mysql - 启用 CFI 编译 mysql

标签 mysql llvm control-flow

我想使用 LLVM 启用的 CFI 来编译 mysql。软件版本如下:

  1. clang-6.0
  2. mysql-5.6.26
  3. binutils-2.28.1

我可以使用以下配置成功编译mysql:

CC="clang" CXX="clang++" CFLAGS="-g" cmake -DCMAKE_INSTALL_PREFIX=../mysql -DWITH_BOOST=./boost .

但是,我无法使用以下配置编译 mysql:

CC="clang" CXX="clang++" CFLAGS="-g -flto" CXXFLAGS="-g -flto"  cmake -DCMAKE_INSTALL_PREFIX=../mysql -DWITH_BOOST=./boost .

报错如下:

../mysys/libmysys.a: error adding symbols: Archive has no index; run ranlib to add one
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [extra/comp_err] Error 1

../mysys/libmysys.a 由以下命令构建:

cd /home/zhangjun/work/mysql/mysql-5.6.26/mysys_ssl 
&& /home/zhangjun/tools/cmake/cmake-3.9.1-Linux-x86_64/bin/cmake -P 
CMakeFiles/mysys_ssl.dir/cmake_clean_target.cmake
cd /home/zhangjun/work/mysql/mysql-5.6.26/mysys_ssl && /home/zhangjun/tools/cmake/cmake-3.9.1-Linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/mysys_ssl.dir/link.txt --verbose=1
/usr/bin/ar qc libmysys_ssl.a  CMakeFiles/mysys_ssl.dir/crypt_genhash_impl.cc.o CMakeFiles/mysys_ssl.dir/my_default.cc.o CMakeFiles/mysys_ssl.dir/my_getopt.cc.o CMakeFiles/mysys_ssl.dir/my_aes.cc.o CMakeFiles/mysys_ssl.dir/my_sha1.cc.o CMakeFiles/mysys_ssl.dir/my_sha2.cc.o CMakeFiles/mysys_ssl.dir/my_md5.cc.o CMakeFiles/mysys_ssl.dir/my_rnd.cc.o CMakeFiles/mysys_ssl.dir/my_murmur3.cc.o CMakeFiles/mysys_ssl.dir/my_aes_yassl.cc.o
/usr/bin/ranlib libmysys_ssl.a

如何修复此错误?

<小时/>

为了修复此错误,我向《Enforcing Forward-Edge Control-Flow Integrity in GCC & LLVM》一书的作者 Caroline Tice 发送了一封电子邮件 他说我应该使用llvm的ar和runlib。使用以下配置修复了上述错误:

CC="clang" CXX="clang++" CFLAGS="-g -flto -fvisibility=hidden -fsanitize=cfi" CXXFLAGS="-g -flto -fvisibility=hidden -fsanitize=cfi" cmake -DCMAKE_{EXE,SHARED,MODULE}_LINKER_FLAGS="-flto -fsanitize=cfi" -DCMAKE_AR=/home/zhangjun/work/llvm/llvm-3.7.1/bin/llvm-ar -DCMAKE_RANLIB=/home/zhangjun/work/llvm/llvm-3.7.1/bin/llvm-ranlib -DCMAKE_NM=/home/zhangjun/work/llvm/llvm-3.7.1/bin/llvm-nm -DCMAKE_INSTALL_PREFIX=../mysql -DWITH_BOOST=./boost .

不幸的是,还有另一个错误:

ld: /home/zhangjun/work/llvm/llvm/tools/gold/gold-plugin.cpp:879: ld_plugin_status allSymbolsReadHook(): Assertion `ObjFilename.second' failed.
clang-6.0: error: unable to execute command: Aborted (core dumped)
clang-6.0: error: linker command failed due to signal (use -v to see invocation)
make[2]: *** [extra/comp_err] Error 254
make[2]: Leaving directory `/home/zhangjun/work/mysql/mysql-5.6.26'
make[1]: *** [extra/CMakeFiles/comp_err.dir/all] Error 2
make[1]: Leaving directory `/home/zhangjun/work/mysql/mysql-5.6.26'
make: *** [all] Error 2

任何人都可以帮我解决这个错误吗?

最佳答案

尝试从标志中删除-flto。由于某种原因,使用 clang,我的链接时优化导致了该问题。

关于mysql - 启用 CFI 编译 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772450/

相关文章:

php - SQL 更新增量不起作用

mysql - 数据库设计可容纳多种项目类型

c - 在 Xeon-Phi 上运行 Haskell

Swift:guard let 与 if let

c# - 通过 Return 与 If/Else 控制流程

While 循环中的 Python Walrus 运算符

mysql - 将数据加载到 mysql 忽略第一行

c# - 将 Putty 登录凭据转换为 C# MySqlConnection 连接字符串

c++ - 如何追踪 LLVM verifyFunction 错误 "Expected no forward declarations!"?

c++ - 错误 : not. exe 已停止工作 - 尝试构建 LLVM 时