CSAPP/1장

[CSAPP] 1-2 프로그램은 다른 프로그램에 의해 다른 형태로 변역된다.

넌뭐가그렇게중요해 2025. 3. 25. 16:13

우리가 c언어로 hello.c(소스 파일 또는 소스 코드)를 만들고 컴퓨터 시스템에서 실행시키려면 각 C 문장들은 다른 프로그램에 의해 저급 기계어 인스트럭션들로 번역되어야 한다. 이 인스트럭션들은 실행가능 목적 프로그램이라고 하는 형태로 합쳐져서 바이러니 디스크 파일로 저장됩니다. 목적프로그램은 실행가능 목적 파일이라고도 부른다.

컴파일러 드라이버는 유닉스 시스템에서 다음과 같이 소스파일에서 오브젝트 파일로 번역한다. 

위에 그림과 같이 우리가 쓴 hello.c를 컴퓨터가 읽으려면 4단계를 거칩니다. 이 4단계를 실행하는 프로그램들(전처리기, 컴파일러, 어셈블러, 링커)을 합쳐서 컴파일 시스템이라고 부릅니다. 

 

  • 전처리 단계 : 전처리기(cpp)는 본래 C 프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정한다. 예를 들어 hello.c 파일 첫 줄의 #include <stdio.h>는 전처리기에게 시스템 헤더파일인 stdio.h를 프로그램 문장에 직접 삽입하라고 지시한다. 그 결과 일반적으로. i로 끝나는 새로운 C 프로그램이 생성된다. 
  • 컴파일 단계 : 컴파일러(ccl)는 텍스트 파일 hello.i를 텍스트파일인 hello.s로 번역하며, 이 파일은 어셈블리어 프로그램이 저장된다. 이 프로그램은 다음과 같은 main 함수의 정의를 포함된다. 

2 ~ 7줄에서는 한 개의 저수준 기계어 명령어를 텍스트 형태로 나타내고 있습니다. 어셈블리어는 여러 상위 수준 언어의 컴파일러들을 위한 공통의 출력언어를 제공하기 때문에 유용합니다. e.g. C와 Fortan 컴파일러는 둘 다 동일한 어셈블리어로 출력 파일을 생성합니다. 

  • 어셈블리 단계 : 다음에는 어셈블러(as)가 hello.s를 기계어 인스트럭션으로 번역하고, 이들을 재배치가능 목적프로그램의 형태로 묶어서 hello.o라는 목적 파일에 그 결과를 저장한다. 이 파일은 main함수의 인스트럭션들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일이다. hello.o 파일을 텍스트 편집기로 열어보면 쓰레기 같은 데이터로 보일 것이다. 
  • 링크 단계 : hello프로그램이 C 컴파일러에서 제공하는 표준 C 라이브러리에 들어있는 printf 함수를 호출하는 것에 주목할 필요가 있다. printf 함수는 이미 컴파일된 별도의 목적파일인 printf.o에 들어 있으며, 이 파일은 hello.o 파일과 어떤 형태로든 결합되어야 한다. 링커 프로그램(Id)이 이 통합 작업을 수행한다. 그 결과 hello 파일은 실행가능 목적파일(즉, 실행파일)로 메모리에 적재되어 시스템에 의해 실행됩니다