导出函数符号名称混淆

3

我有一个D DLL,被一个我无法控制的C++程序加载。该程序LoadLibrarys我的DLL并使用GetProcAddress查找名为“extension_load”的函数,该函数需要一个参数(指针)。在我的D DLL中,我有:

extern (C) int extension_load(void* ptr) {
    return 0;
}

这个名称需要导出为extension_load,但它被导出为extension_load@4,因此GetProcAddress无法找到它。我如何使它成为普通的不带名称修饰的extension_load?


GetProcAddress没有找到函数吗?extension_load@4是从哪里来的(即,您是如何发现它是这个名称的)? - jpalecek
@jpalecek,抱歉,我以为这是暗示。GetProcAddress无法找到名为extension_load的函数。@4来自所有参数的字节长度,我知道现在导出的函数是extension_load@4,因为如果我用调试器打开进程并修改内存中的字符串为extension_load@4,就可以找到该函数。 - John Zane
3个回答

5
您需要向链接器提供一个.def文件,该文件将重命名导出。文档在这里,您需要使用EXPORTS。

我对D语言完全不熟悉,也不知道如何提供链接器一个重命名导出的.def文件。我甚至不知道命令行选项是什么。 - John Zane
好的,把它看作一个开始学习更多关于它的绝佳机会。你的问题不够详细,我无法确定你是否使用某种IDE或手动构建。请浏览我提供的链接,它也有关于链接器的文档。 - Hans Passant

4
我在Hans Passant提供的链接帮助下解决了问题。以下是我的.def文件,供未来需要的人使用(也可能包括我自己):
EXETYPE NT

EXPORTS
    extension_load
    DllMain

我有一个名为dll.def的.def文件。我编写的函数如下:
extern (C++) int extension_load(void* ptr) {

我使用的集成开发环境是D-IDE,要给连接器提供def文件,请前往项目 > 属性 > 构建选项并输入。

nameofdef.def

在“额外连接参数”文本框中输入。这假定nameofdef.def文件存在于您的主项目目录中,以便D-IDE找到它。

1

不需要使用def文件,只需在函数之前加上export即可,例如:

    export extern (C) int extension_load(void* ptr) {
    return 0;
}

编译方法为:dmd -ofmydll.dll mydll.d,当然你也需要定义DllMain()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接