링킹 (Linking)
: 링킹은 여러 목적 파일(object file)들을 연결하여 실행 가능한 프로그램을 만드는 과정입니다.
- object file : 소스 코드의 컴파일 결과물 (기계어 코드 + 데이터)
링킹의 목적
- 모듈화 : 프로그램을 하나의 파일이 아니라 여러개의 작은 파일들로 만들 수 있다.
- 공유자원을 만들기 쉽다.
- 효율성 : 분리된 상태로 컴파일 하면, 이미 컴파일한 object file 을 재사용가능하다.
- 변경할 때도 하나만 변경하고 따로 컴파일 하면 된다.
- 최종 실행파일을 작게 만들 수 있다.
링킹의 종류
- 정적 링킹(Static Linking): 컴파일 시점에 라이브러리를 프로그램에 포함시키는 방식입니다.
실행 파일의 크기가 커지지만, 외부 라이브러리 의존성 없이 독립적으로 실행 가능합니다.

- 동적 링킹(Dynamic Linking): 프로그램 실행 시점이나 로드 시점에 라이브러리를 연결하는 방식입니다. 실행 파일의 크기는 작지만, 외부 라이브러리가 필요합니다.
링킹
- 심볼 테이블: 각 목적 파일에는 심볼 테이블이 있습니다.
심볼 테이블은 각 목적 파일에서 정의된 심볼(함수, 변수)과 참조되는 심볼에 대한 정보를 담고 있습니다.
- 심볼 해결: 링커는 각 목적 파일의 심볼 테이블을 사용하여 심볼을 해결합니다. 즉, 한 목적 파일에서 참조되는 심볼이 다른 목적 파일에서 정의되어 있는 경우, 링커는 이 두 심볼을 연결합니다.
- 재배치: 링커는 각 심볼의 주소를 결정하고, 이를 참조하는 부분을 수정합니다.
예를 들어, 한 목적 파일에서 다른 목적 파일의 함수를 호출하는 경우,
링커는 호출하는 부분의 주소를 실제 함수의 주소로 수정합니다.
- 라이브러리: 링커는 표준 C 라이브러리와 같은 라이브러리도 연결합니다. 라이브러리는 자주 사용되는 함수들을 미리 컴파일해 놓은 파일입니다. 링커는 프로그램에서 사용되는 라이브러리 함수를 찾아서 프로그램에 연결합니다.
링킹 과정 (linking time)
- 심볼 해결(Symbol Resolution)
- 링커는 각 목적 파일에서 정의된 심볼(함수, 변수)과 참조되는 심볼을 연결합니다.
- 복수 개의 심볼을 허용하지 않는다.
- Symbol Talbe : 구조체 배열 → 심볼의 이름, 위치, 크기를 기록해둠
- 재배치(Relocation)
- 각 코드, 데이터 섹션을 하나로 합친다.
- object 파일에서 상대경로를 절대경로로 바꾼다. → 타 함수의 경로를 내가 정확하게 지정 불가능
- 심볼의 주소를 결정하고 → 이를 참조하는 부분을 수정한다.
$ gcc -Wall -Werror -O2 -std=c99 -o helloworld helloworld.o
//ldd 명령어를 사용하면 실행 파일에 어떤 라이브러리가 연결되어 있는지 확인할 수 있습니다.
$ ldd helloworld
linux-vdso.so.1 (0x00007ffe34d1a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f24dacbb00)
/lib64/ld-linux-x86-64.so.2 (0x00007f24db25c000)
Binary File
- Relocatable Object file ( .o file )
- 하나의 .c 파일이 하나의 .o 파일을 만든다.
- 재배치 가능한 object 파일끼리 모아서 실행가능한 object 파일을 만든다. 아직은 실행가능한 상태 아님
- Executable Object file ( a.out file, f file )
- 메모리에 직접 복사되어 실행될 수 있는 파일 → executable
- Shared Object file ( .so file )
- load time, run time 에서 메모리에 로드되어, 동적으로 링크될 수 있는 특별한 형태의 재배치 가능한 오브젝트 파일입니다.
- Called Dynamic Link Libraries (DLLs) by Windows
- 메모리에 어디든 올라갈 수 있다.
- 메모리 공간이 있었는데 printf 를 실행하려고 하면 .so file 을 메모리에 불러오고 거기서 printf 를 실행
ELF (Executable and Linkable Format)
: .o file a.out file .so file 을 위한 표준 파일 형식입니다. (Generic name = ELF binaries) - Object 파일도 ELF 파일이다.
ELF Object
File Format

- ELF header
- word size, file type, byte ordering
- loader 가 사용한다.
- Segment header table
- page size, virtual addresses, segment size
- .text section
- .rodata section
- .data section
- .bss section
- 초기화 되지 않은 전역변수
- “Block Started by Symbol”
- “Better Save Space”
- 섹션 헤더가 있지만 공간을 차지하지 않음
- .symtab section
- Symbol table
- procedure and static variable names
- Section 이름과 주소
- .rel .text section
- 합쳐졌을 때 바뀐 위치 저장
- Relocation info for .text section
- excutable 파일에 들어갈 명령어 주소
- Instructions for modifying
- .rel.data section
- Relocation info for .data section
- executable 파일로 갈 data의 포인터
- .debug section
- Info for symbolic debugging( gcc -g )
- Section header table
- Offsets and sizes of each section
Linker Symbol
- Global symbols
- External symbols
- Local symbols

- linker 가 관심있는 것은 변수보단 전역변수의 이름, 위치 같은것
- main.c
- sum.c
Local Symbol
- local non-static C variables (global 환경에서 정의된 static 변수)