gpt4 book ai didi

c++ - 强制 visual studio 链接器保持名称修改

转载 作者:行者123 更新时间:2023-11-30 02:40:27 24 4
gpt4 key购买 nike

我正在处理一个 dll 代理项目,我在强制 visual studio 链接器使用函数的混合名称时遇到了问题。

在我的 def 文件中我有:

导出
_ap_abort_on_oom@0=__E__0__ @1

但是在构建解决方案之后,dll 中的函数是:

_ap_abort_on_oom

当我运行我原来的程序时,我得到一个错误,说 _ap_abort_on_oom@0 没有找到。我正在使用 wrappit项目我如何更改链接器设置以便它使用修饰的名称?

最佳答案

这个问题(以及其他类似问题)与使用 Code Project WRAPPIT 自动创建代理 DLL 有关。工具。

解决方案是始终将包装函数声明为 __stdcall,以便用前导 _ 和尾随 @0 进行装饰,然后在 .def 文件中使用它,以便保留原始函数装饰(如果有) .

(当/如果您用真正的函数替换包装器时,您需要记住将调用约定从 __stdcall 更改为所需的约定,以及删除 __declspec(naked),添加参数声明等。)

包装 .cpp 片段:

// _OriginalFunction@12
extern "C" __declspec(naked) void __stdcall __E__0__()
{
__asm
{
jmp p[0*4];
}
}

.def 文件:

EXPORTS
_OriginalFunction@12=___E__0__@0 @1
etc.

我修改了我的 WRAPPIT 工具版本以自动执行此操作:

165c165
< fprintf(fdef,"%s=%s @%u\r\n",v[i].en,v[i].in,v[i].o);
---
> fprintf(fdef,"%s=_%s@0 @%u\r\n",v[i].en,v[i].in,v[i].o);
167c167
< fprintf(fdef,"%s=%s @%u NONAME\r\n",v[i].en,v[i].in,v[i].o);
---
> fprintf(fdef,"%s=_%s@0 @%u NONAME\r\n",v[i].en,v[i].in,v[i].o);
225c225
< fprintf(fcpp,"// %s\r\nextern \"C\" __declspec(naked) void %s %s()\r\n",v[i].en,argv[3],v[i].in);
---
> fprintf(fcpp,"// %s\r\nextern \"C\" __declspec(naked) void %s %s()\r\n",v[i].en,"__stdcall",v[i].in);

关于c++ - 强制 visual studio 链接器保持名称修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28938579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com