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

OMG*_*chy 11 compiler-construction llvm object-files

在查看LLVM源代码中的错误修复时,我遇到了"虚拟部分"一词,并想知道它的含义.

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

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

有人可以告诉我目标文件中的虚拟部分是什么吗?

Aby*_*byx 1

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

.bss部分仅包含未初始化的数据,因此目标文件中不应包含任何数据(尽管理论上可以)。所以该.bss部分应该是“虚拟的”,并且在LLVM中不需要有以下代码:

if (Sec.isBSS() || Sec.isVirtual())
Run Code Online (Sandbox Code Playgroud)

但问题是 LLVM 不支持 Mach-O 文件中的“虚拟”部分(或者 Mach-O 文件可能无法拥有它们)

bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
  // FIXME: Unimplemented.
  return false;
}
Run Code Online (Sandbox Code Playgroud)

因此 LLVM 对isBSS和进行单独的检查isVirtual

BSS 部分是:

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

虚拟节可能具有不同的属性和用例,例如可写+可执行,或非BSS的不可读(对齐)节(请注意,可写+可执行节是不安全的,“对齐”节仅对某些代码有用保护(反倾销)技巧)。

因此每个 BSS 部分都是一个虚拟部分,但并非每个虚拟部分都是 BSS 部分。