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/

Reply via email to