Почему отсутствует /lib/libc.so.6?

20
find | grep libc.so.6

показывает, что он включен /lib/i386-linux-gnu/libc.so.6, но сценарий, который я выполнял, ожидал, что он будет находиться непосредственно под ним /lib, так почему нет хотя бы символической ссылки?

Рискну ли я что-нибудь сломать, если добавлю туда ссылку?

Эрик Б
источник

Ответы:

22

libc.soбыл перенесен как часть многоархивной работы в Ubuntu 11.04. Причина, по которой здесь не может быть символической ссылки, заключается в том, что цель multiarch состоит в том, чтобы сделать возможным одновременную установку как версий, так i386и amd64версий, libcчтобы вы могли легче запускать 32-разрядные двоичные файлы в 64-разрядных системах и наоборот (и другие подобные ситуации). Если libc6пакет содержал символическую ссылку на новое местоположение, то версии этого пакета для разных архитектур не могли бы быть установлены одновременно (какую версию символической ссылки dpkgвыберет?), Что нанесло бы ущерб всей цели упражнения.

Все, что жестко кодирует путь, libc.soдолжно быть обновлено для правильной работы начиная с Ubuntu 11.04 и далее. Если скрипт, о котором вы говорите, является частью Ubuntu, пожалуйста, сообщите об ошибке и добавьте multiarchтег.

Колин Уотсон
источник
1
Хороший ответ, узнал что-то новое сегодня (снова) :)
Лекенштейн
1
Процессор, который я использую, даже не поддерживает 64-битные инструкции. Вы сказали бы, что есть какой-нибудь риск, связанный с добавлением символической ссылки вручную? Не уверен, что мне нужно это делать, но если. Во всяком случае, это, кажется, правильный ответ. Спасибо.
Эрик Б
@ Эрик Б: что? Вы говорите мне, что пытаетесь использовать 64-разрядное приложение на 32-битном процессоре? Это точно не сработает. 32-битные приложения работают нормально на 64-битном процессоре, но не наоборот.
Лекенштейн
@Lekensteyn, это точно не то, что я говорю. Я говорю о том, что мне не нужна 64-битная библиотека. Поэтому в моей конкретной системе не возникнет путаницы в отношении того, /lib/libc.so.6является ли библиотека 32- или 64-разрядной.
Эрик Б
3
Если вы никогда не собираетесь использовать 64-битные пакеты, я сомневаюсь, что есть какой-то значительный риск при добавлении символической ссылки, нет.
Колин Уотсон
10

Динамические библиотеки загружаются ядром, пути не жестко закодированы в программе. Программа просто говорит: «Мне нужен libc.so.6». Затем система выполняет поиск в путях к библиотекам, как определено в /etc/ld.so.conf, в том числе /usr/libи /libпо умолчанию. Этот файл включает в себя дополнительные файлы конфигурации в /etc/ld.so.conf.d.

В моей 64-битной системе libc.so.6можно найти /lib/x86_64-linux-gnu/libc.so.6из-за пути, определенного в /etc/ld.so.conf.d/x86_64-linux-gnu.conf:

# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

Чтобы узнать, какая библиотека загружена программой, используйте lddкак в ldd /bin/bash:

    linux-vdso.so.1 =>  (0x00007ffff1dff000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00007f9d8b3b8000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d8b1b4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d8ae1f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d8b61c000)

Размещение символической ссылки ничего не сломает.

Чтобы получить список каталогов, в которых выполняется поиск, выполните:

ldconfig -v -N | grep '^/'

-vвызывает отображение списка файлов и каталогов, -Nпредотвращает /etc/ld.so.cacheповторное создание cache ( ).

Lekensteyn
источник
Размещение символической ссылки ничего не сломает, но и ничего хорошего не даст, верно?
Эрик Б
@Erik B: на какую программу / скрипт вы ссылаетесь? Я могу понять, что сценарий запутался, потому что путь жестко закодирован. Но программа не должна знать путь.
Лекенштейн
Это так работает? У меня иногда возникают проблемы, когда программы не могут найти установленные библиотеки /usr/local/lib, но они работают нормально, если я создаю символическую ссылку /usr/lib. Что вызывает это поведение?
crazy2be
@ crazy2be: вы можете опубликовать вывод ldconfig -v -N | grep '^/'?
Лекенштейн
@Lekensteyn: Конечно: pastebin.com/dtfnw2Tv . Это произошло с некоторыми программами практически на любой системе, которую я использовал, поэтому я предположил, что это не связано с конфигурацией системы.
crazy2be
5

Просто добавьте символическую ссылку в файл libc.so.6 следующим образом:

sudo ln -s /lib/i386-linux-gnu/libc.so.6 /lib/libc.so.6

То же самое касается других отсутствующих файлов, которые все еще находятся в системе, в моем случае Matlab пропустил файл, проблема исчезла.

Роберт Хьюз
источник