0

単純な 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 を使用して) 同じアセンブル ステートメントを実行しようとしましたが、同じ結果が得られました。

4

1 に答える 1

0

実行ld --helpすると

-Ttext ADDRESS              Set address of .text section


次のプログラムを使用してアセンブルするとgcc -Ttext=8 -nostdlib -o test test.s

.globl _start
_start:
movl test,%ebx
test:

そして、セクションヘッダーをダンプします(objdump -h test):

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000007  0000000000000008  0000000000000008  00200008  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE

..そしてコード(objdump -d test):

0000000000000008 <_start>:
   8:   8b 1c 25 0f 00 00 00    mov    0xf,%ebx

セクションの開始アドレスが8、サイズが7であることがわかります.text。つまり、セクション内のシンボルへのすべての参照は、指定した開始アドレス(8)によってオフセットされていますが、パディングは含まれていません(セクションアドレスを変更した結果、サイズは大きくなりませんでした)。

NASMでも、 ORGディレクティブを使用して同じことを実行できるはずです。「NASMのORGは、ディレクティブの指示どおりに実行します。origin。その唯一の機能は、セクション内のすべての内部アドレス参照に追加される1つのオフセットを指定することです」

于 2013-03-05T16:17:21.217 に答える