内核如何在linux下运行得到一个可执行二进制文件?

2024-10-11 08:36:00
admin
原创
76
摘要:问题描述:内核如何在linux下运行得到一个可执行二进制文件?这似乎是一个简单的问题,但有人能帮我深入挖掘一下吗?文件如何加载到内存中以及如何开始执行代码?有人能帮助我并告诉我一步一步发生的情况吗?解决方案 1:execLinux 4.0 系统调用的最佳时刻找出所有这些的最佳方法是使用 QEMU 对内核进行 ...

问题描述:

内核如何在linux下运行得到一个可执行二进制文件?

这似乎是一个简单的问题,但有人能帮我深入挖掘一下吗?文件如何加载到内存中以及如何开始执行代码?

有人能帮助我并告诉我一步一步发生的情况吗?


解决方案 1:

execLinux 4.0 系统调用的最佳时刻

找出所有这些的最佳方法是使用 QEMU 对内核进行 GDB 步骤调试:如何使用 GDB 和 QEMU 调试 Linux 内核?

  • fs/exec.c定义系统调用SYSCALL_DEFINE3(execve

只需转发至do_execve

  • do_execve

转发至do_execveat_common

  • do_execveat_common

要找到下一个主要函数,请跟踪返回值的retval最后修改时间。

开始构建一个struct linux_binprm *bprm来描述程序,并将其传递给exec_binprm执行。

  • exec_binprm

再次按照返回值来寻找下一个主要调用。

  • search_binary_handler

+ 处理程序由可执行文件的第一个魔法字节决定。


最常见的两个处理程序是用于解释文件 ( `#!`magic) 和用于 ELF ( `ELF`magic) 的处理程序,但内核中还有其他内置处理程序,例如。用户还可以通过/proc/sys/fs/binfmt_misc`a.out`注册自己的处理程序


ELF 处理程序定义在`fs/binfmt_elf.c`。


另请参阅:为什么人们在 Python 脚本的第一行写 #!/usr/bin/env python shebang?
+ 该`formats`列表包含所有处理程序。


每个处理程序文件包含如下内容:


static int __init init_elf_binfmt(void)
{
    register_binfmt(&elf_format);
    return 0;
}

并在该文件中`elf_format`定义`struct linux_binfmt`。


`__init`是魔术的,并将该代码放入内核启动时调用的魔术部分:Linux 内核代码中的 __init 是什么意思?


链接器级依赖注入!
+ 还有一个递归计数器,以防解释器无限执行。


尝试一下:


echo '#!/tmp/a' > /tmp/a
chmod +x /tmp/a
/tmp/a
+ 我们再次跟踪返回值,看看接下来会发生什么,并看到它来自:


retval = fmt->load_binary(bprm);

其中,`load_binary`针对结构中的每个处理程序进行定义:C 风格多态性。
  • fs/binfmt_elf.c:load_binary

是否进行实际工作:

+ 根据ELF规范解析ELF文件,这里是ELF文件格式的概述:如何使用十六进制编辑器在Linux中制作可执行ELF文件?
+ 根据解析的 ELF 文件设置进程初始程序状态,最值得注意的是:


    - 初始寄存器设置`struct pt_regs`
    - 初始虚拟内存设置,内存在 ELF 段中指定:ELF 文件格式中 section 和 section 有什么区别
    - 调用`start_thread`,标记该进程为可用进程,以便由调度程序进行调度
  • 最终,调度程序决定运行该进程,然后它必须跳转到存储的 PC 地址,struct pt_regs同时转到权限较低的 CPU 状态,例如 Ring 3/EL0:在操作系统中,Ring 0 和 Ring 3 是什么?

调度程序会定期被时钟硬件唤醒,该时钟硬件会定期生成中断,如内核先前配置的那样,例如旧的 x86 PIT或ARM 定时器。内核还会注册处理程序,当触发定时器中断时,该处理程序会运行调度程序代码。

TODO:继续进一步分析源代码。我期望接下来发生什么:

  • 内核解析ELF的INTERP头来找到动态加载器(通常设置为/lib64/ld-linux-x86-64.so.2)。

  • 如果存在:

+ 内核将动态加载器和要执行的 ELF 映射到内存中
+ 动态加载器启动,带入指向内存中 ELF 的指针。
+ 现在在用户空间中,加载器以某种方式解析 elf 头,并`dlopen`对其进行
+ `dlopen`使用可配置的搜索路径来查找这些库(`ldd`和相关库),将它们映射到内存中,并以某种方式通知 ELF 在哪里找到其丢失的符号
+ 加载器调用`_start`ELF 的
  • 否则,内核将直接将可执行文件加载到内存中,而不使用动态加载器。

因此,它必须特别检查可执行文件是否为 PIE,以及是否将其放置在内存中的随机位置:gcc 和 ld 中位置无关可执行文件的 -fPIE 选项是什么?

解决方案 2:

Linux内核中的两个系统调用是相关的。fork系统调用(或者可能是或)用于创建新进程,类似于调用进程(每个 Linux 用户空间进程,除了由 或 朋友创建的进程)。execve系统调用用新的进程地址空间替换进程地址空间(本质上是通过从 ELF 可执行文件和匿名段中对段进行mmap操作,然后初始化寄存器,包括堆栈指针)。x86-64 ABI 补充和Linux 汇编指南提供了详细信息。vfork`cloneinitfork`

动态链接发生在文件之后execve并涉及/lib/x86_64-linux-gnu/ld-2.13.so文件,对于 ELF 来说,它被视为“解释器”。

解决方案 3:

阅读完已经引用的ELF 文档后,您应该阅读实际执行此操作的内核代码。

如果您难以理解该代码,请构建一个UML Linux,然后您可以在调试器中逐步执行该代码。

解决方案 4:

您可以从了解可执行文件格式开始,例如 ELF。http: //en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF 文件包含几个带有标题的部分,描述了二进制文件的各个部分如何以及在何处加载到内存中。

然后,我建议你阅读一下 Linux 中加载二进制文件和处理动态链接的部分,ld-linux。这也是对 ld-linux 的一个很好的描述:http ://www.cs.virginia.edu/~dww4s/articles/ld_linux.html

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用