更改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
)已经有一些搬迁了