티스토리 뷰
Linking
Linking : 여러 개의 코드와 데이터를 통합·연결하여 실행될 수 있는 하나의 파일로 만드는 작업
[ Linking의 종류 ]
Static Linking
: Compile-Time에 수행되는 Linking.
: 라이브러리를 같이 포함시켜 실행 파일을 만드는 방법.
(소스 코드와 라이브러리를 merge한다고 표현)
: 파일 수정 시 전체 파일을 모두 다시 Compile해야 하는 문제.
: Redundancy 발생 가능.
: -static 옵션으로 수행 가능.
Dynamic Linking
: Run-Time 또는 Load-Time에 수행되는 Linking.
: Dynamic Linker가 호출될 때 Share 과정을 거침.
: 메모리 상으로 효과적.
: 수행 시간 중에 Linking이 진행되므로, Runtime Overhead가 발생할 수 있음.
: 오류 생성 시 해당 오류가 발생한 라이브러리만 수정. (분할 작업 가능 → 생산성 향상)
: 필요한 기능을 지닌 라이브러리를 재활용 가능.
: -shared 옵션으로 수행 가능
[ Object File의 종류와 ELF ]
Relocatable File(.o file) : 실행 불가능한 파일. 불완전한 파일.
Executable File(.out / .exe file) : 실행 가능한 파일. 완전한 파일.
Shared File(.so / .dll file) : Dynamic Linking을 지원하기 위한 파일.
ELF File(Executable and Linkable Format)
: 리눅스에서 사용되는 위 3가지 파일의 Format을 말한다.
: 정형화된 File Format 구조를 가진다. (ELF 자료형)
[ Linker의 작업 수행 과정 ]
Linker : 컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 이를 단일 실행 프로그램으로 병합하는 프로그램.
1. Symbol Resolution
: 각각의 Symbol을 하나의 Symbol로 연결. → 같은 이름을 가진 Symbol을 Rule에 따라 관계 정의.
2. Relocation
: 파일을 Merge하면서 각각의 코드에 있는 주소를 하나의 파일에 맞게 수정해주는 작업.
(배치가 완료되므로 각각의 주소가 모두 결정되는 과정.)
: Section과 Symbol의 정의를 Relocate.
: Merge, Relocation, Update, Reference 과정 진행.
: ELF의 .text section에 코드, .data section에 초기화된 전역 변수가 들어간다.
[ Symbol과 Symbol Table ]
Symbol
: 함수 및 전역 데이터에 대한 정보를 포함하는 언어적 독립체.
Symbol Table
: 각 object file에 존재하는 Symbol의 정보를 저장한 테이블. (.symtab)
: Value, Bind, Type, Section, Size 정보를 가지고 있다.
: Linking 또는 Debuging 때만 필요하므로, 실행 파일로 넘어가면 사라진다.
Value : Symbol의 offset(시작 주소).
Bind : Symbol의 Bind 종류.
· 전역 심볼(Global Symbol) : non-static Symbol. 전역 변수와 전역 함수를 뜻한다.
· 지역 심볼(Local Symbol) : static Symbol. 정적 변수와 정적 함수를 뜻한다. (지역 변수가 아님)
· 외부 심볼(External Symbol)
: Undefined Symbol. 참조 심볼. 다른 파일에서 정의된 심볼을 참조하는 심볼.
: *UND*로 표시되며, 이를 pseudosection이라 한다.
Type : Function과 Object로 구분.
Section : ELF의 Section 부분을 말한다.
메모리 로드 영역
· .text : 소스 코드.
· .rodata : 읽기 전용 데이터. (Jump table 등)
· .data : 초기화 된 전역 또는 정적 변수.
· .bss
: 초기화 되지 않은 전역 또는 정적 변수.
: 실행될 때 공간을 아끼기 위함.
: 초기화가 0으로 된 경우도 이 section으로 오게 된다.
메모리 비-로드 영역
· .symtab : 심볼 테이블의 정보.
· .rel.text : 실행 파일에는 없는 section. 구멍 난 text가 들어가며, Linker가 다른 오브젝트 파일과 연결할 때 이용.
· .rel.data : 실행 파일에는 없는 section. 구멍 난 심볼(extern 변수, extern 함수)의 정보가 들어있다. Linking시 이용.
· .debug : 디버그 심볼 테이블의 정보.
· Section header table : 파일의 section들에 관한 정보가 입력 된 테이블.
· Pseudosection : Section header table에 엔트리가 없는 섹션.
- *ABS* : 재배치가 이뤄지면 안 되는 심볼을 위한 Section. Absolute.
- *UND* : External Symbol을 위한 Section. Undefined.
- *COM* : 초기화되지 않는 전역 변수들을 위한 Section. Common.
Size : Symbol의 크기.
[ Linker's Symbol Rules ]
Strong Symbol : 초기화 된 Global Symbol
Weak Symbol : 초기화되지 않은 Global Symbol
( 0으로 초기화 된 경우는 .bss section으로 들어가지만 Strong Symbol로 본다 )
Symbol Rules : Linking 시 동일한 Global Symbol이 존재 할 때 상관관계를 정해주는 규칙.
1. Strong Vs. Strong : Linking Error 발생
2. Strong Vs. Weak : Weak Symbol을 extern으로 지정.
3. Weak Vs. Weak
: 둘 중에 하나를 extern으로 지정. (어떤 것이 될 지는 알 수 없음)
: 두 변수의 자료형의 크기가 다를 경우 다른 변수의 주소에 침범해 데이터를 손실시킬 위험이 있음.
[ Library의 종류 ]
Static Library
: 프로그램을 컴파일하는 과정에서 포함시키는 오브젝트 파일의 모임.
: archive(ar command) 형태로 패키징. (.a file)
(archive : 여러 개의 파일을 묶어서 보관하는 기록 보관소. 용량 절감 효과.)
(윈도우 환경에서는 .lib file 형태이다. 하지만 .lib이 모두 정적 라이브러리는 아니다.)
: libc.a, libm.a 등이 이에 속한다.
: 이식성이 좋고 안정적이라는 장점이 있지만, Static Linking의 문제점이 그대로 적용된다.
: 정적 라이브러리를 Linking할 때, Command Line Order 문제를 해결하기 위해 라이브러리를 마지막에 써준다.
Shared Library
: 완성된 프로그램을 실행할 때 포함시키는 동적 라이브러리.
: Version Control 문제나 Server 문제를 쉽게 해결할 수 있음. → Restart, Recompile 방지.
[ Library Interpositioning ]
Interpositioning
: 원본의 파일 수정 없이 임의의 함수 호출 시 함수를 가로채 원하는 함수가 호출되도록 하는 방법.
: Compile-Time, Link-Time, Load/Run-Time에 수행 가능.
: 보안, 디버깅, 모니터링, 프로파일링에 사용 가능. Malloc Tracing이 대표적. → 메모리 누수 탐색, 할당 주소 추적
1. Compile-Time
: 소스 코드 컴파일 시 -I 옵션을 통해 헤더 파일 주소를 변경.
2. Link-Time
: -Wl,--wrap,malloc 옵션을 통해 참조를 변경. Static Linking 시에 가능.
3. Load/Run-Time
: Dynamic Linker의 LD_PRELOAD 환경 변수를 변경하여 가능.
: LD_PRELOAD="./mymalloc.so"; ./intr
'컴퓨터 공학 이론 > 시스템 프로그래밍' 카테고리의 다른 글
[시스템 프로그래밍] File Structure & I/O (0) | 2022.12.03 |
---|---|
[시스템 프로그래밍] Signal (0) | 2022.12.03 |
[시스템 프로그래밍] Process의 생성과 종료 (0) | 2022.12.02 |
[시스템 프로그래밍] Process와 Context Switching (0) | 2022.11.30 |
[시스템 프로그래밍] Exceptional Control Flow와 System Call (0) | 2022.11.29 |