Search

'CLKH64 OS/07장'에 해당되는 글 4건

  1. 2013.01.01 링커스크립트

링커스크립트

CLKH64 OS/07장 2013. 1. 1. 01:00 Posted by 알 수 없는 사용자

1. 모르는 내용

7장에서  링커 스크립트란게 나오는데 첨봤다.

내가 이걸 알아야 하는 이유는 C 언어를 OS개발에 쓰기 위해서다.

어셈블리어와 C언어로 코딩된 파일을 컴파일 해 오브젝트 파일로 만들고

링커 스크립트로 섹션을 추출해서 하나의 바이너리로 만들기 위함임.

2. 컴파일 과정

아래는 c 파일을 exe로 만드는 과정.


그림1 [각주:1]

 

우리가

gcc -o test test.c 

와 같이 하면 결과는 "test.exe" 파일이 하나 나오지만

실제로 그 과정은 위 그림과 같이 여러 단계를 거치게 된다.

 

다시 말해서, gcc는

전처리기(cpp0), C컴파일러(cc1), 어셈블러(as), 링커(ld or collect2) 로 구성되어 있다는 것이다.

 

다음을 커맨드를 통해서 확인할 수 있다. 이 커맨드를 실행하면 각 단계를 거친 파일들이 생성된다.

gcc --save-temps -o test test.c

 

1. 전처리기인 cpp0 통해 매크로를 해석하며, 그결과는 test.i 와 같이 확장자가 i 인 파일로 나타난다.

2. test.i 를 C컴파일러인 cc1이 해석하며 그 결과는 test.s 와 같이 어셈블리어 파일로 나타난다.

(중간에 어셈블리어 단계를 둔 이유는, 플랫폼이 x86만 있는게 아니기 때문이다.)

3. test.s 를 어셈블러인 as가 해석하며 그 결과는 test.o 와 같이 오브젝트 파일로 나타난다.

4. 링커인 ld 또는 collect2(최신버전 gcc는 이게 탑재되어 있다고 한다.)가 오브젝트 파일을 링킹하여 executable 파일을 만들어 낸다.

이때, 링킹 과정에 쓰이는게 링커 스크립트다.

 

3. 링커 스크립트

링커 스크립트는 링커가 다수의 오브젝트파일에서

- 필요한 섹션을 추출하고,

- 출력 파일 내의 어드레스를 지정하며

- 필요한 동적 라이브러리 정보를 링킹

하는데 사용하는 스크립트다. 아무것도 지정하지 않으면 Default 스크립트를 사용한다.

 

스크립트에 대한 자세한 설명은 여길[각주:2] 참조하도록 하자

 

4. C - Assembly 같이 사용하기

C언어를 위해 준비해야 할것은 다음과 같다.

- 스택 : C언어 함수는 스택을 사용한다.

- .data section : 초기화된 전역변수가 이곳에 저장된다.

- .bss section : 초기화되지 않은 변수들이 이곳에 저장되나, 일반적으로 C에서는 모든 변수들이 0으로 초기화된다.(라고 참조 문서에 써있음.)

- .text section : 실행 코드가 저장되는 영역

자세한 내용을 여길 [각주:3] 참조해라.

 

 

 

 

참조

- http://www.iamroot.org/xe/28312 (링커 스크립트 개요)

- http://sourceware.org/binutils/docs-2.21/ld/ (LD 메뉴얼)

- http://korea.gnu.org/manual/release/ld/ld-mahajjh/ld_3.html#SEC6 

(위에꺼 번역본)

- http://recipes.egloos.com/5332087 (친절한 임베디드, 링커 스크립트가 뭐죠?)

- http://blog.daum.net/english_100/65 (링커 스크립트의 이해)

- http://kjhworld.tistory.com/entry/Linker-Script 

(링커스크립트파일 설명)

 

 

Embedded Programming with the GNU Toolchain

- http://www.bravegnu.org/gnu-eprog/linker.html (6. Linker)

- http://www.bravegnu.org/gnu-eprog/lds.html (7. Linker Script)

- http://www.bravegnu.org/gnu-eprog/c-startup.html (10. C Startup)

 

 

OS Dev 링크

- http://wiki.osdev.org/Linker_Scripts

- http://wiki.osdev.org/LD

- http://wiki.osdev.org/Linkers

- http://wiki.osdev.org/How_kernel,_compiler,_and_C_library_work_together 

(C와 Assembly섞어쓰기)

 

Objdump, Objcopy 사용법

- http://devanix.tistory.com/187

- http://devanix.tistory.com/188

- http://devanix.tistory.com/189

  1. http://clansim.tistory.com/48 [본문으로]
  2. http://kjhworld.tistory.com/entry/Linker-Script [본문으로]
  3. http://www.bravegnu.org/gnu-eprog/c-startup.html [본문으로]

'CLKH64 OS > 07장' 카테고리의 다른 글

7장 대략적인 설명  (2) 2013.01.07
파이썬으로 만든 ImageMaker  (0) 2013.01.02
Makefile  (1) 2013.01.01