--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にコードをコピーするのに余分な時間を費やす価値があります。