• Ulrich Sibiller's avatar
    nxagent/Imakefile: remove ../../exports/lib · b55c66e8
    Ulrich Sibiller authored
    nxagent links system libraries that link against libX11. Unfortunately,
    nxagent (and libXcompshad) require a modified libX11 version,
    nicknamed libNX_X11, for proper functioning. Fortunately, this one can
    act as a drop-in replacement for the system libX11. So we’ll hack our
    way out: add a DT_NEEDED entry for libX11 by linking against the
    system library when building nxagent and link the other system
    libraries later and set DT_RUNPATH to a special directory containing
    symlinks from libNX_X11 to libX11.
    
    This tricks the loader into pulling in the "fake" libX11 version
    without checking its SONAME and thus satisfying the DT_NEEDED entry
    early on - specifically also for the system libraries.
    
    Ex.:
    readelf -a /usr/bin/nxagent | grep NEEDED
     0x0000000000000001 (NEEDED)             Shared library: [libX11.so.6]
    ...
     0x0000000000000001 (NEEDED)             Shared library: [libNX_X11.so.6]
    ...
    
    If, however, you run the build a second time, it will find the newly
    created libX11 links in ../../exports/lib (used as an additional
    library search path) instead of the system libX11. The results in a
    binary looking like this:
    
     0x0000000000000001 (NEEDED)             Shared library: [libNX_X11.so.6]
    ...
    
    With such a setup, the whole magic falls apart and system libraries
    will suddenly pull in the actual system libX11 file.
    
    We initially believed a compiler call such as:
    
    ${CC} [--unrelated-options ...] [-Lunrelated_library_path ...] -lX11 [more
           options like -l and -L] -L../../exports/lib -lother_libraries
    
    to do "the right thing" and link against the system libX11 (or, at
    worst, a libX11 found in the library directory search list preceding the
    link call) and use ../../exports/lib only for later linking operations,
    since the order of options matters.
    
    However, this turned out to be blatantly wrong: while the order of -L
    arguments does matter for building the search path, the whole search
    path including elements from *ALL* -L arguments (and the system paths)
    will always be used when linking libraries.
    
    Hence, (counter-intuitively to us) both these calls will be equivalent:
    
    ${CC} [--unrelated-options ...] -la -Loverride_liba -lb
          [-Lunrelated_library_path ...] -lc
    
    ${CC} [--unrelated-options ...] -Loverride_liba [-Lunrelated_library_path
           ...] -la -lb -lc
    
    By removing LDPRELIBS from NXAGENTSYSLIBS, ../../exports/lib is no
    longer used during building/linking and the binaries are built
    reproducibly. We never intended to use this directory at link time
    anyway.
    b55c66e8
Name
Last commit
Last update
debian Loading commit data...
doc Loading commit data...
etc Loading commit data...
m4 Loading commit data...
nx-X11 Loading commit data...
nxcomp Loading commit data...
nxcompshad Loading commit data...
nxdialog Loading commit data...
nxproxy Loading commit data...
testscripts Loading commit data...
.gitignore Loading commit data...
.travis.yml Loading commit data...
COPYING Loading commit data...
ChangeLog Loading commit data...
LICENSE Loading commit data...
LICENSE.nxcomp Loading commit data...
Makefile Loading commit data...
README.NX-development Loading commit data...
README.md Loading commit data...
VERSION Loading commit data...
fix-patch-whitespace Loading commit data...
make-changelog.sh Loading commit data...
mesa-quilt Loading commit data...
nx-libs.spec Loading commit data...
regenerate-symbol-docs.sh Loading commit data...
replace.sh Loading commit data...
roll-tarballs.sh Loading commit data...
run-static-analysis.sh Loading commit data...
static-analysis-suppressions Loading commit data...
version.sh Loading commit data...