web-dev-qa-db-fra.com

Construire une application 32 bits dans Ubuntu 64 bits

Après des heures de recherches sur Google, je décide d'abandonner et de demander à des experts. J'essaie 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. La dernière étape consiste à relier tous les objets et bibliothèques pour X Windows à cet exécutable --- xgap. D'une certaine manière, il 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 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 ld drapeaux dans ma commande gcc comme indiqué ci-dessus: - melf_i386 et - ofmat 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 déterminé?

Merci pour toute idée et aide!

EDIT: quand j’ajoute l’indicateur -m32 dans ma dernière commande gcc (l’étape de liaison, je crois), même si j’ai le drapeau -L/usr/lib32 en place, gcc ne recherche plus dans/usr/lib32 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=47479 pour télécharger tous les .a archives nécessaires pour la liaison. Alors gcc a fonctionné. Je pense que gcc a cherché dans le répertoire /usr/lib32 mais n'a pas t ne trouve pas les archives . a , puis est allé chercher dans le répertoire standard qui est /usr/lib , où se trouvent les fichiers incompatibles *. so .

Mais alors la question est: les fichiers *. So dans /usr/lib32/ du paquet ia32-libs ne possède pas vraiment les bibliothèques nécessaires pour lier? A quoi servent ces fichiers /usr/lib32/?

22
Rich

LDFLAGS devrait également inclure -m32. Suivre devrait fonctionner:

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

En fait, vous pouvez supprimer la partie -L/usr/lib32, 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 un ordinateur 64 bits est le suivant:

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

..ou alimentez ces variables pour configurer le script si vous utilisez autotools.

METTRE À JOUR:

On dirait que vous n'êtes pas vraiment au courant des différences entre les liens avec les bibliothèques statiques et dynamiques. Je vais essayer d'être aussi minime que possible:

  • Les bibliothèques de développement statiques et dynamiques ont la même extension de fichier .a
  • Si vous avez installé des versions statiques et dynamiques de la même bibliothèque, l'une d'entre elles peut comporter un postfix supplémentaire, tel que libname.a pour dynamic et libname_s.a pour la version statique.
  • Les versions des bibliothèques statiques et dynamiques sont sûrement de tailles différentes. La version statique est plus lourde.
  • Si vous créez un lien avec une bibliothèque statique, votre application n'a pas de dépendances. Si vous établissez un lien avec la bibliothèque dynamique, elle s'appuiera sur la bibliothèque d'exécution .so qui devrait être présente sur 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 ().

15
Andrejs Cainikovs

Je recevais 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 a résolu le problème pour moi:

Sudo apt-get install g++-multilib

si vous utilisez un package gcc différent de celui par défaut (par exemple, gcc-7), vous devez l'installer pour cette version spécifique:

Sudo apt-get install g++-7-multilib
7
Vladimir Panteleev