Linux Kernel 加载ELF续

楔子

继续Linux Kernel内核态加载elf main入口调看

类同

elf文件实际上就类似于windows上的exe文件。

注意

注意下elf的入口其实是_start函数,linux kernel在设置调用main函数入口的时候实际上是设置的rip(new_ip)为_start入口,此处为:0x4016b0。通过_start调用Glibc,后者调用了main。sp(new_sp)则为一个固定的八字节:0x0000000000000001.
Linux Kernel 加载ELF续

有了这两条信息,可以去kernel里面调看下。

调看

在start_thread函数断点,进入
Linux Kernel 加载ELF续
看下局部变量new_ip,new_sp的值分别是的多少
Linux Kernel 加载ELF续
new_ip=0x4016b0刚好是elf入口_start函数地址。
new_sp=0x00007ffcb46c7560,看下它内存是啥
Linux Kernel 加载ELF续
可以看到它确实是:0x0000000000000001。

那么这个很明显的就在于,当CPU从内核态切换到用户态的时候,直接跳转到用户态的RIP所在的地址,也就是elf函数_start地址,同时设置了RSP的值。

结尾

到这里elf大致上有个了解了,后面继续看下其它方面的。

作者:江湖评谈