OVH Cloud OVH Cloud

a.out et AMD 64

2 réponses
Avatar
Vincent Bernat
Coucou,

J'aimerais construire avec un programme un fichier a.out. Cela marche
impec sur x86, mais cela ne semble pas marcher sur AMD64. Il s'agit
d'un 2.6.8 Debian qui est pourtant compilé avec le support du a.out
dans l'émulation IA32. Je génère bien du code 32 bits (puisqu'il ne
semble pas possible d'avoir du 64 bits en x86_64 avec a.out) et
celui-ci tourne sans problème sur x86.

gcc ne semble plus savoir compiler des a.out. Cela devrait être le
format de sortie par défaut quand on ne précise pas de -o, mais il me
génère quand même un binaire ELF.

Dans les sources du noyau, il y a plein de code pour gérer le a.out
pour x86_64, cela devrait donc être supporté.

Autre possibilité : comment générer simplement du ELF (j'ai la section
code, je veux la rendre exécutable) ?
--
printk("ufs_read_super: fucking Sun blows me\n");
2.0.38 /usr/src/linux/fs/ufs/ufs_super.c

--
Pour contacter l'équipe de modération : moderateurs-fcolm@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.

2 réponses

Avatar
Didier Couderc
Salut,

Vincent Bernat writes:


gcc ne semble plus savoir compiler des a.out. Cela devrait être le
format de sortie par défaut quand on ne précise pas de -o, mais il me
génère quand même un binaire ELF.



Attention à la confusion, quand on ne précise pas l'option -o
l'exécutable produit s'appelle a.out. C'est tout.

Pour produire un exécutable a.out, il faut le demander au linker
gcc -Wl,--oformat=a.out-i386-linux ...
en remplaçant i386 par ce qui va bien, "objdump -i" pour avoir la
liste des formats connus.

--
Mog

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Vincent Bernat
OoO En ce début d'après-midi nuageux du mardi 18 juillet 2006, vers
14:35, Didier Couderc disait:

gcc ne semble plus savoir compiler des a.out. Cela devrait être le
format de sortie par défaut quand on ne précise pas de -o, mais il me
génère quand même un binaire ELF.





Attention à la confusion, quand on ne précise pas l'option -o
l'exécutable produit s'appelle a.out. C'est tout.



Pour produire un exécutable a.out, il faut le demander au linker
gcc -Wl,--oformat=a.out-i386-linux ...
en remplaçant i386 par ce qui va bien, "objdump -i" pour avoir la
liste des formats connus.



Ca ne doit pas suffir :
/usr/lib/gcc/i486-linux-gnu/4.1.2/libgcc_s.so: ne peut lire les symboles: Fichier dans un mauvais format
collect2: ld returned 1 exit status

Avec -v, il indique qu'il exécute la commande :
/usr/lib/gcc/i486-linux-gnu/4.1.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.2/crtbegin.o -L/usr/lib/gcc/i486-linux-gnu/4.1.2 -L/usr/lib/gcc/i486-linux-gnu/4.1.2 -L/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib -L/lib/../lib -L/usr/lib/../lib --oformat=a.out-i386-linux /tmp/ccKa2GQh.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i486-linux-gnu/4.1.2/crtend.o /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crtn.o

Le -m elf_i386 doit posser problème. J'ai effectué les étapes à la
main, mais sans -m elf_i386, j'obtiens la même erreur. Si je mets -m
blah, il me dit qu'il supporte : elf_i386 i386linux elf_x86_64. Je
tente i386linux, je vire --eh-frame-hdr et il se plaint qu'il ne
trouve pas -lgcc_s. Et bien sûr, si je vire la liaison dynamique, il
se plaint qu'il n'arrive pas à trouver tous les symboles.

Ou alors, peut-être qu'il me faut installer des trucs en plus ?
--
IT DOES NOT SUCK TO BE YOU
IT DOES NOT SUCK TO BE YOU
IT DOES NOT SUCK TO BE YOU
-+- Bart Simpson on chalkboard in episode AABF13

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.