//main.c
int buf[2] = { 1,2 };
int main()
{
swap();
return 0;
}
extern int buf[]; //외부에서 선언한 int array
int *bufp0 = &buf[0]; //global variable
static int *bufp1; // global variable
//첫번째 element와 두번째 element를 바꿔주는 함수
void swap()
{
int temp;
bufp1 = &buf[1];
temp = *bufp0;
*bufp0 = *bufp1;
*bufp1 = temp;
}
이 프로그램을 컴파일 하기 위해 다음과 같이 입력한다.
unix> gcc -O2 -g -o p main.c swap.c
unix> ./p
main.c와 swap.c를 gcc를 이용해 컴파일 한다.
-o p : p라는 executable파일을 만듬
-o2 : 최적화

1. 각각 compil해서 relocatable object file로 만들어 준다.
main.c -> main.o
swap.c -> swap.o
cpp : 프리프로세서 (컴파일러에 들어가기전에 처리)
cc1 : C컴파일러 ( C -> 어셈블러)
as : 어셈블러 ( 어셈블러 -> 기계어)
2. Linker를 이용해 fully linked executable objectfile을 만든다.
Lining : Symbol resolution을 한다.
global variable은 심볼이다.
print와 같은 systemcall 은 linking을 할때 library에서 찾아 linking 한다.
linking은 static하게 할 수 있고 dynamic하게 할 수 있다.
static: library안에 있는 것을 p에 넣는다.
static linking을 하면 p안에 모든게 다 들어있다. 이 안에 모르는 symbol이 없다
dynamic의 결과로 나온 p 파일에는 아직 resolve되지 않은 symbol이 있다. 이것은 runtime에서 해결된다.
Linker를 사용하는 이유
1. Modularity
- 보통 프로그램은 한번에 작성되기 보다는 작은 부분으로 나누어져 작성된다. Linker를 사용할 경우 한 부분에서 수정이 발생하면 그 부분만 컴파일을 하면 된다.
- 한번 만들어서 여러곳에서 사용하는 library(common function)를 한번 만들어 놓고 계속해서 사용할 수 있다.
ex) math library, standard c library ..
2.Efficincy
- 시간 : 수정된 하나의 파일만 compile후 linking하면 된다.
- 공간 : library
여러곳에서 사용되는 library같은경우 메모리 한곳에 올려두고 여러 곳에서 불러서 사용할 수 있다.
Linker가 하는 것
1단계. Symbol resolution
위의 예시에서
- void swap(){}
- swap ();
int *xp = &x;
symbol table안에는 symbol의 이름, 사이즈, 위치 등이 들어가 있다.
2단계 : Relocation
code 부분과 data부분을 합친다.
typedef struct {
int offset;
int symbol:24,
type:8;
int value;
} Elf32_rel;
Relocation Entry : Relocaiton이 필요한 것들이 명시된 것.
Offset
Symbol
Type : 어떤식으로 relocaiton을 할지
Value : PC 보정값 / Array offset
ELF에는 11가지의 relocation type이 있다.
이중 많이 쓰이는 2가지는
R_386_PC32 : 32bit PC에 상대값 주소
R_387_32 : 32bit 절대값
먼저 Main.o에 있는 relocation entry를 보고
그다음Swap.o에 있는 relocation entry를 본다.
'System programming' 카테고리의 다른 글
| Linking 6 - Library interpositioning (0) | 2022.04.07 |
|---|---|
| Linker 문제2 (0) | 2022.04.06 |
| Linker 문제1 (0) | 2022.04.06 |
| Linker2 (0) | 2022.04.05 |
| 시스템프로그래밍1 - Overview (0) | 2022.04.04 |
댓글