当我们 运行 一个可执行文件时,是否所有部分都会立即加载到内存中?

When we run an executable, do all the sections get loaded into memory at once?

所以一个可执行文件包含不同的部分和 headers。

ELF Header 我们可以看到一些关于它们的元数据,例如不同 headers 的大小、起点等

可执行文件的不同部分是否同时加载到内存中?

如果是,它是如何/何时定义的以及我们在哪里可以看到相关信息,因为ELF Header似乎没有任何参数重要的。

提前致谢。

对于 ELF 二进制文件,节不是决定二进制文件如何加载到内存中的因素。它们只是调试器和其他工具的有用元数据,段和节之间不需要对应关系,并且通常多个节包含在一个段下。二进制文件可以完全没有 header 部分,但仍然可以正常加载。

真正决定加载什么以及程序headers在哪里。每个程序header描述一个内存段 并包含以下信息:

  • 字段 p_type 告诉您程序 header 包含什么样的信息。这通常只是 PT_LOAD 表示“可加载段”。
  • 字段p_offset 告诉您该段所在的文件开头的偏移量。请注意,在极少数情况下,这可能超出文件末尾。
  • 字段p_vaddr 告诉您段映射到的虚拟地址。还有p_paddr指定物理地址,不过一般不用。
  • 字段 p_filesz 告诉您段在文件中的长度。
  • 字段 p_memsz 告诉您段在内存中的长度。如果这大于文件中的段长度,则剩余部分用零填充。
  • 字段 p_flags 告诉您该段是可读的 (PF_R)、可写的 (PF_W)、可执行的 (PF_X) 还是这三者的某种组合.加载段时,操作系统使用这些标志来设置写和可执行保护。
  • 字段 p_align 告诉您段是如何对齐的。这在这里并不重要。

当操作系统加载您的二进制文件或运行时 link 编辑器加载共享 object 时,它会读取您的二进制文件的程序 headers 并加载或映射每个段按照它们出现的顺序。完成后,您的程序就会执行。

您可以通过 运行 readelf -l binary.

获取有关二进制程序 headers 的信息