1. Linking
1-1 about
- 여러개의 코드와 데이터를 통합, 연결 하여 실행될 수 있는 하나의 파일로 만드는 작업
- Modularity(모듈화)
- 하나의 거대한 파일이 아니라 여러개의 작은 source 파일이 모여 하나의 걷한 파일을 이룰 수 있으며, 라이브러리를 만들 때도 유용하게 쓰임
- Efficienc
- 여러개의 작은 source 파일로 나누게 되면 특정 source 파일만 다시 컴파일만 하고 linking 거치게 되면 시간적인 측면에서 효율적
- symbol table 만들어서 Global, static 변수 등 알려줌
- Relocation
- linking 위해 서로 분류된 소스 파일에서 함수 call할때, 함수가 위치한 주소 알아야한다. 이에 Linker가 서로 다른 section에 있는 data들을 하나의 section으로 합치는 작업을 하게 되고, symbol table에 며이된 ㅣocation을 Relocation 하여 새로운 주소로 바꿔주는 작업


- bss
-값 정의되지 않은 global 변수 저장
-어느정도의 size를 잡아야하는지에 초점 맞추게됨
-int a[100];
1-3 Linker SYMBOLS
- 링킹 시작시 각 파일에 존재하는 함수, 변수에 대해 분리작업 거치게 되는데 3가지 분류로 나뉨
- Global symbol
- global 변수로 정의된 변수들의 총 집합, 다른 모듈에서도 접근 및 사용 가능(extern 명시한 경우)
- non-staic C function, non-static C global variable
- 접근할 경우 Link error 유발할 수 있으며, symbol table에 들어가지 않는다
- External Symbol
-global 변수를 나타내지만, 파일내 가 아닌 다른 파일에서 명시된 변수나 함수
- Local symbols
- module 밖에서 정의된 symbol
- 다른 모듈에서 접근 불가능
- static으로 정의된 C function, variable
- local 변수와 Local linker symbol은 완전히 다름
1-3-1 Linker's SYmbol Rules
- Strong symbol : Procedures(함수 이름), Initialized variables(.data에 저장되는 변수들)
- Weak symbol : uninitialized variables(.bss)
- Rule 1 : Multiple strong symbols are not allowed
- strong symbol 에서 변수, 함수의 선언은 오직 한번만 허용
- 어길시 link error
- Rule 2 : Given a Strong symbol and multiple weak symbols, choose the strong symbols
- weak symbol에 대한 reference들이 strong symbol로 바뀌게 됨
- 에러가 발생하진 않음, symbol이 뒤바뀌면서 원하는 프로그램이 작동하지 않을 수 있다.
- Rule 3 : If there are multiple weak symbols, pick an arbitary one

- p1() {} : 서로 다른 c 파일에서 선언됨, Rule 1 위반 -> link error

- weak symbol이 동시에 서로 다른 파일에 정의 -> randim하게 변수 설정
- p1에서 x로 접근시, p2도 똑같은 x로 접근하게됨

- int, double 서로 다른 data type 형태로 같은 이름으로 변수 저장 -> Random하게 변수 선택
- P2의 double이 선택될 경우 큰문제 발생 X
- p1의 int 선택될 시 p2(){}에서 int x의 값을 받아와서 값을 수정할때 int와 인접한 data인 int y가 overwrite될 수 있음

- 반드시 overwrite 발생, int x = 7;은 strong symbol -> double x가 아닌 Int x 채택됨 이후 y = 5;가 저장, 즉 x, y는 인접한 데이터로 저장
-p2(){..}에서 x값 수정시 8바이트 수정이 되어 y의 값이 훼손

- strong symbol인 int x = 7 선택
- p2(){}에서도 해당 x 접근
- 컴파일 상 문제 x, 원하는 프로그램 구현 불가능
1-4 Relocation entries

- a : R_X86_64_32 array
- a 주소에 있는 값을 array 주소로 바꿔라
-f : R~ sum - 0x4
- f 주소에 있는 값을 sum의 상대주소로 바꿔라
1-5 Library
- 구식 : Static Libraries
- 연관된 obj 파일들 하나로 묶어 관리, 아카이브라 불리며, 일종의 압축 파일
- 아카이브에 속한 파일의 정보 링커에게 알려주기 위한 인덱스 포함
- 링커는 순회하며 symbol 찾아야함
- static library 만들기
- 각각의 c 파일 각각의 relocate obj파일로 만든다
- 아카이브 통해 하나의 아카이브로 묶는다. 아카이브는 묶어주는 작업을 하는 프로그램
- static 단점
- 실행파일마다 라이브러리를 필요로 하므로 라이브러리 중복
- 실행파일 중복(실행프로그램 데이터의 중복)
- 라이브러리를 수정하면 모든 실행파일에 대해 Relink 해야함
- 현대식 : Shared libraries
- 라이브러리 필요시 그때 그때 필요한 정보 빼오면 됨
- 필요한 정보 빼오기를 런타임에 수행
- 런타임 중 printf 발견시 그 시점에 관련 정보 빼옴
- 과거에 메모리에 올려놓은 것이 있다면 그 정보 이용