Por que o /lib/libc.so.6 está ausente?

20
find | grep libc.so.6

revela que está dentro /lib/i386-linux-gnu/libc.so.6, mas um script em que eu estava executando esperava que ele estivesse diretamente abaixo /lib, então por que não há pelo menos um link simbólico?

Eu arriscaria quebrar alguma coisa se eu colocar um link simbólico lá?

Erik B
fonte

Respostas:

22

libc.sofoi movido como parte do trabalho multiarca no Ubuntu 11.04. A razão por que não pode haver um link simbólico não é que o propósito da multiarch é torná-lo possível para instalar os i386e amd64versões libcao mesmo tempo, de modo que você pode executar binários de 32 bits mais facilmente em sistemas de 64 bits e vice-versa (e outras situações semelhantes). Se o libc6pacote continha um link simbólico para o novo local, as versões desse pacote para arquiteturas diferentes não seriam instaláveis ​​ao mesmo tempo (qual versão do link simbólico dpkgescolheria?), Derrotando todo o objetivo do exercício.

Qualquer coisa que codifique o caminho libc.sodeve ser atualizada para funcionar corretamente a partir do Ubuntu 11.04. Se o script do qual você está falando faz parte do Ubuntu, informe um bug e adicione a multiarchtag.

Colin Watson
fonte
11
Resposta agradável, aprendeu algo novo hoje (novamente) :)
Lekensteyn
11
O processador que estou usando nem suporta instruções de 64 bits. Você diria que há algum risco associado à adição manual de um link simbólico? Não tenho certeza se preciso fazer isso, mas se. De qualquer forma, esta parece ser a resposta correta. Obrigado.
Erik B
@Erik B: o que? Você está me dizendo que está tentando usar um aplicativo de 64 em um processador de 32 bits? Definitivamente, isso não vai funcionar. Aplicativos de 32 bits funcionam bem em um processador de 64 bits, mas não vice-versa.
Lekensteyn
@Lekensteyn que definitivamente não é o que estou dizendo. O que estou dizendo é que não tenho uso para a biblioteca de 64 bits. Portanto, no meu sistema específico, não haverá confusão sobre se /lib/libc.so.6é a biblioteca de 32 ou 64 bits.
Erik B
3
Se você nunca usar pacotes de 64 bits, duvido que exista um risco significativo em adicionar um link simbólico, não.
Colin Watson
10

Bibliotecas dinâmicas são carregadas pelo kernel, os caminhos não são codificados em um programa. Um programa apenas diz "Eu preciso da libc.so.6". O sistema procura nos caminhos da biblioteca, conforme definido em /etc/ld.so.conf, incluindo /usr/libe /libpor padrão. Este arquivo inclui arquivos de configuração adicionais em /etc/ld.so.conf.d.

No meu sistema de 64 bits, libc.so.6pode ser encontrado /lib/x86_64-linux-gnu/libc.so.6devido ao caminho definido em /etc/ld.so.conf.d/x86_64-linux-gnu.conf:

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

Para descobrir qual biblioteca é carregada por um programa, use lddcomo em 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)

Colocar o link simbólico não quebraria nada.

Para obter uma lista dos diretórios pesquisados, execute:

ldconfig -v -N | grep '^/'

-vfaz com que uma lista de arquivos + diretórios seja exibida, -Nimpede que o cache ( /etc/ld.so.cache) seja recriado.

Lekensteyn
fonte
Colocar o link simbólico não quebraria nada, mas também não faria nada de bom, certo?
Erik B
@Erik B: a que programa / script você está se referindo? Eu posso entender que um script fica confuso porque o caminho é codificado. Mas um programa não precisa conhecer o caminho.
Lekensteyn 5/05
É assim que funciona? Às vezes, parece que tenho problemas em que os programas não conseguem encontrar as bibliotecas instaladas /usr/local/lib, mas funcionam bem se eu fizer um link simbólico /usr/lib. O que causa esse comportamento?
crazy2be
@ crazy2be: você pode postar a saída de ldconfig -v -N | grep '^/'?
Lekensteyn
@Lekensteyn: Claro: pastebin.com/dtfnw2Tv . No entanto, aconteceu com alguns programas em praticamente qualquer sistema que eu usei, então eu assumi que não estava relacionado à configuração do sistema.
crazy2be
5

Basta adicionar o link simbólico ao arquivo libc.so.6 da seguinte maneira:

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

O mesmo vale para outros arquivos ausentes ainda no sistema. No meu caso, o Matlab estava ausente, o problema desapareceu agora.

Robert Hughes
fonte