我创建了一个简单的应用程序,并希望最小化。
该应用程序如下所示:
#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我没有这样的问题。
答案 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
)已经进行了一些重定位