Building the Python binding (with fix)

John Goerzen <[email protected]> Tue, 20 Jun 2023 22:23:09 -0500
Newsgroups gmane.comp.sysutils.backup.dar.support
Message-ID <[email protected]>
Hi,

Now that I have uploaded libthreadar, and a version with libthreadar and
curl enabled to Debian, the last thing I need to get built is the Python
binding.

I got that working OK, but:

$ python3
Python 3.11.4 (main, Jun  7 2023, 10:13:09) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import libdar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /usr/lib/python3/dist-packages/libdar.cpython-311-x86_64-linux-gnu.so: undefined symbol: _ZTIN6libdar16user_interactionE

That seems to be in libdar64.so.  But, oddly:

 ldd /usr/lib/python3/dist-packages/libdar.cpython-311-x86_64-linux-gnu.so
        linux-vdso.so.1 (0x00007ffd60d82000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa98776d000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa987749000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa987568000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa987b0e000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa987489000)

Huh.  No reference to libdar64, or to threadar.  Or curl, or tons of
other things. Odd.

It was linked with:

g++ -shared -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

On a lark, I tried:

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

Yep, that did it!  It imports in python3, and:

$ ldd ./libdar.cpython-311-x86_64-linux-gnu.so
        linux-vdso.so.1 (0x00007fff6a398000)
        libgpgme.so.11 => /lib/x86_64-linux-gnu/libgpgme.so.11 (0x00007f075b231000)
        libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x00007f075b184000)
        libthreadar.so.1000 => /lib/x86_64-linux-gnu/libthreadar.so.1000 (0x00007f075b174000)
        libdar64.so.6000 => /lib/x86_64-linux-gnu/libdar64.so.6000 (0x00007f075aeaa000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f075ac54000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f075ab73000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f075ab4f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f075a96e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f075b3d0000)
        libassuan.so.0 => /lib/x86_64-linux-gnu/libassuan.so.0 (0x00007f075a958000)
        libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f075a930000)
        libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007f075a901000)
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f075a8ce000)
        librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1 (0x00007f075a8af000)
        libssh2.so.1 => /lib/x86_64-linux-gnu/libssh2.so.1 (0x00007f075a86e000)
        libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5 (0x00007f075a85a000)
        libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007f075a7b1000)
        libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007f075a330000)
        libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f075a2dc000)
        libldap-2.5.so.0 => /lib/x86_64-linux-gnu/libldap-2.5.so.0 (0x00007f075a27d000)
        liblber-2.5.so.0 => /lib/x86_64-linux-gnu/liblber-2.5.so.0 (0x00007f075a26d000)
        libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007f075a1b1000)
        libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f075a1a4000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f075a185000)
        libargon2.so.1 => /lib/x86_64-linux-gnu/libargon2.so.1 (0x00007f075a179000)
        librsync.so.2 => /lib/x86_64-linux-gnu/librsync.so.2 (0x00007f075a16b000)
        libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f075a025000)
        liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f0759fff000)
        liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f0759fd0000)
        liblzo2.so.2 => /lib/x86_64-linux-gnu/liblzo2.so.2 (0x00007f0759fa9000)
        libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f0759f96000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f0759f8a000)
        libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f0759dd4000)
        libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007f0759bb8000)
        libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x00007f0759b6d000)
        libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x00007f0759b1f000)
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f0759a9e000)
        libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f07599c4000)
        libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f0759997000)
        libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f075998f000)
        libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f0759981000)
        libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f0759964000)
        libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f0759941000)
        libb2.so.1 => /lib/x86_64-linux-gnu/libb2.so.1 (0x00007f0759922000)
        libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007f07597ec000)
        libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007f07597d7000)
        libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f07597d0000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f07597bf000)
        libgomp.so.1 => /lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f075976e000)
        libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007f0759760000)

So now the question is:

1) How did this work for you/others?

2) Would you like to add this -Wl,--no-as-needed to the build system
yourself, or should I patch that locally for Debian?

Thanks!

- John