7.1-Compiler_Drivers

는 필요에 따라
preprocessor, compiler, assembler, linker 를 불러 사용한다.

code/link/main.c
1
int sum(int *a, int n);
2
int array[2] = {1, 2};
3

4
int main() {
5
int val = sum(array, 2);
6
return val;
7
}
code/link/sum.c
1
int sum(int *a, int n) {
2
int i, s = 0;
3
for(i = 0; i < n; i++) {
4
s += a[i];
5
}
6
return s;
7
}

2개의 파일을 이용해 하나의 실행파일 prog 를 만드는 과정을 살펴보자.
이를 위해 명령어 gcc -Og -o prog main.c sum.c 를 실행시키게 된다.

driver는 첫번째로, 를 실행시킨다.
이는 C 소스코드를 중간파일(ASCII intermediate file) 인, 로 만든다.

그 다음으로, 을 실행시킨다.
이는 중간파일을 어셈블리 파일(ASCII assembly-language) 인, 로 만든다.

을 실행시킨다.
이는 어셈블리 파일을 재할당 가능한 이진 목적파일() 로 만든다.

sum.c 에 대해 동일한 과정을 거쳐, 목적파일을 만든다.

마지막으로, 을 실행시킨다.
main.o, sum.o 그리고 다른 필요한 시스템목적파일과 함께, 실행가능한 이진파일() 을 만든다.

마지막으로 실행을 위해, ./prog 를 입력하는데, 이는
터미널이 OS의 loader 라는 함수를 사용하는 것으로 이루어진다.
loader 는 코드와 데이터를 메모리에 복사하고, 통제권을 프로그램의 시작부분으로 넘겨준다.

PARA/Project/CS_APP_organize/chapter7/imgs/static_linking.png