在查看LLVM源代码中的bugfix时,我遇到了这个术语,"虚拟部分"并想知道它的意思。
我尝试使用谷歌搜索一些不同的术语并进一步浏览源代码,但我设法找到的是每个目标文件格式的isSectionVirtual
成员函数的实现似乎表示一个部分是虚拟如果它没有内容(例如.bss部分,但源代码清楚地表明这是两个不同的概念)。具体实现取决于所涉及的具体对象格式。
我对理解目标文件的内部结构还是比较陌生的,所以我不确定这是LLVM还是LLVM之外的更一般的概念。
有人可以告诉我目标文件中的虚拟部分是什么吗?
答案 0 :(得分:1)
根据LLVM源代码中的注释,“虚拟部分”是在目标文件中没有任何数据的部分。 (PE / COFF规范没有这样的术语,所以它可能只在LLVM中使用。)
.bss
部分只有未初始化的数据,因此它不应该在目标文件中有任何数据(尽管理论上它可以)。所以.bss
部分应该是“虚拟的”,并且不需要在LLVM中包含以下代码:
if (Sec.isBSS() || Sec.isVirtual())
但问题是LLVM不支持Mach-O文件中的“虚拟”部分(或者Mach-O文件可能不支持它们)
bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
// FIXME: Unimplemented.
return false;
}
因此,LLVM对isBSS
和isVirtual
进行单独检查。
BSS部分是:
虚拟部分可能具有不同的属性和用例,例如可写+可执行文件,或者不是BSS的不可读(对齐)部分(请注意,可写+可执行部分不安全,“对齐”部分仅有用)对于一些代码保护(反倾销)技巧)。
因此每个BSS部分都是虚拟部分,但不是每个虚拟部分都是BSS部分。