web-dev-qa-db-fra.com

Dans LINUX, déterminez si une bibliothèque / archive 32 bits ou 64 bits .a?

Nous distribuons sous Linux une bibliothèque statique dans les versions 64 bits et 32 ​​bits. Lors du dépannage d'un client, je souhaite que mon script de diagnostic Diagnostic élimine rapidement le problème en vérifiant le fichier d'archive .a pour déterminer s'il s'agit du format 32 ou 64 bits. Les méthodes qui me viennent à l'esprit sont moins qu'élégantes:

  1. extraire un membre .o et demander la commande "file" (par exemple, ELF 32 bits, etc.)

  2. commencez à inclure un membre factice codé pour indiquer, par ex. 32bit.o/64bit.o et utilisez "ar -t" pour vérifier

J'ai essayé "strings xyz.a | grep 32" mais cela ne fonctionne pas bien avec les versions. Ce n'est pas un problème, mais si vous connaissez une solution élégante, j'aimerais le savoir.

76
cvsdave

objdump semble être le meilleur moyen:

objdump -f libfoo.a | grep ^architecture
108
caf

Le moyen le plus simple consiste à utiliser la commande de fichier.

$file <.so file or .a file>
27
pankaj kapoor

Il suffit d'utiliser la commande de fichier; c'est à dire. file library.so

16
Erik

oups, ce sed manquant signifie qu'il affichait de nombreux éléments.

Juste dans une réponse:

count=$(nm foo.a | grep '^0' | head -1 | sed 's/ .*//' | wc -c)
((count == 17)) && echo 64bit
((count == 9)) && echo 32bit
((count == 0)) && echo '??bit'

Comment ça doit fonctionner:

  • nm - récupère les symboles de la bibliothèque
  • grep - récupère les lignes commençant par une chaîne hexagonale (adresse du symbole dans le fichier)
  • head - obtient la première ligne
  • sed - supprime tout ce qui est au-delà des espaces, y compris les espaces
  • wc - compte le nombre de caractères.

Dans un environnement 32 bits, vous obtenez des adresses composées de 8 chiffres hexadécimaux, ajouter la nouvelle ligne vous donne 9. Dans un environnement 64 bits, vous obtenez des adresses composées de 16 chiffres hexadécaux, ajouter la nouvelle ligne vous 17.

2
Petesh

Si certaines fonctions sont spécifiques à une version particulière, vous pouvez essayer nm, puis grep pour la fonction.

1
ColWhi