ch7-Linking
과거에는 수동으로 이루어졌지만, 현대에서는
이는 하나의 크고 긴 소스코드를 한번에 컴파일 하는 것이 아닌,
더 작고 다루기 쉬운 모듈(
어떤 부분에서의 수정은 해당 모듈에 대한 수정, 즉 재컴파일만 이루어지면 된다.
linking 과정에서 프로그램의 정당성(correctness) 에 영향을 줄 수 있다.
잘못 정의된 여러 전역변수는 linker 가 어떠한 에러도 보여주지 않는다.
이것이 어떻게 발생하는지, 어떻게 해결하는지 살펴본다.
전역변수와 지역변수의 차이, static
으로 정의한 것의 의미가 무엇인지 등을 살펴본다.
linker 에 의해 만들어진 목적파일(object file)은 시스템 함수에서 중요한 역할을 한다.
프로그램 로딩, 실행, 가상 메모리 등등이 있다.
과거에는 직관적인 일이었지만,
shared libraries, dynamic linking 의 중요성이 부각되면서, 그 과정은 좀 더 정교해졌다.
이에 따라 linking 은 유용한 도구가 되었다.
예를 들어,
여러 시스템에서 같은 파일로 사용할 수 있다는 장점이 있다. 각 시스템에서 linking 을 통해 시스템용 실행 파일로 변환된다.
이 챕터에서는 모든 linking 의 양상을 살펴본다.
여기서는 특정 환경에 종속적으로 확인하지만, 주요한 컨셉은 다른 시스템에서도 동일하다.
7.1-Compiler_Drivers
7.2-Static_Linking
7.3-Object_Files
7.4-Relocatable_Object_Files
7.5-Symbols_and-Symbol_Tables
7.6-Symbol_Resolution
아래는 해당 챕터에서 계속 살펴볼 2개의 소스코드이다.
int sum(int *a, int n);
int array[2] = {1, 2};
int main() {
int val = sum(array, 2);
return val;
}
int sum(int *a, int n) {
int i, s = 0;
for(i = 0; i < n; i++) {
s += a[i];
}
return s;
}