Compiler un exécutable en 64 bits sous Solaris avec gcc/gnu-ld

Le
JKB
Bonjour à tous (et bonne année 2009),

Je disjoncte Mais vraiment je disjoncte J'ai un programme de
calcul à compiler sous Solaris 10/Sparc en 64 bits.

Ce programme fonctionne parfaitement et compile sans aucun problème
en 32 bits sur la machine en question (compilateur gcc/gfortran 4.3.2 +
GNU ld correspondant).

J'arrive à compiler en 64 bits avec la chaîne gcc/Solaris ld. Sauf
que cela ne fonctionne pas bien au final car j'ai absolument besoin de
l'option -export-dynamic du linker de GNU. J'ai bien essayé de trouver
l'équivalent dans les nombreuses options du linker de Solaris, mais rien
n'y fait. J'ai besoin que le programme en question exporte ses symboles
vers une bibliothèque dynamique qu'il charge à la volée.

Lorsque j'essaye de compiler en 64 bits avec la chaîne gcc/GNU ld,
je me prends une erreur dès que j'essaye de compiler autre chose que du
C en 64 bits.

tchaikovski:[~/test] > cat test.c
#include <stdio.h>
#include <stdlib.h>

int
main()
{
printf("Hello, World!");
exit(EXIT_SUCCESS);
}
tchaikovski:[~/test] > gcc -m64 test.c
tchaikovski:[~/test] > file a.out
a.out: ELF 64 bits MSB exécutable SPARCV9 Version 1, avec liens
dynamiques, fichier intégral
tchaikovski:[~/test] > ./a.out
Hello, World!

Parfait. Maintenant, la même chose en Fortran :

tchaikovski:[~/test] > cat test.f90
program TEST
write(*, *) ' Hello, world!'
end
tchaikovski:[~/test] > gfortran -m64 test.f90
tchaikovski:[~/test] > file a.out
a.out: ELF 64 bits MSB exécutable SPARCV9 Version 1, avec liens
dynamiques, fichier intégral
tchaikovski:[~/test] > ./a.out
ld.so.1: a.out: fatal : /usr/shared-apps/lib/libgfortran.so.3 : classe
ELF erronée : ELFCLASS32
Tué
tchaikovski:[~/test] > ldd a.out
libgfortran.so.3 => /usr/shared-apps/lib/libgfortran.so.3
- classe ELF erronée : ELFCLASS32
libm.so.2 => /lib/64/libm.so.2
libgcc_s.so.1 => /usr/shared-apps/lib/libgcc_s.so.1 -
classe ELF erronée : ELFCLASS32
libc.so.1 => /lib/64/libc.so.1
/platform/SUNW,SPARC-Enterprise-T1000/lib/sparcv9/libc_psr.so.1
tchaikovski:[~/test] >

Il va sans dire que les bibliothèques demandées sont présentes sur
le système, mais dans un autre répertoire :
tchaikovski:[/usr/shared-apps/lib/sparcv9] > file libgfortran.so.3
libgfortran.so.3: ELF 64 bits MSB bibliothèque dynamique SPARCV9
Version 1, avec liens dynamiques, fichier intégral
tchaikovski:[/usr/shared-apps/lib/sparcv9] > file ../libgfortran.so.3
../libgfortran.so.3: ELF 32 bits MSB bibliothèque dynamique
SPARC32PLUS Version 1, V8+ requis, avec liens dynamiques, fichier intégral
tchaikovski:[/usr/shared-apps/lib/sparcv9] >

J'ai essayé de truander en imposant ce chemin dans les options du
linker, rien n'y fait et c'est toujours les version 32 bits qui sont
chargées !

Y a-t-il une solution autre que prendre le linker de Solaris qui ne
convient pas ? Pour information :

tchaikovski:[~/test] > gcc -v
Using built-in specs.
Target: sparc-sun-solaris2.10
Configured with: ../configure --prefix=/usr/shared-apps
--enable-languages=c,c++,fortran --enable-shared
--enable-threads=solaris --enable-nls --enable-checking=release
--with-mpfr=/usr/shared-apps/ --with-gnu-ld
Thread model: solaris
gcc version 4.3.2 (GCC)

Merci de vos lumières,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JKB
Le #18362461
Le 11-01-2009, ? propos de
Compiler un exécutable en 64 bits sous Solaris avec gcc/gnu-ld,
JKB ?crivait dans fr.comp.os.unix :
Bonjour à tous (et bonne année 2009),

Je disjoncte... Mais vraiment je disjoncte... J'ai un programme de
calcul à compiler sous Solaris 10/Sparc en 64 bits.

