交叉编译踩坑
本文假定所使用的是 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 ...
论文阅读笔记-GiantSan: Efficient Memory Sanitization with Segment Folding
文章发表于 ASPLOS’24,
相关背景
内存安全是程序安全的基础,为了能够方便的检测内存出错,通常我们会使用内存检测工具,例如 AddressSanitizer(ASAN),但是此类工具存在一个问题,其为了能够检测内存出错,会在进行访存等内存操作时,进行运行时检测,这样会导致程序的性能下降,因此,如何在尽可能小的影响程序性能的情况下,进行内存检测就成为了一个重要的问题。
本文的工作
基于 ASan 的原理,对其进行了改进,提出了 GiantSan,其主要的改进点在于,将连续的内存块进行合并,从而减少了运行时内存检测的开销,并对内存检测结果进行了缓存,使其能够在后续的访存中,直接从缓存中读取结果,从而减少了运行时的开销。通过和 ASan 以及 ASan-- 的对比,证明了 GiantSan 在性能上的优势。
ASan 的原理
在开始介绍 GiantSan 之前,我们先来了解下 ASan 的原理,正如前文所说,ASan 是一种内存检测工具,其工作涉及到编译时以及运行时两个阶段。
编译时主要的工作是在栈对象以及全局对象前后插入一些特殊的内存区域,称之为 poisoned redzon ...