Perché manca /lib/libc.so.6?

18
find | grep libc.so.6

rivela che è in /lib/i386-linux-gnu/libc.so.6 , ma uno script che stavo correndo si aspettava che fosse direttamente sotto /lib , quindi perché non c'è almeno un link simbolico?

Potrei rischiare di rompere qualcosa se metto un link simbolico lì?

    
posta Erik B 05.05.2011 - 19:00

3 risposte

21

libc.so è stato spostato come parte del multiarch funziona in Ubuntu 11.04. La ragione per cui non può esserci un link simbolico è che lo scopo del multiarch è quello di rendere possibile installare sia le i386 che amd64 versioni di libc allo stesso tempo in modo da poter eseguire 32-bit binari più facilmente su sistemi a 64 bit e viceversa (e altre situazioni simili). Se il pacchetto libc6 contenesse un collegamento simbolico alla nuova posizione, le versioni di quel pacchetto per architetture diverse non sarebbero entrambe installabili contemporaneamente (quale versione del link simbolico avrebbe dpkg pick?), Sconfiggendo l'intero punto dell'esercizio.

Tutto ciò che codifica il percorso verso libc.so deve essere aggiornato per funzionare correttamente da Ubuntu 11.04 in poi. Se la sceneggiatura di cui parli fa parte di Ubuntu, segnalaci un bug e aggiungi il tag multiarch .

    
risposta data Colin Watson 05.05.2011 - 21:53
9

Le librerie dinamiche sono caricate dal kernel, i percorsi non sono codificati in un programma. Un programma dice semplicemente "Ho bisogno di libc.so.6". Il sistema cerca quindi nei percorsi della libreria come definito in /etc/ld.so.conf , inclusi /usr/lib e /lib per impostazione predefinita. Questo file include file di configurazione aggiuntivi in /etc/ld.so.conf.d .

Sul mio sistema a 64 bit, libc.so.6 può essere trovato in /lib/x86_64-linux-gnu/libc.so.6 a causa del percorso definito in /etc/ld.so.conf.d/x86_64-linux-gnu.conf :

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

Per scoprire quale libreria è caricata da un programma, usa ldd come in 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)

Mettere il link simbolico non rompe nulla.

Per ottenere un elenco di directory ricercate, esegui:

ldconfig -v -N | grep '^/'

-v provoca la visualizzazione di un elenco di file + directory, -N impedisce che la cache ( /etc/ld.so.cache ) venga ricreata.

    
risposta data Lekensteyn 05.05.2011 - 19:29
5

Basta aggiungere un link simbolico al file libc.so.6 come segue:

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

Lo stesso vale per altri file mancanti ancora presenti nel sistema, nel mio caso Matlab mancava il file, il problema non c'è più.

    
risposta data Robert Hughes 09.10.2011 - 18:25

Leggi altre domande sui tag