Package: fakechroot
Version: 2.5-1
Severity: normal

A package using libtool to build shared libraries, and then run them
in-tree, ends up having two executables and a helper script... one of
the executables is .libs/lt-foo and it has a run-time-link-path encoded into
it (objdump -p, look for RPATH under "Dynamic Section:") that gives an
absolute path to the the build tree, so it can find the just-built
libraries (instead of looking for not-yet-installed ones.)

That works fine normally... but under fakechroot
  * the path is an "internal" path, ie. relative to $FAKECHROOT_BASE
  * /lib/ld-linux.so is not fakeroot-aware
  * /lib/ld-linux.so is loaded first (it *is* the dynamic linker,
    after all), so inherently can't have symbols overridden via LD_PRELOAD.

The *big* problem here is that if you have an older version of the
package installed on the "outside" system,
  * the libraries aren't found in the RPATH location, because it
    doesn't exist
  * the libraries are then found in the *outside* /usr/lib

(In my case, I found it because on one system (with a mostly current
outside version of the package), everything worked fine, and on
another system (with a stale outside version) shared lib
incompatiblities led to segfaults... which was actually *better*
because it exposed the problem :-)

A full solution could involve having the execve() wrapper notice that
an object is ELF, then that its interpreter is /lib/ld-linux.so, and
run an alternate fakechroot-aware version (giving a slightly different
path for the invocation of some executables, I'm not sure of the
subtleties here, but manual tests seem to work.)

A decent shortcut (which I'm using myself) is to have the execve()
wrapper check as above, but then also check for RPATH, and if one is
found, "unfake" it and stuff it into the start of LD_LIBRARY_PATH.
This has a bug -- if the raw RPATH value actually corresponds to an
existing outside directory, the libs will be taken from that outside
directory.  In practice, using this under pbuilder gets somewhat
unique directories, which is sufficient for some uses.

(Note that this exposes a secondary bug - all dynamic executables
[which in practice is everything] inside the fake chroot end up
running the *outside* /lib/ld-linux.so... which could matter if you
had a significantly different inside vs. outside linux.)


-- System Information:
Debian Release: 3.1
Architecture: i386 (i686)
Kernel: Linux 2.6.15-mc2
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)

Versions of packages fakechroot depends on:
ii  libc6                 2.3.2.ds1-22sarge5 GNU C Library: Shared libraries an

-- debconf-show failed


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to