--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으로 코드를 복사하는 데 추가 시간을 투자할 가치가 있습니다.