在基于GCC的C嵌入式系统中,我们使用-ffunction-sections和-fdata-sections选项来允许链接器在链接最终可执行文件时删除未使用(未引用)的部分。多年来,这种方法运行得很好。
在同一系统中,大多数数据结构和缓冲区都是静态分配的(通常作为文件范围内的static-variables )。
当然,我们有bug,有时很糟糕,我们希望快速排除缓冲区溢出的可能性。
我们的一个想法是在每个bss-section和data-section之间放置金丝雀-每个金丝雀只表示一个符号(因为-fdata-sections)。就像当堆栈粉碎和StackProtection被激活时,编译器对函数堆栈所做的那样。通过“不时”读取金丝雀地址,可以从主机检查这些金丝雀。
似乎修改链接器脚本(手动放置部分并在其间添加一个金丝雀单词)似乎是可行的,但它有意义吗?
有没有一个项目或一篇文章?使用我的关键字,我什么也找不到。
发布于 2020-01-29 00:14:14
金丝雀对堆栈最有用,因为它的展开和折叠超出了程序员的直接控制。你在data/bss上的东西并不是这样的。它们要么是静态变量,要么是缓冲区,它们应该保持在固定的大小内,这应该通过防御性编程与算法就地进行检查,而不是非正统的技巧。
此外,堆栈金丝雀专门用于基于RAM的、类似PC的系统中,这些系统不知道更好的方法。在嵌入式系统中,它们没有多大意义。你可以做一些有用的事情:
if(x==good) {...} else if(x == bad) {... }缺少else。而且switch(x) case A: { ... }少了一个default。“但从理论上讲,它不能去那里!”不是,但在实践中,当错误(很可能)、闪存的数据保留(100%可能)或内存上的电磁干扰影响(相当于unlikely).)导致代码失控时
https://stackoverflow.com/questions/59951505
复制相似问题