ELF文件在内存中是如何布局的

How ELF file is laid out in memory

当一个 ELF 文件 运行 并且它的各个段被加载到内存中时,有没有办法提前知道这些段将如何相互排列?也就是说,我可以知道 rodata 段在 bss 段之后吗?

is there a way to know in advance how the segments will be arranged in relation to each other?

是的。有两种类型的 ELF 文件:ET_EXECER_DYN。前者用于可执行文件,后者用于 PIE 可执行文件和共享库。

ET_EXEC 个片段将在内存中 恰好 它们链接的位置。如果将其段加载到其他任何地方,可执行文件将无法运行。

您可以使用 readelf -Wl a.out 检查链接地址。

对于 ET_DYN,这些段将在链接位置的 单个固定 偏移处加载。也就是说,如果第一个 PT_LOAD 段链接在地址 0x0,并在地址 0x1234000 加载,那么您可以将 0x1234000 添加到每个段的 p_vaddr后续段以确定它在内存中的加载位置。

could I know, for example, that the rodata segment comes after the bss segment?

没有 rodatabss 段这样的东西——它们是 。要查看这些部分分配给哪个段,请使用 readelf -Wl.