我一直在玩一种技术来透明地对内存映射数据进行数据转换。这个想法基本上是为了存储映射一个所需的文件,并创建一个读/写受保护的第二个匿名区域。当用户访问匿名区域时,将捕获生成的段错误,转换数据并更改权限以允许继续访问。
效果很好,但有一个小问题。在没有先将数据传递给系统调用(如write())的情况下传递指针不会触发segfault处理程序,而是只返回EFAULT,因为未调用处理程序来修复权限。有没有办法让系统调用在出现问题时使用用户空间处理程序?
答案 0 :(得分:3)
当缓冲区出错时,没有办法让write
之类的系统调用成为SIGSEGV
。返回EFAULT
是write(2)
系统调用的语义的一部分。
如果仅关注LD_PRELOAD
,您可以执行libc.so
件事;您也可以使用ptrace
来捕获系统调用àlastrace
。
另请参阅this answer与您的非常相似的问题。