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
.
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.