O vinculador não localiza bibliotecas em / lib

1

Estou construindo um pequeno sistema embarcado para um destino x86_64, com um kernel Linux e um initramfs que contém um busybox vinculado dinamicamente.

Eu tentei instalar as bibliotecas necessárias ( libm.so.6 , libc.so.6 ) em /lib e o vinculador ld-linux-x86-64.so.2 em /lib64 (porque o binário busybox solicita isso neste local).

lib
├── libc.so.6
└── libm.so.6
lib64
└── ld-linux-x86-64.so.2

mas não conseguiu vincular:

/sbin/init: error while loading shared libraries: libm.so.6: cannot open shared object file: No such file or directory

Consegui fazê-lo funcionar movendo tudo em /lib64 :

lib64
├── ld-linux-x86-64.so.2
├── libc.so.6
└── libm.so.6

ou criando um link simbólico entre /lib e /lib64

lib
├── ld-linux-x86-64.so.2
├── libc.so.6
└── libm.so.6
lib64 -> lib

Mas ainda não entendi porque a primeira configuração não funciona. Por que o vinculador não consegue encontrar bibliotecas em /lib ?

EDIT: Para fazê-lo funcionar corretamente (graças ao yaegashi):

  • Entre no diretório raiz do initramfs.
  • Crie um arquivo /etc/ld.so.conf com o caminho da biblioteca que você precisa.

    echo /lib > etc/ld.so.conf

  • Gere seu arquivo ld.so.cache .

    ldconfig -r .

  • Re gerencie seus initramfs. Está feito
por jml 30.05.2015 / 12:18

2 respostas

2

Leia o manual do ld.so (o linker / loader dinâmico ). Os caminhos de pesquisa reais são determinados principalmente por /etc/ld.so.cache (que é compilado de /etc/ld.so.conf por ldconfig ) ou por caminhos internos em seu binário ld.so. Então, verifique suas configurações de plataforma e como você construiu seu glibc.

Você pode observar atividades detalhadas de ld.so executando qualquer binário com LD_DEBUG=libs definido na variável de ambiente.

$ LD_DEBUG=libs ls
     17441: find library=libselinux.so.1 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libselinux.so.1
     17441: 
     17441: find library=libacl.so.1 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libacl.so.1
     17441: 
     17441: find library=libc.so.6 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libc.so.6
     ...
    
por 30.05.2015 / 13:36
0

Como uma correção rápida, adicione lib à variável de ambiente do shell LD_LIBRARY_PATH via .bashrc,

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib

e depois,

source /home/user/.bashrc
    
por 31.05.2015 / 15:13