ldd equivalente que falha quando a biblioteca não é encontrada

1

Suponha que eu execute ldd /bin/ls com a biblioteca pthread removida. Eu obtenho

linux-vdso.so.1 (0x00007ffcc3563000)

libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000)
libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000)
/lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000)
libpthread.so.0 => not found

O código de retorno é zero. Existe um comando retornando um erro neste caso? Algo parecido com

#!/bin/bash
if [[ ! -z $(ldd ${target} | grep 'not found') ]]; then
   exit 1
fi
    
por UmNyobe 12.11.2018 / 13:18

1 resposta

1

Tome cuidado com ldd no linux; é apenas um script bash que, pelo menos em sistemas mais antigos, executará o programa fornecido com LD_TRACE_LOADED_OBJECTS=1 em seu ambiente.

Isso significa que, se o programa tiver outro intérprete que não seja /lib{64,32}/ld-* , esse programa será executado com seu alvo como seu primeiro argumento, mesmo que você não tenha a intenção de fazê-lo. Se você executar ldd em um executável pertencente a algum outro usuário, esse usuário será proprietário de você .

Você pode verificar o que o interpretador está definido nos cabeçalhos ELF com readelf -l "$target" | grep interpreter .

Em sistemas mais novos, ldd foi alterado para passar o alvo como argumento para um intérprete retirado de uma lista de 'bons' intérpretes (por exemplo, /lib64/ld-linux.so.2 target ); Eu não acho isso convincente, mas cabe a você decidir se isso é seguro o suficiente.

Se você achar tudo isso aceitável, a maneira mais simples de fazer isso é:

if ldd "$target" | grep -q 'not found'; then
   echo >&2 "$target is missing dependencies"
   exit 1
fi

Se for chamado em 'trace mode' (como em ldd), o carregador dinâmico padrão no linux sempre sairá com um status 0, e não há como alterar isso através de opções de linha de comando ou variáveis de ambiente; você terá que mudar seu código fonte.

    
por 12.11.2018 / 14:20