ELF程序头部及程序加载

程序头部

程序头部描述与程序执行直接相关的目标文件结构信息。用来在文件中定位各个段的映像。同时包含其他一些用来为程序创建进程映像所必需的信息。

可执行文件或者共享目标文件的程序头部是一个结构数组,每个结构描述了一个段或者系统准备程序执行所必需的其它信息。

目标文件的“段”包含一个或者多个“节区”, 也就是“段内容(Segment Contents)”。

程序头部仅对于可执行文件和共享目标文件有意义。

程序头部的数据结构如下

其中各个字段说明如下:

  •  p_type 此数组元素描述的段的类型。
  • p_offset 此成员给出从文件头到该段第一个字节的偏移。
  • p_vaddr 此成员给出段的第一个字节将被放到内存中的虚拟地址。
  • p_paddr 此成员仅用于与物理地址相关的系统中。
  • p_filesz 此成员给出段在文件映像中所占的字节数。可以为 0。
  • p_memsz 此成员给出段在内存映像中占用的字节数。可以为 0。
  • p_flags 此成员给出与段相关的标志。
  • p_align 此成员给出段在文件中和内存中如何对齐。数值 0 和 1 表示不需要对齐。 

段类型如下:

  • PT_NULL 0 此数组元素未用。
  • PT_LOAD 此数组元素给出一个可加载的段,段的大小由 p_filesz 和 p_memsz 描述。
  • PT_DYNAMIC 数组元素给出动态链接信息。
  • PT_INTERP 数组元素给出一个 NULL 结尾的字符串的位置和长度,该字符串将被当作解释器调用。
  • PT_NOTE 此数组元素给出附加信息的位置和大小。
  • PT_SHLIB 此段类型被保留。
  • PT_PHDR 此类型的数组元素如果存在,则给出了程序头部表自身的大小和位置,既包括在文件中也包括在内存中的信息。
  • PT_LOPROC 0x70000000 PT_HIPROC 0x7fffffff 此范围的类型保留给处理器专用语义

程序加载:

给定一个目标文件,系统加载该文件到内存中,启动程序执行。

进程除非在执行过程中引用到相应的逻辑页面,否则不会请求真正的物理页面。

进程通常会包含很多未引用的页面,因此延迟物理读操作通常会避免这类费力不讨好的事情发生,从而提高系统性能。

要想实际获得这种效率,可执行文件和共享目标文件必须具有这样的段:其文件偏移和虚拟地址对页面大小取模后余数相同。

原文地址:https://www.cnblogs.com/tongyishu/p/11821645.html