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

时间:2018-08-22 06:11:32

标签: linux assembly process elf virtual-memory

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

import tensorflow as tf sess = tf.Session() from keras import backend as K K.set_session(sess) ,我们可以看到有关它们的一些元数据,例如不同标头的大小,起点等。

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

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

先谢谢了。

1 个答案:

答案 0 :(得分:6)

使用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获得有关二进制程序头的信息。