lfs-ru/chapter08/binutils.xml
Poltern 77512d60a7 binutils: Add --enable-new-dtags
This option makes ld use DT_RUNPATH instead of DT_RPATH.  DT_RPATH is
generally considered bad because it takes precedence over
LD_LIBRARY_PATH.  For example, eog is linked with -rpath /usr/lib/eog,
and with DT_RPATH if an old eog is already installed we are basically
impossible to debug a new eog build w/o overwriting the system
installation first or explicitly using "ld.so --inhibit-rpath" to
invoke it.

This "new" actually means "new in 2000," it's 24 years ago and all other
distros has enabled it.  Thus I guess some unexplainable "test suite
uses installed library instead of the just built one" issues in BLFS are
actually caused by this difference: the package author just assumes
everyone is using DT_RUNPATH thus they just set LD_LIBRARY_PATH and
consider it enough to test with the just built libraries, but DT_RPATH
breaks this expectation.

Let's eliminate the difference as it seems not doing anything good and
doing so just takes one switch.
2024-08-06 21:07:39 +05:00

450 lines
19 KiB
XML
Raw Permalink 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-binutils" role="wrap">
<?dbhtml filename="binutils.html"?>
<sect1info condition="script">
<productname>binutils</productname>
<productnumber>&binutils-version;</productnumber>
<address>&binutils-url;</address>
</sect1info>
<title>Binutils-&binutils-version;</title>
<indexterm zone="ch-system-binutils">
<primary sortas="a-Binutils">Binutils</primary>
</indexterm>
<sect2 role="package">
<title/>
<para>Пакет Binutils содержит компоновщик, ассемблер и другие инструменты
для работы с объектными файлами.</para>
<segmentedlist>
<segtitle>&buildtime;</segtitle>
<segtitle>&diskspace;</segtitle>
<seglistitem>
<seg>&binutils-fin-sbu;</seg>
<seg>&binutils-fin-du;</seg>
</seglistitem>
</segmentedlist>
</sect2>
<sect2 role="installation">
<title>Установка пакета Binutils</title>
<para>Документация Binutils рекомендует выполнять компиляцию в
отдельном каталоге:</para>
<screen><userinput remap="pre">mkdir -v build
cd build</userinput></screen>
<para>Подготовьте Binutils к компиляции:</para>
<screen><userinput remap="configure">../configure --prefix=/usr \
--sysconfdir=/etc \
--enable-gold \
--enable-ld=default \
--enable-plugins \
--enable-shared \
--disable-werror \
--enable-64-bit-bfd \
--enable-new-dtags \
--with-system-zlib \
--enable-default-hash-style=gnu</userinput></screen>
<variablelist>
<title>Значение новых параметров настройки:</title>
<varlistentry>
<term><parameter>--enable-gold</parameter></term>
<listitem>
<para>Собирает компоновщик gold и устанавливает его как ld.gold (вместе с
компоновщиком по умолчанию).</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>--enable-ld=default</parameter></term>
<listitem>
<para>Собирает оригинальный компоновщик bfd и устанавливает его как ld
(компоновщик по умолчанию) и как ld.bfd</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>--enable-plugins</parameter></term>
<listitem>
<para>Включает поддержку плагинов для компоновщика.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>--with-system-zlib</parameter></term>
<listitem>
<para>Указывает, что необходимо использовать установленную библиотеку zlib вместо
сборки собственной.</para>
</listitem>
</varlistentry>
</variablelist>
<para>Скомпилируйте пакет:</para>
<screen><userinput remap="make">make tooldir=/usr</userinput></screen>
<variablelist>
<title>Значение параметра make:</title>
<varlistentry>
<term><parameter>tooldir=/usr</parameter></term>
<listitem>
<para>Обычно для tooldir (каталога, в котором будут расположены исполняемые
файлы) установлено значение <filename
class="directory">$(exec_prefix)/$(target_alias)</filename>. Например, машины
x86_64 преобразуют это значение в
<filename class="directory">/usr/x86_64-unknown-linux-gnu</filename>. Поскольку
это пользовательская система, то целевой каталог в <filename
class="directory">/usr</filename> не требуется. Параметр <filename
class="directory">$(exec_prefix)/$(target_alias)</filename> использовался, если бы система
применялась для кросс-компиляции (например, при компиляции пакета на компьютере
Intel, который генерирует код, который может быть выполнен на компьютерах PowerPC).</para>
</listitem>
</varlistentry>
</variablelist>
<important>
<para>Набор тестов для Binutils в этом разделе считается критически важным. Ни в
коем случае не пропускайте его.</para>
</important>
<para>Выполните тестирование:</para>
<screen><userinput remap="test">make -k check</userinput></screen>
<para>Чтобы получить список неудачных тестов, запустите:</para>
<screen><userinput remap="test">grep '^FAIL:' $(find -name '*.log')</userinput></screen>
<para>Двенадцать тестов завершаются неудачно в наборе тестов gold, когда GCC
собирается с параметрами
<option>--enable-default-pie</option> и
<option>--enable-default-ssp</option>.</para>
<!-- <para>Также известно, что завершаются неудачно три теста в пакете gprofng.</para>-->
<para>Установите пакет:</para>
<screen><userinput remap="install">make tooldir=/usr install</userinput></screen>
<para>Удалите бесполезные статические библиотеки:</para>
<screen><userinput remap="install">rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a</userinput></screen>
</sect2>
<sect2 id="contents-binutils" role="content">
<title>Содержимое пакета Binutils</title>
<segmentedlist>
<segtitle>Установленные программы</segtitle>
<segtitle>Установленные библиотеки</segtitle>
<segtitle>Созданные каталоги</segtitle>
<seglistitem>
<seg>addr2line, ar, as, c++filt, dwp, elfedit, gprof, gprofng, ld, ld.bfd, ld.gold, nm,
objcopy, objdump, ranlib, readelf, size, strings и strip</seg>
<seg>libbfd.so, libctf.so, libctf-nobfd.so, libgprofng.so,
libopcodes.so и libsframe.so</seg>
<seg>/usr/lib/ldscripts</seg>
</seglistitem>
</segmentedlist>
<variablelist>
<bridgehead renderas="sect3">Краткое описание</bridgehead>
<?dbfo list-presentation="list"?>
<?dbhtml list-presentation="table"?>
<varlistentry id="addr2line">
<term><command>addr2line</command></term>
<listitem>
<para>Переводит адреса программ в имена файлов и номера строк; учитывая
адрес и имя исполняемого файла, использует отладочную информацию в
исполняемом файле, для определения файла исходного кода и номера строки,
ассоциированной с адресом</para>
<indexterm zone="ch-system-binutils addr2line">
<primary sortas="b-addr2line">addr2line</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="ar">
<term><command>ar</command></term>
<listitem>
<para>Создаёт, изменяет и распаковывает архивы</para>
<indexterm zone="ch-system-binutils ar">
<primary sortas="b-ar">ar</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="as">
<term><command>as</command></term>
<listitem>
<para>Ассемблер, который собирает результат работы <command>gcc</command>
в объектные файлы</para>
<indexterm zone="ch-system-binutils as">
<primary sortas="b-as">as</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="c-filt">
<term><command>c++filt</command></term>
<listitem>
<para>Используется компоновщиком для исправления символов C++ и Java и
предотвращения конфликтов перегруженных функций.</para>
<indexterm zone="ch-system-binutils c-filt">
<primary sortas="b-c++filt">c++filt</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="dwp">
<term><command>dwp</command></term>
<listitem>
<para>Утилита для упаковки DWARF</para>
<indexterm zone="ch-system-binutils dwp">
<primary sortas="dwp">dwp</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="elfedit">
<term><command>elfedit</command></term>
<listitem>
<para>Обновляет ELF заголовки в ELF файлах</para>
<indexterm zone="ch-system-binutils elfedit">
<primary sortas="b-elfedit">elfedit</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="gprof">
<term><command>gprof</command></term>
<listitem>
<para>Отображает в графическом виде информацию о профилировании</para>
<indexterm zone="ch-system-binutils gprof">
<primary sortas="b-gprof">gprof</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="gprofng">
<term><command>gprofng</command></term>
<listitem>
<para>Собирает и анализирует данные о производительности</para>
<indexterm zone="ch-system-binutils gprofng">
<primary sortas="b-gprofng">gprofng</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="ld">
<term><command>ld</command></term>
<listitem>
<para>Компоновщик, который объединяет несколько объектных и архивных файлов
в один файл, перемещая их данные и связывая символическими ссылками</para>
<indexterm zone="ch-system-binutils ld">
<primary sortas="b-ld">ld</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="ld.gold">
<term><command>ld.gold</command></term>
<listitem>
<para>Урезанная версия ld, которая поддерживает только формат объектных файлов elf</para>
<indexterm zone="ch-system-binutils ld.gold">
<primary sortas="b-ld.gold">ld.gold</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="ld.bfd">
<term><command>ld.bfd</command></term>
<listitem>
<para>Жесткая ссылка на <command>ld</command></para>
<indexterm zone="ch-system-binutils ld.bfd">
<primary sortas="b-ld.bfd">ld.bfd</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="nm">
<term><command>nm</command></term>
<listitem>
<para>Выводит список символов, используемых в данном объектном файле</para>
<indexterm zone="ch-system-binutils nm">
<primary sortas="b-nm">nm</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="objcopy">
<term><command>objcopy</command></term>
<listitem>
<para>Преобразует один тип объектного файла в другой</para>
<indexterm zone="ch-system-binutils objcopy">
<primary sortas="b-objcopy">objcopy</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="objdump">
<term><command>objdump</command></term>
<listitem>
<para>Отображает информацию о данном объектном файле; можно указать
параметры, определяющие, какая конкретно информация будет отображаться.
Отображаемая информация полезна для программистов, которые работают над
инструментами, используемыми при компиляции </para>
<indexterm zone="ch-system-binutils objdump">
<primary sortas="b-objdump">objdump</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="ranlib">
<term><command>ranlib</command></term>
<listitem>
<para>Создает индекс содержимого архива и сохраняет его в архиве; в индексе
перечислены все символы, определенные в перемещаемых объектных файлах, содержащихся в
архиве</para>
<indexterm zone="ch-system-binutils ranlib">
<primary sortas="b-ranlib">ranlib</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="readelf">
<term><command>readelf</command></term>
<listitem>
<para>Отображает информацию о двоичных файлах типа ELF</para>
<indexterm zone="ch-system-binutils readelf">
<primary sortas="b-readelf">readelf</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="size">
<term><command>size</command></term>
<listitem>
<para>Отображает размеры секций и общий размер указанных объектных файлов</para>
<indexterm zone="ch-system-binutils size">
<primary sortas="b-size">size</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="strings">
<term><command>strings</command></term>
<listitem>
<para>Выводит для каждого указанного файла последовательности печатаемых
символов, которые имеют по крайней мере указанную длину (по умолчанию четыре);
для объектных файлов по умолчанию печатаются только строки из секций
инициализации и загрузки, в то время как для других файлов он сканирует весь файл.</para>
<indexterm zone="ch-system-binutils strings">
<primary sortas="b-strings">strings</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="strip">
<term><command>strip</command></term>
<listitem>
<para>Удаляет символы из объектных файлов</para>
<indexterm zone="ch-system-binutils strip">
<primary sortas="b-strip">strip</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="libbfd">
<term><filename class="libraryfile">libbfd</filename></term>
<listitem>
<para>Библиотека дескрипторов двоичных файлов</para>
<indexterm zone="ch-system-binutils libbfd">
<primary sortas="c-libbfd">libbfd</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="libctf">
<term><filename class="libraryfile">libctf</filename></term>
<listitem>
<para>Библиотека отладки формата Compat ANSI-C Type</para>
<indexterm zone="ch-system-binutils libctf">
<primary sortas="c-libctf">libctf</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="libctf-nobfd">
<term><filename class="libraryfile">libctf-nobfd</filename></term>
<listitem>
<para>Вариант libctf, не использующий функциональность libbfd.</para>
<indexterm zone="ch-system-binutils libctf-nobfd">
<primary sortas="c-libctf-nobfd">libctf-nobfd</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="libgprofng">
<term><filename class="libraryfile">libgprofng</filename></term>
<listitem>
<para>Библиотека, содержащая большинство подпрограмм, используемых
<command>gprofng</command></para>
<indexterm zone="ch-system-binutils libgprofng">
<primary sortas="c-libgprofng">libgprofng</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="libopcodes">
<term><filename class="libraryfile">libopcodes</filename></term>
<listitem>
<para>Библиотека для работы с опкодами&mdash;<quote>читаемыми</quote>
версиями инструкций для процессора.
Используется для сборки таких утилит как
<command>objdump</command></para>
<indexterm zone="ch-system-binutils libopcodes">
<primary sortas="c-libopcodes">libopcodes</primary>
</indexterm>
</listitem>
</varlistentry>
<varlistentry id="libsframe">
<term><filename class="libraryfile">libsframe</filename></term>
<listitem>
<para>Библиотека для поддержки обратной онлайн-трассировки с использованием
простого декодера разделов .sframe.</para>
<indexterm zone="ch-system-binutils libsframe">
<primary sortas="c-libsframe">libsframe</primary>
</indexterm>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>