Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses
Avatar
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!\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,

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.

5 réponses

Avatar
JKB
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 <stdio.h>
#include <stdlib.h>

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.
Avatar
Marc
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 ?
Avatar
JKB
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.
Avatar
Marc
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 ?
Avatar
JKB
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.