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