LLVM学习之基础知识

2023-11-07

介绍:

学习LLVM与代码混淆技术课程总结出来的经验,希望能够帮助到大家理解。

1、我们首先学会LLVM的基础知识

2、如何搭建LLVM的环境

3、编译一个Hello world

4、LLVM IR基本语法

LLVM搭建环境:

Ubuntu 20.04.3

LLVM 12.0.1

Cmake 3.21.1(项目管理工具)

Cmake注意事项:

刚装完系统要检查cmake是否安装成功,输入:cmake -version

1、LLVM简介

1、1  什么是LLVM

    LLVM项目是模块化、可重用的编译器以及工具链技术的集合。也可以把它理解为一个编译器。

 

1、2  GCC传统编译器架构

    传统编译器都是分为三个阶段:前端(词法分析、语法分析、语义分析、生成中间代码)、优化(中间代码优化)和后端(生成机器码)

     我们发现GCC的前端和后端没有分开的,当gcc需要支持一门新的语言或则平台则会变得非常困难。

1、3  LLVM编译器架构

    通过这种设计,移植编译器以支持新的源代码 语言(例如:Algol 或 BASIC)需要实现一个新的前端, 但是可以重用现有的优化器和后端。

1、4  Clang和LLVM的关系

     LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成)。

源代码(c/c++)经过clang--> 中间代码(经过一系列的优化,优化用的是Pass) --> 机器码

2、搭建环境

2、1 下载 LLVM-Core 和 Clang 源代码

llvm-12.0.1.src.tar.xz

clang-12.0.1.src.tar.xz

然后解包后存放路径如下,并把文件改成llvm和clang

        

2、2  编译LLVM项目

还是在同一文件夹内创建build.sh 文件,内容如下:

cd build

cmake -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" \

-DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" \

-DBUILD_SHARED_LIBS=On ../llvm

make

make install

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 目录,方便后续使用。

执行build.sh 文件自动安装和编译,编译时长从十多分钟到数小时,具体时间由机器性能决定。

输入clang -v确认编译和安装是否完成:

并且在build生成对应的文件

3、编写个Hello World测试

代码如下:

#include <cstdio>

int main(int argcchar *argv[])

    printf("Hello World...\n");

    return 0;

}

LLVM IR主要有三种格式:一种是在内存中的编译中间语言;一种是硬盘上存储的二进制中间语言(以.bc结尾),最后一种是可读的中间格式(以.ll结尾)。这三种中间格式是完全相等的。

clang -S -emit-llvm TestProgram.cpp -o TestProgram.ll

 clang -c -emit-llvm TestProgram.cpp -o TestProgram.bc

 clang TestProgram.ll -o TestProgram_orig

4、LLVM IR基本语法

我们拿前面的例子反汇编出来的.II文件来阅读

LLVM IR中的标识符有两种基本类型:全局标识符(以@开头)和局部标识符(以%开头)

6行是定义了一个全局变量字符串

10~12行分别分配3个局部变量%3、%4、%5其中i32是所占位数,后面align 4是对齐,这就是栈分配的局部变量

 13~15行分别是填充分配的局部变量内容

16行是调用call,其中@.str是全局变量,在最前面可以开到这个全局变量字符串的定义

