本次讨论的是《Getting Started with LLVM Core Libraries》一书的内容。
这里使用的是较新的gcc7.5进行的编译,而读者使用的应该是gcc4.7,此外,可以注意到作者使用的操作系统是apple-macosx10.7.0,因此会出一些问题,以下是解决方案:
修改projects/compiler-rt/asan_linux.cc,加入#include
参考 https://github.com/google/sanitizers/issues/822
修改projects/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc,#include
修改projects/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc,internal_sigaltstack定义中,struct sigaltstack全部修改为stack_t,sanitizer_linux.h同理,并加入bits/types/stack_t.h。
修改projects/compiler-rt/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc,TracerThread函数中的sigaltstack替换为stack_t。
为了在64位机器上编译32位程序,需要使用sudo apt install gcc-multilib安装32位gcc支持,这样才能正常编译compiler-rt的测试程序。
为了顺利带着lldb一起编译,需要使用sudo apt install gcc-multilib g++-multilib安装32位的gcc和g++支持。
为了成功运行lldb,需要将llvm的lib目录加入LD_LIBRARY_PATH环境变量中。
书中的lldb演示中的下断点指令有误,这里应该是breakpoint set --name main,b main也可,作者给出的是gdb写法,不过按照演示执行run -v时,会出现"process launch failed: Child exec failed."的提示,怀疑是lldb版本过老,与ubuntu 18.04LTS不兼容。