sdg*_*sdh 3 c++ code-generation llvm clang
我一直在浏览Clang/LLVM源代码,我遇到了它的CodeModel属性CodeGenOptions.
基于这种方法,有效的价值似乎是:"small","kernel","medium"和"large".
这个属性控制什么?
如何为我的应用程序选择正确的值?
代码模型是来自AMD64 ABI的术语(有关详细信息,请参阅https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf中的 3.5.1 ).
简而言之 - x64-64指令中的大多数偏移都是PC相关的,但是指令内的直接字段只有32位长.因此,如果数据位于距离代码"远"的位置(超过32位),则无法在指令内使用立即字段来有效编码偏移量,并应明确计算地址.代码模型对代码和数据的相对位置提供了各种限制.
如果您正在静态编译所有内容,那么'small'是安全的(默认).如果你是JIT,那么一切都是可能的,特别是如果启用ASLR并且你需要使用中/大代码模型.