程序加载/执行

时间:2012-04-11 00:01:37

标签: c++ linux gcc llvm elf

我是编译器的初学者,但我对学习程序的结构(二进制)以及如何在内存中读取和加载以执行它非常感兴趣。你们有什么电子书/书籍/教程建议我快速入门阅读?

2 个答案:

答案 0 :(得分:4)

ELF文件布局

  

ELF文件有两个视图:

     
      
  • 程序标题显示在运行时使用的段
  •   
  • 部分标题列出了二进制文件的部分
  •   
     

每个ELF文件由一个ELF标头组成,后跟文件数据。

     

文件数据可包括:

     
      
  • 程序标题表,描述零个或多个段
  •   
  • 章节标题表,描述零个或多个部分
  •   
  • 数据由程序标题表或节标题表
  • 中的条目引用   
     

这些段包含运行时执行文件所必需的信息,而部分包含重要数据   连接和搬迁。整个文件中的任何字节都可以由at拥有   大多数一节,并且可能存在不属于的孤立字节   任何部分。

enter image description here

将程序加载到内存

  

在计算中,加载器是操作系统的一部分   负责加载程序。

     

这是其中一个重要的阶段   启动程序的过程,因为它将程序放入内存   并准备他们执行。

     

加载程序涉及:

     
      
  • 读取可执行文件的内容,包含程序文本的文件,   进入记忆
  •   
  • 执行其他必要的准备任务   准备运行的可执行文件。
  •   
     

加载完成后,即可   操作系统通过将控制传递给已加载的程序来启动程序   程序代码。

* NIX方式

  

在Unix中,加载器是系统调用execve()的处理程序。

     

Unix加载程序的任务包括:

     
      
  • 验证(权限,内存要求等)
  •   
  • 将程序映像从磁盘复制到主内存
  •   
  • 在堆栈上复制命令行参数
  •   
  • 初始化寄存器(例如,堆栈指针)
  •   
  • 跳转到程序入口点(_start
  •   

答案 1 :(得分:4)

编译器和可执行二进制文件是远程相关的。 (实际的可执行文件是由链接器ld构建的,而不是编译器构建的。

在Linux系统上,linux kernel使用copy-on-writedemand-paging技术延迟加载ELF可执行文件的程序页面。共享库可能为dynamically loaded,最好包含position independent code

您可能有兴趣阅读compiler construction,Levine的书籍linkers & loadersLinux Assembly HowtoProgram Library Howtoldd(1),{{3} },execve(2)intro(2)fork(2)mmap(2)dlopen(3)elf(5)proc(5)手册页。

还要了解cat /proc/self/maps向您展示的内容(执行该cat的流程的内存映射)。您也可以使用objdump