# [Developpement ASM] Cross-compilation 64b/32b (résolu)

## Saimoun

Bonsoir,

Je vous explique mon problème : je me suis mis à l'Assembleur il y a peu, et la compilation avec NASM en utilisant le format de sortie "bin" marchait très bien.

Sauf que voilà, j'ai voulu passer à un programme un peu plus grand, qui est réparti sur plusieurs fichiers : et là la compilation bloque au niveau de l'édition de lien, car je suis sous un système 64 bits (amd64 plus précisément) mais je veux compiler un exécutable en format 32 bits (pour pouvoir l'éxécuter dans le MBR d'une disquette, après).

Concrètement, j'ai :

```
fichier1.asm ---> nasm -f elf fichier1.asm ---> fichier1.o

fichier2.asm ---> nasm -f elf fichier2.asm ---> fichier2.o

(jusqu'ici tout va bien)

fichier1.o et fichier2.o ---> ld --oformat binary -o executable fichier1.o fichier2.o ----??----> executable
```

Sauf que la dernière éxecution me renvoie

 *Quote:*   

> ld: i386 architecture of input file `fichier1.o' is incompatible with i386:x86-64 output

 

Faut savoir que je ne demande pas sans avoir cherché : j'ai fouillé le net, je suis allé voir (R)TFM (The F***ing Manuals), j'ai parcouru les forums, la Doc Gentoo, etc etc.

J'ai beau avoir cherché je n'ai trouvé quasiment aucun tuto sur le net qui apprend à se servir de ld o_O Du coup je suit allé voir le manuel, et j'ai trouvé l'option --oformat, qui est très mal documentée vu qu'elle ne donne même pas les formats possibles...

En cherchant sur le net, j'ai trouvé "objdump -i", qui renvoie une liste de format BFD... Oui ça n'a peut-être rien à voir, mais je les ai testé, et à mon avis celui qui conviendrai le mieux à mon problème serait le format "a.out-i386-linux", sauf que quand je l'essaye, j'ai une autre erreur :

 *Quote:*   

> ld:kernel: can not set architecture: No such file or directory

 

J'ai aussi trouvé ça dans la Doc : http://www.gentoo.org/proj/en/base/embedded/handbook/?part=1&chap=4

Mais j'ai comme l'impression que ça concerne plus la compilation des applications (en gros, les "emerge") que la compilation dans le cadre de développement d'applications hors Gentoo.

Voilà, vous savez tout. Je suis preneur de toute solution, que ça soit avec gcc, avec ld, ou même avec autre chose comme un script.

Voici quelques infos :

```
$ file fichier1.o

kernel.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

$ uname -a

Linux gentux 2.6.30-gentoo-r5 #9 Sun Oct 18 22:07:56 CEST 2009 x86_64 AMD Athlon(tm) 64 Processor 3800+ AuthenticAMD GNU/Linux

$ gcc-config -l

 [1] x86_64-pc-linux-gnu-3.4.6

 [2] x86_64-pc-linux-gnu-3.4.6-hardened

 [3] x86_64-pc-linux-gnu-3.4.6-hardenednopie

 [4] x86_64-pc-linux-gnu-3.4.6-hardenednopiessp

 [5] x86_64-pc-linux-gnu-3.4.6-hardenednossp

 [6] x86_64-pc-linux-gnu-4.3.4 *

$ binutils-config -l

 [1] x86_64-pc-linux-gnu-2.18 *

```

Merci d'avance !

----------

## kwenspc

C'est bien ton ld à qui il faut préciser la chose.

```
ld -m elf_i386
```

 :Wink: 

Pour l'exécution, faut que ton kernel supporte l'émulation 32 bits (si t'es en multilib c'est que tu l'as)

Sinon oui la doc pour la cross-compilation vise le système emerge principalement. Dans ton cas tu peux te passer d'un système lourd de cross compilation vu que c'est supportés nativement le 32 bits sur 64 bits.

----------

## Saimoun

Ca répond à ma question, merci  :Wink: 

Seulement j'ai plein d'autres problèmes, mais là c'est encore autre chose, ça rejoint la compilation Assembleur en plusieurs morceaux... En fait je ne sais pas s'il faut que je mette les directives (j'utilise Nasm) [ORG], [BITS], segment dans tous les fichiers où que l'indique ces directives lors de l'édition de liens des différents fichiers .o créés avec Nasm...

Enfin bref, faut que je me penche sur la question, je poserai une question claire et précise dans un autre topic quand j'en aurait une claire et précise.

----------

