Distribuímos no Linux uma biblioteca estática nas versões de 64 e 32 bits. Ao solucionar problemas de um cliente, gostaria que meu script de shell de diagnóstico eliminasse rapidamente o problema, verificando o arquivo .a para determinar se ele é de 32 ou 64 bits. Os métodos que me ocorrem são menos que elegantes:
extrair um membro .o e solicitar o comando "arquivo" (por exemplo, ELF de 32 bits etc)
comece incluindo um membro fictício codificado para indicar, por exemplo, 32bit.o / 64bit.o e use "ar -t" para verificar
Eu tentei "strings xyz.a | grep 32", mas isso não funciona bem nas versões. Não é um problema destruidor de corações, mas se você souber de uma solução elegante, eu gostaria de saber.
linux
32bit-64bit
archive
cvsdave
fonte
fonte
Respostas:
objdump
parece ser a melhor maneira:fonte
file
é mais fácil de ler conforme indicado abaixo stackoverflow.com/a/8909086/233906architecture: i386:x86-64, flags 0x00000039:
.. isso significa que são os dois ..? isso é improvável. por favor ajude: Di386
( IA32 antigo simples),i386:x86-64
(AMD64) ei386:x64-32
(a arquitetura X32 de espaço de endereço de 32 bits em modo longo).objdump -f lib.a | grep ^architecture | cut -d' ' -f-2 | sort -u
A maneira mais simples é usar o comando file.
fonte
file armeabi/libpique.so
->libpique.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
. (2)file x86/libpique.so
->libpique.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
Basta usar o comando file; ie
file library.so
fonte
Apenas em uma resposta:
Como deve funcionar:
Em um ambiente de 32 bits, você obtém endereços compostos de 8 dígitos hexadecimais, adicionando a nova linha
9
, você obtém . Em um ambiente de 64 bits, você obtém endereços compostos de 16 dígitos hexadecimais, adicionando a nova linha17
.fonte
Se houver funções específicas de uma determinada versão, você pode tentar nm e grep para a função.
fonte