차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
linuxfromscratch:12.1:152-stripping [2024/05/27 12:25] – 만듦 - 바깥 편집 127.0.0.1linuxfromscratch:12.1:152-stripping [2024/06/18 04:01] (현재) – [8.82. 스트립] baecy
줄 1: 줄 1:
 +^  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** 명령을 사용하는 근거를 확인할 수 있습니다.)
 +
 +<WRAP info center round 90%>
 +**참고** \\
 +ELF 로더의 이름은 64비트 시스템에서는 ld-linux-x86-64.so.2, 32비트 시스템에서는 ld-linux.so.2입니다. 아래 구문은 아래 명령이 이미 실행된 경우 g로 끝나는 것을 제외하고 현재 아키텍처에 맞는 올바른 이름을 선택합니다.
 +</WRAP>
 +
 +<WRAP important center round 90%>
 +**중요** \\
 +책에서 지정한 버전과 다른 버전이 있는 패키지가 있는 경우(보안 권고에 따르거나 개인 취향에 따라) ''save_usrlib'' 또는 ''online_usrlib''에서 라이브러리 파일 이름을 업데이트해야 할 수 있습니다. 그렇게 하지 않으면 시스템을 완전히 사용할 수 없게 될 수 있습니다.
 +</WRAP>
 +
 +<code bash>
 +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
 +</code>
 +
 +파일 형식이 인식되지 않아 많은 수의 파일이 오류로 표시될 수 있습니다. 이러한 경고는 안전하게 무시해도 됩니다. 해당 파일이 바이너리가 아닌 스크립트임을 나타냅니다.
  
  • linuxfromscratch/12.1/152-stripping.1716812714.txt.gz
  • 마지막으로 수정됨: 2024/05/27 12:25
  • 저자 127.0.0.1