2017-08-17 8 views
1

を生成しません。は、私は簡単なアプリケーションを作成し、サイズを最小化するために思っている何の再配置テーブル

アプリは、次のようになります。#pragma comment(linker, "/ENTRY:testfc")

#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; 
} 

iは、オプション/DYNAMICBASEは、リンカで有効になっていることをリンカが任意の再配置情報を生成しません見ることができるので、これは奇妙です。 Hovewer #pragma comment(linker, "/ENTRY:testfc")を削除して元のエントリポイントに戻ると、再配置が生成されます。エントリポイントを変更することはできますが、再配置テーブルを保持するにはどうすればよいですか?これはx64ビルドでのみ起こり、x86ではこのような問題はありません。

答えて

2

移転の絶対的なエントリポイントから依存しません。リンカがrelocを生成しない場合は、コード内に実際の再配置はありません。何も生成されません。

#pragma comment(linker, "/ENTRY:testfc")ご使用のコードがごく小さい場合は、int testfc()とすべて(ExitProcessと忘れてください - これはエラーです)。文字列"test"は、ここでは文字列の絶対アドレスを使用しているため、x86コードで再配置を生成します。 x64はrip-addressingを使用します。ここでは本当に再リンクはありません。あなたが深刻な変更された#pragma comment(linker, "/ENTRY:testfc")状況をコメント

。リンカーは、デフォルトでmainCRTStartupentryとして使用します。結果としてCRTコードがリンクされます。すでに

持っているいくつかの再配置(あなた mainを呼び出す) mainCRTStartup
関連する問題