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
实操:
同一个进程里面 execve 切换可执行程序 ...
动态链接库的依赖树~
如果要动态链接,则返回的不是可执行程序规定的起点,而是动态链接器的入口
动态链接器解析当前可执行文件依赖哪些库,
广度搜索遍历,逐层解析依赖库;
动态链接主要不是由内核态完成的
主要是 ld 用户态完成的