11

私が理解していることから、オブジェクトファイル内の命令とデータにはすべてアドレスがあります。最初のデータ項目はアドレス 0 から始まり、最初の命令もアドレス 0 から始まります。

再配置テーブルには、ファイル内のアドレスが変更された場合 (たとえば、ファイルが別のファイルとリンクされている場合) に更新する必要がある命令に関する情報が含まれています。以下の例の行 A は、再配置テーブルにあります。ラベル「等しい」のアドレスはBに関連しているため、Bが再配置テーブルにあるとは思いません.これらの正しい仮定はありますか?

シンボル テーブルには、ファイルのラベルと解決されていないラベルが表示されます。しかし、シンボル テーブルには他にどのような情報が含まれているのでしょうか?

また、アセンブラが命令をバイナリに変換するとき、未解決の参照を持つ命令には何が配置されますか? この例では B.

.data
TEXT: .asciiz "Foo"

.text
.global main
main:
     li t0, 1
     beq t0, 1, equal #B

equal:
    la a0, TEXT
    jal printf #A
4

1 に答える 1

9

はい、あなたの仮定は正しいです。再配置にはさまざまな種類があり、アセンブラが命令に出力するものは種類によって異なります。通常、追加するのはオフセットです。objdump -dr転居先を見ることができます。より良い説明のために、コードを少し変更しました:

.data
.int 0
TEXT: .asciiz "Foo"
.text
.global main
main:
     li $t0, 1
     beq $t0, 1, equal #B
     bne $t0, 42, foo  #C

equal:
     la $a0, TEXT
     jal printf #A

objdump の出力:

00000000 <main>:
   0:   24080001        li      t0,1
   4:   24010001        li      at,1
   8:   11010004        beq     t0,at,1c <equal>
   c:   00000000        nop
  10:   2401002a        li      at,42
  14:   1501ffff        bne     t0,at,14 <main+0x14>
                        14: R_MIPS_PC16 foo
  18:   00000000        nop

0000001c <equal>:
  1c:   3c040000        lui     a0,0x0
                        1c: R_MIPS_HI16 .data
  20:   0c000000        jal     0 <main>
                        20: R_MIPS_26   printf
  24:   24840004        addiu   a0,a0,4
                        24: R_MIPS_LO16 .data

あなたが言ったように、それはbeqこのオブジェクトファイル内の相対アドレスであるため、再配置はありません。

bne追加した ( でマークされた行)Cは外部シンボルを参照しているため、アドレスが相対であっても再配置エントリが必要です。R_MIPS_PC16symbol への 16 ビットの符号付きワード オフセットを生成するタイプになりますfooPC命令のエンコードでは、再配置が使用する現在の値ではなく、次のワードからのオフセットが必要なため、1減算する必要があり、それは 2 の補数としてffff命令自体にエンコードされます。

la疑似命令は、アセンブラによってlui/ペアに変換されています(addiu後者は の遅延スロットにありますjal)。lui再配置のために、上位 16 ビットを埋めるセクションR_MIPS_HI16に対して作成されます。.dataシンボルTEXTはセクション内のアドレス4にあるため.data、オフセットの上位 16 ビットは0. これは、命令に0オフセットが含まれていることを意味します。同様に、下位 16 ビットについても、命令に のオフセットが含まれている場合を除きます4

最後に、jal printf命令で必要なエンコーディングに合わせて調整された、さらに別の種類の再配置を使用しています。ジャンプは参照シンボルに直接行われるため、オフセットはゼロです。objdump はそれをデコードすることで役立つことに注意してください。ただし、再配置を処理しないため、<main>出力はもちろんナンセンスです。

于 2013-05-25T14:02:49.110 に答える