2009-12-16 4 views
4

Я пытаюсь изучить сборку, используя NASM, pcasm-book.pdf от Доктора Пола Картера - http://www.drpaulcarter.com/pcasm/ - на моем Mac OS X Snow Leopard.Какой формат файла используется gcc в OSX?

Я пытаюсь связать предыдущий скомпилированный образец C образцы ассемблера:

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

Но это возвращение его:

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 

Я использую формат macho-компилировать ассемблер не образцы, и я получил никаких ошибок:

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

Если я пытаюсь использовать только GCC -c в driver.c, используя ЛД, чтобы связать все объектные файлы, л d не ссылается на формат driver.o.

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

возвращает:

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 

В чем проблема? Каков правильный формат работы с gcc и NASM в OS X?

спасибо. Daniel Koch

ответ

5

«Файл не является требуемой архитектурой» означает, что вы пытаетесь связать объектные файлы с разными архитектурами: возможно, x86_64 и i386. Как кажется, ваш выход nasm i386, попробуйте использовать -arch i386 с gcc. Вы также можете использовать file для отображения архитектуры данного объектного файла или библиотеки.

% 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

спасибо. Gcc использует x86_64 по умолчанию, а формат «macho» из NASM - i386. –

+0

@ DanielKoch вы могли бы разместить то, что наконец-то сработало для вас? Я все еще получаю ошибки компиляции. – gideon

+0

@gideon Возможно, вам стоит опубликовать новый вопрос или включить ссылку на команды, которые вы пытаетесь и какие ошибки вы видите. Или описать то, что вы не понимали в моем ответе, поэтому я могу улучшить его. –

Смежные вопросы