2009-12-16 4 views
4

J'essaie d'apprendre l'assemblage en utilisant NASM, le pcasm-book.pdf du Dr Paul Carter - http://www.drpaulcarter.com/pcasm/ - sur mon Mac OS X Snow Leopard.Quel est le format de fichier utilisé par gcc dans OSX?

Je suis en train de relier l'échantillon précédent C compilé à des échantillons asm:

gcc first.o driver.c asm_io.o -o first 

Mais il est le retourner:

driver.c:3: warning: ‘cdecl’ attribute ignored 
ld: warning: in first.o, **file is not of required architecture** 
ld: warning: in asm_io.o, file is not of required architecture 
Undefined symbols: 
    "_asm_main", referenced from: 
     _main in ccjLqYJn.o 
ld: symbol(s) not found 

J'utilise le format Mach-o pour compiler asm échantillons, et je suis pas d'erreur:

nasm -f macho **first.asm** 
nasm -f macho asm_io.asm 

Si j'essaie d'utiliser gcc -c dans driver.c, en utilisant ld pour relier tous les fichiers objets, l d semble ne pas lier le format driver.o.

ld -o first asm_io.o first.o driver.o 

Il retourne:

ld: warning: in driver.o, file is not of required architecture 
Undefined symbols: 
    "_putchar", referenced from: 
     print_char in asm_io.o 
     print_nl in asm_io.o 
    "_printf", referenced from: 
     print_int in asm_io.o 
     print_string in asm_io.o 
     push_of in asm_io.o 
     sub_dump_stack in asm_io.o 
     stack_line_loop in asm_io.o 
     sub_dump_mem in asm_io.o 
     mem_outer_loop in asm_io.o 
     mem_hex_loop in asm_io.o 
     sub_dump_math in asm_io.o 
     tag_loop in asm_io.o 
     print_real in asm_io.o 
     invalid_st in asm_io.o 
    "_scanf", referenced from: 
     read_int in asm_io.o 
    "_getchar", referenced from: 
     read_char in asm_io.o 
ld: symbol(s) not found for inferred architecture i386 

Quel est le problème? Quel est le format correct pour travailler avec gcc et NASM sur OS X?

Merci. Daniel Koch

Répondre

5

Le "fichier n'est pas de l'architecture requise" indique que vous essayez de lier des fichiers objets avec différentes architectures: probablement x86_64 et i386. Comme il apparaît que votre sortie nasm est i386, essayez d'utiliser -arch i386 avec gcc. Vous pouvez également utiliser file pour afficher l'architecture d'un fichier objet ou d'une bibliothèque.

% touch foo.c ; gcc -c foo.c 
% file foo.o 
foo.o: Mach-O 64-bit object x86_64 
% gcc -c -arch i386 foo.c 
% file foo.o    
foo.o: Mach-O object i386 
+0

Merci. Gcc utilise x86_64 par défaut alors que le format "macho" de NASM est i386. –

+0

@DanielKoch pourriez-vous poster ce qui a finalement fonctionné pour vous? Je reçois toujours des erreurs de compilation. – gideon

+0

@gideon Vous devriez probablement poster une nouvelle question ou inclure un lien vers exactement les commandes que vous essayez et les erreurs que vous voyez. Ou décrivez ce que vous n'avez pas compris à propos de ma réponse, afin que je puisse l'améliorer. –

Questions connexes