Kingsley Tran
Kingsley Tran

Reputation: 13

Using a user defined entry point in assembly x86-64 nasm when compiling with gcc

I recently started learning assembly and was wondering if it is possible for us to have our own defined entry point for an assembly code when compiling with gcc?

For example the standard code that compiles with gcc is

global main

section .data

section .bss

section .text

main:

I would like to change the entry point to a more defined name such as "addition", something like this below.

global addition

section .data

section .bss

section .text

addition:

A reason for why im using gcc to compile in the first place as well is that im using c libraries in my assembly code for "printf" and "scanf", and everytime I tried to change the entry point, I would get an undefined reference to main error.

Upvotes: 1

Views: 4695

Answers (2)

Peter Cordes
Peter Cordes

Reputation: 363980

You can put multiple labels on the same address. So you can stick the main label at whatever place you want the CRT startup code to call.

global main
main:
addition:
   lea  eax, [rdi+rdi]    ; return argc*2
   ret

I checked, and GDB chooses to show main in the disassembly for the block of code following the label, regardless of which one you declare first. (`global addition doesn't help either.)


Of if you want to be able to change one line at the top of your file to select which function is the main entry point, you could maybe do

%define addition main

I'm not sure if NASM lets you create an alias or weak-alias for a symbol, like with GAS
.weakref main, addition. (Call a function in another object file without using PLT within a shared library?)

Upvotes: 2

prl
prl

Reputation: 12435

If you are writing in assembly and not using the C runtime library, then you can call your entry point whatever you want. You tell the linker what the name of the entry point is, using either the gcc command line option -Wl,--entry=<symbol> or the ENTRY directive in the linker script. The linker writes the address of this entry point in the executable file.

If you are using the C runtime library, then the entry point in the executable file needs to be the entry point of the C runtime library, so that it can perform initialization. This entry point is typically called crt0. When crt0 finishes initializing, it calls main, so in this case, you cannot change the name.

Upvotes: 4

Related Questions