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