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 中并考虑地址一旦它被复制到内存中。调试信息反映了 RAM 位置的代码,而不是存储在 ROM 中的副本。该--adjust-vma选项允许您添加 rom 和 ram 地址之间的差异常量,

换句话说,它--adjust-vma不调整调试信息,只调整代码的地址。

[1] 代码在 RAM 中的执行速度通常比 ROM 快得多,因此,如果代码不适合 CPU 缓存,则值得花费额外的时间将代码从 ROM 复制到 RAM。

相关内容