2017-08-16 25 views
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

我還是不知道該如何處理這個問題,任何一個可以給我一些建議嗎?

+0

您需要'-fuse-ld = gold'標誌。當然,安裝Gold鏈接器。 – arrowd

+0

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

+0

對於最新的LLVM,我們不必將LLVMgold.so複製到/ usr/local/lib。安裝完成後,該文件將被複制到目標目錄(./install_dir/lib) – Rambo

回答

0

幫助其他大一喜歡我,我提供更多的細節:

  1. 安裝鍍金連接器(打倒ld.bfd加載的binutils(> 2.21.51.0.2))。
  2. 使用-DLLVM_BINUTILS_INCDIR =/path/to/binutils/include(此路徑包含文件plugin-api.h)運行CMake,並make -j8。這一步生成LLVMgold.so。
  3. 對於以前的LLVM版本,請將LLVMgold.so複製到/ usr/local/lib。對於最新的LLVM,我們不必將LLVMgold.so複製到/ usr/local/lib。安裝完成後,文件將被複制到目標目錄(./install_dir/lib)