Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- java
- 건조합니다
- 쉽지요잉
- 봄
- 서비스
- OWL
- 이게 뭐니
- XML
- 우분투
- Android
- iphone
- 원격으로 컴퓨터 끄기
- 과제
- ontology
- TPC-C
- 안드로이드
- 3GS
- Mac
- 아이폰
- 설명좀 써줍니다
- OSGi
- Benchmark
- rdf
- 블로그가
- TunesMate
- JNI
- w3c
- 앱
- uPnP
- book
Archives
- Today
- Total
infatuation
컴파일 과정 & 오브젝트 파일 & 링킹 본문
컴파일 과정
C 코드를 컴파일 할 때 가장 먼저 수행되는 것은 전처리기.
전처리기에서 처리된 결과는 임시 파일로 저장 >> 생성된 파일은 컴파일러에서 하드웨어 종속적인 어셈블리 코드를 생성
>> 어셈블러는 생성된 어셈블리 코드를 처리해서 오브젝트 파일을 생성 >> 오브젝트 파일들은 링킹과 재배치 과정을 거쳐 실행 파일로 생성
* 컴파일 과정(GNU C compiler인 gcc 경우)
test.c -> 전처리기 -> test.i -> 컴파일러 -> test.s -> 어셈블러 -> test.o -> 링커 -> test(실행파일)
Object File
* 오브젝트 파일(Object file) : PE(Portable Executable) - 윈도우에서 사용 , COFF(Common Object File Format), ELF(Executable and Linking Format) - 유닉스, 리눅스, 솔라리스에서 사용
* 오브젝트 파일의 3가지 타입
1) 재배치 가능 파일 : 코드와 데이터로 구성, 다른 오브젝트 파일과 결합하여 실행 가능 파일이나 공유 오브젝트 파일을 생성
2) 실행 가능 파일: 실행 가능한 프로그램을 가지고 있음.
3) 공유 오브젝트 파일 : 코드와 데이터로 구성, 재배치 가능한 오브젝트 파일로 프로그램 실행 시 도적으로 로드 및 링킹되는 파일
* 오브젝트 파일 구성 : 헤더와 섹셩
1) 헤더 : 파일 구성에 대한 정보
2) 섹션 : 실행코드나 데이터를 저장, 링킹에 필요한 제어 정보를 가지고 있음
- 컴파일된 바이너리 코드 : Text 섹션
- 상수같은 읽기 전용 데이터 : rodata 섹션
- 초기화 된 전역 변수나 정적 변수 : data 섹션
- 초기화 되지 않은 전역 변수가 정적 변수 : bss 섹션
- 프로그램에서 정의된 전역변수와 함수들에 대한 참조 정보 : symtab 섹션
Linking
* Linking : 여러 개로 나눠진 오브젝트 파일들을 하나로 합치는 역할
- 컴파일에서 만들어진 오브젝트 파일들의 포맷은 그대로 유지, 파일들의 모든 코드와 데이터를 포함하는 새로운 오브젝트 파일을 생성
- 여러 오브젝트 파일들의 코드는 text 섹션에, 초기화된 전역 변수와 정적변수는 data 섹션에, 초기화되지 않은 전역변수와 정적 변수는 bss 섹션으로 묶여져 하나의 파일을 이룸.
- 결정되지 않은 심볼을 찾아 값을 결정해 주는 일도 수행함
- 링커는 재배치가 가능한 오브젝트 파일을 생성함
- 심볼 해석의 역할 : 심볼 테이블에는 배치나 재배치를 할 때 필요한 프로그램의 심볼의 정의나 참조값에 대한 정보가 들어있다.
Relocation
* 재배치(relocation) : 심볼 정의와 심볼 참조를 연결하는 과정
- 프로그램에서 함수를 호출하면 함수 분기 명령을 적합한 목적 주소로 변환하는 작업이 재배치 과정에서 일어남. 그래서 재배치 가능 파일은 각 섹션 내용을 정렬하는 정보가 필요 >> 여러 개의 오브젝트 파일이 결합할 경우, 같은 이름의 섹션들은 하나의 섹션에 저장. 이 과정을 거치면 실행 가능 파일이나 공유 오브젝트 파일들이 실행 이미지에서 필요한 올바른 정보를 갖게 한다.
'Study > OS&Linux' 카테고리의 다른 글
뮤텍스(Mutex)와 세마포어(Semaphore) (5) | 2011.05.09 |
---|---|
운영체제가 있는 경우의 main() 호출과정 (0) | 2010.11.18 |
리눅스 Vmware 구동시 하드웨어 제어(Beep음, 네트워크 인식) (0) | 2010.10.17 |
OLE(Object Linking and Embedding) (0) | 2010.08.26 |