• Paran Lee

[Training] 링맹(링커 스크립트 문맹) 탈출기 - Linux kernel 64 bit RISC-V (작성중)


이번에는 링커 스크립트에 대한 필수적인 내용을 알아보려고 해요. 링커 스크립트의 기본적인 문법과 예제로 리눅스 커널의 vmlinux.lds.S 기준으로 알아보도록 할께요.

TODO: 기본적인 문법을 정리하자.


아래는 linux/include/asm-generic/vmlinux.lds.h 경로에 위치한 주석 부분의 내용을 보기 편하게 나눠 놓았어요.

1 ~ 7: 링커 스크립트의 최소한의 내용을 샘플로 보여주고 있고, 아키텍쳐마다 특별한 구현이 있을 수 있다는 내용의 주석이네요.


9: OUTPUT_FORMAT 은 어떤 ELF 형식의 파일을 사용할 지 알려주는 커맨드에요.


8: OUTPUT_ARCH 는 어떤 아키텍쳐 형식으로 지정하는 커맨드에요.


10: 프로그램이 올라간 메모리 레이아웃에서 맨 처음 어떤 주소부터 시작할지 알려주는 커맨드에요.


11: SECTIONS 는 크게 아래 처럼 구성해요.


TODO: 안의 구성을 조사할 필요가 있음.


44 ~ 46: __init_begin, __init_end 영역은 init section 으로 초기화 이후 free 한다고 나와있어요.

그리고 page aligned 이기 때문에, .init 메모리를 깨끗하게 정리할 수 있다네요!


47: _stext, _etext 사이의 영역은 텍스트 섹션이에요.


48: _sdata, _edata 사이의 영역은 데이터 섹션이에요.


50 ~ 51: 특정 output section 은 특정한 상수들을 가질 수 있다는데 일단 지금은 중요한 내용은 아니에요!


링커도 컴파일러처럼 아키텍쳐마다 다르게 구현되어 있어요. 그리고 아키텍쳐마다 메모리 레이아웃이 다르기 때문에 링커 스크립트도 linux/arch/*/kernel/vmlinux.lds.S 로 각각 존재해요. 아래 RISC-V 기준의 vmlinux.lds.S 파일을 분석해볼께요.

RISC-V 에는 OUTPUT_FORMAT 을 따로 지정해주지 않고, RISC-V 링커가 사용하는 디폴트 값을 사용하네요.

그 다음 OUTPUT_ARCH 는 RISC-V 아키텍쳐에 맞게 지정해줘요.

프로그램 내의 실행되는 첫번째 instruction 을 entry point 라고 합니다. ENTRY 는 링커 스크립트 커맨드로 시작할 지점에 아래처럼 심볼 이름을 지정하여 사용한답니다.

OUTPUT_ARCH(riscv)
ENTRY(_start)

자 이제 SECTIONS 항목을 살펴볼 차례에요.

조회수 95회댓글 0개

관련 게시물

전체 보기