디스어셈블리에서 레이블 정보는 어디에 있나요???

eternalklaus의 이미지

아래 코드는 디스어셈블리의 일부입니다.
(바이너리를 디스어셈블해서 뽑아왔습니다)

00000000004004d6 <main>:
  4004d6:       50                      push   %rax
  4004d7:       58                      pop    %rax
  4004d8:       eb 00                   jmp    4004da <LABEL1>
 
00000000004004da <LABEL1>:
  4004da:       53                      push   %rbx
 
00000000004004db <LABEL2>:
  4004db:       48 89 c3                mov    %rax,%rbx
  4004de:       66 90                   xchg   %ax,%ax

그런데 궁금한 점이 있습니다.

바이너리에는 기계어 코드들이 들어있지 않습니까?
위의 코드를 예를들자면, 50 58 eb 00 53...[생략] 이런 코드들이 들어있겠죠.

그런데 바이너리로부터 뽑은 위 디스어셈블리를 보면 과 같은 레이블정보도 복원되어 있습니다.

오직 기계어뿐인 삭막한 바이너리에서...
이런 레이블정보는 어디에 있길래 objdump가 복원을 시켜준걸까요?

cinsk의 이미지

아마 symbol table에 있을 겁니다. objdump -t -T xxx.o로 확인해보세요.

eternalklaus의 이미지

objdump는 심볼테이블에 있는 심볼을 가져다가 붙여주는 것이었군요~
많은 도움이 되었습니다. 감사합니다

bushi의 이미지

> 오직 기계어뿐인 삭막한 바이너리에서...
>

objcopy -O binary 를 거치면 그러한 바이너리를 얻을 수 있습니다.
이러한 삭막한 바이너리를 디스어셈블하려면, 코드와 데이타를 구별할 방법이 없기 때문에 objdump -D 를 이용해야 합니다.