【发布时间】:2015-07-10 12:21:07
【问题描述】:
有没有办法找出 libc 创建/访问了哪些匿名虚拟内存区域?
我有一个程序在其地址空间上mprotects VMA。
但是当它mprotects 一个将被 libc 访问的区域时,就会发生 SIGSEGV。不幸的是,我安装的信号处理程序只处理发生在我的代码上的错误,而不是 libc 的。
详细地说,我得到的错误是因为printf 使用可变参数。它尝试访问位于va_list 结构中的reg_save_area 的位置。该位置属于我之前拥有的匿名 VMA mprotected。
那么,在我mprotect 之前,有没有人知道这些区域是什么?或者至少有一种方法可以知道stdarg.h 选择放置reg_save_area 的位置?
最干净的方法是处理出现在 libc 中的 SIGSEGV。 但我怀疑是否有这种方法。
注意: libc 的 data/bss 段很容易识别,因为它不是匿名的。如果我也mprotect那个VMA,它也会导致一个未处理的SIGSEGV,这就是我选择不这样做的原因。
【问题讨论】:
标签: c segmentation-fault signal-handling mprotect