
编译
文章平均质量分 93
流左沙
越努力,越幸运
展开
-
LLVM 新一代 JIT API:ORC
最近看到 ORC(On Request Compilation) 在增加 MachO 平台的 OC 和 Swift 语言支持,这是 MachO JIT(Just In Time) 相关的进展。本文将探索这个 LLVM 新一代的 JIT APIs,即 ORC,其 ORC JIT Weekly 现在还一直处于更新状态。1、JIT 解释以防语境不一致,解释下 JIT(Just In Time) 这个术语。Whenever a program, while running, creates and ru原创 2021-10-07 14:56:25 · 1931 阅读 · 0 评论 -
代码分析属性图 CPG 介绍
代码分析工具层出不穷,编译器本身也内置了大量的静态检查,但分析的数据源较为单一。而本文要介绍的,是集众之所长的代码分析属性图 CPG,在漏洞分析上很有帮助。1、定义代码属性图(code property graph,简称 CPG) 是一种数据结构,用来通过 DSL(domain-specific language) 查询语句来挖掘代码漏洞。它的主要思想如下:CPG 将多个程序表示(program representations)整合成一个 CPG 数据被存储在图数据库中 通过 DSL 在原创 2021-08-01 11:49:04 · 3810 阅读 · 1 评论 -
【译】LLVM 类型相等判断
在 LLVM 的类型系统中,进行两个类型是否等价的判断,对于做代码分析而言是很重要的,本文将介绍遇到的难题以及解决的方法。内容来源:https://lowlevelbits.org/type-equality-in-llvm/原文标题:TYPE EQUALITY IN LLVM作者:AlexDenisov译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。1、LLVM 类型系统的简述关于 LLVM 类型系统的背景,可以看我之前写的一翻译 2021-07-24 18:13:00 · 529 阅读 · 0 评论 -
代码 bug 嗅探器:Sanitizer
代码 bug 总在不经意间出现,导演了一出出 crash 的悲剧。为了扼杀 bug 于襁褓之中,本文介绍的主角 Sanitize 挺身而出,致力于解决内存泄露、缓冲区溢出和未定义行为。本文将从原理来探索 Sanitize 的相关能力实现,介绍 ASan、MSan、UBSan、TSan,而关于如何使用,在官方教程都有,不会过多介绍。AddressSanitizer (ASan)ASan 是用来检测释放后使用(use-after-free)、多次释放(double-free)、缓冲区溢出(buff.原创 2021-07-17 12:54:42 · 803 阅读 · 1 评论 -
跨语言调 C 库:DragonFFI
跨语言调用是很方便实用的操作,但其实现并非想象的那么简单,包含有复杂的 ABI 设计、语言间的兼容交互等,本文将介绍一个跨语言调 C 库:DragonFFI。1、定义在官方 github 仓库中就有相关的说明,DragonFFI是 C 语言的 FFI(Foreign Function Interface,外部函数接口)库,使用 C++ 编写,基于 clang/llvm 来实现。跨语言调用 C ,一般有通过手写胶水代码的(JNI,Python,Ruby)、生成胶水代码的(SWIG)、扩展 C 的.原创 2021-07-10 11:13:21 · 408 阅读 · 0 评论 -
【译】LLVM 类型系统
LLVM IR(intermediate representation) 的类型系统,在 LLVM 3.0 的时候被重写了,本文将介绍其原因,以及新类型系统如何运作。内容来源:http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html原文标题:LLVM 3.0 Type System Rewrite作者:Chris Lattner译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为翻译 2021-07-03 12:44:27 · 385 阅读 · 0 评论 -
【译】LLVM 的设计
LLVM 是开源的编译工具链项目,用 C++ 编写,包含一系列模块化的编译器组件和工具链,用于开发编译器前端和后端。内容来源:https://aosabook.org/en/llvm.html原文标题:LLVM作者:Chris Lattner译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。Classical Compiler DesignImplications of this DesignThe most import翻译 2021-06-14 15:41:30 · 390 阅读 · 0 评论 -
【译】CMake 构建工具
CMake 是开源的跨平台的构建工具,在开发社区非常的出名,以及各种项目都有用到,本文来了解下 CMake 为何厉害。内容来源:https://aosabook.org/en/cmake.html原文标题:CMake作者:Bill Hoffman && Kenneth Martin译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。In addition to a build system, over the years翻译 2021-06-13 14:32:09 · 297 阅读 · 0 评论 -
【译】Ninja 构建系统
Ninja 是设计目标为速度快而生的构建系统,通过官方的博客,本文来深入了解下 Ninja 为何而快。内容来源:https://aosabook.org/en/posa/ninja.html原文标题:Ninja作者:Evan Martin译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。As input you describe the commands necessary to process source files intot.翻译 2021-06-13 14:26:08 · 378 阅读 · 0 评论 -
【译】编译构建的确定性分析
这是一篇对编译构建的确定性分析的文章,偏理论性的,对编译构建的确定性进行了很好地分类。内容来源:https://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html原文标题:Deterministic builds with clang and lld作者:Nico Weber译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。definitionA b翻译 2021-06-12 13:33:53 · 249 阅读 · 0 评论 -
C++ 是如何处理函数符号查找?
在 C++ 的日常开发中,经常会遇到函数冲突或者找不到匹配的函数的问题,如果不了解编译器处理函数符号查找的行为,就很难去解决这些问题。【参考 How C++ Resolves a Function Call -https://preshing.com/20210315/how-cpp-resolves-a-function-call/】1、函数符号查找难点C 语言的函数调用很简单,每个函数都有唯一的名字。但 C++ 就复杂得多了,因为其有:函数重载 (overloading) 运算符.原创 2021-06-05 18:02:32 · 739 阅读 · 0 评论 -
堆内存优化之动态栈分配
前言在堆上分配内存的操作开销很大,对性能影响会比较明显。本文探索的就是对于堆内存优化的一种技术,动态栈分配(dynamic stack allocations),中心思想就是把在堆上申请内存的操作分配到栈上来完成。主要参考文章在文末链接处附上了,一些翻译可能不太准确的术语可以直接看原文进行理解。堆 & 栈在探索动态栈分配之前,先简单描述一下基本知识 —— 堆和栈 的概念。堆堆内存在运行时创建,没有固定的地址或大小,一般需要由开发者自行申请分配和释放。在 Linux 和 Posix 上原创 2021-04-03 14:42:27 · 980 阅读 · 0 评论 -
Translation units & module 术语解释
Translation unitsA program consists of one or more translation units. A translation unit consists of an implementation file and all the headers that it includes directly or indirectly. Implementation files typically have a file extension of cpp&原创 2021-02-06 15:38:12 · 443 阅读 · 2 评论