Как установить glibc, собранный из исходного кода, в Debian (64-разрядной версии)?

Как установить glibc, собранный из исходного кода, в Debian (64-разрядной версии)?

Когда я попытался это сделать, моя система сломалась, и каждая программа немедленно выдала ошибку сегментации. Я думаю, это потому, что она установила новую версию ld-linux-x86-64.so.2in, /lib64но когда программа была загружена, она нашла старую версию libc.so.6in /lib/x86_64-linux-gnuвместо новой версии in /lib64. (По-видимому, ld и libc должны совпадать?)

Я попробовал поставить /lib64в начало /etc/ld.so.conf.d/x86_64-linux-gnu.confи запустить ldconfig. Однако по какой-то причине это ничего не исправило.

решение1

Во время поиска чего-то постороннего я случайно обнаружил, почему моя установка использовала старую libc: потому что новая libc имела более старую версию ABI (https://stackoverflow.com/questions/20577638/library-path-order-for-alternate-glibc-dynamic-linker-ld-so).

Итак, вот что я сделал:

  1. Я сделал резервную копию содержимого /lib, /lib32, и /lib64.

  2. Я отредактировал /etc/ld.so.conf.d/x86_64-linux-gnu.conf, чтобы поместить /lib64в начало путей поиска.

  3. Я настроил новую версию glibc (2.19) с параметрами --prefix=/usr --enable-kernel=2.6.26, чтобы она соответствовала старой версии glibc (2.13).

  4. Я собрал новый glibc. Это было без происшествий.

  5. Я suполучал права root и запускал make install. Он начал устанавливаться, затем после установки нового файла произошел сбой сегментации, ld-linux-x86-64.so.2и старый файл все еще подхватывался libc.so.6.

  6. Чтобы это исправить, я запустил ldconfig(конечно, все еще как root).

  7. Я перезапустил установку ( make install). Она снова выдала ошибку на какой-то команде, вызывающей gcc. Я обнаружил, что это было из-за несоответствия заголовков: новый /usr/include/stdio.hподбирал старую /usr/include/x86_64-linux-gnu/sys/cdefs.h, а не новую версию в /usr/include/sys/cdefs.h.

  8. Итак, чтобы исправить это, я удалил каталог /usr/include/x86_64-linux-gnu/sysи заменил его символической ссылкой на /usr/include/sys. Я также заменил заголовки a.out.h, fpu_control.h, и ieee754.hв /usr/include/x86_64-linux-gnuсимволическими ссылками на их новые версии в /usr/include.

  9. Я снова перезапустил установку ( make install). Наконец, все получилось.

После перезагрузки системы все заработало идеально.

Я пока не выяснил, что произойдет, если я попытаюсь также обновить 32-битную версию libc, установленную вместе с 64-битной версией в моей системе. Подозреваю, что это снова все ужасно сломает. Обновлю этот ответ, если у меня получится.

Связанный контент