이번 Chapter에서는 Linking 이라는 개념에 대해 알아볼 것입니다. 말만 거창하지 사실 크게 어려운 부분은 아닙니다.


위와 같이 두 개의 c 파일이 있다고 해 보겠습니다. C언어를 배운 적이 있는 사람들은 알겠지만, 저 두 파일은 서로 연결되어 하나의 프로그램이 될 수 있습니다.
그럼 여기서 main은 어떻게 swap 함수를 가져다 쓰고, swap에서는 어떻게 다시 main으로 돌아갈까요?
이 질문에 대한 대답이 바로 Linking 입니다.
Linking의 정의는 아래와 같이 내릴 수 있습니다.
컴파일러에 의해 만들어진 relocatable object files를 합쳐서 하나의 실행 파일을 만드는 것

여기서 이 Linking을 수행해주는 프로그램을 Linker 라고 부릅니다.
아래에서 linking에 대해 자세히 설명하기 전에 object file의 3가지 종류에 대해서 알면 좋을 거 같습니다.
Relocatable object file (.o file): 코드와 데이터를 포함합니다.
Executable object file (a.out file): 실행 파일입니다.
Shared obect file (.so file): Library처럼 Share 되는 파일입니다.
Linking에도 종류가 있습니다. 그 중 하나가 Static Linking 입니다. 이는 compile time에 끝이 납니다.
아래는 static linking을 잘 나타내는 그림입니다.

각각의 object file은 3개의 영역을 가지고 있습니다.
Linking이 진행됨에 따라 각각의 파일들의 같은 영역끼리 묶어서 다시 새로운 파일(실행 파일)을 만들게 됩니다. 이러한 특징 때문에 relocatable object file이라고 불리는 것 입니다.
Static Linker는 두가지 역할을 수행합니다.
Symbol resolution: 위에서 3가지 영역이 있다고 하였는데, 이에 맞게 분류하는 작업을 합니다.
Relocation: 분류된 것들을 메모리에 재배치하는 역할을 합니다.
Linking 방식 중 남은 하나는 Dynamic Linking 입니다. 이는 프로그램이 메모리에 로드될 때 Linking을 수행하는 방식입니다.
대표적인 예로는 라이브러리를 들 수 있는데, 모든 코드에서 다 사용되는 라이브러리 같은 경우 일일이 라이브러리를 지정하는 것보다 마지막에 한 번에 Linking을 통해 적용하는 것이 개별 프로그램의 사이즈를 줄이는 데 도움이 될 것입니다.
Dynamic Linker 는 Static Linker와 비슷하지만 조금 다른 역할을 수행합니다.
공유 라이브러리 로드: libc.so와 같은 라이브러리를 찾아 메모리에 올려 놓습니다.
Symbol 결합: printf() 함수는 libc.so에 정의되어 있으며, Linker가 함수를 연결합니다.
Relocation: static linker와 같은 역할을 합니다.
그럼 의문이 들 수 있습니다. Linker는 왜 사용해야하는 거냐? 크게 2가지 이유가 있습니다.
Modularity: 프로그램을 작은 소스 파일들로 나누어 작성할 수 있습니다. 이 또한 3가지 이점이 있습니다.
개발의 편리함: 소스 파일을 독립적으로 작성 및 관리 가능
재사용성: 공통 사용 함수들을 라이브러리로 만들어 여러 프로그램에서 재사용 가능
협업 가능: 여러 개발자가 서로 다른 소스 파일을 독립적 작업 가능
Efficiency
Time: 수정된 파일만 recompile하면 되기 대문에 시간을 절약할 수 있습니다. 또한 여러 파일들을 동시 컴파일 할 수 있기 때문에 시간을 단축할 수 있습니다.
Space: 실행 파일에는 실제 사용 함수만 포함되므로 크기가 작아집니다. 또한 공유 라이브러리를 동시에 사용하여 메모리를 효율적으로 사용할 수 있습니다.
Variable(변수)에는 Life와 scope라는 개념이 존재합니다. Life는 변수가 지속되는 시간, Scope는 변수가 적용되는 범위라고 생각하면 될 거 같습니다.
Symbol은 Linking에서 사용되는 개념이며, 4가지 종류의 variable 또는 function을 참조합니다.
또한 Symbol은 3가지 종류가 존재합니다.
Global symbols: 다른 모듈에서 사용 가능하도록 정의된 심볼
External symbols: 다른 모듈에서 정의된 것들을 참조하기 위해 정의된 심볼
Local symbols: 특정 module/function에서만 사용 가능한 심볼
심볼에도 level이 존재합니다. strong과 weak로 나누어집니다.
심볼에도 규칙이 있습니다.