1、初识 llvm源码编译 及virtualbox和ubuntu环境搭建

news2025/1/18 16:46:37

很久没更新了,最近准备研究逆向和加固,于是跟着看雪hanbing老师学习彻底搞懂ollvm,终于把所有流程跑通了,中间遇到了太多的坑,所以必须记录一下,能避免自己和帮助他人最好。

环境搭建太重要了,折腾了好几遍,老师的视频里对初始环境说得太少了,吃了太多这方面的亏,这里我是在windows中添加虚拟机完成的,原以为mac上应该也可以,但后面发现还是很多地方走不通。

系统使用VirtualBox-7.0.12-159484-Win和ubuntu-2204.3,从目前来说都是最新的,

virturalBox 下载地址:https://www.virtualbox.org/wiki/Downloads​​​​​​icon-default.png?t=N7T8https://www.virtualbox.org/wiki/Downloads

ubuntu 下载地址 : 

https://releases.ubuntu.com/jammy/ubuntu-22.04.3-desktop-amd64.isoicon-default.png?t=N7T8https://releases.ubuntu.com/jammy/ubuntu-22.04.3-desktop-amd64.iso

先安装虚拟机环境并配好网络,整个下载和安装过程大部分时间就是等

下载好这两个文件后,可以开始安装了

我准备了一个空盘,465G,为了防止llvm编译时内存报错,搞得很大

VirtualBox 安装,配置内存24000MB,差不多20G,处理器8,硬盘给到360G,因为llvm编译很容易内存溢出,所以硬件还是要跟上,这里我是吃过亏的。

配置完毕后,等待一段时间的安装,检查Terminal应用是否正常,默认浏览器是否能上网。

terminal无法打开的问题解决:

CTRL + ALT + F3 # 进入命令行模式(需要返回桌面时CTRL + ALT + F1)
cd /etc/default
sudo nano locale
# 把文件中的 “en_US” 改成 “en_US.UTF-8”
#注意是所有的en_US,我这边发现了两处
# 保存退出
sudo locale-gen --purge
reboot # 重启虚拟机

安装git,去官网下载llvm 9.0.1版本源代码,注意是linux的版本,然后上传到一个自己的git仓库,这里上传是为了后面有用,这里很重要,后面要做代码分支切换。

下载地址:https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1/llvm-project-9.0.1.tar.xz

git 添加ssh命令

ssh-keygen -t ed25519 -C "your_email@example.com"

安装llvm编译命令,同Android源码编译的命令相同:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

 安装完毕后可以编译安卓源码也可以编译llvm。

安装cmake, sudo apt install cmake 

安装ninja , sudo apt-get install ninja-build

两个工具安装完毕后,mkdir build-debug  cd build-debug

cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS="clang" ../llvm

目录结构如上,命令正常后执行,ninja -j8,然后等待编译完成。3000多个文件,至少半个小时吧。

同样的操作,再编译release目录,先创建build-release文件夹,再执行

cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang" ../llvm

同样执行 ninja -j8。

然后就是在clion中编译llvm了,先去官网下clion并安装,注意下载的是linux的版本,

clion下载地址:

Download CLion: A Smart Cross-Platform IDE for C and C++

打开llvm项目,目录为/home/nowind/llvm/llvm-project-9.0.1/llvm /CMakeLists.txt,然后手动配置CMake参数:

Debug和Release,-G Ninja -DLLVM_ENABLE_PROJECTS="clang",在llvm目录下会自动生成

cmake-build-debug和cmake-build-release目录,再使用命令行进入这两个目录,执行ninja -j8

debug模式在编译llc文件的时候,我等了将近半个小时,也是这里容易将内存给崩了,需要随时查看free -m,查看剩余内存还够不够,不够就添加swap内存。这个文件非常难过,编译完成后直接吞掉了我近100G,编译后debug包的大小有65G

这里我添加了40G的swap内存

sudo swapoff -a

sudo rm /swapfile

sudo dd if=/dev/zero of=/swapfile bs=1M count=40960

sudo chmod 600 /swapfile

sudo mkswap /swapfile

sudo swapon /swapfile

sudo swapon --show

以上是在外层生成的编译文件,但我在后面看老师讲解的时候,并没有用到这个,所以很奇怪,为啥多这一步,如果时间不足可以先往后看,有空再来编译这边的。

终于编译完了。

