llvm-linux

以clang+llvm9.0为例说明如何不从源码编译llvm/clang来实现pass的编译

起因是想用llvm写pass分析linux kernel,从实验室学姐那里拿到了一个llvm9.0.1编译的一个arm linux kernel。然而我之前从源码编译的llvm+clang的版本为11.0.0。于是尝试编译一个llvm+clang9.0.1的版本。。。编译make -j4在我的辣鸡笔记本上大概40分钟左右吧。
然而clang编译时候ld segment fault死活编译不过。。。不知道是不是因为我使用的是wsl,尝试重装ld无果。被气到自闭。不知道为什么官方的文档都是编译源码 + 在源码加一个目录来加新pass这么麻烦劝退,使得在不同llvm版本之间切换实在不友好,如果没有什么从源码编译的必须需求就试着使用编译好的二进制包吧。

看了以下ubuntu官方貌似提供了clang9.0的版本的包,于是放弃从源码编译,下面讲下怎么使用官方包。。

步骤

  • 安装
    1
    sudo apt install clang-9

直接安装clang+llvm9.0版本

  • 环境变量
    在~/.bashrc设置环境变量

    1
    2
    export LLVM_HOME=/usr/lib/llvm-9
    export PATH=$PATH:/usr/lib/llvm-9/bin:/usr/lib/llvm-9/lib
  • 下载pass模板

    1
    git clone https://github.com/abenkhadra/llvm-pass-tutorial.git

建议clone之后先修改skeleton/CMakeList.txt往里面加

1
2
3
4
5
set(CMAKE_CXX_COMPILER "clang-9")

set_target_properties(SkeletonPass PROPERTIES
COMPILE_FLAGS "-D__GLIBCXX_USE_CXX11_ABI=0 -fno-rtti"
)

  • 编译pass

    1
    2
    3
    4
    5
    cd llvm-pass-tutorial
    mkdir build
    cd build
    cmake ..
    make
  • 运用pass分析这个cpp文件
    随便写一个hello.cpp

    1
    clang-9 -Xclang -load -Xclang build/skeleton/libSkeletonPass.* hello.cpp
  • 结束
    不用编译llvm+clang可太舒服了。。。
    虽然这个pass分析arm linux kernel仍然出错。。。接下来我需要编译一个linux kernel。。。我太难了。

参考

https://github.com/abenkhadra/llvm-pass-tutorial
https://askubuntu.com/questions/1198087/how-to-set-clang-9-as-the-default-c-compiler-on-ubuntu-19-10
https://llvm.org/docs/GettingStartedVS.html