交叉编译踩坑
本文假定所使用的是 Debian 系的系统,且使用 apt 作为包管理器。对于其他的系统/其他的包管理器,可能需要做相应的调整。
Always remember: Google is your best friend!
1. 交叉编译的基本概念
通常我们写的程序是在本机上编译运行的,这样的程序称为本地程序。而在开发嵌入式系统,或者运行平台和本地不一致的时,我们需要将程序编译成目标平台上可以运行的程序,这样的程序称为交叉编译程序。
一般来说,编译器识别平台所用的是一个三元组,即 arch-vendor-os,例如我们通常的 x86,我们可以使用 clang -v 来查看
123456789$ clang -vDebian clang version 14.0.6Target: x86_64-pc-linux-gnuThread model: posixInstalledDir: /usr/binFound candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12Selected GCC installati ...
给 clang 扩展语法
给 clang 扩展语法
由于最近所做的项目需要对 C 语言进行一些扩展,而项目中使用的编译器为 clang,因此需要对 clang 进行一些修改,以支持新的语法。本文将介绍如何给 clang 添加新的语法。
需要增加的实际是一个 pragma 的注释,用于指定一个循环的原始(即未经优化的)次数,其语法如下:
1234#pragma loopbound min 10 max 10 // 或者 _Pragma("loopbound min 10 max 10")for (int i = 0; i < 10; i++) { // do something}
这里的 min 和 max 分别表示循环的最小次数和最大次数,我们要做的是提取这个信息,并将其插入到 IR 中,在后续的解析中,我们可以根据这个信息进行一些优化。
实现
Note: clang 的编译器实现是相对好阅读的,如果你对编译原理的一些基础知识有所了解,而你又对编译器的实现感兴趣,那么阅读 clang 的源码是一个不错的选择,本文不会对 clang 的源码进行详绵的解释,而是 ...
论文阅读笔记-GiantSan: Efficient Memory Sanitization with Segment Folding
文章发表于 ASPLOS’24,
相关背景
内存安全是程序安全的基础,为了能够方便的检测内存出错,通常我们会使用内存检测工具,例如 AddressSanitizer(ASAN),但是此类工具存在一个问题,其为了能够检测内存出错,会在进行访存等内存操作时,进行运行时检测,这样会导致程序的性能下降,因此,如何在尽可能小的影响程序性能的情况下,进行内存检测就成为了一个重要的问题。
本文的工作
基于 ASan 的原理,对其进行了改进,提出了 GiantSan,其主要的改进点在于,将连续的内存块进行合并,从而减少了运行时内存检测的开销,并对内存检测结果进行了缓存,使其能够在后续的访存中,直接从缓存中读取结果,从而减少了运行时的开销。通过和 ASan 以及 ASan-- 的对比,证明了 GiantSan 在性能上的优势。
ASan 的原理
在开始介绍 GiantSan 之前,我们先来了解下 ASan 的原理,正如前文所说,ASan 是一种内存检测工具,其工作涉及到编译时以及运行时两个阶段。
编译时主要的工作是在栈对象以及全局对象前后插入一些特殊的内存区域,称之为 poisoned redzon ...