90 votes

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

Nous distribuons sous Linux une librairie statique en version 64 bits et 32 bits. Lorsque je dépanne un client, j'aimerais que mon shell de diagnostic script élimine rapidement le problème en vérifiant le fichier d'archive .a pour déterminer s'il s'agit d'une version 32 ou 64 bits. Les méthodes qui me viennent à l'esprit ne sont pas très élégantes :

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

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

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

0 votes

Je suis au courant stackoverflow.com/questions/184502/ à la recherche d'une meilleure solution.

2 votes

La solution dans l'autre question semble résoudre le problème de manière assez nette, mais une façon rapide est nm foo.a | grep '^0' | head -1 | wc -c - si le résultat est 17 (16+1 == 8bytes + 1 char pour le retour à la ligne), c'est 64bit, si c'est 9 c'est 32bit (8+1 == 4bytes + 1 char pour le retour à la ligne).

0 votes

Et si j'ai 14 ans ? o_0

127voto

caf Points 114951

objdump semble être le meilleur moyen :

objdump -f libfoo.a | grep ^architecture

2 votes

file est plus facile à lire, comme indiqué ci-dessous stackoverflow.com/a/8909086/233906

1 votes

Je reçois architecture: i386:x86-64, flags 0x00000039: cela signifie-t-il que c'est les deux ? c'est peu probable. aidez-nous s'il vous plaît :D

12 votes

@Paladin : C'est 64 bits - les architectures x86 sont décrites par objdump comme étant i386 (simple vieille IA32), i386:x86-64 (AMD64) et i386:x64-32 (l'architecture X32 32-bit-address-space-in-long-mode).

38voto

pankaj kapoor Points 171

Le moyen le plus simple est d'utiliser la commande file.

$ file <.so file or .a file>

31 votes

Dans l'environnement msys, cela fait simplement écho à <file> : archive ar actuelle et non l'architecture cible.

11 votes

De même dans mon environnement Linux actuel (Ubuntu).

4 votes

De même dans centos7

17voto

Erik Points 31

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

1 votes

La question porte spécifiquement sur les bibliothèques statiques.

5voto

Petesh Points 29374

oops, ce sed manquant signifie qu'il affichait trop d'é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 c'est censé fonctionner :

  • nm - récupérer les symboles de la bibliothèque
  • grep - récupère les lignes commençant par une chaîne hexadécimale (adresse du symbole dans le fichier)
  • head - obtenir la première ligne
  • sed - supprime tout ce qui dépasse l'espace blanc, y compris l'espace blanc
  • wc - compte le nombre de caractères.

Dans un environnement 32 bits, les adresses sont composées de 8 chiffres hexadécimaux, l'ajout de la nouvelle ligne donne 9 Dans un environnement 64 bits, les adresses sont composées de 16 chiffres hexadécimaux, l'ajout de la nouvelle ligne vous donne 17 .

1 votes

Il faudrait peut-être ajouter un sed -e 's/ .*//' là-dedans.

0 votes

Je reçois 73 au fait. Vous pouvez m'expliquer pourquoi cela devrait fonctionner ?

0 votes

Oops, ce sed manquant était important. Réponse mise à jour, avec une explication de comment c'est censé fonctionner.

1voto

ColWhi Points 1064

S'il y a des fonctions qui sont spécifiques à une version particulière, vous pouvez essayer nm puis grep pour la fonction.

0 votes

Vous pouvez peut-être écrire un code qui recherche des octets spécifiques dans la bibliothèque. Vous pourriez essayer d'utiliser od sur les deux fichiers et trouver des différences entre les deux.

1 votes

Une autre solution serait de renommer les bibliothèques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X