您的位置:首页 > 运维架构 > Linux

20135316王剑桥Linux内核学习记笔记第七周

2016-04-06 20:26 435 查看
20135316王剑桥《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC 1000029000

一、可执行程序是怎么得来的?

编译器预处理(负责把include的文件包含进来及宏替换等工作);编译成汇编代码;编译器编译成目标代码;再链接成可执行文件;操作系统加载到内存中来执行





hello.o和hello文件都是ELF格式的

二、目标文件的格式(ELF可执行可链接)



ABI(应用程序二进制接口)



可重定位主要是.o文件

可执行文件加载的主要工作:可执行文件的格式和进程地址空间的映射。

三、ELF文件默认加载到0x8048000;程序的实际入口是头文件里面的那个地址位置0x8048x00(可执行文件加载到内存中执行的第一句代码);一般静态链接会将所有代码放在一个代码段,动态链接会有多个代码段。

四、可执行程序的执行环境

$ ls -l /usr/bin 列出/usr/bin下的目录信息

Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身

例如,int main(int argc, char argv[])

又如, int main(int argc, char argv[], char envp[])

Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数

int execve(const char filename,char * const argv[ ],char * const envp[ ]);

命令行参数和环境串都放在用户态堆栈中,先函数调用参数传递,再系统调用参数传递。

五、动态链接分为可执行程序装载是动态链接和运行时动态链接

gcc -shared shlibexample.c -o libshlibexample.so -m32



-L:库对应的接口头文件所在的目录

-l:库名

-ldl:动态加载器

六、子进程是从ret-from-fork开始执行然后返回用户态。

七、当系统调用进入内核中后调用sye-execve,解析可执行文件的格式。之后的调用顺序为:do-execve、do-execve-commom、exex-binprm。Search-binary-handle寻找符合文件格式对应的解析模块(根据文件头部信息)。

八、对于ELF格式的可执行文件fmt->load-binary(bprm),执行的应该是load-elf-binary,其内部是和ELF文件格式解析的部分需要和ELF文件格式标准结合起来阅读。

九、Elf-format和inint-elf-binfmt是观察者模式中的观察者,解析模块是被观察者

十、Load-elf-binary->start-thread,系统调用返回用户态的起点,通过修改内核堆栈中EIP的值作为新程序的起点(int 0x80)。命令行参数和环境变量在栈顶。

十一、如果可执行文件需要依赖其他的动态链接的话,需要将CPU控制权交给ld来加载依赖库完成动态链接。对于静态链接的文件elf-entry是新程序执行的起点























s可以进入do-execve的内部

Po new-ip可以查看返回到用户态的第一条指令地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: