Compiler construction 对象文件上下文中的LLVM虚拟部分是什么?

Compiler construction 对象文件上下文中的LLVM虚拟部分是什么?,compiler-construction,llvm,object-files,Compiler Construction,Llvm,Object Files,在查看LLVM源代码中的a时,我偶然发现了“虚拟部分”这个术语,并想知道它是什么意思 我试着用谷歌搜索一些不同的术语并进一步浏览源代码,但我发现每个对象文件格式的isSectionVirtual成员函数的实现似乎表示,如果某个节没有内容,则该节是虚拟的(例如.bss部分,但源代码清楚地表示这是两个不同的概念)。实现根据所涉及的特定对象格式而有所不同 我对理解对象文件的内部是相当陌生的,所以我不确定这是LLVM还是LLVM之外的一个更一般的概念 有人能告诉我对象文件中的虚拟部分是什么吗?根据LLV

在查看LLVM源代码中的a时,我偶然发现了“虚拟部分”这个术语,并想知道它是什么意思

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

我对理解对象文件的内部是相当陌生的,所以我不确定这是LLVM还是LLVM之外的一个更一般的概念


有人能告诉我对象文件中的虚拟部分是什么吗?

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

.bss
部分只有未初始化的数据,因此它不应该在对象文件中有任何数据(虽然理论上可以)。因此
.bss
部分应该是“虚拟的”,并且在LLVM中不需要有以下代码:

if (Sec.isBSS() || Sec.isVirtual())
但问题是LLVM不支持Mach-O文件中的“虚拟”部分(或者Mach-O文件不能包含它们)

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

BSS部分包括:

  • 可读的
  • 可写
  • 不可执行
  • 未初始化数据
虚拟节可能具有不同的属性和用例,例如可写+可执行或非BSS的不可读(对齐)节(请注意,可写+可执行节是不安全的,“对齐”节仅对某些代码保护(反转储)技巧有用)


因此,每个BSS分区都是虚拟分区,但不是每个虚拟分区都是BSS分区。

当然,单独的检查表明这些实际上是不同的概念?否则,就只会有
isBSS
,而
isVirtual
就不需要存在了。不管怎样,感谢您的输入!谢谢,这样更好!
bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
  // FIXME: Unimplemented.
  return false;
}