^ Linux From Scratch - Version 12.1-systemd ^^^
^ Chapter 8. Installing Basic System Software ^^^
|[[.:151-about_debugging_symbols|이전]] | [[.:08-installing_basic_system_software|위로]] / [[.:12.1|처음으로]] | [[.:153-cleaning_up|다음]]|
|디버깅 심볼 | 정리|
----
===== 8.82. 스트립 =====
이 장의 내용은 선택적인 사항입니다. 사용자가 프로그래머가 아니고 시스템 소프트웨어의 디버깅을 수행할 계획이 없는 경우 바이너리와 라이브러리에서 디버깅 심볼과 일부 불필요한 심볼 테이블 항목을 제거하여 시스템 크기를 약 2GB 줄일 수 있습니다. 이는 일반적인 Linux 사용자에게는 큰 불편을 초래하지 않습니다.
아래에 언급된 명령을 사용하는 대부분의 사람들은 어려움을 겪지 않습니다. 그러나 실수로 인해 새 시스템을 사용할 수 없게 만드는 것은 쉽습니다. 따라서 **strip** 명령을 실행하기 전에 현재 상태의 LFS 시스템을 백업하는 것이 좋습니다.
**strip** 명령은 //--strip-uneeded// 옵션을 사용하여 바이너리 또는 라이브러리에서 모든 디버그 심볼을 제거합니다. 또한 링커(정적 라이브러리의 경우) 또는 동적 링커(동적으로 링크된 바이너리 및 공유 라이브러리의 경우)에 필요하지 않은 모든 심볼 테이블 항목도 제거합니다.
선택한 라이브러리의 디버깅 심볼은 Zlib로 압축되어 별도의 파일에 보존됩니다. 이 디버깅 정보는 나중에 BLFS에서 [[beyondlinuxfromscratch:installedpackages:valgrind]] 또는 [[beyondlinuxfromscratch:installedpackages:gdb]]로 회귀 테스트를 실행하는 데 필요합니다.
**strip**은 처리 중인 바이너리 또는 라이브러리 파일을 덮어쓴다는 점에 유의하세요. 이로 인해 파일의 코드나 데이터를 사용하는 프로세스가 충돌할 수 있습니다. 스트립을 실행 중인 프로세스가 영향을 받으면 스트립되는 바이너리 또는 라이브러리가 파괴되어 시스템을 완전히 사용할 수 없게 될 수 있습니다. 이 문제를 방지하려면 일부 라이브러리와 바이너리를 /tmp로 복사하여 스트립한 다음 **install** 명령으로 다시 설치합니다. ([[.:072-package_management#8.2.1. 업그레이드 문제|8.2.1절 "업그레이드 문제"]]의 관련 항목에서 **install** 명령을 사용하는 근거를 확인할 수 있습니다.)
**참고** \\
ELF 로더의 이름은 64비트 시스템에서는 ld-linux-x86-64.so.2, 32비트 시스템에서는 ld-linux.so.2입니다. 아래 구문은 아래 명령이 이미 실행된 경우 g로 끝나는 것을 제외하고 현재 아키텍처에 맞는 올바른 이름을 선택합니다.
**중요** \\
책에서 지정한 버전과 다른 버전이 있는 패키지가 있는 경우(보안 권고에 따르거나 개인 취향에 따라) ''save_usrlib'' 또는 ''online_usrlib''에서 라이브러리 파일 이름을 업데이트해야 할 수 있습니다. 그렇게 하지 않으면 시스템을 완전히 사용할 수 없게 될 수 있습니다.
save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
libc.so.6
libthread_db.so.1
libquadmath.so.0.0.0
libstdc++.so.6.0.32
libitm.so.1.0.0
libatomic.so.1.2.0"
cd /usr/lib
for LIB in $save_usrlib; do
objcopy --only-keep-debug --compress-debug-sections=zlib $LIB $LIB.dbg
cp $LIB /tmp/$LIB
strip --strip-unneeded /tmp/$LIB
objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
install -vm755 /tmp/$LIB /usr/lib
rm /tmp/$LIB
done
online_usrbin="bash find strip"
online_usrlib="libbfd-2.42.so
libsframe.so.1.0.0
libhistory.so.8.2
libncursesw.so.6.4-20230520
libm.so.6
libreadline.so.8.2
libz.so.1.3.1
libzstd.so.1.5.5
$(cd /usr/lib; find libnss*.so* -type f)"
for BIN in $online_usrbin; do
cp /usr/bin/$BIN /tmp/$BIN
strip --strip-unneeded /tmp/$BIN
install -vm755 /tmp/$BIN /usr/bin
rm /tmp/$BIN
done
for LIB in $online_usrlib; do
cp /usr/lib/$LIB /tmp/$LIB
strip --strip-unneeded /tmp/$LIB
install -vm755 /tmp/$LIB /usr/lib
rm /tmp/$LIB
done
for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
$(find /usr/lib -type f -name \*.a) \
$(find /usr/{bin,sbin,libexec} -type f); do
case "$online_usrbin $online_usrlib $save_usrlib" in
*$(basename $i)* )
;;
* ) strip --strip-unneeded $i
;;
esac
done
unset BIN LIB save_usrlib online_usrbin online_usrlib
파일 형식이 인식되지 않아 많은 수의 파일이 오류로 표시될 수 있습니다. 이러한 경고는 안전하게 무시해도 됩니다. 해당 파일이 바이너리가 아닌 스크립트임을 나타냅니다.