diff options
author | Ulrich Sibiller <uli42@gmx.de> | 2019-09-28 21:32:07 +0200 |
---|---|---|
committer | Mihai Moldovan <ionic@ionic.de> | 2019-10-10 12:45:23 +0200 |
commit | b55c66e8ab3ed004043c54101aae8935ca7471eb (patch) | |
tree | b48c475789ad717339b0bbddcb480160431c7ceb /nx-X11/programs/Xserver/hw/nxagent/Imakefile | |
parent | 57d3a42c22f7213e782f89429c1a072833f90785 (diff) | |
download | nx-libs-b55c66e8ab3ed004043c54101aae8935ca7471eb.tar.gz nx-libs-b55c66e8ab3ed004043c54101aae8935ca7471eb.tar.bz2 nx-libs-b55c66e8ab3ed004043c54101aae8935ca7471eb.zip |
nxagent/Imakefile: remove ../../exports/lib
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.
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Imakefile')
0 files changed, 0 insertions, 0 deletions