GCC 使用 __stdcall 编译 dll
当我们在 Visual Studio 2008 中使用 __stdcall 编译 DLL 时,DLL 中的编译函数名称为:
FunctionName
虽然当我们使用 wx-dev-cpp 使用 GCC 编译相同的 dll 时,GCC 会附加该函数具有的参数数量,因此使用 Dependency walker 的函数名称看起来像这样。
FunctionName@numberOfParameters 或 == FunctionName@8
如何告诉 GCC 编译器从 dll 中的导出符号中删除 @nn?
When we compile a dll using __stdcall inside visual studio 2008 the compiled function names inside the dll are.
FunctionName
Though when we compile the same dll using GCC using wx-dev-cpp GCC appends the number of paramers the function has, so the name of the function using Dependency walker looks like.
FunctionName@numberOfParameters or == FunctionName@8
How do you tell GCC compiler to remove @nn from exported symbols in the dll?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
__stdcall 修饰函数名,在开头添加下划线,在结尾添加参数的字节数(用 @ 分隔)。
所以,一个函数:
...将变成 _Foo@8。
如果您在 .DEF 文件的 EXPORTS 部分中列出函数名称(未修饰),则它将在未修饰的情况下导出。
或许这就是区别?
__stdcall decorates the function name by adding an underscore to the start, and the number of bytes of parameters to the end (separated by @).
So, a function:
...would become _Foo@8.
If you list the function name (undecorated) in the EXPORTS section of your .DEF file, it is exported undecorated.
Perhaps this is the difference?
只需在 gcc 命令行上使用
-Wl,--kill-at
即可将--kill-at
传递给链接器。参考文献:
Just use
-Wl,--kill-at
on the gcc command line, which will pass--kill-at
to the linker.References:
您还可以在 GCC 中的链接器选项中使用
-Wl,--add-stdcall-alias
。 这将确保两个函数名称(修饰的和未修饰的)都存在并且可以用作别名。You can also use
-Wl,--add-stdcall-alias
to your linker options in GCC. This will ensure that both function names (decorated and undecorated) are present and can be used as alias.