我想实现一个每个函数调用堆栈的金丝雀。因此,我必须使用一个(不是太小的)内存区域来放入金丝雀(检查金丝雀的堆栈值与初始金丝雀值)。我已经看到gcc的堆栈保护器使用FS内存。它只需要一个非常小的内存区域(我认为它大约有5个整数)。我还读过,FS内存用于其他操作系统目的,因此我显然需要尽量不要打扰这些目的。由于我正在实现一个每个函数调用金丝雀,我需要更大的内存(金丝雀是1个字大,我应该能够容纳至少100个金丝雀)。总的来说,我很好奇我可以安全地放置它们。
答案 0 :(得分:2)
我认为你提议修改GCC以管理另一种堆栈金丝雀(它没有一个?)。
您是否建议保持"并行" psuedo-stack到主堆栈,那个psuedo堆栈指针可以通过FS访问?使用可通过FS访问的线程本地存储实现起来非常简单。但为什么?为什么不能将堆栈canary放入为函数调用分配的堆栈中?
我构建了一个具有堆栈canaries的编译器(与GCC无关)。它在每个堆栈帧的最底部分配空间以保存金丝雀值(常量,但您可以将其作为从函数定义派生的值)。由于编译器正在生成(函数调用/退出)代码,因此在函数入口上它可以将canary常量写入堆栈帧,并且在退出时,它可以针对同一常量的立即值添加测试,对堆栈中的canary 。不需要并行堆栈,或任何特殊用途的FS或任何其他寄存器来实现堆栈金丝雀。