使用 mingw64 在 jmpq 上崩溃到另一个 dll 中的函数
Crash on jmpq to a function in another dll with mingw64
我正在使用 mingw64 在 Windows 上将我的项目从 32 位迁移到 64 位。
一切正常 compiling/linking,但是我在运行时遇到了一些问题:调用另一个 DLL 中引用的函数时程序崩溃,例如在这样的指令上:
0x574040 ff 25 e8 66 6a 00 jmpq *0x6a66e8(%rip) # 0xc1a72e <_ZN12QTableWidget18currentCellChangedEiiii+638>
上面的例子是一个Qt函数,在启动应用程序时调用,但我用其他DLL也有类似的问题。
奇怪的事情:我只在发布模式下遇到 Qt DLL 的问题(这意味着我使用了另一组名称以'd
'结尾的 DLL ).
在调试模式下,我遇到了类似的问题,但只有一个库。有了这个库,我就能够动态加载函数(使用 QLibrary),因此 DLL 似乎不会无效。
我花了一整天的时间试图找出问题所在,但我没有其他想法:
- DLL 和 exe 文件在 objdump 时被视为 "file format pei-x86-64"。
- 应该是用同一个编译器编译的(除了我提到的附加库是用 MSVC 编译的,但只有 C 接口)
- DLL 文件实际上存在,紧挨着 exe 文件(否则我会遇到有意义的错误 "X.DLL is mssing from your computer")。
如果有人有任何线索,请告诉我!
OK,其实有问题:
- 对于使用 MSVC 编译的附加库,it is not possible to link against .lib 是一个已知问题。正如评论中所说,gcc 可以直接针对 DLL link,从而为我解决了这个库的问题。
- 我在发布模式下遇到其他库的问题,但那是一个完全不同的问题:我正在使用的软件有一个保护机制,只在发布模式下激活,这把一切都搞砸了。
我正在使用 mingw64 在 Windows 上将我的项目从 32 位迁移到 64 位。
一切正常 compiling/linking,但是我在运行时遇到了一些问题:调用另一个 DLL 中引用的函数时程序崩溃,例如在这样的指令上:
0x574040 ff 25 e8 66 6a 00 jmpq *0x6a66e8(%rip) # 0xc1a72e <_ZN12QTableWidget18currentCellChangedEiiii+638>
上面的例子是一个Qt函数,在启动应用程序时调用,但我用其他DLL也有类似的问题。
奇怪的事情:我只在发布模式下遇到 Qt DLL 的问题(这意味着我使用了另一组名称以'd
'结尾的 DLL ).
在调试模式下,我遇到了类似的问题,但只有一个库。有了这个库,我就能够动态加载函数(使用 QLibrary),因此 DLL 似乎不会无效。
我花了一整天的时间试图找出问题所在,但我没有其他想法:
- DLL 和 exe 文件在 objdump 时被视为 "file format pei-x86-64"。
- 应该是用同一个编译器编译的(除了我提到的附加库是用 MSVC 编译的,但只有 C 接口)
- DLL 文件实际上存在,紧挨着 exe 文件(否则我会遇到有意义的错误 "X.DLL is mssing from your computer")。
如果有人有任何线索,请告诉我!
OK,其实有问题:
- 对于使用 MSVC 编译的附加库,it is not possible to link against .lib 是一个已知问题。正如评论中所说,gcc 可以直接针对 DLL link,从而为我解决了这个库的问题。
- 我在发布模式下遇到其他库的问题,但那是一个完全不同的问题:我正在使用的软件有一个保护机制,只在发布模式下激活,这把一切都搞砸了。