-
Notifications
You must be signed in to change notification settings - Fork 14k
Description
I'm the maintainer of Compiler Explorer, and recently (in the last 2-3 days) the nightly build of Rust has started reporting an error when I try and compile using it from within a Docker container:
root@c45dac5bb5c7:/tmp# cat > test.rs
pub fn square(num: i32) -> i32 {
num * num
}
root@c45dac5bb5c7:/tmp# strace -f -o/tmp/moo /opt/compiler-explorer/rust-nightly/bin/rustc -C debuginfo=1 -o /tmp/moose.s --emit asm test.rs --crate-type rlib
error: could not copy "/tmp/moose.test0.rcgu.s" to "/tmp/moose.s": Operation not permitted (os error 1)
error: aborting due to previous error
The same compile works just fine outside of a container. The strace call yields the problem call:
4809 stat("/tmp/moose.test0.rcgu.s", {st_mode=S_IFREG|0644, st_size=3360, ...}) = 0
4809 open("/tmp/moose.test0.rcgu.s", O_RDONLY|O_CLOEXEC) = 5
4809 open("/tmp/moose.s", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 6
4809 fstat(5, {st_mode=S_IFREG|0644, st_size=3360, ...}) = 0
4809 syscall_18446744073709551615(0x5, 0, 0x6, 0, 0xd20, 0x7f3200000000) = -1 (errno 1)
4809 close(6) = 0
4809 close(5) = 0
4809 write(2, "\33[0m\33[1m\33[38;5;9merror\33[0m\33[0m\33["..., 137) = 137
4809 write(2, "\n", 1) = 1
4809 unlink("/tmp/moose.test0.rcgu.s") = 0
It seems whatever "syscall_18446744073709551615" is, it's getting EPERM.
Cross checking from outside a docker container:
6206 open("/tmp/moose.s", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 6
6206 fstat(5, {st_mode=S_IFREG|0664, st_size=3360, ...}) = 0
6206 syscall_326(0x5, 0, 0x6, 0, 0xd20, 0x7f3f00000000) = -1 (errno 38)
6206 read(5, "\t.text\n\t.file\t\"test0-8787f43e282"..., 8192) = 3360
6206 write(6, "\t.text\n\t.file\t\"test0-8787f43e282"..., 3360) = 3360
6206 read(5, "", 8192) = 0
6206 chmod("/tmp/moose.s", 0100664) = 0
6206 close(6) = 0
6206 close(5) = 0
6206 unlink("/tmp/moose.test0.rcgu.s") = 0
in this case things succeed (although the syscall_326, whatever that is still fails, but with ENOSYS).
Can anyone shed any light on this as this is outside of my experience! As I say, it only happens on the nightly build, and it has started happening in the last day or two (e.g. sometime around 29th May 2018).
I wonder if some new (unsupported on Ubuntu 16) libc function is being called, and in the docker environment EPERM is returned instead of ENOSYS, which confuses some bailout code in rustc?
Thanks in advance, Matt
(See also compiler-explorer/compiler-explorer#942 )