2014-03-12 5 views
2

gdb 및 objdump에 관한 여러 가지 질문이 있습니다. 내가 할 경우 objdump를gdb 및 objdump로 디버깅

에서

주소 :

Disassembly of section .text: 

080484a0 <_start>: 
80484a0: 31 ed     xor %ebp,%ebp 
80484a2: 5e      pop %esi 
80484a3: 89 e1     mov %esp,%ecx 

나는 이러한 숫자를 가정 objdump를 -d 이진 파일 이름는, 나는이 부분을 포함 출력을 얻을 첫 번째 열은 주소입니까? 그러나 프로세스를로드 할 때마다 메모리의 임의의 위치에 배치되므로 코드가 매번 다른 주소를 갖기 때문에 이러한 주소를 알 수있는 방법을 이해할 수 없습니까? 또는이 주소가 프로세스의 주소 인 addres-space입니까?

< _start> 아래에 나열된 값은 무엇입니까? 코드

를 단계별로

GDB는 내가 소스 코드가없는있는 바이너리 파일을 얻었다. 나는 프로그램을 진행하고 싶지만 기호 정보는 없다. 함수 이름이나 줄 번호에 중단 점을 설정할 수 없습니다. 주소에 중단 점을 설정하려고 시도했지만이 방법이 효과적 이었지만 프로그램을 단계별로 실행하는 방법을 알 수는 없습니다. 내가 할 때 : (gdb) s 또는 (gdb) n 줄 정보가없고 그냥 전체 기능을 실행합니다. 단계별 가이드가 있습니까? 아니면 조립 지침을 단계별로 안내 할 수 있습니까?

답변

3

예, 첫 번째 열은 주소 열입니다. 실행 파일은 PIE (Position Independent Executable)로 특별히 표시되지 않는 한 특정 주소 (각 섹션은 자체적으로)에로드됩니다.이 경우 표시되는 주소는 0부터 시작하며 실제로 무작위로드 주소의 오프셋 일뿐입니다. 그러나 공유 라이브러리는 기본적으로 위치 독립적이며 다른 주소에 매핑 될 수 있습니다.

두 번째 열은 컴퓨터 코드 자체입니다. 프로그램은 메모리에 저장된 바이트 시퀀스로, 프로세서는 실제로보고 실행합니다. 디버그 정보가없는 경우

당신은 stepi 또는 nexti (짧은 형태 각각 sini을)를 사용할 수 있습니다. layout asm과 친구들도 GUI 프론트 엔드를 사용하지 않는 경우 유용 할 수 있습니다.