gcc: 4.4.0
gcc 프로그램은 C 컴파일러로 알고 있지만
엄밀하게 말하면 C compiler driver이며 주어진 옵션을 처리한 후
"정해진 규칙"에 따라 실제 전처리기, 컴파일러, 어셈블러, 링커를 차례로 호출하는 역할을 한다.
여기서 정해진 규칙을 spec이라고 칭하며
사용자는 spec 파일을 제공하여 gcc의 여러 spec들을 override하는 것이 가능하다.
다음과 같이 gcc를 실행해보면 내장(built-in) spec을 이용한다는 정보를 볼 수 있다.
~/temp/gcc-test $ gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../srcdir/configure --prefix=/usr/local
Thread model: posix
gcc version 4.4.0 (GCC)
내장 spec들을 보고 싶다면 -dumpspecs 옵션을 주어 gcc를 실행하면 된다.
-dumpspecs의 출력을 살펴보면 다음과 같은 부분이 보인다
*lib:
%{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}
lib이라는 spec은 링크 시 링커에게 넘겨줄 라이브러리의 목록을 지정하는 것이다.
비교적 짧고 간단하므로 의미를 하나씩 살펴보면
먼저 -pthread 옵션이 주어졌을 때는 -lpthread를 출력하고
-shared 옵션이 주어졌을 때는 -lc를 출력하고
-shared 옵션이 주어지지 않고 -mieee-fp 옵션이 주어졌다면 -lieee를 출력하고
-shared 옵션이 주어지지 않고 -profile 옵션이 주어졌다면 -lc_p를 출력하고
-shared 옵션이 주어지지 않고 -profile 옵션이 주어지지 않았다면 -lc를 출력한다.
따라서 일반적으로 컴파일 시에 C 라이브러리와 링크를 하면서도
-lc 옵션을 주지 않았던 이유를 알 수 있다.
이제 실제로 specs 파일을 이용하여 이를 제어할 수 있는지 살펴보자.
먼저 다음과 같이 간단한 myspec 이라는 이름의 텍스트 파일을 만든다.
*lib:
%{!v:%e-v option must be given} -lc
spec에서 %e 문자가 나오면 이후의 문자열을 에러 메시지로 출력하고 종료한다.
위의 spec은 컴파일 시 -v 옵션을 지정하지 않으면 에러를 발생시키도록 한 것이다.
-v 옵션이 주어졌다면 에러가 발생하지 않고 단지 -lc 만을 출력한다.
(-lc를 빼먹으면 링크 과정에서 (당연히) 에러가 나므로 반드시 넣어둔다.)
그리고 다음과 같이 gcc를 실행해 보면 myspec을 이용한다는 것을 볼 수 있다.
~/temp/gcc-test $ gcc -specs=myspec hello.c
gcc: -v option must be given
~/temp/gcc-test $ gcc -specs=myspec hello.c -v
Using built-in specs.
Reading specs from myspec
...
~/temp/gcc-test $ ./a.out
Hello, world