2011-05-08 3 views
3

왜 내가 gdb에서 asm 소스를 디버깅 할 때 0x8048080 코드가 시작 진입 점으로 선택 되었습니까? 이것은 단지 상대 오프셋이며 실제 명령의 메모리로의 실제 오프셋이 아닙니다.주소의 의미 0x8048080

답변

2

0x8048080를 해결하기 위해 특별한 의미가 없지만, 주소 0x08048000 하나가 : 자세한 내용은

체크 아웃.

후자의 주소는 기본 주소이며 ld은 Linux/x86에서 첫 번째 PT_LOAD 세그먼트를 시작합니다. Linux/x86_64에서 기본값은 0x400000이며 "사용자 지정"링커 스크립트를 사용하여 기본값을 변경할 수 있습니다. .text 섹션이 -Wl,-Ttext,0xNNNNNNNN 플래그로 시작하는 부분을 변경할 수도 있습니다.

0x08048000에서 ld 시작 후에는 프로그램 헤더를위한 공간을 추가하고,에 따라 실행 파일의 나머지 부분을 연결하는 진행 내장 된 당신이 당신의 연결 라인에 -Wl,--verbose에 전달하면 당신이 볼 수있는 링커 스크립트. 당신의 프로그램

은 프로그램 헤더의 크기는 항상 0x80을 것으로 보인다, 그래서 당신의 .text 부분은 항상 0x8048080에서 시작하지만 더 보편적 인 의미가 없습니다. 나는 사소한 int main() { return 0; } 프로그램을 연결할 때

, 나는 내가 사용하는 컴파일러에 따라 0x8048300, 0x8048178 또는 0x8048360에서 &_start == &.text를 얻을.

+0

매우 흥미로운 세부 사항에 대해 감사드립니다 :) –

1

0 x 8048080은 Linux ld 링커에서 사용되는 가상 메모리의 기본 진입 점입니다. 원하는대로 변경할 수 있습니다. http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints/

+0

감사합니다. 매우 흥미로운 링크, 그냥 내가 무엇을 찾고 있었는지 :) –

+0

이 답변은 잘못되었습니다. 'ld'는 미리 설정된 주소에 기본 진입 점을 두지 않습니다. –