当使用--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 中并考虑地址将一旦它被复制到内存中。调试信息反映了 RAM 位置的代码,而不是存储在 ROM 中的副本。该--adjust-vma
选项允许您添加 rom 和 ram 地址之间的差异常量,
换句话说,它--adjust-vma
不调整调试信息,只调整代码的地址。
[1] 代码在 RAM 中的执行速度通常比 ROM 快得多,因此,如果代码不适合 CPU 缓存,则值得花费额外的时间将代码从 ROM 复制到 RAM。