On Sat, 12 Mar 2005, Matthias-Christian Ott wrote:
Hi! I hope I'm right here. I've the following assembler code:
SECTION .DATA hello: db 'Hello world!',10 helloLen: equ $-hello
SECTION .TEXT GLOBAL main
main:
; Write 'Hello world!' to the screen mov eax,4 ; 'write' system call mov ebx,1 ; file descriptor 1 = screen mov ecx,hello ; string to write mov edx,helloLen ; length of string to write int 80h ; call the kernel
; Terminate program mov eax,1 ; 'exit' system call mov ebx,0 ; exit with error code 0 int 80h ; call the kernel
Then I run:
nasm -f elf hello.asm
I link it with ld and run it:
ld -s -o hello hello.o ./hello segmentation fault
I link it with the gcc and run it:
gcc hello.o -o hello ./hello Hello world!
What's wrong with the ld?
Nothing at all. Where is _start: ?
Remove the 'main' label and substitute _start:
It is 'C' convention that programs start with main(). They really don't. With the Linux API, they start at _start: and do some housekeeping before calling main. That's what the crt.o file that the 'C' tool-chain uses, does.
Cheers, Dick Johnson Penguin : Linux version 2.6.11 on an i686 machine (5537.79 BogoMips). Notice : All mail here is now cached for review by Dictator Bush. 98.36% of all statistics are fiction. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

