代码混淆技术系列
LLVM环境搭建与基本用法
00 分钟
2022-12-14
2024-11-11
type
status
date
slug
summary
tags
category
icon
password

LLVM 环境搭建

  • Ubuntu 18.04
  • LLVM 12.0.1
  • CMake 3.21.1

下载 LLVM-Core 和 Clang 源代码

在 llvm-project 仓库的 Releases 界面
  • llvm-12.0.1.src.tar.xz
  • clang-12.0.1.src.tar.xz
因为编译 llvm-core 的 cmake 版本必须高于 3.13.4,因为 ubuntu18.0 apt 安装的 cmake 版本小于这个版本,所以需要自己下载并编译,我试过最新版的 cmake,也编译失败,最后还是老老实实用了课程推荐的 3.21.1 版本
notion image

下载 cmake3.21.1

  • cmake3.21.1.tar.xz

编译 cmake

下载完进入文件夹,然后运行一下下面的指令,防止下一步报错
执行:
最后检验安装是否成功

编译 LLVM 项目

在 llvm 和 clang 源码同级目录下创建一个 build 文件夹,用于存放 camke 编译完的 LLVM 项目 同时也创建一个 shell 编译脚本
notion image
Shell 脚本内容如下:
cmake 参数解释:
  • -G "Unix Makefiles":生成 Unix 下的 Makefile
  • -DLLVM_ENABLE_PROJECTS="clang":除了 LLVM Core 外,还需要编译的子项目。
  • -DLLVM_BUILD_TYPE=Release:在 cmake 里,有四种编译模式:Debug, Release, RelWithDebInfo, 和 MinSizeRel。使用 Release 模式编译会节省很多空间。
  • -DLLVM_TARGETS_TO_BUILD="X86":默认是 ALL,选择 X86 可节约很多编译时间。
  • -DBUILD_SHARED_LIBS=On:指定动态链接 LLVM 的库,可以节省空间。
make install 指令是将编译好的二进制文件和头文件等安装到本机的 /usr/local/bin 和 /usr/local/include 目录,方便后续使用
最后
然后耐心等待几个小时,最后输入
验证是否安装成功

LLVM 基本用法

notion image
LLVM 编译源代码大致分为三步
  1. 将源代码转换成 LLVM IR 指令(IR 指令类似于 x86 汇编)
  1. 通过优化器优化 LLVM IR
  1. 编译 LLVM IR 为可执行文件

示例

(一) 将源代码转化成 LLVM IR

LLVM IR 有两种表现形式 一种是人类可阅读的文本形式,对应文件后缀为 . ll 另一种是方便机器处理的二进制格式,对应文件后缀为 . bc 使用以下命令将源代码转化为 LLVM IR:

(二)优化 LLVM IR

使用 opt 指令对 LLVM IR 进行优化 Opt 是 llvm 项目里面的优化器命令行工具
  • -load 加载特定的 LLVM Pass (集合) 进行优化(通常为. so 文件)
  • -hlw 是 LLVM Pass 中自定义的参数,用来指定使用哪个 Pass 进行优化
这一步最难懂,说简单点,就是优化器通过这个 pass 优化这个 IR

(三) 编译 LLVM IR 为可执行文件

这一步通过 Clang 完成,从 LLVM IR 到可执行文件中间还有一系列复杂的流程,Clang 帮助我们整合了这个过程:

参考于

上一篇
AES加密算法原理
下一篇
OLLVM环境搭建和基本用法