什么是目标文件上下文中的 LLVM 虚拟部分?

What is an LLVM virtual section in the context of object files?

在查看 LLVM 源代码中的 bugfix 时,我遇到了术语 "virtual section" 并想知道它是什么意思。

我尝试使用谷歌搜索一些不同的术语并进一步浏览源代码,但我设法发现的是,每个目标文件格式的 isSectionVirtual 成员函数的实现似乎表示一个部分是虚拟的,如果它没有内容(例如.bss部分,但源代码明确表示这是两个不同的概念)。实现取决于所涉及的特定对象格式。

我对理解目标文件的内部结构还很陌生,所以我不确定这是 LLVM 的东西还是 LLVM 之外的更一般的概念。

有人能告诉我目标文件中的虚拟节是什么吗?

根据 LLVM 源代码中的注释,"virtual section" 是目标文件中没有任何数据的部分。 (PE/COFF 规范没有这样的术语,所以它可能只在 LLVM 中使用)。

.bss 部分只有未初始化的数据,因此目标文件中不应有任何数据(尽管理论上可以)。所以.bss段应该是"virtual",LLVM中不需要有下面的代码:

if (Sec.isBSS() || Sec.isVirtual())

但问题是 LLVM 不支持 Mach-O 文件中的 "virtual" 部分(或者 Mach-O 文件可能没有它们)

bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
  // FIXME: Unimplemented.
  return false;
}

因此 LLVM 对 isBSSisVirtual 有单独的检查。

BSS 部分是:

  • 可读
  • 可写
  • 不可执行
  • 未初始化的数据

虚拟部分可能具有不同的属性和用例,例如可写 + 可执行,或非 BSS 的不可读(对齐)部分(请注意,可写 + 可执行部分是不安全的,并且 "alignment"部分仅对某些代码保护(反转储)技巧有用。

所以每个BSS段都是虚拟段,但不是每个虚拟段都是BSS段。