Compile 원시 프로그램은 컴파일러를 통해 오브젝트 파일(목적프로그램)로 바꿔진다. 이 단계에서 아래와 같은 절차가 이뤄진다. - 만약 원시프로그램 이름이 a.c라면 a.c에 대하여 전처리기(preprocessor)를 수행시키고, 그 결과를 전처리된 임시파일에
저장한다. # cpp [other-command-line options] a.c
/tmp/a.i - a.i에 대하여 컴파일러를 수행시키고, a.s라는 어셈블러 코드를 생성한다. # cc1
[other-command-line options] /tmp/a.i -o /tmp/a.s - a.s에 대하여 어셈블러를 수행시키고, a.o라는 오브젝트 파일을 생성한다. # as
[other-command-line options] /tmp/a.s -o /tmp/a.o cpp, cc1, as는 GNU의 전처리기, 컴파일러, 어셈블러를 각각 나타내며, GCC 배포본 안에 들어있다. Linking 오브젝트 파일을 필요한 라이브러리와 연결시켜(링크) 컴퓨터가 알 수 있는 기계어로 바꾼다. 그러면 실제로 실행 가능한
파일을 생성하게 된다. # ld [other-command-line options] /tmp/a.o -o
a.out 리눅스의 gcc는 컴파일 시 자동으로 링크까지 수행한다. 생성된 실행 파일은 리눅스의 경우 특별히 이름을 지정하지 않으면 a.out라는
이름이 만들어진다. 최종적으로 만들어진 실행파일(a.out)은 이제 로드 될 준비가 되었다. 이것을 실행시키기 위해서 우리는 쉘 프롬프트 상에서 아래와 같이 타이핑한다. # ./a.out 그러면 쉘은 로더를 불러 a.out의 코드와 데이터를 메모리로 복사하고, 프로그램내의 제일 처음으로 제어권을 넘긴다. 여기서 말하는 로더는 execve라는 것으로 실행 가능한 오브젝트 파일의 코드와 데이터를 메모리로 로드하고 그 프로그램의 첫번째 명령어가
저장된 주소로 점프함으로써 프로그램을 수행하게 한다. a.out이라는 명칭은 a.out 오브젝트 파일들 안에 있는 어셈블러의
출력물에서 그 유래를 찾을 수 있다. 그 이후로 오브젝트 형식은 다양하게 바뀌어 왔지만, 그 이름은 계속 사용 되어지고 있다.
'Development > C' 카테고리의 다른 글
심볼 테이블 (Symbol Table) (0) | 2012.01.31 |
---|---|
프로그래머 10계명 (1) | 2011.09.25 |
심볼 테이블 (0) | 2011.07.31 |
toolchain 이란 (0) | 2011.02.12 |
C - 문자 '0'과 문자 '\0'의 차이 그리고 NUL과 NULL의 차이 (0) | 2011.02.12 |