Comment créer un 32 bits partagée de la bibliothèque sur une plate-forme 64 bits avec les autotools
J'utilise les autotools pour construire mon système, qui se compose principalement d'une bibliothèque. Sur 64 bits Red Hat plates-formes, j'ai besoin d'être en mesure de produire une bibliothèque capable de travailler sur 32 bits Red Hat plates-formes.
Quand j'ajoute -m32
à la compilation des lignes tout fonctionne bien pour produire un statique (.a
) de la bibliothèque, mais dès que j'essaie de créer une partagée la bibliothèque, j'obtiens le message d'erreur comme ceci:
/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o' is incompatible with i386 output
/usr/bin/ld: warning: i386:x86-64 architecture of input file `/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o' is incompatible with i386 output
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbeginS.o: In function `__do_global_dtors_aux':
crtstuff.c:(.text+0x29): undefined reference to `__DTOR_END__'
collect2: ld returned 1 exit status'
Je peux voir le problème c'est que c'est 64-bit objet les fichiers de /usr/lib64 au lieu de le corriger 32 bits à partir de /usr/lib (ils y sont très bien), mais je ne peux pas comprendre comment le corriger.
- ce fil a quelques idées mail-archive.com/[email protected]/msg11662.html
- Vous obtenez le mal de l'irtc.o Voir cette question précédente au sujet de l'inspection de l'include path. Êtes-vous sûr que vous avez une version 32 bits de l'irtc.o dans votre chemin de la bibliothèque? (Et qu'il est présent dans le chemin devant la version 64 bits se produit).
- Aussi loin que je peux dire que le chemin est intégrée dans le compilateur/linker. Depuis que j'ai envie de construire soit 32 ou 64-bit versions, en fonction des arguments pour les autotools script de configuration, la reconstruction de l'outils n'est pas une option. J'ai aussi besoin de cela pour travailler sur mes clients des machines.
- En effet, la version 32 bits de glibc-devel installé?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, assurez-vous d'avoir compilateur/libc prise en charge de 32 bits de la compilation. Dans certaines distributions comme Ubuntu, ce que vous devez faire est d'installer des paquets
gcc-multilib
et/oug++-multilib
:Ensuite, lors de l'appel de configurer, de spécifier un hôte 32 bits et de passer de 32 bits indicateurs de compilation:
Si vous n'avez pas multilib installé, vous obtiendrez un message d'erreur comme
configure: error: C compiler cannot create executables
lors du passage de la-m32
drapeau.gcc-multilib
etc.J'ai eu ce problème sur RHEL6. Cela a fonctionné
LTCC=gcc -m32
était l'incantation magique nécessaire pour obtenir libtool pour construire la bibliothèque de 32 bitsJ'ai eu ce même problème. Mais je n'utilise pas les autotools. Ensuite, dans le fichier Makefile édité à la main, j'ai remarqué que dans la ligne
il n'y a pas d'option de gcc qui indique le 32bit architeture. Une fois mon CFLAGS a déjà l'option-m32, j'ai décidé de le mettre dans la ligne mentionnée ci-dessus:
et voilà. Il fonctionne!
Donc, dans les autotools, peut-être mettre en variable CFLAGS à inclure-m32 option fonctionne pour vous aussi.
Espère que j'ai aidé...
Voulez-vous essayer:
dans votre makefile, depuis certains des scripts à essayer de réticulation à l'aide de gcc ou g++ au lieu de ld comme nous attendre?
Mise à jour: Dans le cas où vous modifier manuellement chaque gcc/g++ à l'appel, essayez d'utiliser -m32 -Wl,-m32 au lieu de simple -m32 comme option supplémentaire.
ELF 32-bit LSB shared object
dans Centos 5.6 x86_64, en utilisant la commande suivante:CC="gcc -m32" sh configure && make
. Je souhaite que cela va vous aider.J'ai eu ce même problème: en cours d'Exécution sur une Ubuntu 64 bits de la machine, j'ai réussi à compiler et lier de 32 bits hôtes à l'aide du
export CFLAGS=-m32; ./configure --host=i386
, mais libtool génèrerait une version 64 bits de bibliothèque partagée.J'ai travaillé autour de ce par la création d'une version 32 bits de l'environnement et de chroot en elle. Ubuntu rend ce facile via debootstrap.
L'éditeur de liens GNU drapeau de construire un 32 bits objet partagé sur un ordinateur 64 bits est:
-m elf_i386
Merci donc de par exemple écrire dans le fichier Makefile:
Une solution rapide....
Générer une application sur un autre PC avec 32 bits de linux et de transfert de l'
les fichiers d'application ( bibliothèque, etc) à la valeur souhaitée 64 bits de linux de la machine. Voir si cela fonctionne. Il a travaillé pour moi.