Ao usar a --adjust-vma
opção de objdump
todas as funções ficarem comprimidas, como se não houvesse informações de depuração sobre onde cada função começa.
Vou demonstrar com o seguinte arquivo C simples ( a.c
):
void func(void)
{
}
int main()
{
}
Compile-o usando gcc -g a.c
Now sem --adjust-vma
obter muitas informações:
$ 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
Mas com --adjust-vma
eu recebo o seguinte:
$ 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
Alguma ideia de por que isso acontece?
O manual do objdump diz isso sobre o
--adjust-vma option
Um caso em que eu usaria isso se estivesse empacotando código em uma ROM de inicialização que eu copiaria para a memória RAM e executaria [1]. Para entender o código que está armazenado na ROM, deve-se ignorar os endereços como estão na ROM e considerar quais serão os endereços quando for copiado para a RAM. As informações de depuração refletem o código nos locais da memória RAM, não a cópia armazenada na ROM. A
--adjust-vma
opção permite adicionar a constante que é a diferença entre os endereços rom e ram,Dito de outra forma,
--adjust-vma
não ajusta as informações de depuração, apenas os endereços do código.[1] O código normalmente é executado muito mais rápido da memória RAM do que da ROM, portanto, se o código não couber no cache da CPU, pode valer a pena o tempo extra para copiar o código da ROM para a memória RAM.