时间:2010-07-26 00:37:34

标签: com assembly nasm vtable

3 个答案:

答案 0 :(得分:2)

我必须道歉,问题原来是我自己的错......在构建事物的所有混战中,我从链接器调用中删除了/dll,导致它被构建为EXE ,而不是DLL ...


让我为下一个遇到这个问题的人解释一下这个问题。

所有Windows可执行文件都有base address,假定它是可执行文件将加载到的虚拟地址。在大多数情况下加载到正在运行的进程中的可执行文件不会加载到“首选”base address,因为另一个DLL(或应用程序本身)可能已占用该地址。因此,Windows PE可执行文件使用所谓的Relocation TableRelocation Table告诉Windows在重定位到新base address的情况下,需要重写可执行文件中的哪些位置。

然而,随着Virtual Memory的出现,大多数链接器将省略EXE的重定位表作为优化,因为可执行文件将始终加载到它的基地址(除非它与保留的内核地址冲突,在哪种情况下它将无法一起加载)。因为我停止编译为DLL,我的可执行文件没有被赋予Relocation Table,因此无法正确加载到正在运行的进程的地址空间。


<强>更新

默认情况下,MSVC仅包含DLL项目中的重定位表,如on MSDN所述:

By default, /FIXED:NO is the default when building a DLL, and /FIXED is the default for any other project type.

可以通过向链接器提供/FIXED:NO开关来更改此行为。非DLL项目的默认值为/FIXED,它告诉链接器目标具有固定的基址,并且不需要重定位表。

答案 1 :(得分:1)

答案 2 :(得分:1)

您是否尝试将全局变量声明为导出?我好久没做过x86了。但是阅读nasm的doc似乎意味着你需要全局和导出才能使DLL重定位修复工作。