美文网首页
Linux 程序加载过程

Linux 程序加载过程

作者: 10m每秒滑行 | 来源:发表于2019-10-28 16:39 被阅读0次

首先在用户层面,bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令

execve() 函数会调用到 do_execve()读取文件的前128个字节的目的是判断文件的格式,每种可执行文件的格式的开头几个字节都是很特殊的,特别是开头4个字节,常常被称做魔数(Magic Number),通过对魔数的判断可以确定文件的格式和类型

当do_execve()读取了这128个字节的文件头部之后,然后调用search_binary_handle()去搜索和匹配合适的可执行文件装载处理过程
ELF可执行文件的装载,是load_elf_binary()函数,步骤大致如下

(1)检查ELF可执行文件格式的有效性,比如魔数、程序头表中段(Segment)的数量。

(2)寻找动态链接的“.interp”段,设置动态链接器路径

(3)根据ELF可执行文件的程序头表的描述,对ELF文件进行映射,比如代码、数据、只读数据。

(4)初始化ELF进程环境,比如进程启动时EDX寄存器的地址应该是DT_FINI的地址

(5)将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的链接方式,对于静态链接的ELF可执行文件,这个程序入口就是ELF文件的文件头中e_entry所指的地址;对于动态链接的ELF可执行文件,程序入口点是动态链接器。

在系统开始运行时,动态链接器与普通共享对象一样被映射到了进程的地址空间,在主程序运行前,首先会把控制权交给动态链接器,由它完成所有的动态链接工作以后再把控制权交给主程序,然后开始执行

相关文章

  • linux系统启动过程

    Linux 启动过程如下图所示,依次经过BIOS加电自检,加载主引导加载程序,加载次引导加载程序,加载linux内...

  • 【Linux学习笔记】Linux开机启动过程

    序言 计算机启动Linux系统的过程分为BIOS程序运行过程、引导加载程序运行过程、Linux系统运行过程。 BI...

  • Linux 程序加载过程

    首先在用户层面,bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执...

  • Android系统启动

    init进程 启动电源,加载引导程序,引导程序启动Linux内核,Linux内核加载完成后,首先启动 init 进...

  • _dl_runtime_resolve

    简介 在Linux中如果程序想要调用其它动态链接库的函数,必须要在程序加载的时候动态链接;在一个程序运行过程中,可...

  • 程序加载过程

    程序加载时,会加载静态库、动态库和二进制可执行文件等,由此引出几个问题:问题1❓:什么是静态库?什么是动态库?二者...

  • iOS底层原理 12 : 应用程序的加载

    一、应用程序的加载 APP加载过程:程序启动依次加载dyld、libSystem、libdispathc.dyld...

  • 面巾纸

    linux启动过程BIOS->MBR->引导加载程序->内核文件 RIADraid0,同一份数据交替写入两个磁盘r...

  • IOS - 程序加载过程

    静态库 动态库 静态库:.a文件 静态库会被完整地复制到可执行文件中。被多次使用就有多份冗余拷贝 动态库:.dyl...

  • 全局符号

    最近打算把linux下的一个c++程序以插件的形式实现,即主程序加载so功能模块的方式,在这个过程中,遇到了一个全...

网友评论

      本文标题:Linux 程序加载过程

      本文链接:https://www.haomeiwen.com/subject/fombvctx.html