GCC 使用 __stdcall 编译 dll

发布于 2024-07-05 22:28:29 字数 294 浏览 9 评论 0原文

当我们在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

若言繁花未落 2024-07-12 22:28:29

__stdcall 修饰函数名,在开头添加下划线,在结尾添加参数的字节数(用 @ 分隔)。

所以,一个函数:

void __stdcall Foo(int a, int b);

...将变成 _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:

void __stdcall Foo(int a, int b);

...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?

ゞ记忆︶ㄣ 2024-07-12 22:28:29

只需在 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:

缱绻入梦 2024-07-12 22:28:29

您还可以在 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文