我最近开始学习汇编,并且想知道在使用gcc进行编译时,是否可以为汇编代码定义自己的入口点?
例如,用gcc编译的标准代码是
全局主要
.data
.bss
.text部分
主要:
我想将入口点更改为更定义的名称,例如“ addition”,如下所示。
全局加法
.data
.bss
.text部分
添加:
我之所以也首先使用gcc进行编译的原因是,我在我的汇编代码中使用了c库来表示“ printf”和“ scanf”,并且每次我尝试更改入口点时,我都会得到未定义对主要错误的引用。
答案 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?)