编译遇到错误:

llvm-project-9.0.1/llvm/utils/benchmark/src/benchmark_register.h:17:30: error: ‘numeric_limits’ is not a member of ‘std’ 17 | static const T kmax = std::numeric_limits<T>::max();

需要在llvm-project-9.0.1/llvm/utils/benchmark/src/benchmark_register.h中增加

#include <limits>

无论在clion中编译还是使用cmake直接编译,都是后续的第一步,这步遇到问题,一定是要解决的

接下来我们使用编译后的clang和llvm来执行c文件

先配置环境变量:

export PATH=/home/nowind/llvm/llvm-project-9.0.1/llvm/cmake-build-debug/bin:$PATH
clang -emit-llvm -S hello_clang.c -o hello_clang.ll    其中ll文件可以直接修改,改字符串名字和长度
lli hello_clang.ll
llvm-as hello_clang.ll -o hello_clang.bc
llc hello_clang.bc -o hello_clang.s  转化成汇编
clang  hello_clang.s -o hello_clang_s 汇编转可执行文件
llvm-dis hello_clang.bc -o hello_clang_re.ll   同样可以把bc文件转ll文件,和上面使用clang的结果是一样的
opt --print-bb hello_clang.bc 打印内容

熟悉下c文件编译后的几种格式    灵活运用

clion断点调试,

使用clang命令行:

clang /home/nowind/llvm/pro/pro1/hello_clang.c -o /home/nowind/llvm/pro/pro1/hello_clang_s

使用clang 断点:clion 切换到Clang Debug模式,配置参数

/home/nowind/llvm/pro/pro1/hello_clang.c -o /home/nowind/llvm/pro/pro1/hello_clang_s

然后断点打在/home/nowind/llvm/llvm-project-9.0.1/clang/tools/driver/driver.cpp的main函数中,这里是clang的入口

使用pass:

bc或者ll文件使用hello pass

opt 命令行运行

 opt -load '/home/nowind/llvm/llvm-project-9.0.1/build-debug/lib/LLVMHello.so' -hello hello.bc

clion调试opt  切换至 opt debug,进行断点 在 llvm/lib/Transform/Hello/hello.cpp

配置参数 

-load /home/nowind/llvm/llvm-project-9.0.1/build-debug/lib/LLVMHello.so -hello hello.bc

以上基本是第一课的所有内容了,并不复杂,但编译时间会比较长,遇到相关问题也可以一起讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言指针详解下

