Когда я попытался это сделать, моя система сломалась, и каждая программа немедленно выдала ошибку сегментации. Я думаю, это потому, что она установила новую версию ld-linux-x86-64.so.2
in, /lib64
но когда программа была загружена, она нашла старую версию libc.so.6
in /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).
Итак, вот что я сделал:
Я сделал резервную копию содержимого
/lib
,/lib32
, и/lib64
.Я отредактировал
/etc/ld.so.conf.d/x86_64-linux-gnu.conf
, чтобы поместить/lib64
в начало путей поиска.Я настроил новую версию glibc (2.19) с параметрами
--prefix=/usr --enable-kernel=2.6.26
, чтобы она соответствовала старой версии glibc (2.13).Я собрал новый glibc. Это было без происшествий.
Я
su
получал права root и запускалmake install
. Он начал устанавливаться, затем после установки нового файла произошел сбой сегментации,ld-linux-x86-64.so.2
и старый файл все еще подхватывалсяlibc.so.6
.Чтобы это исправить, я запустил
ldconfig
(конечно, все еще как root).Я перезапустил установку (
make install
). Она снова выдала ошибку на какой-то команде, вызывающейgcc
. Я обнаружил, что это было из-за несоответствия заголовков: новый/usr/include/stdio.h
подбирал старую/usr/include/x86_64-linux-gnu/sys/cdefs.h
, а не новую версию в/usr/include/sys/cdefs.h
.Итак, чтобы исправить это, я удалил каталог
/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
.Я снова перезапустил установку (
make install
). Наконец, все получилось.
После перезагрузки системы все заработало идеально.
Я пока не выяснил, что произойдет, если я попытаюсь также обновить 32-битную версию libc, установленную вместе с 64-битной версией в моей системе. Подозреваю, что это снова все ужасно сломает. Обновлю этот ответ, если у меня получится.