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.