Question

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

Was it helpful?

Solution

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top