Várias shells não executam um binário que existe

1

Eu baixei vários binários pré-construídos do mesmo programa ( nodejs-linux, -x86, -x86_64 ). Em shells diferentes, recebo um erro semelhante que no such file or directory: node . O $PATH está correto e os binários existem e são executáveis.

É porque estou em uma distribuição de musl -based e os binários usam glibc ? Eu pensei que os programas iriam falhar ou sair de zero em tal caso.

Nota: Tanto @DepressionDaniel quanto @xhienne deram respostas corretas abaixo.

    
por dgo.a 09.12.2016 / 05:12

2 respostas

2

Se as suas bibliotecas não corresponderem às bibliotecas dinâmicas exigidas pelo executável, nem sequer será iniciado. Para verificar as bibliotecas dinâmicas que este executável está vinculado, faça:

ldd /path/to/executable

Se você vir => not found , sabe o que está faltando.

    
por 09.12.2016 / 05:18
2

Seu erro é causado não por um objeto compartilhado ausente, mas por não ter o carregador dinâmico usado pelo aplicativo.

Se o carregador dinâmico não puder ser encontrado, exec() devolve ENOENT ao shell, o que significa a mensagem de erro que você recebe.

Se um carregador dinâmico for encontrado, exec() será bem-sucedido e o carregador dinâmico terá a chance de imprimir uma mensagem informativa sobre um objeto compartilhado ausente, se for o caso.

Isso pode ser experimentado facilmente, ao knoblar um binário como ls de maneiras diferentes:

cd /tmp
cp $(which ls) .
sed -e 's/libc.so.6/BAD!.so.6/' <ls >ls2
sed -e 's/ld-linux/ha-hahah/' <ls >ls3
strace ./ls2
strace ./ls3

Então, eu diria que seu Linux musl -based é tão radical, que não apenas altera glibc para outra coisa, mas também coloca o carregador dinâmico em um caminho não convencional, ou lhe dá um nome não convencional.

    
por 09.12.2016 / 05:37