2012-06-13 8 views
0

커널의 어셈블리 파일에 대해 ld 명령을 linux에서 사용하려고합니다. grub로 부팅하려면 1Mb 주소 뒤에 있어야합니다. 그래서 내 링크 스크립트는 주소 0x00100000에 텍스트가 있습니다.예기치 않은 링커 섹션 출력 위치

여기 내가 사용 링커 스크립트입니다 :

SECTIONS { 
     .text 0x00100000 :{ 
      *(.text) 
     } 
     textEnd = .; 
     .data :{ 
      *(.data) 
      *(.rodata) 
     } 
     dataEnd = .; 
     .bss :{ 
      *(.common) 
      *(.bss) 
     } 
     bssEnd = .; 
    } 

내 질문은 출력 파일에 관한 것입니다. 파일의 바이너리를 보면 텍스트 섹션이 0x1000에서 시작됩니다. 스크립트에서 텍스트 위치를 변경하고 0x500과 같이 0x1000보다 낮은 주소를 사용하면 텍스트가 시작됩니다. 하지만 0x1000 이상이 될 때마다 반올림합니다 (0x2500은 텍스트를 0x500에 놓습니다).

텍스트가 0x100000에 있어야한다고 지정하면 출력 파일에 해당 텍스트가 없어야합니까? 또는 바이너리의 다른 부분이 더 많은 이동이 필요하다는 것을 지정합니다. 커널 부팅에 문제가 있기 때문에 물어 보지만, 지금은 단순히 링커 출력을 이해하려고합니다.

답변

0

두 개의 다른 주소 공간을 참조합니다. 링크 된 파일에서 참조하는 주소 (예 : 0x1000 및 0x500)는 파일 오프셋에 불과합니다. 링커 스크립트에 지정된 주소 (예 : 0x00100000)는 컴퓨터 메모리 (예 : RAM)를 기준으로합니다.

링커 스크립트의 경우 링커는 이진/실행 파일의 .text 섹션을 RAM의 1MiB 지점 (즉 0x00100000)에로드해야한다고 알립니다. 이것은 링커가 출력하는 파일의 레이아웃과 관련이 없으며 실행될 때 파일을로드하는 방법과 관련이 있습니다.

실제 파일의 섹션 위치는 정렬과 관련이 있습니다. 즉, 링커는 첫 번째 섹션을 4096 바이트 경계에 정렬하는 것으로 보입니다. 예를 들어, 각 섹션의 크기가 4096 바이트보다 작고 각각이 4096 바이트 경계에 배치되면 파일의 해당 오프셋은 0x1000, 0x2000, 0x3000 등이됩니다. 기본적으로이 정렬은 파일 이전 예제에서 0x00100000, 0x00101000, 0x00102000 등의 섹션을 생성하도록 RAM에로드됩니다.

로드 위치를 충분히 작은 수로 변경하면 링커에서 자동으로 정렬을 변경하는 것처럼 보입니다. 그러나 정렬을 수동으로 지정하려면 '정렬'기능을 사용할 수 있습니다. 링커 (보다 상세하게 상기의 모든 기술) I 추천 짧은 & 달콤한 설명은

:

http://www.math.utah.edu/docs/info/ld_3.html

또는

http://sourceware.org/binutils/docs-2.15/ld/Scripts.html