20.04 中的 mmap() 发生了什么?

20.04 中的 mmap() 发生了什么?

我有一个程序在 /dev/zero 上调用 mmap() 来创建一些新的私有页面。如果我使用 PROT_READ|PROT_WRITE,它工作正常,但如果我使用 PROT_EXEC 而不是 write,它总是会出现操作不允许 (errno 1)。这一直有效,它在 Fedora 中甚至在较新的内核版本上也能工作,但在使用内核 5.4.0-26-generic (x86_64) 的 ubuntu 20.04 中总是会出现错误。

由于动态加载器仍然有效,因此必须有某种方法来 mmap 读取/执行页面。

有人知道我需要做什么神奇的新事才能让地图再次发挥作用吗?

答案1

找到了!在 ubuntu 20.04 中,/dev 文件系统使用 noexec 标志挂载,并且 mmap 拒绝从 noexec 文件系统映射页面执行。幸运的是,MAP_ANONYMOUS 确实有效,所以我可以使用它(使用一些逻辑来检测有效的匿名映射,因为这个程序在无数不同的发行版和旧内核上运行)。

相关内容