본문 바로가기
System programming

Linking1

by sarberos 2022. 4. 4.
//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

댓글