17行是ret返回

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM学习之基础知识 的相关文章

  • Xcode“来自调试器的消息:对 k 数据包收到意外响应:正常”

    在模拟器上测试我的应用程序时收到此消息 来自调试器的消息 对 k 数据包收到意外响应 正常 这是什么意思 我的应用程序是否存在任何危险 使用 Xcode 6 4 和 7 2 如果你看一下文件进程GDBRemote cpp http llvm
  • 针对 Windows Phone ARM 目标的 Clang 交叉编译

    我想使用 Clang 为 Windows Phone ARM 目标编译一个用 C 编写的程序 有人有这方面的经验吗 什么是更好的方法 1 使用 Clang for Windows 和 MinGW 在运行 Windows 8 的主机上构建 C
  • 使用 llvm-prof 收集 LLVM 边缘分析

    我正在使用这些命令来编译下面的代码以收集 trunk llvm 中的边缘 块分析 clang emit llvm c sort c o sort bc opt insert edge profiling sort bc o sort pro
  • 有 libclang 的教程吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找一些易于理解的 libclang 指南 我在这里或其他论坛上看到了一些帖子 但唯一推荐的信
  • 如何使用 Clang 编码生成未使用的声明? [复制]

    这个问题在这里已经有答案了 我正在寻找代码生成一个llvm Module来自一些 C 代码 具体来说 我将混合 Clang 生成的代码和其他来源的代码 不幸的是 铿锵CodeGenModule如果存在使用它的定义 类似乎坚持只在模块中生成声
  • 我可以使用 LLVM(低级虚拟机)为哪些平台编译二进制文件?

    我对使用 LLVM 的 Clang 编译器感兴趣 LLVM 声称是跨平台的 但尚不清楚可以针对哪些平台 我对此做了很多谷歌搜索 但似乎没有太多关于 LLVM 支持的平台的信息 我唯一发现的是 this http llvm org docs
  • LoadInst 和 StoreInst 值和地址 LLVM

    我有一个文件 print c 它有两个功能 void printLoad print address and value of memory location from which value printf address value vo
  • 统一不同 clang-format 版本的输出

    我们尝试使用 clang format 工具稍微美化我们的代码 为了在我们所做的所有机器上获得统一的结果clang format style llvm dump config 已进行了一些调整并存储到 repo 中 问题是 clang 10
  • 如何在 CMake 项目中使用 LLVM 的 libcxx 和 libcxxabi?

    目前我正在跑步Debian 9 https en wikipedia org wiki Debian version history Debian 9 Stretch 拉伸 用系统默认的编译器GCC 6 3 0 但我有一个使用 CMake
  • 使用带有空格的 CMake 的 include_directories 命令

    我正在使用 CMake 来构建我的项目 并且有以下行 include directories LLVM INCLUDE DIRS 评估后LLVM INCLUDE DIRS 评估为 include directories C Program
  • LLVM到底是什么?

    我一直听说 LLVM 它是 Perl 语言 然后是 Haskell 语言 然后有人用其他语言使用它 它是什么 它与 GCC 到底有什么区别 视角 安全等 LLVM 是一个用于构建 优化和生成中间和 或二进制机器代码的库 LLVM 可以用作编
  • __attribute__ ((已弃用)) 不适用于 Objective-C 协议方法?

    我需要弃用 Objective C 协议中的单个方法 在普通的类 实例方法上我添加 attribute deprecated 声明后 看来它不适用于协议方法 如果我将它们标记为已弃用并在某个地方使用它们 则项目编译正常 不会出现预期的弃用警
  • 如何使用自定义 llc 编译 Rust 程序?

    我有一个自定义 LLVM 后端 并且想为该自定义 nostd 目标交叉编译 Rust 我想分两步编译 Rust 程序 Using rustc生成 LLVM IR 用我自己的opt and llc将 LLVM IR 转换为机器代码 我尝试使用
  • 使用 libclang 从内存中的 C 代码生成程序集

    我需要实现一个使用 LLVM Clang 作为后端将 C 代码编译为 eBPF 字节码的库 代码将从内存中读取 我也需要在内存中获取生成的汇编代码 到目前为止 我已经能够使用以下代码编译为 LLVM IR include
  • 是否可以使用 gold 链接器编译和链接 Clang/LLVM?

    我正在为 LLVM Clang 编写自定义通道 重新编译往往需要一段时间并使用大量内存 我听说 gold 链接器 1 比标准 ld 链接器花费更少的时间并且 2 使用更少的内存 有没有办法将标志传递到 LLVM Clang 构建过程并更改为
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • LLVM cmake安装找不到DIA SDK

    我正在尝试使用 cmake 构建 LLVM 安装 但它给了我一个关于 LLVM ENABLE DIA SDK 的错误 我之前在没有 PDB 的情况下成功构建了 LLVM 但我正在尝试开始使用 libclang 所以我需要 PDB Cmake
  • 如何用 clang 替换 llvm-ld ?

    Summary llvm ld已从LLVM 3 2 版本 http llvm org releases 3 2 docs ReleaseNotes html 我试图弄清楚如何在我的构建系统中使用 clang 请注意 我在编写时找到了自己问题
  • 如何在Eclipse上构建LLVM源代码?

    我正在尝试向 llvm 编译器基础结构添加一个新通道 我已经能够使用 make 构建 LLVM 2 9 但我想使用 Eclipse 构建 这样我就可以追踪代码 我使用LinuxGcc工具链将llvm源文件导入到c 项目中 和 CDT 内部构
  • 如何将 IR 保存到文件并将其构建为可执行文件?

    现在我使用 clang 将 c 文件构建为 s 文件 我已经使用llvm API修改了IR 但是 现在我无法将修改后的 IR 保存到文件中 我想使用 LLVMWriteBitcodeToFile 但找不到 LLVMOpaqueModule

