《Linux内核 核心知识全解析(完)【4】》

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

ABI:应用程序二进制接口

 

 

可执行的进程 和 虚拟地址空间,建立映射关系

 

 

 

 

 

 

 

 

 

execve 和 fork 是比较特殊的系统调用:

fork 返回:父进程返回 & 子进程返回(ret_from_fork,生成用户态环境)

execve:返回的可执行程序替换之前的

 

 

 

 

 

 

 

 

关键代码:search_binary_handler(bprm);

struct linux_binprm bprm;//存储可执行文件信息

总结

Linux 系统启动新进程是通过系统调用 execve 实现的,核心函数是 do_execveat_common,所做的工作无非是创建一个帧,顶部塞文件名、环境变量、参数,初始化 bss、break section、加载 elf 文件至内存等等,最后在启动新进程之前,设置各种段寄存器、标志寄存器、堆栈寄存器以及指令计数器 (PC,即 IP),通过 iret 指令强制返回系统调用后,一个用户空间的进程便启动了。

Linux 如何执行程序—— 内核态篇(废弃) | 一朵浊浪映天地

vvl.me › how-does-the-Linux-kernel-run-a-program
 
2017年3月20日 - 创建 struct linux_binprm (linux binary parameter, 存储待执行的二进制文件的参数) 实例bprm; Prepare binprm credentials. bprm->cred 是一份 ...
 

 load_binary 实际上调用的 load_elf_binary

 

 

 

 

 

8048

实操:

P4603_使用gdb跟踪sys_execve内核函数的处理过程

同一个进程里面 execve 切换可执行程序 ... 

动态链接库的依赖树~

如果要动态链接,则返回的不是可执行程序规定的起点,而是动态链接器的入口

 

动态链接器解析当前可执行文件依赖哪些库,

广度搜索遍历,逐层解析依赖库;

动态链接主要不是由内核态完成的

主要是 ld 用户态完成的

原文地址:https://www.cnblogs.com/cx2016/p/13094431.html