指针下 1 指针与字符串 int main01(){//指针与字符串char a[] "helloworld";//定义了一个字符数组,字符数组内容为helloworld\0//定义一个指针用来保存数组首元素的地址char * p a;printf("%s\n",p);//%s打印一个字符串,要的是首个字符的地址printf(…

使用Rust 构建C 组件

协议解析&#xff0c;这不就很快了&#xff0c;而且原生的标准库红黑树和avl 树支持&#xff0c;异步tokio 这些库&#xff0c;编写应用组件就很快了 rust 标准库不支持 unix 的消息队列&#xff0c;但是支持 shm 和 uds&#xff0c;后者从多方面考虑都比&#xff0c;消息队列更…

flutter添加全局水印

效果&#xff1a; 可以直接引用&#xff1a;disable_screenshots: ^0.2.0 但是有时候直接引用会报错&#xff0c;可以不引用插件直接把下面的源码工具类放在项目里面 工具类源码&#xff1a; import dart:io; import dart:math;import package:flutter/cupertino.dart; impor…

oomall课堂笔记

一、项目分层结构介绍 controller层&#xff08;控制器层&#xff09;&#xff1a; 作用&#xff1a;负责输出和输入&#xff0c;接收前端数据&#xff0c;把结果返回给前端。 1.处理用户请求&#xff0c;接收用户参数 2.调用service层处理业务&#xff0c;返回响应 servi…

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…

【Linux】已安装 powerlevel10k,报错 command not found: p10k

问题描述 在配置 zsh 时&#xff0c;已经安装了 powerlevel10k&#xff0c;但是当尝试启动 Powerlevel10k 配置向导时&#xff0c;出现了以下错误&#xff1a; p10k configure zsh: command not found: p10k原因分析 出现这个错误的原因是因为 zsh 终端还没有加载最新的配置…

Kafka性能调优:高吞吐、低延迟的数据流

Apache Kafka作为一种高性能、分布式流处理平台&#xff0c;对于实时数据的处理至关重要。本文将深入讨论Kafka性能调优的关键策略和技术&#xff0c;通过丰富的示例代码为大家提供实际操作指南&#xff0c;以构建高吞吐、低延迟的数据流系统。 Broker 配置的优化 首先&#…

[全志Tina/Linux]全志在线生成bootlogo工具

一、需求 由于全志的bootlogo文件要求使用bmp格式的32位RGBA图像&#xff0c;经测试在使用不同版本的ps软件修图时&#xff0c;导出的bootlogo.bmp经常无法被全志uboot识别&#xff0c;因此使用在线工具转换。 二、操作 1、登录工具网站 https://online-converting.com/ima…

C++面试宝典第3题:找不同的数

题目 封装两个函数&#xff0c;分别完成下面的编码任务。 &#xff08;1&#xff09;在一个整型数组中&#xff0c;数字都是两两相同&#xff0c;只有一个不同&#xff0c;请编写代码&#xff0c;最快找出这个不同的数字。 &#xff08;2&#xff09;在一个整型数组中&#xff…

力扣78. 子集(java 回溯解法)

Problem: 78. 子集 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们易知&#xff0c;本题目涉及到对元素的穷举&#xff0c;即我们可以使用回溯来实现。对于本题目我们应该较为注重回溯中的决策阶段&#xff1a; 由于涉及到对数组中元素的穷举&#xff0c;即在每…

1、Redis变慢原因排查(上)

感觉Redis变慢了&#xff0c;这些可能的原因你查了没 &#xff1f;(上) Redis 作为一款业内使用率最高的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单节点的QPS压测能达到18万以上。但也正因此如此&#xff0c;当应用访问 Redis 时&#xff0c;如果发现响应延迟变…

Docker架构及常用的命令

一、初识Docker 1、 docker是一个快速交付应用、运行应用的技术&#xff0c;具备下列优势&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以…

Redis保证高可用的三种方式

Redis保证高可用主要有三种方式&#xff1a;主从、哨兵、集群。 主从复制了解吗&#xff1f; Redis主从复制简图 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为 主节点(master)&#xff0c;后者称为 从节点(slave)。且…

用Rust刷LeetCode之66 加一

66. 加一[1] 难度: 简单 func plusOne(digits []int) []int { length : len(digits) // 从最低位开始遍历&#xff0c;逐位加一 for i : length - 1; i > 0; i-- { if digits[i] < 9 { digits[i] return digits } d…

计算整数各位数字之和 C语言xdoj29

时间限制: 1 S 内存限制: 1000 Kb 问题描述: 假设n是一个由最多9位数字&#xff08;d9, …, d1&#xff09;组成的正整数。编写一个程序计算n的每一位数字之和 输入说明: 输入数据为一个正整数n 输出说明: 对整数n输出它的各位数字之和后换行 输入样例: …

排序算法——桶排序/基数排序/计数排序

桶排序 是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理&#xff1a; 假设输入数据服从均匀分布&#xff0c;将数据分到有限数量的桶里&#xff0c;每个桶再分别排序&#xff08;有可能再使…

C/C++,数字序列——计算伯努利数(Bernoulli Number)的计算方法与源程序

1 文本格式 typedef long long ll; const int maxn 10000; const int mod 1e9 7; ll B[maxn]; // 伯努利数 ll C[maxn][maxn]; // 组合数 ll inv[maxn]; // 逆元&#xff08;计算伯努利数&#xff09; void init() { // 预处理组合数 for (int i 0;…

PHPstudy小皮的数据库打开失败问题解决

如果你的MYSQL服务启动后停止&#xff0c;多次重启依然无法解决的情况下&#xff0c;大概率是和本地mysql冲突了 但是&#xff0c;千万不要卸载掉本地mysql&#xff0c;只需要在服务中停止本地mysql即可 将此服务关闭&#xff0c;小皮的mysql即可使用

AI助力智慧农业,基于DETR【DEtection TRansformer】模型开发构建田间作物场景下庄稼作物、杂草检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候&#xff0c;我总是倾向于极简构建&#xff0c;一切没有必要的软件包都不安装&#xff0c;以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难&#xff0c;如在日常查询、排查问题的时候发现很多命令用不了&#xff0c;不得不在容器中安装额外的命令…