코어 덤프는 프로그램 메모리 풋 프린트의 덤프 일뿐입니다. 모든 것이 어디에 있는지 알고 있다면이를 사용할 수 있습니다.
실행 파일은 메모리에서 논리 파일의 위치 (예 : 코어 파일)를 설명하므로 실행 파일을 사용합니다.
명령을 사용하면 objdump
조사중인 실행 가능한 개체에 대한 메타 데이터가 덤프됩니다. a.out이라는 실행 가능 객체를 예로 사용합니다.
objdump -h a.out
헤더 정보 만 덤프하면 eg라는 섹션이 표시됩니다. .data 또는 .bss 또는 .text (더 많음) 이들은 커널 로더에게 객체에서 다양한 섹션을 찾을 수있는 위치와 프로세스 주소 공간에서 섹션을로드 할 위치 및로드 할 항목 (예 : .data .text)을 알려줍니다. (.bss 섹션에는 파일에 데이터가 포함되어 있지 않지만 초기화되지 않은 데이터의 프로세스에서 예약 할 메모리 양을 나타내며 0으로 채워집니다).
실행 가능한 객체 파일의 레이아웃은 표준 ELF를 따릅니다.
objdump -x a.out
-모든 것을 버린다
실행 개체에 여전히 심볼 테이블이 포함되어 있으면 (제거되지 않았으며
ac 소스 컴파일 을 가정 하여 디버그 생성을 생성하는 man strip
데 사용 -g
된 gcc
경우) 심볼 이름으로 핵심 내용을 검사 할 수 있습니다 (예 : 변수 / 버퍼가있는 경우) 소스 코드에서 inputLine 이라는 이름을 사용하면 해당 이름을 사용 gdb
하여 내용을 볼 수 있습니다 . 즉 gdb
, inputLine이 시작 되는 프로그램 초기화 데이터 세그먼트의 시작과 해당 변수의 길이 로부터의 오프셋을 알 수 있습니다 .
추가 기사 1 ,
기사 2 및 완벽한 ELF (Executable and Linking Format) 사양에 대해 자세히 읽어보십시오 .
아래 @mirabilos 주석 후에 업데이트하십시오.
그러나 기호 테이블을 다음과 같이 사용하면
$ gdb --batch -s a.out -c core -q -ex "x buf1"
생산
0x601060 <buf1>: 0x72617453
심볼 테이블을 사용하지 않고 직접 주소를 검사하지 않고
$ gdb --batch -c core -q -ex "x 0x601060"
생산
0x601060: 0x72617453
두 번째 명령에서 기호 테이블을 사용하지 않고 메모리를 직접 검사했습니다.
또한 @ user580082의 답변이 설명에 더 추가되며 투표권이 있습니다.