.data
hello:.ascii "hello"
.text
.global _start
_start:
movl $4,%eax
movl $1,%ebx
movl $hello,%ecx
movl $5,%edx
int $0x80
eax:4 ebx:1,write系统调用,1代表STDOUT_FILENO
.global _start
_start:
movl $1,%eax
movl $2,%ebx
int $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 main
main:
mov $1,%eax
mov $2,%ebx
int $0x80
由这个对比,可以知道
gcc只要有main函数就行,因为他默认会链接一个包含有_start函数的模块(额,没搞清楚是哪个模块)。
ld只要有_start函数就行,因为他不会多链接什么函数。
总结:加载器加载的时候肯定_start函数,这个应该是链接脚本决定的。
问题1:_start是在哪个模块?
问题2:链接脚本,加载器,glibc是什么关系?