views:

509

answers:

1

I'm trying to learn assembly using NASM, the pcasm-book.pdf from Dr Paul Carter - http://www.drpaulcarter.com/pcasm/ - on my Mac OS X Snow Leopard.

I'm trying to link the previous compiled C sample to asm samples:

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

But it's returning it:

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

I'm using the Mach-o format to compile asm samples, and I got no errors:

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

If I try to use only gcc -c in driver.c, using ld to link all object files, ld appears to not link driver.o format.

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

It returns:

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

What's the problem? What is the correct format to work with gcc and NASM on OS X?

Thank you. Daniel Koch

+3  A: 

The "file is not of required architecture" indicates that you're trying to link object files with different architectures: probably x86_64 and i386. As it appears your nasm output is i386, try using -arch i386 with gcc. You can also use file to display the architecture of a given object file or library.

% 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
Nicholas Riley
Thank you. Gcc uses x86_64 by default while "macho" format from NASM is i386.
Daniel Koch