linuxfromscratch:12.1:152-stripping

Linux From Scratch - Version 12.1-systemd
Chapter 8. Installing Basic System Software
이전 위로 / 처음으로 다음
디버깅 심볼 정리

이 장의 내용은 선택적인 사항입니다. 사용자가 프로그래머가 아니고 시스템 소프트웨어의 디버깅을 수행할 계획이 없는 경우 바이너리와 라이브러리에서 디버깅 심볼과 일부 불필요한 심볼 테이블 항목을 제거하여 시스템 크기를 약 2GB 줄일 수 있습니다. 이는 일반적인 Linux 사용자에게는 큰 불편을 초래하지 않습니다.

아래에 언급된 명령을 사용하는 대부분의 사람들은 어려움을 겪지 않습니다. 그러나 실수로 인해 새 시스템을 사용할 수 없게 만드는 것은 쉽습니다. 따라서 strip 명령을 실행하기 전에 현재 상태의 LFS 시스템을 백업하는 것이 좋습니다.

strip 명령은 –strip-uneeded 옵션을 사용하여 바이너리 또는 라이브러리에서 모든 디버그 심볼을 제거합니다. 또한 링커(정적 라이브러리의 경우) 또는 동적 링커(동적으로 링크된 바이너리 및 공유 라이브러리의 경우)에 필요하지 않은 모든 심볼 테이블 항목도 제거합니다.

선택한 라이브러리의 디버깅 심볼은 Zlib로 압축되어 별도의 파일에 보존됩니다. 이 디버깅 정보는 나중에 BLFS에서 valgrind 또는 gdb로 회귀 테스트를 실행하는 데 필요합니다.

strip은 처리 중인 바이너리 또는 라이브러리 파일을 덮어쓴다는 점에 유의하세요. 이로 인해 파일의 코드나 데이터를 사용하는 프로세스가 충돌할 수 있습니다. 스트립을 실행 중인 프로세스가 영향을 받으면 스트립되는 바이너리 또는 라이브러리가 파괴되어 시스템을 완전히 사용할 수 없게 될 수 있습니다. 이 문제를 방지하려면 일부 라이브러리와 바이너리를 /tmp로 복사하여 스트립한 다음 install 명령으로 다시 설치합니다. (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

파일 형식이 인식되지 않아 많은 수의 파일이 오류로 표시될 수 있습니다. 이러한 경고는 안전하게 무시해도 됩니다. 해당 파일이 바이너리가 아닌 스크립트임을 나타냅니다.

  • linuxfromscratch/12.1/152-stripping.txt
  • 마지막으로 수정됨: 2024/06/18 04:01
  • 저자 baecy