summarylogtreecommitdiffstats
path: root/0025-MINGW-support-stdcall-without-underscore.patch
blob: 25bb46c8b1245be7e7d69edc8d5ba79e33e29882 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
From 15b977a7de9a992afdb0af75ae3c3d84a524d7df 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 025/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.33.0