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_EXEC
和 ER_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?
没有 rodata
和 bss
段这样的东西——它们是 段 。要查看这些部分分配给哪个段,请使用 readelf -Wl
.
当一个 ELF 文件 运行 并且它的各个段被加载到内存中时,有没有办法提前知道这些段将如何相互排列?也就是说,我可以知道 rodata 段在 bss 段之后吗?
is there a way to know in advance how the segments will be arranged in relation to each other?
是的。有两种类型的 ELF 文件:ET_EXEC
和 ER_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?
没有 rodata
和 bss
段这样的东西——它们是 段 。要查看这些部分分配给哪个段,请使用 readelf -Wl
.