// main.c
int sum(int *a, int n);
int array[2] = {1, 2};
int main() {
int val = sum(array, 2);
return val;
}
// sum.c
int sum(int *a, int n) {
int i, s = 0;
for (i = 0; i < n; i++) {
s += a[i];
}
return s;
}
<aside> 💡
사용자를 대신하여 언어 전처리기, 컴파일러, 어셈블러, 링커를 필요에 따라 호출하는 컴파일러 드라이버 제공
</aside>
GNU 컴파일 시스템을 사용할 경우 GCC 호출 방식
gcc -0g -o prog main.c sum.c
<aside>
정적연결 (출처 : CSAPP Fig. 7.2)
</aside>
ASCII 소스 파일 → 실행 목적 파일로 번역하는 동작 과정
드라이버는 **C 전처리기(cpp)**를 돌려 main.c
→ ASCII 중간 파일 main.i
로 번역
cpp [other arguments] main.c /tmp/main.i
드라이버는 **C 컴파일러(cc1)**을 돌려 main.i
를 ASCII 어셈블리 언어 파일인 main.s
로 번역
cc1 /tmp/main.i -Og [other arguments] -o /tmp/main.s
**어셈블리(as)**를 돌려 main.s
를 재배치 가능한 바이너리 목적파일인 main.o
로 번역
as [other arguments] -o /tmp/main.o /tmp/main.s
<aside>
sum.o
를 얻기 위해sum.c
도 동일 과정을 수행
</aside>
마지막으로 링커 프로그램 ld
를 실행
prog
를 생성하기 위해 main.o
, sum.o
연결ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o
실행 파일인 prog를 실행하려면, prog를 명령줄에서 호출
./prog
OS 내 함수인 Loader를 호출 → prog의 코드와 데이터를 메모리로 복사, 제어를 프로그램의 시작 부분으로 전환
Previous Chapter
Next Chapter