8.83. ストリップ

本節での作業を行うかどうかは任意です。 対象ユーザーがプログラマーではなく、プログラム類をデバッグするような使い方をしないのであれば、実行ファイルやライブラリに含まれるデバッグシンボルや不要シンボルを削除しても構いません。 そうすれば 2 GB ものサイズ削減を図ることができます。 普通の Linux ユーザーにとっては、実質的な問題はありません。

以下に示すコマンドは簡単なものです。 ただし入力つづりは簡単に間違いやすいので、もし誤った入力をするとシステムを利用不能にしてしまいます。 したがって strip コマンドを実行する前に、現時点の LFS システムのバックアップを取っておくことをお勧めします。

strip コマンドに --strip-unneeded オプションをつけて実行すると、バイナリやライブラリからデバッグシンボルをすべて削除します。 そして(スタティックライブラリ向けの)リンカーや(動的リンクバイナリあるいは共有ライブラリ向けの)ダイナミックリンカーにとって不要なシンボルテーブル項目もすべて削除します。

選択したライブラリから得られたデバッグシンボルは、Zlib によって圧縮され、個別のファイルに保存されます。 このデバッグ情報を必要とするのは BLFS における valgrind または gdb の縮退テストを実施するのに必要であるからです。

なお strip は、処理しているバイナリファイルやライブラリファイルを上書きします。 そのファイルにあるコードやデータを利用しているプロセスは、これによってクラッシュすることがあります。 仮に strip 自体を実行しているプロセスがその影響を受けたとすると、ストリップ最中のバイナリやライブラリは壊れてしまうかもしれません。 これが起きると、システムが完全に利用不能となりかねません。 これを避けるため、ライブラリやバイナリのいくつかを /tmp にコピーして、そこでストリップした上で、install コマンドを使って、元の場所に再インストールすることにします。 (ここで install コマンドを利用する意味については、「アップグレードに関する問題」 において説明しています。)

[注記]

注記

ELF ローダーの名前は、64 ビットシステムでは ld-linux-x86-64.so.2、32 ビットシステムでは ld-linux.so.2 です。 後述の手順では、現行のアーキテクチャーに合わせて適切な名前を選ぶようにしています。 ただし g で終わるものは除いています。 そのようなものはすでにコマンド実行されているからです。

[重要]

重要

各パッケージのバージョンが、本書に示すバージョンとは異なる場合(セキュリティアドバイザリに従った場合や、必要に応じて変更した場合)、save_usrlibonline_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

ファイルフォーマットが認識できないファイルがいくつもエラーとなりますが、無視して構いません。 この警告は、処理したファイルが実行バイナリではなくスクリプトファイルであることを示しています。