Linking of libdar64

John Goerzen <[email protected]> Mon, 10 Jul 2023 19:03:55 -0500
Newsgroups gmane.comp.sysutils.backup.dar.support
Message-ID <[email protected]>
Hi Denis,

One of Debian's automated scan tools detected these warnings:

dpkg-shlibdeps: warning: symbol curl_version used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol gpgme_signers_add used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol _ZN11libthreadar9condition4waitEj used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol gpgme_new used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol curl_version_info used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol _ZN11libthreadar6threadD2Ev used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol gpgme_op_encrypt_sign used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol gpgme_get_protocol_name used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol curl_easy_setopt used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: symbol gpgme_data_new_from_cbs used by debian/libdar64-6000/usr/lib/x86_64-linux-gnu/libdar64.so.6000.6.0 found in none of the libraries
dpkg-shlibdeps: warning: 41 other similar warnings have been skipped
(use -v to see them all)

visible at https://buildd.debian.org/status/fetch.php?pkg=dar&arch=amd64&ver=2.7.10-2&stamp=1688852373&raw=0

Inspecting the library on my system, indeed I see:

$ ldd /usr/lib/x86_64-linux-gnu/libdar64.so.6000
        linux-vdso.so.1 (0x00007fff7fbf3000)
        libargon2.so.1 => /lib/x86_64-linux-gnu/libargon2.so.1 (0x00007f34e3bf9000)
        librsync.so.2 => /lib/x86_64-linux-gnu/librsync.so.2 (0x00007f34e3beb000)
        libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f34e3aa5000)
        liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f34e3a7f000)
        libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f34e39bf000)
        liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f34e398e000)
        liblzo2.so.2 => /lib/x86_64-linux-gnu/liblzo2.so.2 (0x00007f34e3969000)
        libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f34e3956000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f34e3937000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f34e392b000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f34e36d5000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f34e34f1000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f34e34cd000)
        libb2.so.1 => /lib/x86_64-linux-gnu/libb2.so.1 (0x00007f34e34ae000)
        libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f34e3486000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f34e33a7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f34e3ed6000)
        libgomp.so.1 => /lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f34e3354000)

(no curl there)

$ grep curl_version /usr/lib/x86_64-linux-gnu/libdar64.so.6000
grep: /usr/lib/x86_64-linux-gnu/libdar64.so.6000: binary file matches

The build line for the .so includes, in part:

.libs/limitint.o .libs/parallel_tronconneuse.o
.libs/parallel_block_compressor.o   -largon2 -lpthread -lrsync -lgcrypt
-lgpg-error -llz4 -lzstd -llzma -llzo2 -lbz2 -lz -ldl -lcap
-L/usr/lib/gcc/x86_64-linux-gnu/12
-L/usr/lib/gcc/x86_64-linux-gnu/12/../../../x86_64-linux-gnu
-L/usr/lib/gcc/x86_64-linux-gnu/12/../../../../lib
-L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu
-L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/12/../../.. -lstdc++
-lm -lc -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/12/crtendS.o
/usr/lib/gcc/x86_64-linux-gnu/12/../../../x86_64-linux-gnu/crtn.o  -g
-O2 -fstack-protector-strong -Wl,-z -Wl,relro -Wl,-z -Wl,now
-Wl,-soname -Wl,libdar64.so.6000 -o .libs/libdar64.so.6000.6.0

No -lcurl there either.

Now dar itself includes -lcurl in the build:

/bin/bash ../../libtool  --tag=CXX   --mode=link g++  -g -O2 -ffile-prefix-map=/home/jgoerzen/work/dar=. -fstack-protector-strong -Wformat -Werror=format-security  -Wl,-z,relro -Wl,-z,now -o dar command_line.o config_file.o dar.o dar_suite.o hide_file.o no_comment.o line_tools.o crit_action_cmd_line.o ../libdar/libdar64.la -lcurl  -L/usr/lib/x86_64-linux-gnu -lgpgme -lassuan -lthreadar -lpthread   -largon2 -lpthread -lrsync -lgcrypt -lgpg-error -llz4 -lzstd -llzma -llzo2 -lbz2 -lz -ldl -lcap

So we're not having dynamic loader errors from dar, because -lcurl is
linked into the binary.  The python binding is doing the same:

g++ -shared -Wl,--no-as-needed -L/usr/lib/x86_64-linux-gnu -lgpgme -lcurl  -lthreadar -lpthread  ../libdar/.libs/libdar64.so pybind11_libdar.o  -o libdar.cpython-311-x86_64-linux-gnu.so

And indeed:

$ ldd /usr/lib/python3/dist-packages/libdar.cpython-311-x86_64-linux-gnu.so | grep curl
        libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x00007feec54ba000)

So, I think what this means is that if a third-party package (eg, gdar)
wants to link with libdar64, it is going to have to know all the correct
-l libs to add, since there is an incomplete list in libdar itself.

The fix, I believe, would be to list all the relevant libs when building
libdar.

Thanks,

John