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

2023-12-12

因此,可执行文件包含不同的部分和标头。

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

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

If yes, 怎样,几时它被定义了,我们可以在哪里看到相关信息,因为ELF Header似乎没有任何关于此事的参数。

提前致谢。


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

实际上决定加载什么以及加载在哪里程序头。每个程序头描述一个内存段并包含以下信息:

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

当操作系统加载二进制文件或运行时链接编辑器加载共享对象时,它会读取二进制文件的程序头,并按每个段出现的顺序加载或映射它们。一旦完成,您的程序就会被执行。

您可以通过运行来获取有关二进制文件的程序头的信息readelf -l binary.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我们运行可执行文件时,所有部分都会立即加载到内存中吗? 的相关文章

随机推荐