随机推荐

  • 【Linux】shell的简单模拟实现

    目录 一 大概思路 二 命令行显示及获取用户输入命令 三 分析命令 四 创建子进程执行命令 五 导入环境变量 六 源码 总结 前言 我们已经接触了很长时间的Linux 我们对shell特别的好奇 正好前面我们学习了shell的运行原理 以及
  • Ambari——大数据平台的搭建利器(一)

    Ambari是hadoop分布式集群配置管理工具 是由hortonworks主导的开源项目 它已经成为apache基金会的孵化器项目 已经成为hadoop运维系统中的得力助手 引起了业界和学术界的关注 Ambari采用的不是一个新的思想和架
  • matlab系统稳定性仿真实验,基于Matlab的电力系统暂态稳定仿真实验与分析

    基于Matlab的电力系统暂态稳定仿真实验与分析 第29卷第4期2010年4月 实验室研究与探索 RESEARCHANDEXPLORATIONINLABORATORY Vol 29No 4Apr 2010 Matlab 1引言 长期以来 电
  • vue2与vue3的区别

    1 vue2和vue3双向数据绑定原理发生了改变 vue2 的双向数据绑定是利用ES5 的一个 API Object definePropert 对数据进行劫持 结合 发布订阅模式的方式来实现的 vue3 中使用了 es6 的 ProxyA
  • glTexSubImage2D的使用详解

    Name glTexSubImage2D glTextureSubImage2D specify a two dimensional texture subimage C Specification void glTexSubImage2D
  • LeetCode第3题解析

    给定一个字符串 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 bbbbb 输出 1 解释 因为无重复字符的最长子串是
  • 【洛谷 P1170】兔八哥与猎人 题解(数学+辗转相除法)

    兔八哥与猎人 题目描述 兔八哥躲藏在树林旁边的果园里 果园有 M N M times N M N 棵树 组成一个 M M M 行
  • 本地从0搭建Stable Diffusion WebUI及错误记录

    从0开始搭建本地Stable Diffusion WebUI环境 一 环境配置 1 使用的电脑配置 系统 Windows10 处理器 英特尔 i7 内存 24GB 显卡 NVIDIA GTX 1060 6GB 2 镜像源 阿里云 清华大学
  • MySql 简介

    目录 数据存取演变历史 数据库软件应用史 数据库的本质 数据库的分类 1 关系型数据库 关系型数据库有哪些 2 非关系型数据库 非关系型数据库有哪些 MySQL简介 基本使用 系统服务制作 密码相关操作 SQL与NoSQL 数据库的概念 数
  • Spring Junit 单元测试@Test 报错 ServletContext找不到 No qualifying bean of type javax.servlet.ServletContext

    Spring Junit 单元测试 Test 报错 ServletContext找不到 No qualifying bean of type javax servlet ServletContext found for dependency
  • 微信小程序画布详解

    有的时候需要插入动画 这时就需要用到画布 接下来浅谈一下画布的功能和用法吧 wxml代码
  • Log Structured Merge Trees(LSM) 原理(LSM 算法的原理是什么?)

    十年前 谷歌发表了 BigTable 的论文 论文中很多很酷的方面之一就是它所使用的文件组织方式 这个方法更一般的名字叫 Log Structured Merge Tree LSM是当前被用在许多产品的文件结构策略 HBase Cassan
  • nginx basic auth配置踩坑记

    nginx的basic auth配置由ngx http auth basic module模块提供 对HTTP Basic Authentication协议进行了支持 用户可通过该配置设置用户名和密码对web站点进行简单的访问控制 basi
  • 「深度学习表情动作单元识别」 最新2022研究综述

    来源 专知 基于深度学习的表情动作单元识别是计算机视觉与情感计算领域的热点课题 每个动作单元描述了一种人脸局部表情动作 其组合可定量地表示任意表情 当前动作单元识别主要面临标签稀缺 特征难捕捉和标签不均衡3个挑战因素 基于此 本文将已有的研
  • js获取被选择文件的路径方法汇总

    html代码如下
  • verilog的module调用

    目录 1 MUX2to1 2 MUX3to1 3 MUX4to1 作为写过很多代码的程序员应该知道什么是函数的调用 例如下面的代码中 main函数调用了add函数对两个数值进行相加的操作 int add int a int b return
  • Asp.Net 企业微信第三方应用开发(随手笔记)

    C 企业微信第三方应用开发 OAuth2简介 1 注册企业 2 新建第三方应用 3 网页授权链接 OAuth2简介 OAuth2的设计背景 在于允许用户在不告知第三方自己的帐号密码情况下 通过授权方式 让第三方服务可以获取自己的资源信息 1
  • Vuforia 中在脚本中添加识别图被识别和丢失的回调

    start Vuforia 的unity sdk中有一个重要的脚本 DefaultTrackableEventHandler cs 这个脚本在场景中拖入ImageTarget的预制体时会自动挂载 using UnityEngine usin
  • 快速排序【模板+边界处理】

    全文目录 快速排序的思想 快速排序演示图 代码模板 i 和 j 的取值和循环处理 i 和 j 的取值 循环条件判断 边界问题 什么是边界问题 如何处理边界问题 为什么要这样处理边界问题 区间划分问题 取最值问题 mid 取中间值时是否需要
  • LLVM学习之基础知识

    介绍 学习LLVM与代码混淆技术课程总结出来的经验 希望能够帮助到大家理解 1 我们首先学会LLVM的基础知识 2 如何搭建LLVM的环境 3 编译一个Hello world 4 LLVM IR基本语法 LLVM搭建环境 Ubuntu 20