—여기 부터 난이도가 많이 어려워지니 주의——

5.1 Linking

만약에 static Linking을 통해 program을 만들려면 두 개의 source file들을 각각 Translators를 통해 기계어로 번역을 시키로 linker을 통해 실행할 수 있는 program 파일이 완성될 것이다.

이 과정은 linux에서 다음과 같이 쓸 수 있다.

gcc -Og -o prog main.c sum.c

근데 여기서 궁금한게 있을 수 있다. 왜 Linker을 쓰냐? Linker을 쓰면 두 가지 장점이 있다. 첫 번째로 Modulartiry를 보장할 수 있고 두 번째는 Efficiency가 올라간다.

Modularity의 경우 program들을 여러 개의 파일을 나누어서 프로그램 파일 하나가 용량이 커지는 것을 막을 것이다. Efficiency는 Time과 Space 둘 다 절약할 수 있는데 space는 library의 남용을 막ㅇ르 수 있고 time은 separate로 link하는 과정을 합칠 수 있다.

그럼 Linker는 무엇을 할까?

Symbol resolution: Linker는 symbol table이라는 것을 object 파일 안에 만들어서 각 symbol이 함수인지 global 변수인지 static 변수인지 알려주며 이는 각 symbol reference를 정확히 하나의 symbol definition에 대응하기 위함이다.

Symbol table은 각 struct의 array 형태로 저장하여, symbol의 이름과 사이즈 그리고 그에 따른 위치를 정의해 놓는다.

마31.png

Relocation: linking을 하기 위해서 서로 분류된 source 파일에서 함수를 call 할 때 함수가 위치한 주소를 알아야 한다. 이에 linker가 서로 다른 selection에 있는 data를 하나의 section으로 합쳐야 하고 symbol table에 명시된 location을 relocate하여 새로운 주소로 바꿔주는 작업을 한다.