Lx4U-book/docs/build-temp-system/glibc.md
2021-10-12 19:18:09 +03:00

6.0 KiB
Raw Permalink Blame History

Дополнительные необходимые файлы

{{ patch.url }}

Настройка

Необходимо создать две символические ссылки:

ln -sfv ../lib/ld-linux-x86-64.so.2 $LIN/lib64
ln -sfv ../lib/ld-linux-x86-64.so.2 $LIN/lib64/ld-lsb-x86-64.so.3

Первая ссылка используется GCC, вторую требует LSB.

В пакете Glibc по умолчанию используется несоответствующая стандаруту FHS директория /var/db. Для исправления этого примените патч:

patch -Np1 -i ../glibc-2.33-fhs-1.patch

Пакет Glibc требует использовать отдельную директорию для сборки. Создайте её:

mkdir  build
cd     build

Убедитесь, что утилиты ldconfig и sln установлены в /usr/sbin:

echo "rootsbindir=/usr/sbin" > configparms

Запустите скрипт configure:

 ../configure                            \
      --prefix=/usr                      \
      --host=$LIN_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=3.2                \
      --with-headers=$LIN/usr/include    \
      libc_cv_slibdir=/lib               \
      libc_cv_include_x86_isa_level=no   \
      --disable-nscd                     \
      --disable-timezone-tools

Для multilib

Добавьте параметр --enable-multi-arch

Значения параметров

--host=$LIN_TGT, --build=$(../scripts/config.guess) - необходимо для кросс-компиляции.

--enable-kernel=3.2 - оптимизирует glibc для использования с ядрами новее 3.2.

--with-headers=$LIN/usr/include - задает путь к заголовкам ядра.

libc_cv_include_x86_isa_level=no - исключает возможную ошибку.

--disable-nscd, --disable-timezone-tools - демон nscd и инструменты для управления часовыми поясами не нужны для временной glibc.

Сборка

make

Установка

make DESTDIR=$LIN install

Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd:

sed '/RTLDLIST=/s@/usr@@g' -i $LIN/usr/bin/ldd

Завершите установку файла limits.h, запустив скрипт из состава GCC:

$LIN/tools/libexec/gcc/$LIN_TGT/11.2.0/install-tools/mkheaders

Тестирование

!> На данном этапе необходимо убедиться, что установленные ранее пакеты работают правильно. Внимательно изучите результаты вывода команд, и проверьте, что они строго соответствуют результатам вывода, приведенным ниже. Если есть несоответствия, значит инструкции на предыдущих этапах были выполнены некорректно.

Чтобы проверить правильность работы кросс-компилятора и libc, выполните:

echo 'int main(){}' > dummy.c
$LIN_TGT-gcc dummy.c
readelf -l a.out | grep '/ld-linux'

Вывод должен быть таким:

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Если все хорошо, удалите ненужные файлы:

rm -v dummy.c a.out

Для multilib

Для MultiLib требуется установить 32-битную версию glibc. Для этого, удалите оставшиеся файлы от 64-битной сборки glibc:

Настройка

rm -rf ./*
find .. -name "*.a" -delete

Запустите скрипт configure:

CC="$LIN_TGT-gcc -m32"                   \
CXX="$LIN_TGT-g++ -m32"                  \
../configure                             \
      --prefix=/usr                      \
      --host=$LIN_TGT32                  \
      --build=$(../scripts/config.guess) \
      --enable-kernel=3.2                \
      --with-headers=$LIN/usr/include    \
      --enable-multi-arch                \
      --libdir=/usr/lib32                \
      --libexecdir=/usr/lib32            \
      libc_cv_slibdir=/lib32             \
      libc_cv_include_x86_isa_level=no   \
      --disable-nscd                     \
      --disable-timezone-tools

Сборка

make

Установка

Установите 32-битные библиотеки из этого пакета:

make DESTDIR=$PWD/DESTDIR install
cp -a DESTDIR/lib32/*     $LIN/lib32/
cp -a DESTDIR/usr/lib32 $LIN/usr/
install -vm644 DESTDIR/usr/include/gnu/{lib-names,stubs}-32.h \
               $LIN/usr/include/gnu/
ln -svf ../lib32/ld-linux.so.2 $LIN/lib/ld-linux.so.2

Проверка работоспособности

Чтобы проверить работоспособность 32-битной glibc, выполните:

echo 'int main(){}' > dummy.c
$LIN_TGT-gcc -m32 dummy.c
readelf -l a.out | grep '/ld-linux'

Вывод должен быть таким:

[Requesting program interpreter: /lib/ld-linux.so.2]

Если всё хорошо, удалите ненужные файлы:

rm -v dummy.c a.out