我想知道节的大小与节所占用的地址空间有关。 (我这里没有假设动态加载或MMU)
如果有节号,是否包含0个大小符号?
例如说一段的大小为100字节长,从地址0开始。天真的,我会假定此部分占用的地址空间为0到100。
但是,假设在地址0、1、2和3处有大小为0的符号,但确实有一个与之关联的地址,则实际地址空间将为0-103,而0-3为空?
有这样的符号吗? 我是ELF格式的新手,并不100%知道它的工作原理。
答案 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
。