llvm介绍
ollvm的前身
llvm是一个整体的功能代表词,不是字母缩写,他的功能主要是对语言的一个跨平台处理,分为前段 ir 后端三部分,前段是各种语言的编写,经过中间ir的转换,后端优化输出。
clang就是属于llvm的一个子项目,我们可以通过编译llvm源码获取clang
编译llvm
在llvm的官网下载llvm源码, 下载地址
根据官网把编译环境配置下, 我这边用的Ubuntu2004
image.png
image.png
下面的命令行可以配置大部分环境,剩下的用的时候,缺啥补上就行
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
进入下载的源码目录创建两个debug和release文件夹,编译两个版本,编译一个也行,编译的时候,记得电脑磁盘空间要大一点,不然编不动,最少给个150g, 交换空间最少30g,我给的30G交换空间,还是出现了一次交换空间不足的情况,
linux swap 设置
free -m 查看当前空间
image.png
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576 设置10g bs是单位,count是数量
sudo mkswap /swapfile 制作swap交换文件
sudo swapon /swapfile 启用交换文件
sudo swapoff -v /swapfile 关闭交换文件
sudo rm /swapfile 删除交换文件
cmake配置
官方文档说的编译步骤
image.png
我选择用NInja来编译,设置编译为debug,编译项目为clang,llvm有多个子项目,也可以同时写多个项目,用 ; 隔开就好
image.png
-j4 代表四个核处理编译
image.png
release版,修改下编译的type就好了
使用编译的clang
344 export PATH=/home/shock/myfile/ollvm/llvm-project-11.0.0/llvm/cmake-build-debug/bin:$PATH 设置环境变量
345 clang hello.c -o hello 用clang将hello.c 输出成可执行文件
346 ./hello 运行
348 clang -emit-llvm -S hello.c -o hello.ll 将c文件转换llvm中间语言
350 lli hello.ll 运行中间语言
352 llvm-as hello.ll -o hello.bc 将ll文件转换成汇编文件,需要先转换成bc文件
353 llc hello.bc -o hello.s
354 clang hello.s -o hello_s 将汇编文件输出成可执行文件
355 ./hello_s
hello.c 代码
#include <stdio.h>
void test_hello(){
printf("hello pass test\n");
}
int main(int argc, char const *argv[])
{
printf("hello clang\n");
test_hello();
return 0;
}
image.png
image.png
llvm pass
编写pass文件可以对ll文件进行转换,比如方法名的替换,加密等
写个pass项目 修改下文件名,官网cmake配置 地址
image.png
使用clion 开发
项目目录
image.png
配置下项目clang环境 在根目录下配置 ,这是我的路径
set(LLVM_DIR /home/shock/myfile/ollvm/llvm-project-11.0.0/llvm/cmake-build-debug/lib/cmake/llvm/)
项目地址
build project 编译出LLVMencyrpass.so文件
image.png