Compiler construction 对象文件上下文中的LLVM虚拟部分是什么?
在查看LLVM源代码中的a时,我偶然发现了“虚拟部分”这个术语,并想知道它是什么意思 我试着用谷歌搜索一些不同的术语并进一步浏览源代码,但我发现每个对象文件格式的Compiler construction 对象文件上下文中的LLVM虚拟部分是什么?,compiler-construction,llvm,object-files,Compiler Construction,Llvm,Object Files,在查看LLVM源代码中的a时,我偶然发现了“虚拟部分”这个术语,并想知道它是什么意思 我试着用谷歌搜索一些不同的术语并进一步浏览源代码,但我发现每个对象文件格式的isSectionVirtual成员函数的实现似乎表示,如果某个节没有内容,则该节是虚拟的(例如.bss部分,但源代码清楚地表示这是两个不同的概念)。实现根据所涉及的特定对象格式而有所不同 我对理解对象文件的内部是相当陌生的,所以我不确定这是LLVM还是LLVM之外的一个更一般的概念 有人能告诉我对象文件中的虚拟部分是什么吗?根据LLV
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分区。当然,单独的检查表明这些实际上是不同的概念?否则,就只会有
isBSS
,而isVirtual
就不需要存在了。不管怎样,感谢您的输入!谢谢,这样更好!
bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
// FIXME: Unimplemented.
return false;
}