漫谈兼容内核之九:ELF映像的装入(二)
txt我们用一只眼睛看见现实的灰墙,却用另一只眼睛勇敢飞翔,接近梦想
男人喜欢听话的女人,但男人若是喜欢一个女人,就会不知不觉听她的话
漫谈兼容内核之九:ELF映像的装入(二)[align=center][size=4][b]漫谈兼容内核之九:ELF映像的装入(二)[/b][/size][/align][align=center]毛德操[/align]上一篇漫谈介绍了在通过execve()系统调用启动一个ELF格式的目标映像时发生于Linux内核中的活动
简而言之,内核根据映像头部所提供的信息把目标映像映射到(装入)当前进程用户空间的某个位置上;并且,如果目标映像需要使用共享库的话,还要(根据映像头部所提供的信息)将所需的“解释器”的映像也映射到用户空间的某个位置上,然后在从系统调用返回用户空间的时候就“返回”到解释器的入口,下面就是解释器的事了
如果目标映像不使用共享库,那么问题就比较简单,返回用户空间的时候就直接“返回”到目标映像的入口
现代的应用软件一般都要使用共享库,所以我们把这当作常态,而把不使用共享库的应用软件作为一种简化了的特例
映像装入用户空间的位置有些是固定的、在编译连接时就确定好了的;有些则是“浮动”的、可以在装入时动态决定;具体要看编译时是否使用了-fPIC选项
一般应用软件主体的映像都是固定地址的,而共享库映像的装入地址都是浮动的
特别地,解释器映像的装入地址也是浮动的
2.ELF映像的结构每个操作系统对于在其内核上运行的可执行程序二进制映像都有特定的要求和规定,包括例如映像的格式,映像在用户空间的布局(程序段、数据段、堆栈段的划分等等),映像装入用户空间的地址是否可以浮动、以及如何浮动,是否支持动态连接、以及如何连接,如何进行系统调用,等等
这些要求和规定合在一起就构成了具体操作系统的“应用(软件)二进制界