如何在 LLVM 中启用 CFI
How to enable CFI in LLVM
我想用 LLVM 强制的 CFI 编译 nginx。我修改了objs目录下的Makefile。修改包括:
1. 更改 compiler:cc--> clang
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)
编译过程通过。但是,在 link 过程中报告了一些错误:
/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方案依赖link-time optimization(LTO),使用的linker必须支持LTO(比如gold plugin) .
关于LTO的资料有:
http://llvm.org/docs/GoldPlugin.html
我还不知道怎么处理这个问题,谁能给我一些建议?
为了帮助像我这样的其他新生,我提供更多细节:
- 安装 Gold 链接器(使用 ld.bfd 下载 binutils (>2.21.51.0.2))。
- 运行 CMake with -DLLVM_BINUTILS_INCDIR=/path/to/binutils/include(此路径包含文件 plugin-api.h),并生成 -j8。此步骤生成 LLVMgold.so。
- 对于以前的 LLVM 版本,将 LLVMgold.so 复制到 /usr/local/lib。对于最新的 LLVM,我们不必将 LLVMgold.so 复制到 /usr/local/lib。 make install后,文件会复制到目标目录(./install_dir/lib)
我想用 LLVM 强制的 CFI 编译 nginx。我修改了objs目录下的Makefile。修改包括: 1. 更改 compiler:cc--> clang 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)
编译过程通过。但是,在 link 过程中报告了一些错误:
/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方案依赖link-time optimization(LTO),使用的linker必须支持LTO(比如gold plugin) . 关于LTO的资料有:
http://llvm.org/docs/GoldPlugin.html
我还不知道怎么处理这个问题,谁能给我一些建议?
为了帮助像我这样的其他新生,我提供更多细节:
- 安装 Gold 链接器(使用 ld.bfd 下载 binutils (>2.21.51.0.2))。
- 运行 CMake with -DLLVM_BINUTILS_INCDIR=/path/to/binutils/include(此路径包含文件 plugin-api.h),并生成 -j8。此步骤生成 LLVMgold.so。
- 对于以前的 LLVM 版本,将 LLVMgold.so 复制到 /usr/local/lib。对于最新的 LLVM,我们不必将 LLVMgold.so 复制到 /usr/local/lib。 make install后,文件会复制到目标目录(./install_dir/lib)