Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Wed, 27 Aug 2014 16:14:07 +0200
From: "piranna@...il.com" <piranna@...il.com>
To: musl@...ts.openwall.com
Subject: static build and dlopen

I have read that when an executable is compiled fully statically
linked with musl, a stub dlopen() is used instead of the real function
(http://www.openwall.com/lists/musl/2012/12/09/19), and seems it's
done in purpose since normally if you compile an executable as
statically linked is because you don't want to load dynamica libraries
(http://openwall.com/lists/musl/2012/12/08/4), but I've achieved an
use case where I need to do both things.

I'm working with others as a hobby on NodeOS (http://node-os.com/), an
operating system where Node.js is running on top of a naked Linux
kernel. To be able to use Node.js from the begging (as the '/init'
executable) it needs to be compiled as a fully statically linked
executable, and except for the OpenSSL support, so far so good thanks
to musl I was able to do it and worked as a charm :-)

Problem came when trying to use a Node.js compiled module ('.node'
files) so /init could be able to capture zombie processes
(https://github.com/piranna/node-century), since it was throwing an
error:


module.js:355
  Module._extensions[extension](this, filename);
                               ^
Error: Module did not self-register.
    at Error (native)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object.<anonymous> (/tmp/ROOT/lib/node_modules/century/demo.js:3:15)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)


Since I had installed in my machine the same version of Node.js that I
compiled statically with musl (an Ubuntu package one, compiled
dynamically with glibc) and it worked, digging down I get to the point
that the problem was on the Node.js module loader
(https://github.com/joyent/node/blob/master/lib/module.js#L355), and
looking for the error message
(https://github.com/joyent/node/blob/master/src/node.cc#L2092), I
found it was the Node.js DLOpen() function
(https://github.com/joyent/node/blob/master/src/node.cc#L2056), that
thought libuv is calling to the system dlopen() function, it's said,
the musl stub for static builds, making it impossible to load the
Node.js compiled modules :-(

So I ask, does the dlopen() stub really makes sense (the linker is
intelligent enought to remove unused code on static builds...)? Is
there any alternative I can do? Is there a flag to allow to use the
real dlopen() function on static builds, or could it be possible to
add it? If not, could I be able to use an external dlopen library (and
could I be able to integrate it easily)?

Oh, and if you are thinking about it: yes, this is a farily similar
use case as when compiling OS kernels (at least hybrid ones, like
Linux) where you need to compile them statically so it can boot and
also has support to load compiled modules on runtime, since in this
case, Node.js is in fact the "kernel" and Linux is just a somewhat HAL
layer :-P



-- 
"Si quieres viajar alrededor del mundo y ser invitado a hablar en un
monton de sitios diferentes, simplemente escribe un sistema operativo
Unix."
– Linus Tordvals, creador del sistema operativo Linux

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.