llvm-初识

特点

基于经典编译器架构。LLVM的设计十分出色。其目标不是成为一个整体的编译器,而是被设计为一组库文件的集合,用于解决各种特定问题。比如优化器,每种优化便为一个.o文件,之间低耦合,可以针对不同需要选择不同的便。每遍称为Pass
因此用于构建jni等十分方便
前端:构建AST,转化为IR。
优化器: 针对IR进行优化
后端: 负责代码生成

安装

一键安装

1
2
3
4
sudo apt install llvm-6.0
sudo apt install clang-6.0
sudo apt install cmake
sudo apt install build-essential //解决CMAKE_CXX_COMPILER错误

每次使用时所有命令要加-6.0后缀

手动编译

http://releases.llvm.org/download.html

1
2
wget http://releases.llvm.org/7.0.0/llvm-7.0.0.src.tar.xz
wget http://releases.llvm.org/7.0.0/cfe-7.0.0.src.tar.xz

将俩个包解压

1
2
tar -xvf llvm-7.0.0.src.tar.xz
tar -xvf cfe-7.0.0.src.tar.xz

把解压后的clang的源码包重命名,并移动到llvm-7.0.0.src/tools/目录下,最终效果为llvm-7.0.0.src/tools/clang/
在与llvm-7.0.0.src同目录创建build目录

1
2
3
cd build
cmake -G "Unix Makefiles" ../llvm-7.0.0.src
make -j3

cmake 是构建make用的makefile的。因此用make就行
不要用make install….会直接撑爆你的主盘…..使用的话直接在build出的目录用就行而且方便多版本研究

主要内容

  1. Clang前端。 该组件将C,C ++,Objective C和Objective C ++代码编译为LLVM bitcode。
  2. LLVM工具套件。 它包含使用LLVM所需的所有工具,库和头文件。它包含汇编程序,反汇编程序,bitcode分析程序和bitcode优化程序。

源码目录结构

llvm/examples:示例,教程http://llvm.org/docs/tutorial/index.html
llvm/include:从llvm库里导出来的头文件
llvm/lib:大多数源文件
llvm/tools:由工具库的源代码构建而成,这些工具可以直接运行
llvm/utils:这个文件夹里包含了,用于处理LLVM源代码的实用程序; 有些也是是构建过程的一部分,因为它们是部分基础结构的代码生成器。

libc++

libc++库是llvm项目对C++标准库的重写,它支持包括C++11和C++14在内的最新的C++标准

IR中间指令

比java字节码更低级的表示,无限变量,可以使用llvm提供的AST方法生成..
待续…

优化器

针对IR进行优化,每个为Pass
待续…

官方文档

  1. Design & Overview这个类别里的文档主要是几篇介绍LLVM架构和设计的论文和会议报告。
  2. Publications这个类别主要是一个已经发布的基于LLVM的项目列表。
  3. User Guides这个类别的文档主要是针对刚接触LLVM,打算使用LLVM的用户,并且此类用户打算接触LLVM的中间表示。
  4. API Clients这个类别主要是针对以LLVM为基础进行工程开发的人。提供一些介绍编程需要的文档。比如:编程手册、编程规范等文档。
  5. Subsystems这个类别里的文档主要是介绍子系统的。相对前一个类别,这个列别里的文档都是针对的是LLVM里的某一块。比如介绍如何写Pass,如何写 Backend等。
  6. Development Process这个类别里主要介绍的是开发过程中的几个动作需要的文档。如何构建工程,如果编译工程,如何发布等。
  7. Mailing Lists这里主要是几个邮件列表,有开发的还有报告bug的,还有关于提交代码的。

安全保护

  1. ollvm就是在优化层做的代码混淆便.基于Pass
  2. 通过代码同功能多样化,同功能.可以大大增加代码安全强度,因为即使逆向了自己的应用也难以确定其他人的应用.

待熟悉后思考

推荐文档

https://llvm.org/docs/