2012-05-15 4 views
2

링커 스크립트에서 위치 카운터 작업을 이해하고 있다고 생각했지만 생각하지 않았습니다. 방금 내가 이해 한 것을 확인하기위한 간단한 테스트를했습니다. 라이브러리 호출없이 간단한 c 프로그램을 작성하고 gcc로 컴파일했다. 그런 다음 위치 카운터를 처음에 값으로 설정 한 링커 스크립트를 사용하여 링크했습니다. 다음은 링커 스크립트 내가 그것을 실행하지만, 단지 objdump를 출력을보고 싶지 않았다링커 스크립트의 위치 카운터

ENTRY(main) 

addr = 0x8048000; 

SECTIONS 
{ 
.text addr : 
ALIGN(0x1000) 
{ 
    *(text*); 
    *(.rodata*); 

} 

.data : 
ALIGN(0x1000) 
{ 
    *(.data*); 
} 
} 

다음 프로그램

int a = 6; 
int main(){ 
return 0; 
} 

이다. 나는 엘프에 objdump -s을했을 때 시작 주소를 0x8048000으로 표시해야한다고 생각했습니다. 또한 내가 무슨 일이 일어나고 있는지 이해하지 못하고 0000 에서 시작 코멘트 섹션이 외에 그러나 나는 항상 0000

Contents of section .text: 
0000 b8000000 00c3      ......   
Contents of section .data: 
1000 06000000        ....    
Contents of section .comment: 
0000 4743433a 20285562 756e7475 20342e34 GCC: (Ubuntu 4.4 
0010 2e332d34 7562756e 74753529 20342e34 .3-4ubuntu5) 4.4 
0020 2e3300 

로 시작하는 주소를 참조하십시오. 여기

은 (어떤 라이브러리없이 여전히) 링커 스크립트없이 objdump를 출력처럼 맵 파일 모양을 무엇

Contents of section .text: 
8048094 b8000000 00c3      ......   
Contents of section .data: 
804909c 06000000        ....    
Contents of section .comment: 
0000 4743433a 20285562 756e7475 20342e34 GCC: (Ubuntu 4.4 
0010 2e332d34 7562756e 74753529 20342e34 .3-4ubuntu5) 4.4 
0020 2e3300 
+1

링커 스크립트가 없으면 어떻게됩니까? –

답변

1

입니까? 너 어떻게 지어? 나는 당신의 문제를 재현 시도하고 나는 예상대로 모든 일을 믿고 :

x:~/temp> cat test.c && cat test.x && gcc test.c -Wl,-T,./test.x -nostdlib -o test.exe && readelf -S test.exe | grep .text && objdump -s test.exe 
int a = 6; 
int main(){ 
return 0; 
} 

ENTRY(main) 

addr = 0x8048000; 

SECTIONS 
{ 
.text addr : 
ALIGN(0x1000) 
{ 
    *(text*); 
    *(.rodata*); 

} 

.data : 
ALIGN(0x1000) 
{ 
    *(.data*); 
} 
} 

    [ 2] .text    PROGBITS  08048000 001000 00000a 00 AX 0 0 4096 

test.exe:  file format elf32-i386 

Contents of section .data: 
8049000 06000000        ....    
Contents of section .text: 
8048000 5589e5b8 00000000 5dc3    U.......].  
Contents of section .comment: 
0000 00474343 3a202847 4e552920 342e352e .GCC: (GNU) 4.5. 
0010 3100         1.    

아, 그리고 .comment 섹션은 단지 컴파일러에 의해 삽입됩니다.

+0

문제점을 발견했습니다. 이 문제를 일으킨 텍스트 섹션에 (.text *) 대신 (텍스트 *)를 넣는 것은 내 실수 (또는 어리 석음)였습니다. Btw지도 파일의 의미는 무엇입니까? – vjain27

+1

링커는 최종 실행 파일의 주소 레이아웃을 보여주는 맵 파일을 생성 할 수 있습니다. -Map에 대한 http://sourceware.org/binutils/docs/ld/Options.html#Options을 참조하십시오. – DaveS