2
我一直在瀏覽Clang/LLVM源代碼,並且遇到了CodeGenOptions
的CodeModel
屬性。Clang/LLVM中的CodeModel是指什麼?
基於this method,有效值似乎是:"small"
,"kernel"
,"medium"
和"large"
。
這是什麼屬性控制?
我該如何着手爲我的應用程序選擇正確的值?
我一直在瀏覽Clang/LLVM源代碼,並且遇到了CodeGenOptions
的CodeModel
屬性。Clang/LLVM中的CodeModel是指什麼?
基於this method,有效值似乎是:"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位),則不能使用指令內的立即字段來高效編碼偏移量,並應明確計算地址。代碼模型對代碼和數據的相對位置提供了各種限制。
如果你正在靜態編譯所有東西,那麼'小'是安全的(和默認)。如果你正在使用JIT,那麼一切都是可能的,特別是如果啓用了ASLR,你需要使用中/大型代碼模型。