ELF:使用分区大小来计算地址范围

时间:2018-12-06 14:59:22

标签: elf

我想知道节的大小与节所占用的地址空间有关。 (我这里没有假设动态加载或MMU)

如果有节号,是否包含0个大小符号?

例如说一段的大小为100字节长,从地址0开始。天真的,我会假定此部分占用的地址空间为0到100。

但是,假设在地址0、1、2和3处有大小为0的符号,但确实有一个与之关联的地址,则实际地址空间将为0-103,而0-3为空?

有这样的符号吗? 我是ELF格式的新手,并不100%知道它的工作原理。

1 个答案:

答案 0 :(得分:1)

  

我想知道节的大小与节所占用的地址空间有关。

节通常不占用任何地址,而则占据任何地址。

type ViewInterface interface{ Render() } type MainView View func (m MainView) Render() { // do something } type AnotherView func (m AnotherView) Render() { // do something else } func Render(views ...ViewInterface){ for _, view := range views { view.Render() } } 代表可执行和可链接的格式,并且具有双重目的:(静态)链接和执行。

在链接阶段,链接器在 sections 上进行操作,并将其分配给0个或多个段(但通常最多分配给1个可加载段)。某些节,例如ELF.note通常没有设置.comment标志,并且不会以 any 可加载段结尾。

请注意,静态链接后不需要节,并且可以将其完全剥离。

在执行阶段,将可装入段SHF_ALLOC放入地址空间。如果某段的大小为100,具有mmap标志,并被分配给某个SHF_ALLOC段,则该段将占用100个字节的地址空间。

  

(我这里不假设动态加载或MMU)

动态链接和MMU与这里发生的事情完全正交。一提到它们,您只会使水变得浑浊。

  

例如说一段的大小为100字节长,从地址0开始。天真的,我会假定此部分占用的地址空间为0到100。

如上所述,您对世界的看法并不完全准确,该部分不太可能实际占据PT_LOAD地址范围。

  

但是,假设在地址0、1、2和3处有大小为0的符号,但确实有一个与之关联的地址,则实际地址空间将为0-103,而0-3为空?

符号只是附加到某些地址的标签。它们本身不占用任何地址空间。它们也可以在(静态)链接后被完全剥离,尽管通常将它们保留下来以简化调试。这些符号/标签的存在是调试器告诉您程序崩溃的原因,例如[0, 100)fscanf调用了foo