| From 8353a7f30f7dc0a33111f43ad2ce7acfa6de0a32 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= |
| <alexey.pawlow@gmail.com> |
| Date: Thu, 17 Jun 2021 18:51:39 +0530 |
| Subject: [PATCH 029/N] MINGW support stdcall without underscore |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Co-authored-by: Алексей <alexey.pawlow@gmail.com> |
| --- |
| Modules/_ctypes/_ctypes.c | 19 +++++++++++++++++++ |
| 1 file changed, 19 insertions(+) |
| |
| diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c |
| index ceae67e..b9cf96b 100644 |
| --- a/Modules/_ctypes/_ctypes.c |
| +++ b/Modules/_ctypes/_ctypes.c |
| @@ -3406,6 +3406,18 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type) |
| mangled_name = alloca(strlen(name) + 1 + 1 + 1 + 3); /* \0 _ @ %d */ |
| if (!mangled_name) |
| return NULL; |
| + /* Issue: for stdcall decorated export functions MSVC compiler adds |
| + * underscore, but GCC compiler create them without. This is |
| + * visible by example for _ctypes_test.pyd module. |
| + * As well functions from system libraries are without underscore. |
| + * Solutions: |
| + * - If a python module is build with gcc option --add-stdcall-alias |
| + * the module will contain XXX as alias for function XXX@ as result |
| + * first search in this method will succeed. |
| + * - Distutil may use compiler to create def-file, to modify it as |
| + * add underscore alias and with new def file to create module. |
| + * - Or may be just to search for function without underscore. |
| + */ |
| for (i = 0; i < 32; ++i) { |
| sprintf(mangled_name, "_%s@%d", name, i*4); |
| Py_BEGIN_ALLOW_THREADS |
| @@ -3413,6 +3425,13 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type) |
| Py_END_ALLOW_THREADS |
| if (address) |
| return address; |
| + /* search for function without underscore as weel */ |
| + sprintf(mangled_name, "%s@%d", name, i*4); |
| + Py_BEGIN_ALLOW_THREADS |
| + address = (PPROC)GetProcAddress(handle, mangled_name); |
| + Py_END_ALLOW_THREADS |
| + if (address) |
| + return address; |
| } |
| return NULL; |
| #endif |
| -- |
| 2.32.0 |
| |