※ 링커 스크립터란?
 - 링커는 입력파일을 합쳐서 하나의 출력파일을 만듭니다. 출력파일과 각 입력파일은 오브젝트 파일 형식이라는 특수한 형식으로 쓰여집니다. 출력 파일이 종종 실행파일이라고도 불리지만 이도 또한 오브젝트 파일의 일종이라고 볼 수 도 있습니다. 

 링커 스크립트는 일반 텍스트 파일로 되어 있고, 일련의 명령어로 구성되어 있습니다. 이 링커 스크립트의 주 목적은 입력파일의 섹션이 어떻게 출력파일로 대응하는지와 출력파일의 메모리 상태를 어덯게 조정하는지를 지정하는 것입니다. 대부분 링커 스크립트는 이것으로 충분합니다. 그러나 필요하다면 명령어들을 사용하여 링커에 다른 작업을 지시할 수도 있습니다. 
 링커는 항상 링커 스크립트를 사용합니다. 직접 제공하지 않으면 링커는 링커 실행파일에 컴파일된 기본 스크립트를 사용합니다. 

 링커 스크립트는 매우 간단한 구조로 되어 있습니다.
 가장 간단한 링커 스크립트는 'SECTIONS'이라는 단 하나의 명령어를 가집니다. 'SECTIONS'명령어는 출력파일의 메모리 구조를 기술 합니다.
 'SECTIONS' 명령어는 강력한 명령어 입니다. 프로그램이 코드, 초기화된 자료, 초기화되지 않은 자료로만 이루어진다고 가정하겠습니다. 이는 각각 '.test', '.data', '.bbs'섹션이고, 입력파일에 이 섹션들만 나온다고 가정해 보겠습니다.

이 예제 코드가 주소 0x10000에 로드되고 자료는 0x8000000에서 시작한다고 하겠습니다.

SECTIONS
{
. = 0x10000;

.text : { *(.text) }

. = 0x8000000;

.data : { *(.data) }

.bss : { *(.bss) }

}

'SECTIONS' 명령어는 'SECTIONS' 키워드 다음에 대괄호로 묶인 일련의 심볼 할당과 섹션 명이 나옵니다.

위의 예에서 `SECTIONS' 명령어 안의 첫 줄은 위치 카운터인 특별 심볼 `.'의 값을 설정합니다. (아래에서 설명할) 다른 방법으로 출력 섹션의 주소를 설정하지 않으면 위치 카운터의 현재 값이 사용됩니다. 위치 카운터는 출력 섹션의 크기만큼 증가합니다. `SECTIONS' 명령 처음에는 위치 카운터는 `0'입니다.

두번째 줄은 출력 섹션 `.text'을 정의합니다. `:'은 현재는 넘어가지만 필요합니다. 그 뒤에 나오는 대괄호 안에 출력 섹션에 추가할 입력 섹션 이름을 열거합니다. The `*'는 어떤 파일명에도 대응합니다. `*(.text)'는 모든 입력파일의 모든 입력 섹션 `.text'을 의미합니다.

출력 섹션 `.text'이 정의될 때 위치 카운터가 `0x10000'이므로 링커는 출력파일에서 `.text' 섹션의 주소를 `0x10000'로 합니다.

나머지 줄은 출력파일의 `.data', `.bss' 섹션을 정의합니다. 링커는 출력 섹션 `.data'을 주소 `0x8000000'에 위치합니다. 그 후 위치 카운터는 `0x8000000' 더하기 출력 섹션 `.data'의 크기가 됩니다. 그 결과 링커는 출력 섹션 `.bss'을 메모리에서 출력 섹션 `.data' 바로 뒤에 위치시킵니다.

링커는 필요하다면 위치 카운터를 증가하여 각 출력 섹션이 올바로 정렬되게 합니다. 이 경우 `.text' 섹션과 `.data' 셕션의 지정된 주소는 어떤 정렬 제약에도 만족할 것입니다. 그러나 `.data'`.bss' 사이에 작은 공간이 빌 것입니다.

아래 내용은 제가 공부하는 파일을 분석한 내용입니다.


+ Recent posts