我已经阅读了这篇文章,并且了解段包含运行时信息和封装部分,其中包含链接信息。但是,我仍然很困惑为什么这些术语在这两本书中似乎可以互换使用。
\n\n《Shellcoder 手册》
\n\n\n\n\n接下来,信息从程序\xe2\x80\x99s可执行文件加载到新创建的地址空间。段共有三种类型:.text、\n.bss 和.data。.text 段被映射为只读,而\n .data 和 .bss 是可写的。.bss 和.data 段是为全局变量保留的。.data 段包含静态初始化数据,.bss 段包含未初始化数据。最后一段 .text 保存程序指令。
\n
《专业汇编语言》
\n\n\n\n所有汇编语言程序都需要文本部分。这是在可执行程序中声明指令代码的地方。data 和 bss 部分是可选的,但经常在程序中使用。数据部分声明使用初始值声明的数据元素。这些数据元素在汇编语言程序中用作变量。bss 部分声明用零(或 null)值实例化的数据元素。这些数据元素最常用作汇编语言程序中的缓冲区。
\n
在 ELF 的上下文中,它们是两个不同的相关事物。
段在程序头中描述。宽松地说,每个段描述了运行可执行文件时要加载到内存中的文件块。
各节在节标题中进行了描述。粗略地说,每个部分都描述了与程序相关的一大块数据。
因此,节和段都是文件的块,描述为偏移量和大小(尽管在这两种情况下,大小都可能为 0,在这种情况下,偏移量将被忽略)。任何给定的 ELF 文件可能只有段,或只有节,或同时有段和节。为了可执行,它必须有要加载的段。为了可链接,它必须有描述什么在哪里的部分。
动态链接的可执行文件必须有段,但段仍然是可选的:有一个PT_DYNAMIC
段(请参阅此)指示该段的内容.dynamic
。这样,动态链接器仍然可以找到符号表的偏移量.dynsym
。
通常,段彼此不重叠并且部分彼此不重叠,但是部分可以描述作为段的部分(或全部)的数据。这并不是严格的格式要求,但违反就会很奇怪。一个节在两个不同的段中描述数据也会很奇怪。还有(通常)不属于任何段的部分。