ubuntu16.04安装LLVM3.6.0

  因为最近需要用到LLVM做DOPDefender,开始第一步需要安装LLVM+clang,论文中做DOP攻击给的github上的DOP-StaticAssist是LLVM3.5的,想着安装一个3.5,但是尝试了很久,特别是3.5.0,一直报错,说找不到“all”,查了以后发现很多人都遇到这个问题,这是一个本身的bug,试了3.5.1和3.5.2都失败了,于是试3.6.0,安装成功了。

安装cmake

sudo apt-get install cmake

获取源代码

在LLVM的官网上可以找到官网3.6.0下载。选择里面的Clang source code、LLVM source code、Compiler RT source code、LibC++ source code、LibC++ ABI source code,下载到本地,然后传到虚拟机中,在虚拟中解压。
在这里插入图片描述

设置路径

在这里插入图片描述

#在当前目录进入terminal,重命名文件夹和移动文件夹

#把clang的文件夹改成clang
mv cfe-3.6.0.src clang                   
#把clang的文件夹放到llvm的文件夹的/tools/子文件夹
mv clang/ llvm-3.6.0.src/tools/  

#把extra改名为extra       
mv clang-tools-extra-3.6.0.src extra
#把extra放到clang中  
mv extra/ llvm-3.6.0.src/tools/clang/

#把compiler-rt放到/projects/中
mv compiler-rt-3.6.0.src compiler-rt
mv compiler-rt llvm-3.6.0.src/projects/

#把libcxx放到/projects/中
mv libcxx-3.6.0.src libcxx
mv libcxx llvm-3.6.0.src/projects/

#把libcxxabi放到/projects/中
mv libcxxabi-3.6.0.src libcxxabi
mv libcxxabi llvm-3.6.0.src/projects/

设置好之后如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在当前目录创建目录build-3.6.0

mkdir build-3.6.0
cd build-3.6.0

在这里插入图片描述

增加 swap空间

   比较坑的是,有两次都编译快好了,然后被kill了,fatal error(9)。原因是内存炸了,2GB的内存并不够。所以增加swap空间。

#创建一个swap文件
mkdir ./swapfile
cd ./swapfile
sudo dd if=/dev/zero of=swap bs=1024 count=2000000

#改一些权限
cd ../
sudo chmod 600 ./swapfile
sudo mkswap ./swapfile/swap
#最后我们使用swapon命令启用:
sudo swapon ./swapfile/swap

准备编译(在build目录中打开terminal)

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm-3.6.0
make  #会比较久,可以做一些别的事
sudo make install  #如果一切顺利就可以install了,不然可能得换版本再试试

获得LLVM IR文件

demo[hello.c]

#include <stdio.h>

int main()
{
 int a;
 scanf("%d", &a);
 if ( a > 3)
  a *= 2;
 return 0;
}

LLVM IR

输入:
clang -Os -S -emit-llvm hello.c
获得hello.ll文件!

; ModuleID = 'hello.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1

; Function Attrs: nounwind optsize uwtable
define i32 @main() #0 {
  %a = alloca i32, align 4
  %1 = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), i32* %a) #2
  %2 = load i32* %a, align 4, !tbaa !1
  %3 = icmp sgt i32 %2, 3
  br i1 %3, label %4, label %6

; <label>:4                                       ; preds = %0
  %5 = shl nsw i32 %2, 1
  store i32 %5, i32* %a, align 4, !tbaa !1
  br label %6

; <label>:6                                       ; preds = %4, %0
  ret i32 0
}

; Function Attrs: nounwind optsize
declare i32 @__isoc99_scanf(i8* nocapture readonly, ...) #1

attributes #0 = { nounwind optsize uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind optsize "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind optsize }

!llvm.ident = !{!0}

!0 = !{!"clang version 3.6.0 (tags/RELEASE_360/final)"}
!1 = !{!2, !2, i64 0}
!2 = !{!"int", !3, i64 0}
!3 = !{!"omnipotent char", !4, i64 0}
!4 = !{!"Simple C/C++ TBAA"}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值