Pourquoi /lib/libc.so.6 est-il manquant?

20
find | grep libc.so.6

révèle qu'il est en place /lib/i386-linux-gnu/libc.so.6, mais un script que j'exécutais s'attendait à ce qu'il soit directement sous /lib, alors pourquoi n'y a-t-il pas au moins un lien symbolique?

Vais-je risquer de casser quoi que ce soit si j'y mettais un lien symbolique?

Erik B
la source

Réponses:

22

libc.soa été déplacé dans le cadre du travail multiarchitecture dans Ubuntu 11.04. La raison pour laquelle il ne peut pas y avoir de lien symbolique est que le but de multiarch est de permettre d'installer à la fois les versions i386et les amd64de libcafin de pouvoir exécuter plus facilement les binaires 32 bits sur les systèmes 64 bits et vice versa (et autres situations similaires). Si le libc6package contenait un lien symbolique vers le nouvel emplacement, les versions de ce package pour différentes architectures ne seraient pas toutes les deux installables en même temps (quelle version du lien symbolique dpkgchoisirait?), Ce qui irait à l' encontre du point entier de l'exercice.

Tout ce qui code en dur le chemin d'accès libc.sodoit être mis à jour pour fonctionner correctement à partir d'Ubuntu 11.04. Si le script dont vous parlez fait partie d'Ubuntu, veuillez signaler un bogue dessus et ajouter la multiarchbalise.

Colin Watson
la source
1
Belle réponse,
j'ai
1
Le processeur que j'utilise ne prend même pas en charge les instructions 64 bits. Diriez-vous qu'il existe un risque associé à l'ajout manuel d'un lien symbolique? Je ne sais pas si je dois faire ça, mais si. Quoi qu'il en soit, cela semble être la bonne réponse. Merci.
Erik B
@Erik B: quoi? Êtes-vous en train de me dire que vous essayez d'utiliser une application 64 sur un processeur 32 bits? Cela ne fonctionnera certainement pas . Les applications 32 bits fonctionnent bien sur un processeur 64 bits, mais pas l'inverse.
Lekensteyn
@Lekensteyn ce n'est certainement pas ce que je dis. Ce que je dis, c'est que je n'ai aucune utilité pour la bibliothèque 64 bits. Donc, sur mon système particulier, il n'y aura pas de confusion quant à savoir si /lib/libc.so.6c'est la bibliothèque 32 ou 64 bits.
Erik B
3
Si vous n'utilisez jamais de packages 64 bits, je doute qu'il y ait un risque important à ajouter un lien symbolique, non.
Colin Watson
10

Les bibliothèques dynamiques sont chargées par le noyau, les chemins ne sont pas codés en dur dans un programme. Un programme dit simplement "J'ai besoin de libc.so.6". Le système recherche ensuite dans les chemins de bibliothèque tels que définis dans /etc/ld.so.conf, y compris /usr/libet /libpar défaut. Ce fichier inclut des fichiers de configuration supplémentaires dans /etc/ld.so.conf.d.

Sur mon système 64 bits, libc.so.6se trouve dans en /lib/x86_64-linux-gnu/libc.so.6raison du chemin défini dans /etc/ld.so.conf.d/x86_64-linux-gnu.conf:

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

Pour savoir quelle bibliothèque est chargée par un programme, utilisez lddcomme dans 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)

Mettre le lien symbolique ne casserait rien.

Pour obtenir une liste des répertoires recherchés, exécutez:

ldconfig -v -N | grep '^/'

-vprovoque l'affichage d'une liste de fichiers + répertoires, -Nempêche la /etc/ld.so.cacherecréation du cache ( ).

Lekensteyn
la source
Mettre le lien symbolique ne casserait rien, mais cela ne ferait pas vraiment de bien non plus, non?
Erik B
@Erik B: de quel programme / script parlez-vous? Je peux comprendre qu'un script soit confus parce que le chemin est codé en dur. Mais un programme n'a pas besoin de connaître le chemin.
Lekensteyn
Est-ce ainsi que cela fonctionne? Il me semble parfois que les programmes ne trouvent pas de bibliothèques installées dans les programmes /usr/local/lib, mais ils fonctionnent bien si je crée un lien symbolique à partir de /usr/lib. Qu'est-ce qui cause ce comportement?
crazy2be
@ crazy2be: pouvez-vous publier la sortie de ldconfig -v -N | grep '^/'?
Lekensteyn
@Lekensteyn: Bien sûr: pastebin.com/dtfnw2Tv . C'est arrivé avec certains programmes sur presque tous les systèmes que j'ai utilisés, cependant, j'ai donc supposé que ce n'était pas lié à la configuration du système.
crazy2be
5

Ajoutez simplement un lien symbolique au fichier libc.so.6 comme suit:

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

Il en va de même pour les autres fichiers manquants toujours sur le système, dans mon cas, Matlab manquait le fichier, le problème a disparu maintenant.

Robert Hughes
la source