Reputation: 79178
I have this:
$ make build
read.o: In function `_start':
read.asm:(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:3: recipe for target 'build' failed
make: *** [build] Error 1
From this asm:
global main
section .text
main: mov rax, 1 ; system call for write
mov rdi, 1 ; file handle 1 is stdout
mov rsi, message ; address of string to output
mov rdx, 13 ; number of bytes
syscall ; invoke operating system to do the write
mov rax, 60 ; system call for exit
xor rdi, rdi ; exit code 0
syscall ; invoke operating system to exit
section .data
message: db "Hello, World", 10 ; note the newline at the end
I am running it with this:
$ nasm -felf64 read.asm -o read.o && gcc read.o -o store && ./store
How do I change the word main
to something other than main
or _start
, such as begin
or myentrypoint
? I would like to customize it. Can it even be customized?
Upvotes: 1
Views: 1571
Reputation: 92966
Note that main
is not the entrypoint. The entrypoint is _start
provided by crt0.o
which eventually calls main
. You cannot change that. However, you can provide your own startup code that calls some other function than main
.
Note that the entrypoint itself can be set to whatever symbol you like with the -e
option to ld
. Refer to the manual for details. Note however that if you change this, the C runtime code will no longer work correctly. Use only with your own runtime code.
One option to change main
to something else is setting main
to be an alias for some other symbol, e.g. with
.set main, mymain
in some assembly file. Alternatively, simply provide a dummy main
function that jumps to your actual main function:
global main
main: jmp mymain
Upvotes: 3