微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 应用程序在Linux上的执行过程

应用程序在Linux上的执行过程

时间:09-12 来源:互联网 点击:

动态连接器把控制权交给应用程序,从ELF文件头部中定义的程序进入点开始执行。(比如test.c中使用了userlib.so中函数foo(),在编译的时候这个信息被放进了test这个ELF文件中,相应的语句也变成了call fakefoo()。当加载test的时候,知道foo()是一个外部调用,于是求助于动态链接器,加载userlib.so,解析foo()函数地址,然后让fakefoo()重定向到foo(),这样call foo()就成功了。)

简短的说,整个在shell中键入./test执行应用程序的过程为:当前shell进程fork出一个子进程(子shell),子进程使用execve来脱离和父进程的关系,加载test文件(ELF格式)到内存中。如果test使用了动态链接库,就需要加载动态链接器(或者叫程序解释器),进一步加载test使用到的动态链接库到内存,并重定位以供test调用。最后从test的入口地址开始执行test。

PS: 现代的动态链接器因为性能等原因都采用了延迟加载和延迟解析技术,延迟加载是动态连接库在需要的时候才被加载到内存空间中(通过页面异常机制),延迟解析是指到动态链接库(以加载)中的函数被调用的时候,才会去把这个函数的起始地址解析出来,供调用者使用。动态链接器的实现相当的复杂,为了性能等原因,对堆栈的直接操作被大量使用,感兴趣的可以找相关的代码看看。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top