因此,可执行文件包含不同的部分和头。
在import tensorflow as tf
sess = tf.Session()
from keras import backend as K
K.set_session(sess)
,我们可以看到有关它们的一些元数据,例如不同标头的大小,起点等。
可执行文件的不同部分是否一次全部加载到内存中?
如果是,请如何/何时定义,以及在哪里可以看到有关该信息的信息,因为ELF Header
似乎没有任何参数。
先谢谢了。
答案 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
获得有关二进制程序头的信息。