首页 > 其他分享 >execve()系统调用和elf装载过程

execve()系统调用和elf装载过程

时间:2023-05-30 15:13:11浏览次数:53  
标签:可执行文件 调用 elf ELF 装载 execve

在进入execve()系统调用之后,Linux内核就开始进行真正的装配工作。在内核中,execve()系统调用相应的入口是sys_execve()。sys_execve()进行一些参数的检查复制之后,调用do_execve()。do_execve()会首先查找被执行的文件,如果找到文件,则读取文件的前128个字节。文件的前128个字节保存着可执行文件的格式信息,特别是前四个字节(魔数)。这样可以根据不同的可执行文件信息,来调用不同的装载模块。

当do_execve()读取了这128个字节的文件头部之后,然后调用search_binary_handle()去搜索和匹配合适的可执行文件装载处理。linux中所有被支持的可执行文件格式都有相应的装载处理过程。search_binary_handle()会通过判断文件头部的魔数确定文件的格式,并且调用相应的壮哉过程。ELF可执行文件的装载处理过程叫做load_elf_binary()。load_elf_binary()被定义在fs/Binfmt_elf.c。它的主要步骤是:

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

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

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

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

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

 

当load_elf_binary()执行完毕,返回至do_execve()再返回到sys_execve(),上面的第5步中已经把系统调用的返回地址改成了被装载的ELF程序的入口地址了。所以当sys_execve()系统调用从内核态返回到用户态时,EIP寄存器直接跳转到了ELF程序的入口地址了,于是新的程序开始执行,ELF可执行文件装载完成。

标签:可执行文件,调用,elf,ELF,装载,execve
From: https://www.cnblogs.com/woodx/p/17443270.html

相关文章

  • Self-consistency Improves Chain of Thought Reasoning in Language Models 论文阅读
    ICLR2023原文地址1.MotivationChain-of-Thought(CoT)使LargeLanguageModels(LLMs)在复杂的推理任务中取得了令人鼓舞的结果。本文提出了一种新的解码策略——self-consistency,以取代贪婪解码。self-consistency利用了一种直觉,即一个复杂的推理问题通常允许多种不同的思维......
  • 一个ELF文件中的段
    使用readelf-Selfname.o可以读取一个ELF文件的段信息。 Elf32_Shdr段描述符结构 含义: ......
  • 使用form.ModelForm组件注意点
    定义类时是使用model=table中表名如下:classTplModelForm(BootStrapModelForm):classMeta:model=models.Templatefields="__all__"而在函数中定义时是使用form如下deftpl(request):ifrequest.method=="GET":form=TplModelForm() ......
  • 装载问题-分支限界法-队列式分支限界法
    装载问题实质: 装载问题是一个子集选取问题,因此其解空间树是一颗子集树。这里实现队列式分支限界法,对难理解地方做了注释。#include<bits/stdc++.h>usingnamespacestd;typedefstructQNode{QNode*parent;intlchild;intweight;}QNode;intn;intc;int......
  • 装载问题(最优装载问题变形)-回溯法-深度搜索
    问题描述:有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi<=c1+c2。问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。问题分析:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船......
  • 创建一个自托管(Self-Host)的WCF Service
    创建一个自托管(Self-Host)的WCFService//CreateWCFservicehostUribaseAddress=newUri("https://127.0.0.1:8087/MyWcfService");ServiceHosthost=newServiceHost(typeof(MyWcfService));host.Credentials.ServiceCertificate.SetCertificate(StoreL......
  • iOS8 Self Sizing UITableView Cells iOS8Tableview Cells 自适应高度
    UITableViewUITableViewTheoldwayUITableView inheritsfrom UIScrollView).Iftherowswere allequalthiswas justasimpleoperation.Butiftheywere different,ithad toknow theheightsofalltherowsandsumthem.Itaskedusfortheheightofeve......
  • CLIP-S^4:Language-Guided Self-Supervised Semantic Segmentation论文阅读笔记
    摘要作者提出了CLIP-S4,借助自监督像素表示学习和V-L模型实现各种语义分割任务,不需要使用任何像素级别标注以及未知类的信息。作者首先通过对图像的不同增强视角进行像素-分割对比学习来学习像素嵌入。之后,为进一步改善像素嵌入并实现基于自然语言的语义分割,作者设计了由V-L模型指......
  • python类中调用类方法时,报错self参数未填
    转载:(14条消息)python类中调用类方法时,报错self参数未填。_追天一方的博客-CSDN博客又碰到了一个小错误比如一个类如下:classprint_number(object):def__init__(self,string="数字是"):self.string=stringdefprint_(self,ss=3):print("{}:{}".......
  • vue中事件修饰符.prevent.self和.self.prevent有什么区别
    v-on:click.prevent.self:会阻止所有的点击,阻止了自身的默认事件和阻止了子元素事件的向上冒泡。v-on:click.self.prevent:只会阻止对元素自身的点击,阻止了子元素事件的向上冒泡,阻止了子组件冒泡事件的默认事件。在Vue.js中,事件修饰符.prevent用于阻止事件的默认行为,.self用于阻......