美文网首页LLVM
llvm学习日记十五:符号重命名

llvm学习日记十五:符号重命名

作者: 鸣人的大哥 | 来源:发表于2021-09-17 16:46 被阅读0次

一、目的:

分析 LLVM 自带的符号重写Pass

二、分析执行流程:

  • LLVM原生的文件
    lib/Transforms/Utils/SymbolRewriter.cpp
  1. 入口首先有 RewriteSymbolPass 类对象创建,该构造函数内首先解析输入的map文件;


    image.png
  2. 一路跟踪 parse 函数,可以看到解析文件内容;


    image.png
  3. 读取内容将对象指针存储到容器中:
    ExplicitRewriteFunctionDescriptor 表示显示名称替换,就是全名替换;
    PatternRewriteFunctionDescriptor 表示正则名称替换;


    image.png
  4. 文件解析完后,进入 runOnModule 开始执行;


    image.png
  5. 循环list对象 Descriptors ,栈结构;


    image.png
  6. 符号替换,看起来并不复杂,核心逻辑使用setName将source替换为Target:
    Comdat组件被 rewriteComdat 提前处理,老实说,Comdat 的来源和作用并不是很理解,官网以及一些网站的解释还是不懂,有大佬可以留言解释一下。QAQ


    image.png
  7. 两个命令行参数:

static cl::list<std::string> RewriteMapFiles("rewrite-map-file",
                                             cl::desc("Symbol Rewrite Map"),
                                             cl::value_desc("filename"),
                                             cl::Hidden);
INITIALIZE_PASS(RewriteSymbolsLegacyPass, "rewrite-symbols", "Rewrite Symbols",
                false, false)

rewrite-map-file 需要跟一个yaml格式的文件,显示指明了需要重命名的符号

三、调试运行:

  1. 在xcode中可以直接使用opt调试,命令行参数如下:


    image.png
  2. 我这里使用llvm自带的例子,参数输入ll文件和map文件,map文件的格式在cpp文件里有注释解释:

// Currently, the following descriptor types are supported:
//
// - function:          (function rewriting)
//      + Source        (original name of the function)
//      + Target        (explicit transformation)
//      + Transform     (pattern transformation)
//      + Naked         (boolean, whether the function is undecorated)
// - global variable:   (external linkage global variable rewriting)
//      + Source        (original name of externally visible variable)
//      + Target        (explicit transformation)
//      + Transform     (pattern transformation)
// - global alias:      (global alias rewriting)
//      + Source        (original name of the aliased name)
//      + Target        (explicit transformation)
//      + Transform     (pattern transformation)
  1. 查看生成的IR:
    可以看到map文件配置的函数名都被更改了,


    image.png

四、示例,自己写一个测试下:

  • c文件:
#include <stdio.h>

int a = 100;

static int add(int x, int y)
{
    return x + y;
}

int sub(int x, int y)
{
    return x - y;
}

int main()
{
    printf("%d\n", add(3, 4));
    printf("%d\n", sub(5, 4));
    printf("%d\n", a);
    return 0;
}
  • 生成IR:
    clang -c test_symbolobf.c -o test_symbolobf.ll -emit-llvm -S

  • 配置yaml文件:


    image.png
  • 使用opt:
    ../bin/opt -rewrite-symbols -rewrite-map-file /xxx/test_symbolobf/test_symbolobf_map.yaml /xxx/test_symbolobf/test_symbolobf.ll -o /xxx/test_symbolobf/test_symbolobf.ll.bc

  • bc to ll:
    llvm-dis /xxx/test_symbolobf/test_symbolobf.ll.bc

  • 查看新生成IR,正常:


    image.png

相关文章

  • llvm学习日记十五:符号重命名

    一、目的: 分析 LLVM 自带的符号重写Pass 二、分析执行流程: LLVM原生的文件lib/Transfor...

  • vscode使用指南(代码重构)

    重构 抽取方法 抽取变量 重命名符号

  • llvm学习日记十:llvm后端概览

    参考书:《Getting Started with LLVM Core Libraries》 一、概览图: 整体概...

  • 【LLVM】LLVM的安装与配置

    LLVM学习入门 入门学习LLVM开始,回顾一下之前的知识。首先,LLVM由三个部分组成, 第一部分是LLVM组件...

  • IDEA 常用快捷键

    将插入标记放在要重命名的符号上,然后按Shift + F6(“重构” |“重命名”)PS:给自己已经使用过的变量重...

  • LLVM 学习

    关于LLVM 官网地址 https://llvm.org/ LLVM 项目是模块化,可重用的编译器以及工具链技术的...

  • LLVM学习

    以下资料是在腾讯课堂上面的视频学习的记录目前熟知的编译器有 GCC LLVM Clang 1命令行查看程序编译...

  • 二十五、LLVM

    什么是编译器 LLVM概述 LLVM案例体验 LLVM源码 & 编译流程 1 什么是编译器? 1.1 Python...

  • LLVM 进阶一:符号混淆(LTO)

    更新:编译参数添加对静态库的说明二次更新:实际业务中意义不是很大 一、目的: 实现链接时符号混淆参考文档:http...

  • llvm学习日记三:使用libclang

    参考书:《Getting Started with LLVM Core Libraries》 这一节主要是介绍cl...

网友评论

    本文标题:llvm学习日记十五:符号重命名

    本文链接:https://www.haomeiwen.com/subject/lnpkgltx.html