使用gcc进行编译时,在程序集x86-64 nasm中使用用户定义的入口点

时间:2019-02-07 21:32:34

标签: gcc assembly nasm x86-64

我最近开始学习汇编,并且想知道在使用gcc进行编译时,是否可以为汇编代码定义自己的入口点?

例如,用gcc编译的标准代码是

全局主要

.data

.bss

.text部分

主要:

我想将入口点更改为更定义的名称,例如“ addition”,如下所示。

全局加法

.data

.bss

.text部分

添加:

我之所以也首先使用gcc进行编译的原因是,我在我的汇编代码中使用了c库来表示“ printf”和“ scanf”,并且每次我尝试更改入口点时,我都会得到未定义对主要错误的引用。

2 个答案:

答案 0 :(得分:1)

如果您要使用C运行时库编写程序集,而不是,则可以随意调用入口点。您可以使用链接器脚本中的gcc命令行选项-Wl,--entry=<symbol>或ENTRY指令,告诉链接器入口点的名称是什么。链接器将此入口点的地址写入可执行文件中。

如果您正在使用C运行时库,则可执行文件中的入口点必须是C运行时库的入口点,以便它可以执行初始化。该入口点通常称为crt0。当crt0完成初始化时,它将调用main,因此在这种情况下,您不能更改名称。

答案 1 :(得分:1)

您可以在同一地址上放置多个标签。因此,您可以将main标签贴在CRT启动代码要放在call的任何位置。

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

我检查了一下,GDB选择在反汇编中为标签后面的代码块显示main,而不管您先声明的是哪个。 (`全局加法也无济于事。)


如果您希望能够在文件顶部更改一行以选择main入口点是哪个功能,则可以这样做

%define addition main

我不确定NASM是否允许您为符号创建别名或弱别名,例如使用GAS
.weakref main, addition。 (Call a function in another object file without using PLT within a shared library?