当运行ELF文件并将其各个段加载到内存中时,是否有办法提前知道这些段之间的关系?也就是说,例如,我可以知道rodata段位于bss段之后吗?
是否有一种方法可以预先知道片段之间的相对关系?
是。 ELF文件有两种类型:ET_EXEC
和ER_DYN
。前者用于可执行文件,后者用于PIE可执行文件和共享库。
ET_EXEC
段将在其链接的位置精确中存储在内存中。如果将其段加载到其他位置,则该可执行文件将无法工作。
您可以使用readelf -Wl a.out
检查链接的地址。
对于ET_DYN
,片段将以链接位置的单个固定偏移量加载。也就是说,如果第一个PT_LOAD
段链接到地址0x0
,并加载到地址0x1234000
,则可以将0x1234000
添加到每个后续段的p_vaddr
中,以确定它在内存中的加载位置。 。
例如,我是否可以知道rodata段位于bss段之后?
没有rodata
和bss
段-它们是sections。要查看这些部分分配给哪个段,请使用readelf -Wl
。