编辑:这个问题(bug #120)在 SML/NJ 版本 110.77(发行说明)中通过启用 MAP_ANONYMOUS 得到修复,这在 Linux 之前是不支持的。安装最新版本的 SMLNJ 会比下面的解决方案更可取,因为它不需要削弱系统的安全性。如果您确实通过修改 的权限继续/dev
,建议exec
在每次会话后删除权限。
此问题主要在运行 ChrUbuntu 或 Crouton 的 Chromium OS 环境中重现,但可能会发生在其他环境中遇到类似问题的其他用户身上。
Running strace
onsml
在错误输出之前给出了这个(尝试的)操作:
open("/dev/zero", O_RDONLY) = 4
mmap2(NULL, 1245184, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 4, 0) = -1 EPERM (Operation not permitted)
根据mmap(2)文档,EPERM
表示系统正在尝试在标记为 的目录中分配具有执行权限的内存noexec
。
确实,mount
给出:
...
devtmpfs on /dev type devtmpfs (rw,nosuid,noexec,relatime,size=960456k,nr_inodes=240114,mode=755)
...
/dev
因此,解决方案是在获得exec
许可的情况下重新安装:
$ sudo mount -o remount,exec /dev
$ sml
Standard ML of New Jersey v110.75 [built: Thu May 9 05:41:01 2013]
-