objdump `--adjust-vma`はデバッグ情報を破壊します。

objdump `--adjust-vma`はデバッグ情報を破壊します。

--adjust-vmaオプションを使用すると、objdump各関数の開始位置に関するデバッグ情報がないように、すべての関数が一緒に圧縮されます。

次の簡単なCファイル(a.c)を使って説明します。

void func(void)
{
}

int main()
{
}

Nowを使用すると、多くの情報を取得gcc -g a.c せずにコンパイルできます。--adjust-vma

$ objdump -d a.out
Disassembly of section .text:

0000000000001040 <_start>:
----- Many other functions which I cut off -------
0000000000001129 <func>:
    1129:   f3 0f 1e fa             endbr64 
    112d:   55                      push   %rbp
    112e:   48 89 e5                mov    %rsp,%rbp
    1131:   90                      nop
    1132:   5d                      pop    %rbp
    1133:   c3                      ret    

0000000000001134 <main>:
    1134:   f3 0f 1e fa             endbr64 
    1138:   55                      push   %rbp
    1139:   48 89 e5                mov    %rsp,%rbp
    113c:   b8 00 00 00 00          mov    $0x0,%eax
    1141:   5d                      pop    %rbp
    1142:   c3                      ret    

ただし、--adjust-vma次のメッセージが表示されます。

$ objdump -d a.out --adjust-vma=0x100000
Disassembly of section .text:

0000000001001040 <main+0xffff0c>:
-------- No function markers, just a lot of instructions one after the other -------
# AM: That's the original `func`
 1001129:   f3 0f 1e fa             endbr64 
 100112d:   55                      push   %rbp
 100112e:   48 89 e5                mov    %rsp,%rbp
 1001131:   90                      nop
 1001132:   5d                      pop    %rbp
 1001133:   c3                      ret    
# AM: That's the original `main`
 1001134:   f3 0f 1e fa             endbr64 
 1001138:   55                      push   %rbp
 1001139:   48 89 e5                mov    %rsp,%rbp
 100113c:   b8 00 00 00 00          mov    $0x0,%eax
 1001141:   5d                      pop    %rbp
 1001142:   c3                      ret    

なぜこれが起こるのかご存知ですか?

答え1

objdumpのマニュアルには次のように記載されています。--adjust-vma option

情報をダンプすると、まずすべてのセクションアドレスにオフセットが追加されます。これは、セクションアドレスがシンボルテーブルと一致しない場合に便利です。これは、セクションアドレスを表すことができない形式(a.outなど)を使用してセクションが特定のアドレスに配置された場合に発生する可能性があります。

コードをブートROMにパッケージ化してメモリにコピーして実行すると、このコードが使用されます[1]。 ROMに保存されているコードを理解するには、このアドレスを無視する必要があります。はいROMにあり、住所を検討してくださいする一度メモリにコピーされます。デバッグ情報は、ROMに記憶されたコピーではなくRAM位置のコードを反映する。この--adjust-vmaオプションを使用すると、ROMアドレスとRAMアドレスの間に差定数を追加できます。

つまり、--adjust-vmaデバッグ情報は調整せずにコードアドレスのみを調整します。

[1]コード​​は通常、ROMよりもRAM上ではるかに速く実行されるため、コードがCPUキャッシュに収まらない場合は、ROMからRAMにコードをコピーするのに余分な時間を費やす価値があります。

関連情報