本節での作業を行うかどうかは任意です。 対象ユーザーがプログラマーではなく、プログラム類をデバッグするような使い方をしないのであれば、実行ファイルやライブラリに含まれるデバッグシンボルや不要シンボルを削除しても構いません。 そうすれば 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_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
ファイルフォーマットが認識できないファイルがいくつもエラーとなりますが、無視して構いません。 この警告は、処理したファイルが実行バイナリではなくスクリプトファイルであることを示しています。