如何在LLVM中启用CFI

时间:2017-08-16 13:50:06

标签: llvm lto

我想用LLVM强制执行的CFI编译nginx。我修改了objs目录中的Makefile。修改包括:  1.更改编译器:cc - >铛  2.添加与CFI相关的参数:-flto -fvisibility = hidden -fsanitize = cfi 修改后的Makefile在

下面进行了说明
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)

根据clang 6.0.0的文档,CFI方案依赖于链接时优化(LTO),并且使用的链接器必须支持LTO(例如黄金插件)。 关于LTO有一些材料:

http://llvm.org/docs/GoldPlugin.html

我仍然不知道如何处理这个问题,任何人都可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

为了帮助像我这样的其他新生,我提供更多细节:

  1. 安装Gold链接器(使用ld.bfd下载binutils(> 2.21.51.0.2))。
  2. 使用-DLLVM_BINUTILS_INCDIR = / path / to / binutils / include运行CMake(此路径包含文件plugin-api.h),并生成-j8。此步骤生成LLVMgold.so。
  3. 对于以前的LLVM版本,请将LLVMgold.so复制到/ usr / local / lib。对于最新的LLVM,我们不必将LLVMgold.so复制到/ usr / local / lib。安装make后,该文件将复制到目标目录(./install_dir/lib)