程序编译中的PIC级别是什么?

What is PIC level in program compilation?

我正在查看 LLVM 库,我发现 Clang 会发出添加此元数据的 LLVM IR 模块:

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"Apple LLVM version 7.3.0 (clang-703.0.31)"}

然后我发现在模块上调用方法setPICLevel()会得到类似的结果:

!0 = !{i32 1, !"PIC Level", i32 0}

所以整个元数据 !0 都是关于 PIC 级别的。

我一直在网上搜索它,但一无所获。 这个 PIC 级别是什么,它表示什么?

这是一个仅适用于 PowerPC 的标志,否则将被忽略。它将位置无关代码的模型设置为小型或大型模型。其他架构当然可以有PIC,但是这个flag代表size如果模型在别处不适用

您可以看到首次添加到 LLVM 的提交:http://comments.gmane.org/gmane.comp.compilers.llvm.cvs/205216

更多信息:

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/dynamic_code.html

https://en.m.wikipedia.org/wiki/Position-independent_code