4

apt-get install smlnj在尝试从终端调用之后,我的 Chromebook 上的 Crouton chroot 出现一个奇怪sml的错误,这是我无法在其他任何地方找到的错误:

$ sml
/usr/lib/smlnj/bin/sml: Error -- unable to map 1179648 bytes, errno = 1
/usr/lib/smlnj/bin/sml: Fatal error -- unable to allocate memory object for BIBOP

有什么指导吗?

4

1 回答 1

4

编辑:这个问题(bug #120)在 SML/NJ 版本 110.77(发行说明)中通过启用 MAP_ANONYMOUS 得到修复,这在 Linux 之前是不支持的。安装最新版本的 SMLNJ 会比下面的解决方案更可取,因为它不需要削弱系统的安全性。如果您确实通过修改 的权限继续/dev,建议exec在每次会话后删除权限。


此问题主要在运行 ChrUbuntu 或 Crouton 的 Chromium OS 环境中重现,但可能会发生在其他环境中遇到类似问题的其他用户身上。

Running straceonsml在错误输出之前给出了这个(尝试的)操作:

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]
- 
于 2014-07-28T16:07:41.903 回答