var*_*per 1 linux assembly process elf virtual-memory
所以可执行文件包含不同的部分和标题.
在ELF Header我们可以看到一些关于它们的元数据,如不同标题的大小,起点等.
可执行文件的不同部分是否一次性加载到内存中?
如果是,如何/何时定义以及我们可以在哪里看到有关该信息的信息,因为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.