Lance Pollard
Lance Pollard

Reputation: 79178

How to change the start/main entrypoint of x86-64 assembly with NASM?

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

Answers (1)

fuz
fuz

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

Related Questions