libc created/accessed 哪些匿名区域?

Which anonymous areas are created/accessed by libc?

有没有办法找出 libc created/accessed 哪些匿名虚拟内存区域?

我有一个程序,在其地址 space 上 mprotects VMA。 但是当它 mprotects 是一个将被 libc 访问的区域时,就会发生 SIGSEGV。不幸的是,我安装的信号处理程序只能处理我的代码中发生的错误,而不是 libc 的错误。

详细来说,我遇到的错误是因为 printf 使用了可变参数。它试图访问 va_list 结构中 reg_save_area 的位置。该位置属于我之前 mprotected.

的匿名 VMA

那么,在我 mprotect 它们之前,是否可以知道这些区域是哪些?或者至少是一种知道 stdarg.h 选择放置 reg_save_area?

的方法

最简洁的方法是处理 libc 中出现的 SIGSEGV。 但我怀疑是否有这种方法。

注:libc的data/bss段由于不是匿名的,所以很容易识别。如果我也 mprotect 那个 VMA,它也会导致未处理的 SIGSEGV,这就是我选择不这样做的原因。

对您的问题最简单的回答是:除了您自己明确映射的那些之外的所有这些。

不要做 mprotect 你自己没有 mmap 的记忆范围。库,甚至可能是内核,都会一直在背后做一些事情。他们将进行自己的分配和映射。您不能更改它们,因为它们不是您可以管理的。

顺便说一句。我确实是指上面的 mmap。您从 malloc 或任何其他分配函数获得的内存保护也不属于您。如果你想完全控制你的内存映射,不要使用 libc,也不要做动态链接。

The most clean way would be to handle SIGSEGV's that occur within the libc. But I doubt that there is such a way.

实际上,可以处理由 C 库代码引起的 SIGSEGV。我确实会处理它们。 无法处理的 SIGSEGV 是发生在处理程序函数本身或正在执行 VMA mprotection 的函数中的那些。

So, is there a to know which are these areas before I mprotect them? Or at least a way to know where stdarg.h chooses to place reg_save_area?

除了@Art 的建议外,没有办法知道哪些区域是由 libc 创建的,但我的问题的解决方案是跳过对处理程序本身或函数正在使用的页面的保护那就是建立整个保护机制。

PS。我不认为这是对我问题的回答,因为它根本没有回答我提出的问题。不过它解决了我最初的问题,这就是我分享它的原因。