汇编1

来源:互联网 发布:php获取物理地址 编辑:程序博客网 时间:2024/05/16 09:53
.datahello:.ascii "hello".text.global _start_start:movl $4,%eaxmovl $1,%ebxmovl $hello,%ecxmovl $5,%edxint $0x80

eax:4 ebx:1,write系统调用,1代表STDOUT_FILENO

.global _start_start:movl $1,%eaxmovl $2,%ebxint $0x80

编译:as -o m.o m.s

链接:ld -o m m.s

看出的问题:

没有.text,.data,.bss三个段也可以,不过最后生成的可执行文件还是会有这几个段的,而且还会多加几个段。

问题1:直接as m.s会生成a.out,但是不能执行。

问题2:直接gcc m.s,_start重定义了

.global mainmain:mov $1,%eaxmov $2,%ebxint $0x80

由这个对比,可以知道

gcc只要有main函数就行,因为他默认会链接一个包含有_start函数的模块(额,没搞清楚是哪个模块)。

ld只要有_start函数就行,因为他不会多链接什么函数。

总结:加载器加载的时候肯定_start函数,这个应该是链接脚本决定的。

问题1:_start是在哪个模块?

问题2:链接脚本,加载器,glibc是什么关系?