Opened 9 years ago

Closed 7 years ago

#1218 closed defect (fixed)

chicken-install may fail if TMPDIR is mounted noexec (depending on setup-file details)

Reported by: Ivan Raikov Owned by:
Priority: major Milestone: 5.0
Component: extensions Version: 4.10.x
Keywords: coops Cc:
Estimated difficulty: hard

Description

chicken-install coops results in the following error:

installing coops:1.93 ...
changing current directory to /tmp/temp4661.6142/coops

'/home/igr/bin/chicken/bin/csi' -bnq -setup-mode -e "(require-library setup-api)" -e "(import setup-api)" -e "(setup-error-handling)" -e "(extension-name-and-version '(\"coops\" \"1.93\"))" 'coops.setup'
'/home/igr/bin/chicken/bin/csc' -feature compiling-extension -setup-mode -s -O3 -d1 coops-module.scm -JS -o coops.so
'/home/igr/bin/chicken/bin/csc' -feature compiling-extension -setup-mode -s -O3 -d0 coops.import.scm
'/home/igr/bin/chicken/bin/csc' -feature compiling-extension -setup-mode -s -O3 -d1 coops-primitive-objects -JS

Error: (load) during expansion of (import ...) - unable to load compiled module - ./coops.import.so: failed to map segment from shared object: Operation not permitted: "./coops.import.so"

Change History (13)

comment:1 Changed 9 years ago by evhan

Unable to replicate on Linux or OpenBSD. On what platform did this occur?

comment:2 in reply to:  1 Changed 9 years ago by Ivan Raikov

Ubuntu Linux 14.04 / gcc 4.8.4

Replying to evhan:

Unable to replicate on Linux or OpenBSD. On what platform did this occur?

comment:3 in reply to:  1 Changed 9 years ago by Ivan Raikov

One more thing, did you try a fresh CHICKEN installation, or did you already have coops installed?

Replying to evhan:

Unable to replicate on Linux or OpenBSD. On what platform did this occur?

comment:4 Changed 9 years ago by sjamaan

This sounds like a noexec mount of /tmp.

I don't know whether that's fixable (I don't know much about coops and its installation procedure), but this causes trouble with several other eggs, IIRC. So perhaps it's not really a coops bug (though one could argue it's a bug in chicken-install, if a very difficult one to fix)

comment:5 in reply to:  4 Changed 9 years ago by Ivan Raikov

True, /tmp is mounted noexec on this system. I remember now that I ran into this issue with an unrelated piece of software a few weeks ago.

I was able to find a workaround by changing the first line in coops.setup

(compile -s -O3 -d1 coops-module.scm -JS -o coops.so)

to

(compile -s -O3 -d1 coops.scm -JS)

And switching around the files coops-module.scm and coops.scm so that now coops.scm includes coops-module.scm.

Is it the -o option to chicken-install that does not work with noexec-mounted /tmp? If so, I will re-title this issue accordingly.

Replying to sjamaan:

This sounds like a noexec mount of /tmp.

I don't know whether that's fixable (I don't know much about coops and its installation procedure), but this causes trouble with several other eggs, IIRC. So perhaps it's not really a coops bug (though one could argue it's a bug in chicken-install, if a very difficult one to fix)

comment:6 Changed 9 years ago by sjamaan

I tried to reproduce what you said you did to the files, but I keep getting the same error message.

However, it worked if I simply moved the import files to the end (even with the orignal versions of coops.scm and coops-module.scm), so they're compiled after all the other files. That's because the (import foo) statements will then fall back to simply loading the source files instead. This may be a good "solution" for coops and similar eggs (perhaps 90% of our eggs, in fact), but it won't work in the general case:

If you have an egg consisting of two modules, let's say module A and B, where A depends on B at compile-time (perhaps B offers some important macros), it must be able to load it. If module B contains FFI calls, it must be compiled.

Of course this is a pretty contrived example: most eggs are not this complicated. So I guess this "bug" should be considered to be in coops after all.

comment:7 Changed 9 years ago by sjamaan

Summary: Cannot install coops with CHICKEN 4.10chicken-install may fail if TMPDIR is mounted noexec (depending on setup-file details)

comment:8 Changed 9 years ago by sjamaan

Milestone: 4.11.05.0

I'd say this is a setup-file problem specific to the egg. We may be able to fix this in a general way with the new setup file language in CHICKEN 5, but I doubt it; it's a fundamental problem that you can't load a library at compile time that you've just generated but not yet installed.

In any case, not something that we can fix with CHICKEN 4.

comment:9 Changed 8 years ago by sjamaan

Estimated difficulty: hard

comment:10 Changed 8 years ago by sjamaan

The new setup language cleanly separates build from install, which means the problem still exists.

I think the clean separation is desirable because you want to be able to build separately, and also because if the building of coops works and is installed, but coops-primitive-objects fails, this means the egg would be half-installed.

I don't know if it's even something we can fix (or even should fix?). Perhaps it should be documented as a limitation. I think even detecting this situation is difficult.

comment:11 Changed 8 years ago by felix winkelmann

Note that in C5, building of eggs takes place in the cache (usually ~/.chicken-install-cache, or $CHICKEN_EGG_CACHE), so $TMPDIR is irrelevant in this case.

comment:12 in reply to:  11 Changed 8 years ago by Ivan Raikov

Oh, it does sound like this might make the issue irrelevant. Apologies for not trying out C5 earlier. Let me just build it and see if I can install eggs with it.

Replying to felix:

Note that in C5, building of eggs takes place in the cache (usually ~/.chicken-install-cache, or $CHICKEN_EGG_CACHE), so $TMPDIR is irrelevant in this case.

comment:13 Changed 7 years ago by sjamaan

Resolution: fixed
Status: newclosed

Should work with C5. Please reopen if it's not working

Note: See TracTickets for help on using tickets.