単純な 32 ビット x86 アセンブリ ステートメントのみを含むファイルを考えてみましょう。
call 0xc1066580
このファイルを nasm -f elf でアセンブルすると、次のようになります。
0: e8 7c 65 06 c1 call 0xc1066581
GCC を使用して -Ttext=0 と -nostdlib を指定すると、次のようになります。
0: e8 7b 65 06 c1 call c1066580
-nostdlib リンク時に、標準のシステム起動ファイルまたはライブラリを使用しません。起動ファイルはなく、指定したライブラリのみがリンカに渡され、-static-libgcc や -shared-libgcc などのシステム ライブラリのリンケージを指定するオプションは無視されます。
しかし、 -Ttext=0 は正確には何をするのでしょうか? これを使用して、ロード/実行時に EIP が開始するエントリ アドレスを指定します。マンページで -Ttext が見つかりません。オンラインで検索すると、次のことがわかりました。
"-Ttext は "--section-start=text" のエイリアスで、次のようになります。 --section-start=sectionname=orgコマンド ラインで複数のセクションを見つけるために必要な回数. org は 1 つの 16 進数の整数である必要があります. 他のリンカとの互換性のために、通常は 16 進数値に関連付けられている先頭の 0x を省略できます. 注: セクション名の間に空白を入れないでください. 、等号 ("=")、および org."
http://www.linuxquestions.org/questions/linux-general-1/gcc-creating-a-huge-executable-image-redhat-2-6-18-8-el5-x86_64-linux-759302/から
ただし、マンページに --section または sectionname が見つかりません。-Ttext を --section-name に置き換えようとすると、これが認識されない引数であることがわかります (関連する場合、これは GCC 4.7.2 です)。 )。
この (-Ttext の) 説明が正確かどうか、またマニュアルのどこに記載されているか教えてもらえますか? 正確でない場合、-Ttext は実際に何をするのでしょうか?
私の他の質問は次のとおりです。 -Ttext と同様の引数を nasm に指定するにはどうすればよいですか? 言い換えれば、nasm が gcc と同じ出力を生成するにはどうすればよいでしょうか?
64 ビット システムと 32 ビット システムの両方で (nasm と gcc を使用して) 同じアセンブル ステートメントを実行しようとしましたが、同じ結果が得られました。