54 lines
2.2 KiB
Diff
54 lines
2.2 KiB
Diff
From 3071b5192abc8a6f89f5652bf3263161ef136820 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 018/N] Add support for stdcall without underscore
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This is the case used in MINGW
|
|
|
|
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 d3b4968..c208223 100644
|
|
--- a/Modules/_ctypes/_ctypes.c
|
|
+++ b/Modules/_ctypes/_ctypes.c
|
|
@@ -3416,6 +3416,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
|
|
@@ -3423,6 +3435,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
|