<div dir="ltr">I have a bit more information about this. In particular: I'm able to reproduce this using chroot (no Docker required), and it's reproducing with a dynamically linked executable too. Steps I used to reproduce:<br><div><br></div><div>1. Write a minimal "foo.hs" containing `main = putStrLn "Hello World"`</div><div>2. Compile that executable and put it in an empty directory</div><div>3. Run `ldd` on it and copy all necessary libraries inside that directory</div><div>4. Run `sudo strace -o log.txt . /foo`</div><div><br></div><div>I've uploaded the logs to:</div><div><br></div><div><a href="https://gist.github.com/snoyberg/095efb17e36acc1d6360">https://gist.github.com/snoyberg/095efb17e36acc1d6360</a><br></div><div><br></div><div>Note that, due to size of the output, I killed the process just a few seconds after starting it, but when I let the output run much longer, I didn't see any difference in the results. I'll continue poking at this a bit, but most likely I'll open a GHC Trac ticket about it later today.</div></div><br><div class="gmail_quote">On Tue, Apr 14, 2015 at 12:39 AM Albert Y. C. Lai <<a href="mailto:trebla@vex.net">trebla@vex.net</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I wonder whether you already know the following, and whether it is<br>
relevant to begin with. (Plus, my knowledge is fairly sketchy.)<br>
<br>
Even though you statically link glibc, its code will, at run time,<br>
dlopen a certain part of glibc.<br>
<br>
Why: To provide a really uniform abstraction layer over user account<br>
queries, e.g., man 3 getpwnam, regardless of whether the accounts are<br>
from /etc/passwd, LDAP, or whatever.<br>
<br>
Therefore, during run time, glibc first reads some config files of the<br>
host to see what kind of user account database the host uses. If it's<br>
/etc/passwd, then dlopen the implementation of getpwnam and friends for<br>
/etc/passwd; else, if it's LDAP, then dlopen the implementation of<br>
getpwnam and friends for LDAP; etc etc.<br>
<br>
So that later when you call getpwnam, it will happen to "do the right<br>
thing".<br>
<br>
This demands the required *.so files to be accessible during run time.<br>
Moreoever, if you statically link glibc, this also demands the required<br>
*.so files to version-match the glibc you statically link.<br>
<br>
(It is the main reason why most people give up on statically linking glibc.)<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div>