Dlaczego brakuje pliku /lib/libc.so.6?

20
find | grep libc.so.6

ujawnia, że ​​jest włączony /lib/i386-linux-gnu/libc.so.6, ale skrypt, który uruchomiłem, spodziewał się, że będzie on bezpośrednio pod /lib, więc dlaczego nie ma co najmniej dowiązania symbolicznego?

Czy zaryzykuję zerwanie czegokolwiek, jeśli umieszczę tam link symboliczny?

Erik B.
źródło

Odpowiedzi:

22

libc.sozostał przeniesiony w ramach pracy wielowątkowej w Ubuntu 11.04. Powodem, dla którego nie może istnieć dowiązanie symboliczne, jest to, że celem multiarch jest umożliwienie zainstalowania zarówno wersji, jak i386i amd64wersji libcw tym samym czasie, aby można było łatwiej uruchamiać 32-bitowe pliki binarne w systemach 64-bitowych i i odwrotnie (i inne podobne sytuacje). Gdyby libc6pakiet zawierał dowiązanie symboliczne do nowej lokalizacji, wówczas wersje tego pakietu dla różnych architektur nie byłyby instalowalne jednocześnie (która wersja dowiązania symbolicznego wybrałaby dpkg?), Pokonując cały punkt ćwiczenia.

Wszystko, co koduje ścieżkę, libc.somusi zostać zaktualizowane, aby działało poprawnie od wersji Ubuntu 11.04. Jeśli skrypt, o którym mówisz, jest częścią Ubuntu, zgłoś błąd i dodaj multiarchtag.

Colin Watson
źródło
1
Dobra
1
Procesor, którego używam, nie obsługuje nawet instrukcji 64-bitowych. Czy powiedziałbyś, że istnieje jakiekolwiek ryzyko związane z ręcznym dodaniem dowiązania symbolicznego? Nie jestem pewien, czy muszę to zrobić, ale jeśli. W każdym razie wydaje się to prawidłową odpowiedzią. Dzięki.
Erik B,
@Erik B: co? Czy mówisz mi, że próbujesz użyć aplikacji 64 na 32-bitowym procesorze? To zdecydowanie nie zadziała. Aplikacje 32-bitowe działają dobrze na 64-bitowym procesorze, ale nie odwrotnie.
Lekensteyn
@Lenensteyn to zdecydowanie nie to, co mówię. Mówię tylko, że nie mam pożytku z biblioteki 64-bitowej. Więc w moim systemie nie będzie żadnych wątpliwości co do tego, czy /lib/libc.so.6jest to biblioteka 32- czy 64-bitowa.
Erik B,
3
Jeśli nigdy nie zamierzasz używać pakietów 64-bitowych, wątpię, aby istniało znaczące ryzyko związane z dodaniem dowiązania symbolicznego, nie.
Colin Watson
10

Biblioteki dynamiczne są ładowane przez jądro, ścieżki nie są zakodowane na stałe w programie. Program mówi tylko „Potrzebuję libc.so.6”. Następnie system przeszukuje ścieżki bibliotek zgodnie z definicjami w /etc/ld.so.conftym /usr/libi /libdomyślnie. Ten plik zawiera dodatkowe pliki konfiguracyjne w /etc/ld.so.conf.d.

W moim 64-bitowym systemie libc.so.6można go znaleźć z /lib/x86_64-linux-gnu/libc.so.6powodu ścieżki zdefiniowanej w /etc/ld.so.conf.d/x86_64-linux-gnu.conf:

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

Aby dowiedzieć się, co biblioteka jest ładowany przez program, należy lddjak w 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)

Umieszczenie dowiązania symbolicznego niczego nie zepsuje.

Aby uzyskać listę przeszukiwanych katalogów, uruchom:

ldconfig -v -N | grep '^/'

-vpowoduje wyświetlenie listy plików i katalogów, -Nzapobiega odtwarzaniu pamięci podręcznej ( /etc/ld.so.cache).

Lekensteyn
źródło
Umieszczenie dowiązania symbolicznego niczego nie zepsułoby, ale tak naprawdę nie zrobiłoby nic dobrego, prawda?
Erik B,
@Erik B: do którego programu / skryptu się odwołujesz? Rozumiem, że skrypt się myli, ponieważ ścieżka jest zakodowana na stałe. Ale program nie musi znać ścieżki.
Lekensteyn
Czy tak to działa? Wydaje mi się, że czasami mam problemy z tym, że programy nie mogą znaleźć bibliotek zainstalowanych /usr/local/lib, ale działają one dobrze, jeśli utworzę dowiązanie symboliczne /usr/lib. Co powoduje takie zachowanie?
crazy2be
@ crazy2be: czy możesz opublikować wynik ldconfig -v -N | grep '^/'?
Lekensteyn
@Lekensteyn: Pewnie: pastebin.com/dtfnw2Tv . Stało się tak z niektórymi programami na prawie każdym używanym przeze mnie systemie, więc założyłem, że nie było to związane z konfiguracją systemu.
crazy2be
5

Wystarczy dodać dowiązanie symboliczne do pliku libc.so.6 w następujący sposób:

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

To samo dotyczy innych brakujących plików w systemie, w moim przypadku Matlaba brakowało pliku, problem zniknął.

Robert Hughes
źródło