Construire une application 32 bits dans Ubuntu 64 bits

23

Après des heures de recherche sur Google, je décide d'abandonner et de vous demander des experts. J'essaye de construire une application 32 bits (xgap si quelqu'un est intéressé) dans mon 64 Ubuntu 11.10. J'ai ajouté le CFLAGS = -m32 et le LDFLAGS = -L / usr / lib32 dans le makefile. Les objets sont intégrés en 32 bits fin. La dernière étape consiste à lier tous les objets et bibliothèques pour X windows dans cet exécutable --- xgap. D'une manière ou d'une autre, cela continue de me donner cette erreur:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

J'ai installé ia32-libs et le support mutilib . Je pense que j'ai juste besoin de forcer l'éditeur de liens pour générer une sortie i386. J'ai essayé de mettre deux drapeaux LD dans ma commande gcc comme indiqué ci-dessus: -melf_i386 et -oformat elf32-i386 . Mais ce qui se passe, c'est que gcc ne recherche plus la bibliothèque 32 bits dans / usr / lib32 . Je me demande si je dois mettre ces drapeaux dans un ordre fixe?

Merci pour toute idée et aide!

EDIT: lorsque j'ajoute l'indicateur -m32 dans ma dernière commande gcc (l'étape de liaison je crois), même si j'ai l'indicateur -L / usr / lib32 en place, gcc ne recherche plus dans / usr / lib32 (vraiment bizarre ...) et génère l'erreur suivante:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

Quelqu'un a une idée pourquoi cela se produit? J'utilise l'outil automatique pour configurer et créer. Je suis vraiment bon pour modifier ces fichiers de script.

EIDT : J'ai résolu le problème. Je pense que gcc attendait une archive de bibliothèque statique. J'ai utilisé le script getlibs de http://ubuntuforums.org/showthread.php?t=474790 pour télécharger toutes les archives .a nécessaires pour la liaison. Ensuite, gcc a fonctionné. Je pense que gcc a fait une recherche dans le répertoire / usr / lib32 mais n'a pas trouvé les archives .a alors a continué à chercher dans le répertoire standard qui est / usr / lib , où il trouve les fichiers * .so incompatibles .

Mais alors la question est: les fichiers * .so dans / usr / lib32 / du paquet ia32-libs n'ont pas vraiment les bibliothèques nécessaires pour la liaison? À quoi servent ces fichiers dans / usr / lib32 / ?

Riches
la source
connexes stackoverflow.com/questions/22355436/...
Ciro Santilli新疆改造中心法轮功六四事件
en relation: stackoverflow.com/questions/58654288/…
smwikipedia

Réponses:

15

LDFLAGSdevrait également inclure -m32. Ce qui suit devrait fonctionner:

export LDFLAGS='-m32 -L/usr/lib32'

En fait, vous pouvez supprimer une -L/usr/lib32partie, car il s'agit d'un répertoire par défaut pour les bibliothèques 32 bits, et votre système en est conscient.

Fondamentalement, le moyen le plus simple de créer une application 32 bits sur une machine 64 bits est:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

..ou alimentez ces variables pour configurer le script si vous utilisez des outils automatiques.

MISE À JOUR:

Il semble que vous ne connaissiez pas vraiment les différences de liaison avec les bibliothèques statiques et dynamiques. Je vais essayer d'être le moins possible:

  • Les bibliothèques de développement statiques et dynamiques ont la même extension de fichier .a
  • Si vous avez installé à la fois des versions statiques et dynamiques de la même bibliothèque, l'une d'entre elles peut avoir un suffixe supplémentaire, comme libname.apour la version dynamique et libname_s.astatique.
  • Bien sûr, les versions des bibliothèques statiques et dynamiques diffèrent en taille. La version statique est plus lourde.
  • Si vous établissez un lien avec une bibliothèque statique - votre application n'a pas de dépendances. Si vous établissez une liaison avec une bibliothèque dynamique, elle dépendra de la .sobibliothèque d'exécution qui devrait être présente dans votre système.

Veuillez noter que nous ne parlons pas ici d'astuces avancées, comme le chargement explicite de DSO à l'aide de l'API dlopen () / dlsym ().

Andrejs Cainikovs
la source
Maintenant, je pense qu'il y a un problème avec ma configuration. Chaque fois que j'ajoute le -m32 dans ma dernière commande gcc, il recherche le dossier / usr / lib à la place. Si je n'ajoute pas -m32 et utilise l'indicateur -L / usr / lib32, il recherche le bon répertoire mais génère les erreurs ci-dessus. Savez-vous ce qui pourrait provoquer cela?
Rich
Et que se passera-t-il si vous combinez les deux (comme dans mon exemple ci-dessus)?
Andrejs Cainikovs
si je combine les deux, il ne cherche toujours pas dans / usr / lib32. il recherche juste dans / usr / lib. Et btw, j'utilise des outils automatiques.
Rich
Bizarre .. Avez-vous essayé de vous nourrir à la -l/usr/lib32/libXaw.soplace?
Andrejs Cainikovs
Il ne peut pas les trouver ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: impossible de trouver -l / usr / lib32 / libXaw.so
Rich
9

J'obtenais des erreurs telles que:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Cela m'a corrigé:

sudo apt-get install g++-multilib

si vous utilisez un package gcc autre que celui par défaut (par exemple gcc-7), vous devrez installer le package pour cette version spécifique:

sudo apt-get install g++-7-multilib
Vladimir Panteleev
la source
1
g++-multilibest pour g ++ (C ++), pour gcc (C) vous avez également besoin gcc-multilib.
pevik