faltando biblioteca compartilhada no ldd

2

Eu compilei o Apache httpd no CentOS 6.x. Funciona bem lá.

Então eu movi os arquivos binários para o CentOS 7. Eu precisava instalar algumas bibliotecas ausentes e agora funciona bem lá.

Então eu movi os arquivos binários para o Archlinux. Como eu esperava, não começou diretamente:

httpd: symbol lookup error: /software_pack/httpd-2.2.25/lib/libapr-1.so.0: undefined symbol: dlopen

No entanto, se eu fizer ldd /software_pack/httpd-2.2.25/lib/libapr-1.so.0 , ele fornecerá resultados diferentes no CentOS e no Archlinux. No Archlinux, o libdl.so não é mostrado?

Onde a partir do CentOS sabe que o arquivo precisa de libdl.so.2?

CentOS 6.x:

# ls -la /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0
lrwxrwxrwx 1 root root 21 Jul 30 09:47 /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.5.2
# ldd /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0.5.2
        linux-vdso.so.1 =>  (0x00007fffec400000)
        libexpat.so.0 => /software_pack/httpd-2.2.25/lib/libexpat.so.0 (0x00007f5ec94d8000)
        libapr-1.so.0 => /software_pack/httpd-2.2.25/lib/libapr-1.so.0 (0x00007f5ec92a8000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f5ec9098000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f5ec8e60000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5ec8c40000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f5ec88a8000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5ec9928000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f5ec8630000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f5ec8428000)   <<<<<<<< Missing in arch

No Archlinux:

# ls -la /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0
lrwxrwxrwx 1 root root 21 Jul 30 10:47 /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.5.2
# ldd /software_pack/httpd-2.2.25/lib/libaprutil-1.so.0.5.2
        linux-vdso.so.1 (0x00007fff7cdd3000)
        libexpat.so.0 => /software_pack/httpd-2.2.25/lib/libexpat.so.0 (0x00007f5aef4e7000)
        libapr-1.so.0 => /software_pack/httpd-2.2.25/lib/libapr-1.so.0 (0x00007f5aef2ba000)
        librt.so.1 => /usr/lib/librt.so.1 (0x00007f5aef084000)
        libcrypt.so.1 => /usr/lib/libcrypt.so.1 (0x00007f5aeee4b000)
        libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f5aeec2d000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007f5aee87f000)
        /usr/lib64/ld-linux-x86-64.so.2 (0x00007f5aef934000)
    
por Nick 30.07.2014 / 16:01

1 resposta

3

dlopen é normalmente fornecido por libdl.so.2 . No Arch Linux libdl.so.2 é fornecido por glibc package. Seria muito estranho se você não tivesse o glibc instalado, mas de qualquer maneira, verifique se você tem libdl.so.2 no seu sistema.

Você também pode usar o comando readelf para gerar uma tabela de símbolos para um objeto compartilhado e verificar se determinado símbolo é exportado:

readelf -Ws /usr/lib/libdl.so.2

Algumas informações sobre o porquê ldd output para o mesmo binário podem diferir em sistemas diferentes podem ser encontradas aqui:

link

    
por 30.07.2014 / 16:34

Tags