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

find | grep libc.so.6

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

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

20
задан 5 May 2011 в 21:00

3 ответа

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

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

0
ответ дан 5 May 2011 в 21:00

Динамические библиотеки загружаются ядром, пути не жестко закодированы в программе. Программа просто говорит: «Мне нужен 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) воссоздан.

0
ответ дан 5 May 2011 в 21:00

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

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

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

0
ответ дан 5 May 2011 в 21:00

Другие вопросы по тегам:

Похожие вопросы: