作者:葛思志 | 来源:互联网 | 2022-12-07 03:31
所以可执行文件包含不同的部分和标题.
在ELF Header
我们可以看到一些关于它们的元数据,如不同标题的大小,起点等.
可执行文件的不同部分是否一次性加载到内存中?
如果是,如何/何时定义以及我们可以在哪里看到有关该信息的信息,因为ELF Header
在该问题上似乎没有任何参数.
提前致谢.
1> fuz..:
对于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
.