2015-07-10 22 views
0

有没有办法找出哪些匿名虚拟内存区域是由libc创建/访问的?哪些匿名区域是由libc创建/访问的?

我有一个程序,其地址空间mprotect秒VMAs。 但是当mprotect是一个将被libc访问的区域时,会发生SIGSEGV。不幸的是,我安装的信号处理程序只处理我的代码发生的错误,而不是libc。

详细地说,我得到的错误是因为printf使用可变参数。它试图访问位于va_list结构内的reg_save_area的位置。那个位置属于一个匿名的VMA,我之前有mprotect ed。

那么,有没有一个知道哪些是我以前的这些区域mprotect呢?或者至少有一种方法可以知道stdarg.h选择放置在哪里reg_save_area

最简洁的方法是处理libc中发生的SIGSEGV。 但我怀疑是否有这样的方式。

注意: libc的data/bss段可以很容易地识别,因为它不是匿名的。如果我mprotect那VMA太,它也会导致一个未处理的SIGSEGV,这就是我为什么不选择。

回答

4

对你的问题最简单的回答是:除了你自己明确映射的那些之外,他们都是。

不要做mprotect你自己没有mmap的记忆范围。图书馆甚至内核都会一直在你背后做事。他们会做自己的分配和映射。你不能改变他们,因为他们不是你的管理者。

Btw。上面我真的意思是mmap。对你从malloc或其他任何分配函数获得的内存的保护不是你自己的。如果你想完全控制你的内存映射,不要使用libc,也不要做动态链接。

+0

谢谢。好主意。但是,目前我正在尝试其他可能的工作。稍后我会提供更新! – Paschalis

+0

@Paschalis你正在做的是向你的汽车发动机发射霰弹枪,然后询问互联网在哪里瞄准,以便它不会着火。正确的答案不是告诉你在哪里瞄准,而是告诉你停止用霰弹枪射击你的发动机。 – Art

+0

是的,这正是它的样子,除非你知道我这样做的原因! ;) – Paschalis

0

最简洁的方法是处理 libc中发生的SIGSEGV。但我怀疑有这样一种方式。

其实,这是造成withing C库的代码的SIGSEGV的可以处理。我确实处理它们。 无法处理的SIGSEGV是在处理函数本身内部或者在执行VMA的函数中发生的SIGSEGV。

那么,在我对它们进行保护之前,是否有知道这些区域? 或至少有一种方法知道stdarg.h选择放置 reg_save_area?

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

PS。我不认为这是对我的问题的回答,因为它根本不回答我问的问题。它解决了我原来的问题,这就是为什么我分享它。