Ce programme fonctionne parfaitement et compile sans aucun problème
en 32 bits sur la machine en question (compilateur gcc/gfortran 4.3.2 +
GNU ld correspondant).

J'arrive à compiler en 64 bits avec la chaîne gcc/Solaris ld. Sauf
que cela ne fonctionne pas bien au final car j'ai absolument besoin de
l'option -export-dynamic du linker de GNU. J'ai bien essayé de trouver
l'équivalent dans les nombreuses options du linker de Solaris, mais rien
n'y fait. J'ai besoin que le programme en question exporte ses symboles
vers une bibliothèque dynamique qu'il charge à la volée.

Lorsque j'essaye de compiler en 64 bits avec la chaîne gcc/GNU ld,
je me prends une erreur dès que j'essaye de compiler autre chose que du
C en 64 bits.

tchaikovski:[~/test] > cat test.c
#include #include
int
main()
{
printf("Hello, World!n");
exit(EXIT_SUCCESS);
}
tchaikovski:[~/test] > gcc -m64 test.c
tchaikovski:[~/test] > file a.out
a.out: ELF 64 bits MSB exécutable SPARCV9 Version 1, avec liens
dynamiques, fichier intégral
tchaikovski:[~/test] > ./a.out
Hello, World!

Parfait. Maintenant, la même chose en Fortran :

tchaikovski:[~/test] > cat test.f90
program TEST
write(*, *) ' Hello, world!'
end
tchaikovski:[~/test] > gfortran -m64 test.f90
tchaikovski:[~/test] > file a.out
a.out: ELF 64 bits MSB exécutable SPARCV9 Version 1, avec liens
dynamiques, fichier intégral
tchaikovski:[~/test] > ./a.out
ld.so.1: a.out: fatal : /usr/shared-apps/lib/libgfortran.so.3 : classe
ELF erronée : ELFCLASS32
Tué
tchaikovski:[~/test] > ldd a.out
libgfortran.so.3 => /usr/shared-apps/lib/libgfortran.so.3
- classe ELF erronée : ELFCLASS32
libm.so.2 => /lib/64/libm.so.2
libgcc_s.so.1 => /usr/shared-apps/lib/libgcc_s.so.1 -
classe ELF erronée : ELFCLASS32
libc.so.1 => /lib/64/libc.so.1
/platform/SUNW,SPARC-Enterprise-T1000/lib/sparcv9/libc_psr.so.1
tchaikovski:[~/test] >

Il va sans dire que les bibliothèques demandées sont présentes sur
le système, mais dans un autre répertoire :
tchaikovski:[/usr/shared-apps/lib/sparcv9] > file libgfortran.so.3
libgfortran.so.3: ELF 64 bits MSB bibliothèque dynamique SPARCV9
Version 1, avec liens dynamiques, fichier intégral
tchaikovski:[/usr/shared-apps/lib/sparcv9] > file ../libgfortran.so.3
../libgfortran.so.3: ELF 32 bits MSB bibliothèque dynamique
SPARC32PLUS Version 1, V8+ requis, avec liens dynamiques, fichier intégral
tchaikovski:[/usr/shared-apps/lib/sparcv9] >

J'ai essayé de truander en imposant ce chemin dans les options du
linker, rien n'y fait et c'est toujours les version 32 bits qui sont
chargées !

Y a-t-il une solution autre que prendre le linker de Solaris qui ne
convient pas ? Pour information :

tchaikovski:[~/test] > gcc -v
Using built-in specs.
Target: sparc-sun-solaris2.10
Configured with: ../configure --prefix=/usr/shared-apps
--enable-languages=c,c++,fortran --enable-shared
--enable-threads=solaris --enable-nls --enable-checking=release
--with-mpfr=/usr/shared-apps/ --with-gnu-ld
Thread model: solaris
gcc version 4.3.2 (GCC)

Merci de vos lumières,



Groumpfff. Au moment où j'écris, je m'aperçois qu'un LD_LIBRARY_PATH
règle en partie le problème. Ce n'est pas propre, mais je vais vois s'il
est possible de bricoler quelque chose par là...

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Marc
Le #18363271
JKB wrote:

Je disjoncte... Mais vraiment je disjoncte... J'ai un programme de
calcul à compiler sous Solaris 10/Sparc en 64 bits.

Ce programme fonctionne parfaitement et compile sans aucun problème
en 32 bits sur la machine en question (compilateur gcc/gfortran 4.3.2 +
GNU ld correspondant).



