编译器技术
文章平均质量分 95
编译器技术
ronnie88597
十年磨一剑,剑影开龙鳞
展开
-
【转载】基于LLVM Pass实现控制流平坦化
基于LLVM Pass实现控制流平坦化文章目录基于LLVM Pass实现控制流平坦化0x00. 什么是LLVM和LLVM Pass0x01. 首先写一个能跑起来的LLVM Pass0x02. 控制流平坦化的基本思想和实现思路0x03. 基于LLVM Pass实现控制流平坦化0x04. 混淆效果测试转载:https://mp.weixin.qq.com/s/FD5YRurcLGh_VlV9GlWB8w提到代码混淆时,我首先想到的是著名的代码混淆工具OLLVM。OLLVM(Obfuscator-LLV转载 2021-03-01 17:14:48 · 1150 阅读 · 0 评论 -
汇编指令中寻址方式汇总
文章目录立即寻址直接寻址寄存器寻址寄存器间接寻址寄存器相对寻址基址加变址寻址相对基址变址寻址立即寻址操作数作为指令的一部分直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。mov eax, 10h直接寻址在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址。mov eax, [0x00304C18h]寄存器寻址操作数在寄存器中,在指令中直接使用寄存器号的方式称为寄存器寻址。mov eax, [esi]寄存器间接寻址操作数在存储器中,操作数有效地址在e原创 2020-10-21 17:29:42 · 2115 阅读 · 1 评论 -
32位CPU寄存器常用知识汇总
文章目录1、32位CPU所含有的寄存器有:通用寄存器包括:2、数据寄存器EAXEBXECXEDX3、变址寄存器4、指针寄存器5、段寄存器CSDSESSSFSGS6、指令指针寄存器7、标志寄存器:EFLAG7.1、运算结果标志位CFOFSFZFAFPF7.2、状态控制标志位TFIFDF7.3、32位CPU新增的标志位IOPLNTRF虚拟8086方式标志位1、32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP原创 2020-10-21 17:06:30 · 4086 阅读 · 0 评论 -
编译器角度看面向对象(OOP)
编译器角度看面向对象(OOP)目前Tiobe排行榜中一半以上都是面向对象的编程语言同时面向对象(OOP),面向对象的设计(OOD)大家工作中用到、提到比比皆是。本篇文章主要目的是从编译器以及面向对象语言设计的角度看"面向对象"是怎么样的,以及面向对象语言设计的复杂问题。相信这篇文章能让你从面向对象的底层设计上更加深刻的理解它。概述面向对象是编程语言提供给程序员的一种使"抽象"来描述"实...原创 2020-04-04 17:03:53 · 801 阅读 · 0 评论 -
COMDAT是什么,据说很多资深大佬都不清楚
COMDAT是什么,很多程序老鸟都不知道最近对COMDAT的关注,也是由于对LLVM代码调试所引起的。在网上收集了很多的前辈写的博文和资料,却没有一个能把COMDAT讲清楚的。所以希望写下这个文章和大家共同学习探讨编译/链接中的COMDAT。问题背景所谓的COMDAT,是COMDAT段(Section)。COMDAT段被多个目标文件所定义的辅助段。该段的作用是将在多个已编译模块中重复的代码和...原创 2020-03-24 23:49:13 · 2988 阅读 · 0 评论 -
编译器优化--6--代码移动
编译器优化–6--代码移动将一个计算移动到相比原来位置执行得不那么频繁的位置上,可以减少运行程序执行的总操作数。因为相对于包围循环的代码来说,循环本身倾向于执行多得多的次数,所以此领域的大部分工作都专注于将不变的表达式从循环中移出。该变换插入代码以使这些操作在所有代码路径上都变成冗余的,并删除这些新的冗余表达式。惰性代码移动(Lazy Code Motion,LCM)Lazy Code Mo...原创 2020-03-08 23:12:45 · 1251 阅读 · 0 评论 -
编译器优化–5--消除冗余
编译器优化–5--消除冗余关于消除冗余,我们着这里只讨论在局部范围内(单个程序块)上的消除冗余。做这种优化一般常用两种方法:值编号(value numbering),树高平衡(tree-height balancing)。我这这里详细讨论关于值编号(value numbering)的技术细节。局部值编号(Local Value Numbering,LVN)定义:对于基本程序块B中的一个表达式...原创 2020-03-08 21:22:55 · 1421 阅读 · 0 评论 -
编译器优化–4--消除无用和不可达代码
编译器优化–4--消除无用和不可达代码概述有时候,程序包含的一些计算不具有外部可见的效应。如果编译器能够确定给定操作不会影响程序的结果,那么它完全可以消除该操作。大多数程序员都不会有意编写这种代码。但是,这种代码在大多数程序中作为编译器中优化的直接结果出现,通常是因宏展开或编译器前端的"朴素"转换所致。有两种不同的效应可以使操作成为消除的合格对象。操作可能是无用的,意即其结果没有外部可见的效...原创 2020-03-02 00:21:21 · 3124 阅读 · 0 评论 -
编译器优化--3--数据流分析简介
编译器优化–3--数据流分析简介在正式进入主题之前,首先需要明白这两个术语:定义(define):对变量的赋值使用(use):对变量值的读取概述为了优化代码,编译器需要把程序作为一个整体来收集信息,并把这些信息分配给流图各个基本块。如:了解每个基本块的出口处哪些变量是活跃的可以改进寄存器的利用率;使用全局公共子表达式的知识区删除冗余计算;执行常量合并和无用代码删除这样的变换;利用到达定义...原创 2020-02-28 15:19:54 · 1479 阅读 · 0 评论 -
编译器优化--2--优化范围简介
编译器优化–2--优化范围简介概述代码优化的目标是在编译时发现有关程序运行时行为的信息,并利用该信息来改进编译器生成代码。在实现变换之前,编译器编写者必须理解合适可以安全地应用各种变换,以及何时能够预期在应用变换后获利。Note:安全性:如果一个变换不会改变程序的运行结果,那么该变换就是安全的。获利:当在某个位置上应用一种变换可以带来实际的改进时,我们就说这种变化是有利可图的。代码的低...原创 2020-02-27 15:26:11 · 925 阅读 · 0 评论 -
编译器优化--1--概述简介
编译器优化–1--概述简介 编译器接收输入源码,在输出目标程序之前,可以在代码的IR(Intermediate Representation)形式上进行多个Pass(有些文档上将Pass翻译为“趟”)迭代。多遍迭代可能会生成更好的代码,因为编译器实际上可以在一个阶段中研究代码并记录相关细节。那么在后续阶段中,编译器可以利用这些记下来的知识来提高转换的质量。这种策略要求在第一个Pass获得知识并...原创 2020-02-25 15:37:40 · 856 阅读 · 0 评论 -
中间表示IR-静态单赋值形式
中间表示IR-静态单赋值形式SSA满足两种约束则为静态单赋值形式:每个定义都有一个不同的名字;每次使用引用一个定义;重要的ϕ\phiϕ(phi)函数SSA中,名字唯一地对应到代码特定的定义位置;每个名字都是通过单个操作定义的,这也是SSA的来历。每次操作中使用某个名字作为参数时,该名字都编码了对应值的来源地信息;文本化名字实际上指向了一个特定的定义位置。为了使这种名字指派具有唯一性...原创 2020-02-24 17:20:56 · 664 阅读 · 0 评论 -
语法分析器原理简介
语法分析器原理简介上下文无关语法(CFG)为描述程序设计语言语法,传统的解决方案是使用上下文无关语法(Context Free Grammar, CFG)。对于语言L,其CFG定义了表示L语言中有效语句的符号串的集合。语句即是从语法规则G中推导出的一个字符串。上下文无关语法G是一组规则,描述了语句是如何形成的。可以冲G导出的语句称为G定义的语言,记作L(G)L(G)L(G)。上下文无关语法定...原创 2020-02-22 18:08:58 · 3822 阅读 · 0 评论 -
词法分析器原理简介
词法分析器原理简介词法分析器读取有字符串组成的输入流,并产生包含单词的输出流,每个单词都标记了其语法范畴(syntactic category)或类型,等效于英文单词的词类。为了完成这种聚集和分类操作,词法分析器会应用一组描述输入程序设计语言的词法结构(也称微语法,microsyntax)的规则。程序设计语言的微语法规定了如何将字符组合为单词,以及反过来如何分开混合在一起的各个单词。如何识别单...原创 2020-02-20 23:01:10 · 4836 阅读 · 0 评论 -
指令调度概念原理介绍
指令调度概念原理介绍 指令调度是编译优化中用于提高指令级并行,从而提高在计算机上指令流水线的性能。更直接的说,在没有改变原代码语义的情况下,它做了下面两件事:1. 通过重排指令顺序避免指令流水线停顿;2. 避免非法或语义模糊的操作(涉及典型的细微的指令流水线时序问题或非互锁的资源); 指令流水线停顿可能是由结构危险(处理器资源限制),数据危险(输出另一条指令所需的一条指令),控制危险...原创 2020-02-20 17:17:47 · 5158 阅读 · 0 评论 -
NP完全问题以及在编译器领域的求解
NP完全问题以及在编译器领域的求解简介 NP完全问题(NP-C问题),是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。 NP类问题:所有的非确定性多项式时间可解的判定问题构成NP类问题。非确定性算法:非确定性算法将问题分解成猜测和验证两个阶段。算法的猜测阶段是非确定性的,算法的验证阶段是确定性的,它...原创 2020-02-20 12:27:29 · 499 阅读 · 0 评论 -
关于GCC/LLVM编译器中的sanitize选项用处用法详解
关于GCC/LLVM编译器中的sanitize选项用处用法详解 编译器中sanitize选项原本来自google的开源C/C+ +工具集sanitizers项目, 包括了AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer,Sanitizers项目本是LLVM项目的一部分,但GNU也将该系列工具加入到了自家的GCC编...原创 2020-02-18 15:21:40 · 6295 阅读 · 1 评论