Question

I want to compile and execute a very simple program in 64 bit.

section .text 
global _start 
_start: 
   mov     rdx,len 
   mov     rcx,msg 
   mov     rbx,1 
   mov     rax,4 
   int     0x80 
   mov    rbx,0 
   mov     rax,1 
   int     0x80 
section .data 
msg     db      "Hello, world!",0xa 
len     equ     $ - msg 

The line to compile it:

yasm -f elf64 -g dwarf2 example.asm

$ yasm --version
yasm 1.2.0

also tried with another format macho[|32|64], elf[|32] bin none of them succeed.

The line to link it:

gcc -o example example.o

ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): example.o
Undefined symbols for architecture x86_64:
"_main", referenced from:
  start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

also tried with some options for gcc such as -m64 -arch x86_64.

Was it helpful?

Solution

You have a few problems here:

1) ELF is not supported on OS X, only Mach-O.

2) Your linker is looking for an x86_64 architecture Mach-O and not finding it.

ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): example.o

Make sure you're assembling for x86_64 or else try passing -m32 to GCC to use x86.

3) Your linker is trying to include the C runtime library crt1.10.6.o, which doesn't look like what you want since you didn't define a _main function. Perhaps you should call the linker directly instead of invoking it via GCC, or else find the right combination of flags to pass to the linker to avoid this.

If I was you, I'd start with the following steps:

a) Write hello world in C, have clang output an assembly file (-s), and then see if you can assemble and link that using just clang. This should be pretty straightforward.

b) Once that works, use file and otool to determine what your object file should look like and try to produce that with yasm.

OTHER TIPS

I have been working on assembly language for OS X using yasm. The assemble line is:

yasm -f macho64 -l file.lst file.asm

Then link with ld:

ld -o file file.o

You should use start rather than _start on OS X.

Following that there is a problem using gdb. There does not seem to be any debug format available for OS X.

You might be interested in trying my IDE named ebe. I have managed to get breakpoints and debugging to work fairly well. Currently I have some issues with debugging floating point code. gdb doesn't seem to be aware of the ymm registers and the default version of gdb had the parts of the xmm registers backwards.

You might like ebe. Download it from sourceforge using

git clone git://git.code.sf.net/p/ebe-ide/code ebe

It requires xterm, python, tkinter and pmw (a python library).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top