如何解决mingw32 gcc 从错误的库中导入符号
我正在尝试使用 mingw64 的交叉编译器在 Linux 上为 Windows 构建 CPython 扩展。
我已经从 Windows 发行版复制了包含文件夹和 lib 文件,并使用以下命令编译:x86_64-w64-mingw32-gcc extension.c -o extension.pyd -I py_38_win/include -L py_38_win -shared -fPIC -static -lpython38
编译成功,但创建的 DLL 正在尝试从 kernel32.dll
导入所有 python38.dll
符号,当然,它没有它们,因此显然无法加载。
- 知道为什么会这样吗?
python38.lib
甚至不导出这些符号 - 有关如何解决此问题的任何想法?是否有链接器标志来记录符号解析并可能对此有所了解?
extension.c:
#include <Python.h>
static PyObject * f(PyObject *self,PyObject *args)
{
printf("I am the extension\n");
Py_RETURN_NONE;
}
static PyMethodDef _module_methods[] = {
{"f",f,METH_VARARGS,NULL},{NULL,NULL,NULL}
};
static struct PyModuleDef _mymodule = {
PyModuleDef_HEAD_INIT,"extension","an extension module",-1,_module_methods,NULL
};
PyMODINIT_FUNC PyInit_extension(void)
{
PyObject *m = PyModule_Create(&_mymodule);
if (!m)
return NULL;
return m;
}
这是生成的 DLL 的 dumpbin /imports
输出:
C:\>dumpbin.exe /imports extension.pyd
Microsoft (R) COFF/PE Dumper Version 14.28.29335.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file extension.pyd
File Type: DLL
Section contains the following imports:
python38.dll
693891C0 Import Address Table
69389070 Import Name Table
0 time date stamp
0 Index of first forwarder reference
5FD _Py_NoneStruct
1FD PyModule_Create2
11B DeleteCriticalSection
13F EnterCriticalSection
228 GetCurrentProcess
229 GetCurrentProcessId
22D GetCurrentThreadId
276 GetLastError
301 GetSystemTimeAsFileTime
31F GetTickCount
37C InitializeCriticalSection
3D8 LeaveCriticalSection
46B QueryPerformanceCounter
4C6 RtlAddFunctionTable
4C7 RtlCaptureContext
4CE RtlLookupFunctionEntry
4D5 RtlVirtualUnwind
572 SetUnhandledExceptionFilter
582 Sleep
591 TerminateProcess
5A5 TlsGetValue
5B3 UnhandledExceptionFilter
5D4 VirtualProtect
5D6 VirtualQuery
KERNEL32.dll
693891D0 Import Address Table
69389080 Import Name Table
0 time date stamp
0 Index of first forwarder reference
11B DeleteCriticalSection
13F EnterCriticalSection
228 GetCurrentProcess
229 GetCurrentProcessId
22D GetCurrentThreadId
276 GetLastError
301 GetSystemTimeAsFileTime
31F GetTickCount
37C InitializeCriticalSection
3D8 LeaveCriticalSection
46B QueryPerformanceCounter
4C6 RtlAddFunctionTable
4C7 RtlCaptureContext
4CE RtlLookupFunctionEntry
4D5 RtlVirtualUnwind
572 SetUnhandledExceptionFilter
582 Sleep
591 TerminateProcess
5A5 TlsGetValue
5B3 UnhandledExceptionFilter
5D4 VirtualProtect
5D6 VirtualQuery
msvcrt.dll
69389288 Import Address Table
69389138 Import Name Table
0 time date stamp
0 Index of first forwarder reference
54 __iob_func
79 _amsg_exit
11E _initterm
184 _lock
2CB _unlock
386 abort
397 calloc
3BE free
3CA fwrite
40D puts
414 realloc
41E signal
433 strlen
436 strncmp
455 vfprintf
Summary
1000 .CRT
1000 .bss
1000 .data
3000 .debug_abbrev
1000 .debug_aranges
1000 .debug_frame
35000 .debug_info
3000 .debug_line
4000 .debug_loc
1000 .debug_ranges
1000 .debug_str
1000 .edata
1000 .idata
1000 .pdata
1000 .rdata
1000 .reloc
2000 .text
1000 .tls
1000 .xdata
附言当我在 Linux 上编译和运行它时,它工作正常:
$ gcc -I /usr/include/python3.8 extension.c -o extension.so -shared -fPIC
$ python -c "import extension;extension.f()"
I am the extension
更新 1
检查生成的二进制文件后,看起来从 python38
(DIRECTORY_ENTRY_IMPORT
) 导入的条目列表没有以 NULL 条目终止,所以它只是通过并包括 {{1} 的所有条目}.看起来可能是 mingw32 中的一个错误。
mingw32 版本:
kernel32
更新 2
看起来它在早期版本的 mingw 上运行良好,所以我猜这确实是 mingw-w64 链接器中新引入的错误。
使用以下版本(可通过 $ x86_64-w64-mingw32-gcc --version
x86_64-w64-mingw32-gcc (GCC) 9.3-win32 20200320
docker 映像轻松获得)
ubuntu:18.04
导入表看起来正确,二进制文件可以正常加载和执行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。