8.78. Удаление отладочных символов

Этот раздел не является обязательным. Если предполагаемый пользователь не является программистом и не планирует выполнять какую-либо отладку системного программного обеспечения, размер системы можно уменьшить примерно на 2 ГБ, удалив отладочные символы, ненужные записи таблицы символов из двоичных файлов и библиотек. Это не вызывает никаких неудобств, кроме невозможности полной отладки программного обеспечения.

Большинство людей, использующих приведенные ниже команды, не испытывают никаких трудностей. Однако легко допустить опечатку и сделать новую систему непригодной для использования, поэтому перед выполнением команды strip рекомендуется сделать резервную копию системы LFS.

Команда strip с параметром --strip-unneeded удаляет все отладочные символы из двоичного файла или библиотеки. Кроме этого, она удаляет все записи таблицы символов, ненужные компоновщику (для статических библиотек) или динамическому компоновщику (для динамически подключаемых двоичных файлов и общих библиотек).

Отладочные символы для выбранных библиотек помещаются в отдельных файлах. Эта отладочная информация необходима при выполнении регрессионных тестов, использующих valgrind или gdb в BLFS.

Обратите внимание, что команда strip перезапишет двоичный файл или библиотеку, которую она обрабатывает. Это может привести к сбою процессов, использующих код или данные из файла. Если это затронет сам процесс, выполняющий strip, удаляемый двоичный файл или библиотека могут быть уничтожены и могут сделать систему полностью непригодной для использования. Чтобы избежать этого, мы скопируем некоторые библиотеки и двоичные файлы в /tmp, очистим их и установим обратно с помощью команды install. Прочтите статью в Раздел 8.2.1, «Проблемы с обновлением», чтобы понять, почему следует использовать команду install здесь.

[Примечание]

Примечание

Имя загрузчика ELF — ld-linux-x86-64.so.2 в 64-битных системах. и ld-linux.so.2 в 32-битных системах. Конструкция ниже выбирает правильное имя для текущей архитектуры, исключая всё, что заканчивается на «g», если приведенные ниже команды уже были выполнены.

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.30
             libitm.so.1.0.0
             libatomic.so.1.2.0"

cd /usr/lib

for LIB in $save_usrlib; do
    objcopy --only-keep-debug $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.39.so
               libhistory.so.8.1
               libncursesw.so.6.3
               libm.so.6
               libreadline.so.8.1
               libz.so.1.2.12
               $(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

Для большого количества файлов будет выдано предупреждение, что формат файла не распознан. Эти предупреждения можно смело игнорировать. Они указывают на то, что файлы являются скриптами, а не двоичными файлами.