C'est de la chance, les gens de gcc disent que c'est une mauvaise idée
d'utiliser gld sur solaris.

J'arrive à compiler en 64 bits avec la chaîne gcc/Solaris ld. Sauf
que cela ne fonctionne pas bien au final car j'ai absolument besoin de
l'option -export-dynamic du linker de GNU. J'ai bien essayé de trouver
l'équivalent dans les nombreuses options du linker de Solaris, mais rien
n'y fait.



C'est surprenant, on lit à un certain nombre d'endroits que c'est le
comportement par défaut (sinon un mapfile devrait faire l'affaire).

tchaikovski:[~/test] > ./a.out
ld.so.1: a.out: fatal : /usr/shared-apps/lib/libgfortran.so.3 : classe
ELF erronée : ELFCLASS32



Ça c'est juste comme d'habitude des specs foireuses de gcc.

J'ai essayé de truander en imposant ce chemin dans les options du
linker, rien n'y fait et c'est toujours les version 32 bits qui sont
chargées !



Comment ? Avec -rpath ?
JKB
Le #18363261
Le 11-01-2009, ? propos de
Re: Compiler un exécutable en 64 bits sous Solaris? avec gcc/gnu-ld,
Marc ?crivait dans fr.comp.os.unix :
JKB wrote:

Je disjoncte... Mais vraiment je disjoncte... J'ai un programme de
calcul à compiler sous Solaris 10/Sparc en 64 bits.

Ce programme fonctionne parfaitement et compile sans aucun problème
en 32 bits sur la machine en question (compilateur gcc/gfortran 4.3.2 +
GNU ld correspondant).



C'est de la chance, les gens de gcc disent que c'est une mauvaise idée
d'utiliser gld sur solaris.



Sauf qu'il faut pouvoir faire autrement...

J'arrive à compiler en 64 bits avec la chaîne gcc/Solaris ld. Sauf
que cela ne fonctionne pas bien au final car j'ai absolument besoin de
l'option -export-dynamic du linker de GNU. J'ai bien essayé de trouver
l'équivalent dans les nombreuses options du linker de Solaris, mais rien
n'y fait.



C'est surprenant, on lit à un certain nombre d'endroits que c'est le
comportement par défaut (sinon un mapfile devrait faire l'affaire).



En tout cas, la bibliothèque ne _peut_ utiliser les symboles
exportés par le programme la chargeant.

tchaikovski:[~/test] > ./a.out
ld.so.1: a.out: fatal : /usr/shared-apps/lib/libgfortran.so.3 : classe
ELF erronée : ELFCLASS32



Ça c'est juste comme d'habitude des specs foireuses de gcc.

J'ai essayé de truander en imposant ce chemin dans les options du
linker, rien n'y fait et c'est toujours les version 32 bits qui sont
chargées !



Comment ? Avec -rpath ?



Oui.

JKB


--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Marc
Le #18363561
JKB wrote:

En tout cas, la bibliothèque ne _peut_ utiliser les symboles
exportés par le programme la chargeant.



Je viens d'essayer, et j'y arrive sans aucune difficulté (gcc-3.4
utilisant le ld de Sun sur solaris 9). Il va falloir donner plus de
détails...

J'ai essayé de truander en imposant ce chemin dans les options du
linker, rien n'y fait et c'est toujours les version 32 bits qui sont
chargées !



Comment ? Avec -rpath ?



Oui.



Que donne dump -Lv sur le résultat ? Et qu'affiche gfortran -v pour le
link ?
JKB
Le #18364011
Le 11-01-2009, ? propos de
Re: Compiler un exécutable en 64 bits sous? Solaris? avec gcc/gnu-ld,
Marc ?crivait dans fr.comp.os.unix :
JKB wrote:

En tout cas, la bibliothèque ne _peut_ utiliser les symboles
exportés par le programme la chargeant.



Je viens d'essayer, et j'y arrive sans aucune difficulté (gcc-3.4
utilisant le ld de Sun sur solaris 9). Il va falloir donner plus de
détails...



Il n'y a pas de gfortran avec gcc-3.4 ;-)

J'ai essayé de truander en imposant ce chemin dans les options du
linker, rien n'y fait et c'est toujours les version 32 bits qui sont
chargées !



Comment ? Avec -rpath ?



Oui.



Que donne dump -Lv sur le résultat ? Et qu'affiche gfortran -v pour le
link ?



Il faudrait que je reteste, mais je n'ai pas de machine de test
disponible tout de suite.

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Publicité
Poster une réponse
Anonyme