2017-08-17 72 views
1

我已經創建了一個簡單的應用程序,並且想要最小化大小。更改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我沒有這樣的問題。

回答

2

搬遷的絕對不取決於入口點。如果鏈接器不產生任何重定位 - 這意味着只有在你的代碼中沒有實際的重定位 - 沒有什麼可產生的。

當你使用#pragma comment(linker, "/ENTRY:testfc")你的代碼很小 - 只有int testfc()和所有的(你忘記了呼叫ExitProcess - 這是錯誤)。字符串"test"產生x86代碼中的重定位,因爲這裏使用了字符串的絕對地址。但x64使用翻頁尋址。所以這裏真的沒有relocs。

當您評論#pragma comment(linker, "/ENTRY:testfc")情況嚴重改變。鏈接器默認使用mainCRTStartup作爲entry。結果CRT代碼被鏈接。 mainCRTStartup(它叫你main)已經有一些搬遷了

相關問題