6.10. 툴체인 조정

이제 최종 C 라이브러리가 설치되었으므로, 툴체인(toolchain)을 조정해서 새롭게 컴파일될 프로그램들이 이 새로운 라이브러리들에 연결되도록 해야 한다.

먼저 /tools 링커를 백업하고 5장에서 만든 조정된 링커로 교체한다. 또 /tools/$(uname -m)-pc-linux-gnu/bin에 해당 링커에 대한 심볼릭 링크도 만들 것이다:

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

다음으로 GCC spec 파일이 새로운 동적 링커를 참조하도록 수정한다. 단순히 /tools의 모든 인스턴스를 삭제하면 동적 링커에 대한 올바른 경로가 남는다. 또한 GCC가 올바른 헤더와 Glibc 시작 파일들을 찾을 수 있도록 spec 파일을 조정한다. 다음 sed 명령을 실행하라:

gcc -dumpspecs | sed -e 's@/tools@@g'                   \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' >      \
    `dirname $(gcc --print-libgcc-file-name)`/specs

Spec 파일이 실제로 의도한 대로 수정됐는지 직접 확인하는 것이 좋다.

여기서 조정된 툴체인의 기본 기능(컴파일 및 링크)이 예상대로 작동하는지 확인하는 것이 필수이다. 다음 온전성 검사를 수행하라:

echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

마지막 명령의 출력은(플랫폼에 따른 동적 링커 이름의 차이는 무관) 다음과 같으며 오류가 없어야 한다:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

64비트 시스템에서 동적 링커의 위치는 /lib이지만, /lib64의 심볼릭 링크를 통해 액세스된다는 점을 참고하라.

[참고]

참고

32비트 시스템에서 인터프리터는 /lib/ld-linux.so.2여야 한다.

이제 올바른 시작 파일을 사용하도록 설정되었는지 확인하라:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

이 명령의 출력은 다음과 같아야 한다:

/usr/lib/../lib/crt1.o succeeded
/usr/lib/../lib/crti.o succeeded
/usr/lib/../lib/crtn.o succeeded

컴파일러가 올바른 헤더 파일을 검색하는지 확인하라:

grep -B1 '^ /usr/include' dummy.log

이 명령은 다음과 같은 결과를 출력해야 한다:

#include <...> search starts here:
 /usr/include

그 다음, 새 링커가 올바른 검색 경로와 함께 사용되고 있는지 확인하라:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

'-linux-gnu' 요소가 있는 경로에 대한 참조는 무시해도 되지만, 나머지 결과는 다음과 같아야 한다:

SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib")

다음으로 올바른 libc를 사용하고 있는지 확인하라:

grep "/lib.*/libc.so.6 " dummy.log

이 명령의 출력은 다음과 같아야 한다:

attempt to open /lib/libc.so.6 succeeded

마지막으로 GCC가 올바른 동적 링커를 사용하는지 확인하라:

grep found dummy.log

이 명령의 출력은 다음과 같아야 한다(플랫폼에 따른 동적 링커 이름의 차이는 무관):

found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

만약 출력이 위와 같이 나타나지 않거나 출력이 전혀 없다면, 무언가 심각하게 잘못된 것이다. 이전 단계를 조사하고 추적해서 문제가 어디에 있는지 파악하고 수정하라. 가장 유력한 원인은 spec 파일 조정에 이상이 생겼기 때문이다. 어떤 문제든 계속 진행하기 전에 해결해야 할 것이다.

모든 것이 올바르게 작동하면 테스트 파일을 정리하라:

rm -v dummy.c a.out dummy.log