Teste se executável válido

3

Existe uma maneira (relativamente) simples de testar se um executável não existe apenas, mas é válido?

Por válido, quero dizer que um executável x86_64 Mach-O (OS X) não será executado em um ARM Raspberry Pi. No entanto, simplesmente executar tool-osx || tool-rpi funciona no OS X, onde o executável é executado, mas não retorna para tool-rpi quando o x86_64 falha.

Como posso voltar para outro executável quando um é inválido para a arquitetura do processador?

    
por Josh The Geek 03.01.2015 / 18:51

2 respostas

6

Em vez de testar um executável válido, é melhor testar qual é a arquitetura atual e, em seguida, selecionar o executável adequado com base nisso. Por exemplo:

if [ $(uname -m) == 'armv6l' ]; then
    tool-rpi
else
    tool-osx
fi

No entanto, se testar o executável for o que você realmente deseja fazer, o GNU file poderá informar a arquitetura de um executável:

user@host:~$ file $(whereis cat)
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x4e89fd8f129f0a508afa325b0f0f703fde610971, stripped
    
por 04.01.2015 / 00:02
2

No Linux glibc, um hack que você poderia usar para testar se um executável vinculado dinamicamente seria executado com êxito, mas sem executá-lo seria definir LD_DEBUG=help em seu ambiente. É bom que ele emite uma mensagem de ajuda (que você ignora) e saia com sucesso, e se for inválido, você receberá um erro.

Infelizmente isso é específico para o Linux glibc e parece que você está perguntando sobre o MacOS. Além disso, é ineficaz com binários vinculados estaticamente e com binários setuid ou setgid.

    
por 03.01.2015 / 23:19