Brise

ld(링커 스크립트, Linker Script) 공부 내용 본문

프로그램

ld(링커 스크립트, Linker Script) 공부 내용

naudhizb 2019. 7. 27. 22:08
반응형

/* 구조

링커는 여러 object file들을 하나로 합치는 것

object file은 section과 symbol로 구성됨

section은 loadable, allocatable 할 수 있고

symbol은  defined or undefined 될 수 있다. 

*/


/* section

출력섹션은 두 주소를 가진다

1. VMA(virtual memory address) : 출력파일이 실행될 때 섹션이 위치하는 주소

2. LMA(load memory address) : 출력파일을 로드할때 위치하는 주소

VMA != LMA인 경우 자료를 ROM에서 읽어서 RAM에 복사하는 경우

LMA = ROM

VMA = RAM

*/


/* symbol

symbol = expression ;

symbol += expression ;

symbol -= expression ;

symbol *= expression ;

symbol /= expression ;

symbol <<= expression ;

symbol >>= expression ;

symbol &= expression ;

symbol |= expression ;

*/


/* 엔트리

프로그램에서 처음으로 실행되는 명령이 진입점이다. ENTRY 명령어로 진입점을 설정한다. 아규먼트는 심볼이름이다.

엔트리 설정 순서는 아래 중 첫번째가 성공하는 경우 결정된다. 

> `-e' entry 옵션

> 링커 스크립트의 ENTRY(symbol) 명령어

> start 심볼이 정의되있다면 심볼 값

> `.text' 섹션이 있다면 첫 바이트 주소

> 주소 0

*/

ENTRY(symbol)




/* 메모리 명령 

MEMORY 명령어는 플래폼에서 메모리 블록의 위치와 크기를 알려준다. 

그래서 링커가 사용거나 피해야하는 메모리 영역을 지정할 수 있다. 

또 섹션을 특정 메모리 영역에 할당할 수 있다. 

링커는 메모리 영역에 기반하여 섹션 주소를 정하고 영역이 다 차면 경고를 한다. 

링커는 주어진 크기에 적합하게 섹션을 재배치하지 못한다.*/


MEMORY

{

name [(attr)] : ORIGIN = origin, LENGTH = len

DTCM (xrw)     : ORIGIN = 0x20000000, LENGTH = 128K

RAM (xrw)      : ORIGIN = 0x20020000, LENGTH = 368K

RAM2 (xrw)     : ORIGIN = 0x2007C000, LENGTH = 16K

ITCM (rx)    : ORIGIN = 0x00000000, LENGTH = 16K

FLASH (rx)      : ORIGIN = 0x00200000, LENGTH = 2048K

}

/* attr 

`R' : Read-only section

`W' : Read/write section

`X' : Executable section

`A' : Allocatable section

`I' : Initialized section

`L' : Same as `I'

`!' : Invert the sense of any of the preceding attributes

*/



/* 출력 파일 */


/* SECTIONS 명령 구조 */

SECTIONS

{

  sections-command -->

  section [address] [(type)] : [AT(lma)]

  {

    output-section-command

    output-section-command

    ...

  } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]

}


/* sections-command 종류

> ENTRY 명령어 (Setting the entry point를 참고)

> 심볼 대입 (Assigning Values to Symbols 참고)

> 출력 섹션 기술

> 오버레이 기술


(type)

NOLOAD : 이 섹션을 로드가능하지 않게 한다. 그래서 프로그램이 실행될 때 메모리로 읽어들이지 않는다.

DSECT

COPY

INFO

OVERLAY

: 이 타입은 호환성을 위해 지원되며 거의 사용되지 않는다. 이들은 모두 섹션을 할당하지 않게 하여, 프로그램 실행 시 섹션에 대한 메모리가 할당되지 않게 한다.


AT 키워드

--> LMA를 변경한다. 

*/

/* output-section-command 종류

> 심볼 할당 (Assigning Values to Symbols 참조)

> 입력 섹션 기술 (Input section description 참조)

> 직접 포함할 자료값 (Output section data 참조)

> 특별한 출력 섹션 키워드 (Output section keywords 참조)

*/


반응형
Comments