0

In the project I'm building from source (Nix 2.3 FWIW), one shared library (libnixstore.so) is being linked with another shared library (libnixutil.so). The command line for this is:

x86_64-slackware-linux-g++ -std=c++17 -o /d/tmp/SBo/nix-2.3/src/libstore/libnixstore.so -shared -L/usr/lib64 -Wl,--no-copy-dt-needed-entries src/libstore/binary-cache-store.o src/libstore/build.o src/libstore/builtins/buildenv.o src/libstore/builtins/fetchurl.o src/libstore/crypto.o src/libstore/derivations.o src/libstore/download.o src/libstore/export-import.o src/libstore/gc.o src/libstore/globals.o src/libstore/http-binary-cache-store.o src/libstore/legacy-ssh-store.o src/libstore/local-binary-cache-store.o src/libstore/local-fs-store.o src/libstore/local-store.o src/libstore/machines.o src/libstore/misc.o src/libstore/nar-accessor.o src/libstore/nar-info-disk-cache.o src/libstore/nar-info.o src/libstore/optimise-store.o src/libstore/parsed-derivations.o src/libstore/pathlocks.o src/libstore/profiles.o src/libstore/references.o src/libstore/remote-fs-accessor.o src/libstore/remote-store.o src/libstore/s3-binary-cache-store.o src/libstore/sqlite.o src/libstore/ssh-store.o src/libstore/ssh.o src/libstore/store-api.o -lsqlite3 -ldl -lbz2 -lcurl  -pthread -ldl -lseccomp -Wl,-z,defs -Wl,-soname=libnixstore.so    -Wl,-rpath,/d/tmp/SBo/nix-2.3/src/libutil -Lsrc/libutil -lnixutil

This command line is what 'configure' script produces. However, this fails, informing of not finding lots of symbols from 'libnixutil.so'. The unresolved symbols actually ARE there, with correct mangling (I checked, with 'nm' and 'readelf'). Now, if I just replace '-lnixutil' with 'src/libutil/libnixutil.so', linking completes okay. What's the difference, and is it documented? I see nothing appropriate in 'man ld', and (seemingly) nothing directly related in the net search.

yury10578
  • 103
  • 3
  • 1
    In the man there is `ld will search the library path`. The difference is `-lnixutil` searches for the file in library path, `src/libutil/libnixutil.so` specifies the file. – KamilCuk Oct 07 '19 at 08:11
  • @Kamil Cuk: I think that's not it, as the file itself (src/libutil/libnixutil.so) seems to be successfully located in the 1st case; those are messages about symbols not being found (and if I replace the namespec with '-lnixutil1', linking predictably fails telling the library can't be found). – yury10578 Oct 07 '19 at 08:19

1 Answers1

1

Now, if I just replace '-lnixutil' with 'src/libutil/libnixutil.so', linking completes okay. What's the difference

The difference is that the -lnuxutil searches for the library in various directories, while src/libutil/libnixutil.so doesn't.

Since using -lnuxutil fails to link while it does find the library, it is safe to assume that it finds a version of this library somewhere other than in src/libutil, and the version it finds is probably wrong (i.e. older version).

To see where the linker finds libnixutil, use the -Wl,-t flag (it will show all input files as they are being opened by the linker).

Employed Russian
  • 199,314
  • 34
  • 295
  • 362