更改x64应用程序的入口点不会产生reloc表

问题描述:

我已经创建了一个简单的应用程序,并且想要最小化大小。更改x64应用程序的入口点不会产生reloc表

该应用程序是这样的:

#include "stdafx.h" 
#include <Windows.h> 
#pragma comment(linker, "/ENTRY:testfc") 


#pragma check_stack(off) 
#pragma runtime_checks("su",off) 

int testfc() 
{ 
    MessageBoxA(0, "test", "test", 0); 
    return 0; 
} 

int main() 
{ 
    MessageBoxA(0, "main", "main", 0); 
    return 0; 
} 

随着#pragma comment(linker, "/ENTRY:testfc")我可以看到,连接器不产生任何relocs,选择/DYNAMICBASE在连接启用,所以这是奇怪的。 Hovewer,如果我删除#pragma comment(linker, "/ENTRY:testfc")并返回到原始入口点,则会生成relocs。我如何更改入口点但保留重定位表?这只发生在x64构建中,x86我没有这样的问题。

搬迁的绝对不取决于入口点。如果链接器不产生任何重定位 - 这意味着只有在你的代码中没有实际的重定位 - 没有什么可产生的。

当你使用#pragma comment(linker, "/ENTRY:testfc")你的代码很小 - 只有int testfc()和所有的(你忘记了呼叫ExitProcess - 这是错误)。字符串"test"产生x86代码中的重定位,因为这里使用了字符串的绝对地址。但x64使用翻页寻址。所以这里真的没有relocs。

当您评论#pragma comment(linker, "/ENTRY:testfc")情况严重改变。链接器默认使用mainCRTStartup作为entry。结果CRT代码被链接。 mainCRTStartup(它叫你main)已经有一些搬迁了