0
我想用LLVM強制執行CFI來編譯nginx。我修改objs目錄中的Makefile。修改模塊主要包括: 1.改變編譯器:CC - >鐺 2. CFI相關的附加參數:-flto -fvisibility =隱藏-fsanitize = CFI 修飾的生成文件被illusrated下面如何在LLVM中啓用CFI
CC = clang
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -flto -fvisibility=hidden -fsanitize=cfi
CPP = cc -E
LINK = $(CC)
的編譯過程已通過。然而,也有一些錯誤鏈接過程中報道:
/usr/bin/ld: unrecognized option '-plugin'
/usr/bin/ld: use the --help option for usage information
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
據鐺6.0.0的文件中,CFI方案依賴於鏈接時優化(LTO),以及使用必須支持LTO鏈接(如黃金插件)。 大約有LTO一些材料:
http://llvm.org/docs/GoldPlugin.html
我還是不知道該如何處理這個問題,任何一個可以給我一些建議嗎?
您需要'-fuse-ld = gold'標誌。當然,安裝Gold鏈接器。 – arrowd
Thans爲您做出迴應。爲了幫助像我這樣的新生,我提供了更多細節:1.安裝Gold鏈接器(使用ld.bfd向下載入binutils(> 2.21.51.0.2))。 2.使用-DLLVM_BINUTILS_INCDIR =/path/to/binutils/include(此路徑包含文件plugin-api.h)運行CMake,並使用-j8。這一步生成LLVMgold.so。 3.將LLVMgold.so複製到/ usr/local/lib – Rambo
對於最新的LLVM,我們不必將LLVMgold.so複製到/ usr/local/lib。安裝完成後,該文件將被複制到目標目錄(./install_dir/lib) – Rambo