разделяемая библиотека связывается или не может связаться с другой разделяемой библиотекой, в зависимости от ее имени - PullRequest
0 голосов
/ 07 октября 2019

В проекте, который я создаю из исходного кода (Nix 2.3 FWIW), одна общая библиотека (libnixstore.so) связана с другой общей библиотекой (libnixutil.so). Командная строка для этого:

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

Эта командная строка - то, что производит сценарий 'configure'. Однако это не помогает, сообщая о том, что в libnixutil.so не найдено много символов. Неразрешенные символы на самом деле там, с правильным искажением (я проверил, с 'nm' и 'readelf'). Теперь, если я просто заменю '-lnixutil' на 'src / libutil / libnixutil.so', связывание завершится хорошо. Какая разница, и это задокументировано? Я не вижу ничего подходящего в 'man ld' и (казалось бы) ничего не связанного напрямую с поиском в сети.

1 Ответ

1 голос
/ 07 октября 2019

Теперь, если я просто заменю '-lnixutil' на 'src / libutil / libnixutil.so', связывание будет завершено. В чем разница

Разница в том, что -lnuxutil ищет библиотеку в разных каталогах, а src/libutil/libnixutil.so - нет.

Поскольку использование -lnuxutil не может связатьхотя он и находит библиотеку, можно с уверенностью предположить, что он находит версию этой библиотеки где-то, кроме src/libutil, и найденная версия, вероятно, неверна (т. е. более старая версия).

Чтобы увидеть, где компоновщик находит libnixutil, используйте флаг -Wl,-t (он покажет все входные файлы по мере их открытия компоновщиком).

...