smlnj交互系统:致命错误

时间:2014-05-15 21:29:49

标签: sml smlnj google-chrome-os crouton-os

apt-get install smlnj后我的Chromebook上的Crouton chroot发生了一个奇怪的错误,并尝试从终端拨打sml,这是我在其他任何地方都找不到的错误:< / p>

$ 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

任何指导?

1 个答案:

答案 0 :(得分:4)

编辑:通过启用以前在Linux中不支持的MAP_ANONYMOUS,在SML / NJ版本110.77(release notes)中修复了此问题(错误#120)。安装最新版本的SMLNJ将优于下面的解决方案,因为它不需要削弱系统的安全性。如果您通过修改/dev的权限继续,则建议您在每次会话后删除exec权限。


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

strace上运行sml会在错误输出之前执行此(尝试)操作:

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]
-