更改x64应用程序的入口点不会生成重定位表

时间:2017-08-17 20:44:43

标签: visual-c++ linker portable-executable relocation

我创建了一个简单的应用程序,并希望最小化。

该应用程序如下所示:

#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,所以这很奇怪。如果我删除#pragma comment(linker, "/ENTRY:testfc")并返回到原始入口点,则会生成relocs。如何更改入口点但保留重定位表?这只发生在x64版本中,x86我没有这样的问题。

1 个答案:

答案 0 :(得分:2)

重新安置绝对不是从入口点依赖。如果链接器没有产生任何重定位 - 这只意味着你的代码中没有实际的重定位 - 什么都不产生。

当您使用#pragma comment(linker, "/ENTRY:testfc")时,您的代码很小 - 仅int testfc()和所有(并且您忘记调用ExitProcess - 这是错误的)。字符串"test"在x86代码中生成relocs,因为这里使用了字符串的绝对地址。但是x64使用rip-addressing。所以这里真的没有重新定位。

当你评论#pragma comment(linker, "/ENTRY:testfc")时情况发生了严重变化。默认情况下,链接器使用mainCRTStartup作为entry。结果CRT代码被链接。 mainCRTStartup(调用您的main)已经进行了一些重定位