Чому /lib/libc.so.6 відсутній?


20
find | grep libc.so.6

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

Чи ризикував би я щось зламати, якби я поставив там символьне посилання?

Відповіді:


22

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

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


1
Приємна відповідь, дізнався щось нове сьогодні (знову) :)
Лекенштейн

1
Процесор, який я використовую, навіть не підтримує 64-бітні інструкції. Ви б сказали, що існує якийсь ризик, пов'язаний із додаванням символьної посилання вручну? Не впевнений, що мені потрібно це зробити, але якщо. У всякому разі, це здається правильною відповіддю. Спасибі.
Ерік Б

@Erik B: що? Ти мені кажеш, що ти хочеш використовувати додаток 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відтворити кеш ( ).


Введення символьної посилання нічого б не порушило, але й насправді нічого доброго не призведе, правда?
Ерік Б

@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 відсутній файл, проблема вже відсутня.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.