lfs-ru/chapter08/stripping.xml

132 lines
7.7 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
<!ENTITY % general-entities SYSTEM "../general.ent">
%general-entities;
]>
<sect1 id="ch-system-stripping">
<?dbhtml filename="stripping.html"?>
<title>Удаление отладочных символов</title>
<para>Этот раздел является необязательным. Если предполагаемый пользователь
не является программистом и не планирует выполнять какую-либо отладку системного
программного обеспечения, размер системы можно уменьшить примерно на 2 ГБ, удалив
отладочные символы и некоторые ненужные записи таблицы символов из двоичных файлов
и библиотек. Это не вызывает никаких неудобств для обычного пользователя Linux.</para>
<para>Большинство людей, использующих приведенные ниже команды, не испытывают никаких
трудностей. Однако легко допустить опечатку и сделать новую систему непригодной для
использования. Поэтому перед выполнением команды <command>strip</command> рекомендуется
сделать резервную копию системы LFS.</para>
<para>Команда <command>strip</command> с параметром
<parameter>--strip-unneeded</parameter> удаляет все отладочные символы
из двоичного файла или библиотеки. Кроме этого, она удаляет все записи таблицы символов,
ненужные компоновщику (для статических библиотек) или динамическому компоновщику (для
динамически подключаемых двоичных файлов и общих библиотек).</para>
<!-- TODO: Zstd is better than Zlib for both speed and size.
Unfortunately Valgrind does not support Zstd-compressed debug
info yet: https://bugs.kde.org/show_bug.cgi?id=469782 -->
<para>Отладочные символы из выбранных библиотек сжимаются с помощью
<application>Zlib</application> и сохраняются в отдельных файлах. Эта
отладочная информация необходима при выполнении регрессионных тестов, с помощью <ulink
url='&blfs-book;/general/valgrind.html'>valgrind</ulink> или <ulink
url='&blfs-book;/general/gdb.html'>gdb</ulink> позже, в BLFS.
</para>
<para>Обратите внимание, что команда <command>strip</command> перезапишет двоичный файл
или библиотеку, которую она обрабатывает. Это может привести к сбою процессов, использующих
код или данные из файла. Если это затронет сам процесс, выполняющий <command>strip</command>,
удаляемый двоичный файл или библиотека могут быть уничтожены; это может сделать систему
полностью непригодной для использования. Чтобы избежать этого, мы скопируем некоторые
библиотеки и двоичные файлы в <filename class="directory">/tmp</filename>, очистим их
и переустановим с помощью команды <command>install</command>. Прочтите
статью <xref linkend="pkgmgmt-upgrade-issues"/>, чтобы понять, почему
следует использовать команду <command>install</command> здесь.</para>
<note><para>Имя загрузчика ELF — ld-linux-x86-64.so.2 в 64-битных системах.
и ld-linux.so.2 в 32-битных системах. Конструкция ниже выбирает
правильное имя для текущей архитектуры, исключая всё, что заканчивается
на <quote>g</quote>, если приведенные ниже команды уже были
выполнены.</para></note>
<important>
<para>
Если есть какой-либо пакет, версия которого отличается от версии, указанной в книге (либо в
соответствии с рекомендациями по безопасности, либо в соответствии с личными предпочтениями),
может потребоваться обновить имя файла библиотеки в <envar>save_usrlib</envar> или
<envar>online_usrlib</envar>. <emphasis role='bold'>В противном случае система может стать
полностью непригодной для использования.</emphasis>
</para>
</important>
<!-- also of interest are libgfortan, libgo, libgomp, and libobjc from GCC -->
<!--<screen><userinput>save_lib="ld-2.25.so libc-2.25.so libpthread-2.25.so libthread_db-1.0.so"-->
<screen><userinput>save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
libc.so.6
libthread_db.so.1
libquadmath.so.&libquadmath-version;
libstdc++.so.&libstdcpp-version;
libitm.so.&libitm-version;
libatomic.so.&libatomic-version;"
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-&binutils-version;.so
libsframe.so.&libsframe-version;
libhistory.so.&readline-soversion;
libncursesw.so.&ncurses-version;
libm.so.6
libreadline.so.&readline-soversion;
libz.so.&zlib-version;
libzstd.so.&zstd-version;
$(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
</userinput></screen>
<para>Большое количество файлов будет помечено как ошибочные, потому что формат
файла не распознан. Эти предупреждения можно смело игнорировать. Они указывают
на то, что файлы являются скриптами, а не двоичными файлами.</para>
</sect1>