I'm trying tu use curl-config --static-libs
which is supposed to link libcurl statically but link all of libcurl's own dependencies dynamically.
This is all in a current ubuntu noble container
root@74c0362a3530:/# curl-config --static-libs
-Wl,-Bstatic -lcurl -Wl,-Bdynamic -lnghttp2 -lidn2 -lrtmp -lssh -lssh -lpsl -lssl -lcrypto -lssl -lcrypto -lgssapi_krb5 -llber -lldap -llber -lzstd -lbrotlidec -lz
root@74c0362a3530:/# gcc -o main main.c $(curl-config --static-libs)
/usr/bin/ld: cannot find -lnghttp2: No such file or directory
/usr/bin/ld: cannot find -lidn2: No such file or directory
/usr/bin/ld: cannot find -lrtmp: No such file or directory
/usr/bin/ld: cannot find -lssh: No such file or directory
/usr/bin/ld: cannot find -lssh: No such file or directory
/usr/bin/ld: cannot find -lpsl: No such file or directory
/usr/bin/ld: cannot find -lssl: No such file or directory
/usr/bin/ld: cannot find -lcrypto: No such file or directory
/usr/bin/ld: cannot find -lssl: No such file or directory
/usr/bin/ld: cannot find -lcrypto: No such file or directory
/usr/bin/ld: cannot find -lgssapi_krb5: No such file or directory
/usr/bin/ld: cannot find -llber: No such file or directory
/usr/bin/ld: cannot find -lldap: No such file or directory
/usr/bin/ld: cannot find -llber: No such file or directory
/usr/bin/ld: cannot find -lzstd: No such file or directory
/usr/bin/ld: cannot find -lbrotlidec: No such file or directory
/usr/bin/ld: cannot find -lz: No such file or directory
My guess is that the linker tries to also link these libraries statically, because if we look at what curl
is linked against, all libraries resolve.
root@74c0362a3530:/# ldd /usr/bin/curl
linux-vdso.so.1 (0x0000ffffb1add000)
libcurl.so.4 => /lib/aarch64-linux-gnu/libcurl.so.4 (0x0000ffffb1970000)
libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000ffffb1930000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffb1770000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffb1aa0000)
libnghttp2.so.14 => /lib/aarch64-linux-gnu/libnghttp2.so.14 (0x0000ffffb1720000)
libidn2.so.0 => /lib/aarch64-linux-gnu/libidn2.so.0 (0x0000ffffb16e0000)
librtmp.so.1 => /lib/aarch64-linux-gnu/librtmp.so.1 (0x0000ffffb16a0000)
libssh.so.4 => /lib/aarch64-linux-gnu/libssh.so.4 (0x0000ffffb1610000)
libpsl.so.5 => /lib/aarch64-linux-gnu/libpsl.so.5 (0x0000ffffb15d0000)
libssl.so.3 => /lib/aarch64-linux-gnu/libssl.so.3 (0x0000ffffb1500000)
libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000ffffb1080000)
libgssapi_krb5.so.2 => /lib/aarch64-linux-gnu/libgssapi_krb5.so.2 (0x0000ffffb1010000)
libldap.so.2 => /lib/aarch64-linux-gnu/libldap.so.2 (0x0000ffffb0f90000)
liblber.so.2 => /lib/aarch64-linux-gnu/liblber.so.2 (0x0000ffffb0f60000)
libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x0000ffffb0ea0000)
libbrotlidec.so.1 => /lib/aarch64-linux-gnu/libbrotlidec.so.1 (0x0000ffffb0e70000)
libunistring.so.5 => /lib/aarch64-linux-gnu/libunistring.so.5 (0x0000ffffb0ca0000)
libgnutls.so.30 => /lib/aarch64-linux-gnu/libgnutls.so.30 (0x0000ffffb0a80000)
libhogweed.so.6 => /lib/aarch64-linux-gnu/libhogweed.so.6 (0x0000ffffb0a10000)
libnettle.so.8 => /lib/aarch64-linux-gnu/libnettle.so.8 (0x0000ffffb09a0000)
libgmp.so.10 => /lib/aarch64-linux-gnu/libgmp.so.10 (0x0000ffffb0900000)
libkrb5.so.3 => /lib/aarch64-linux-gnu/libkrb5.so.3 (0x0000ffffb0820000)
libk5crypto.so.3 => /lib/aarch64-linux-gnu/libk5crypto.so.3 (0x0000ffffb07d0000)
libcom_err.so.2 => /lib/aarch64-linux-gnu/libcom_err.so.2 (0x0000ffffb07a0000)
libkrb5support.so.0 => /lib/aarch64-linux-gnu/libkrb5support.so.0 (0x0000ffffb0770000)
libsasl2.so.2 => /lib/aarch64-linux-gnu/libsasl2.so.2 (0x0000ffffb0730000)
libbrotlicommon.so.1 => /lib/aarch64-linux-gnu/libbrotlicommon.so.1 (0x0000ffffb06f0000)
libp11-kit.so.0 => /lib/aarch64-linux-gnu/libp11-kit.so.0 (0x0000ffffb0520000)
libtasn1.so.6 => /lib/aarch64-linux-gnu/libtasn1.so.6 (0x0000ffffb04e0000)
libkeyutils.so.1 => /lib/aarch64-linux-gnu/libkeyutils.so.1 (0x0000ffffb04b0000)
libresolv.so.2 => /lib/aarch64-linux-gnu/libresolv.so.2 (0x0000ffffb0480000)
libffi.so.8 => /lib/aarch64-linux-gnu/libffi.so.8 (0x0000ffffb0450000)
Linking dynamically works
root@74c0362a3530:/# curl-config --libs
-lcurl
root@74c0362a3530:/# cc -o main main.c $(curl-config --libs)
root@74c0362a3530:/# ldd main
linux-vdso.so.1 (0x0000ffffa070d000)
libcurl.so.4 => /lib/aarch64-linux-gnu/libcurl.so.4 (0x0000ffffa05d0000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffa0410000)
libnghttp2.so.14 => /lib/aarch64-linux-gnu/libnghttp2.so.14 (0x0000ffffa03c0000)
libidn2.so.0 => /lib/aarch64-linux-gnu/libidn2.so.0 (0x0000ffffa0380000)
librtmp.so.1 => /lib/aarch64-linux-gnu/librtmp.so.1 (0x0000ffffa0340000)
libssh.so.4 => /lib/aarch64-linux-gnu/libssh.so.4 (0x0000ffffa02b0000)
libpsl.so.5 => /lib/aarch64-linux-gnu/libpsl.so.5 (0x0000ffffa0270000)
libssl.so.3 => /lib/aarch64-linux-gnu/libssl.so.3 (0x0000ffffa01a0000)
libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000ffff9fd20000)
libgssapi_krb5.so.2 => /lib/aarch64-linux-gnu/libgssapi_krb5.so.2 (0x0000ffff9fcb0000)
libldap.so.2 => /lib/aarch64-linux-gnu/libldap.so.2 (0x0000ffff9fc30000)
liblber.so.2 => /lib/aarch64-linux-gnu/liblber.so.2 (0x0000ffff9fc00000)
libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x0000ffff9fb40000)
libbrotlidec.so.1 => /lib/aarch64-linux-gnu/libbrotlidec.so.1 (0x0000ffff9fb10000)
libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000ffff9fad0000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffa06d0000)
libunistring.so.5 => /lib/aarch64-linux-gnu/libunistring.so.5 (0x0000ffff9f900000)
libgnutls.so.30 => /lib/aarch64-linux-gnu/libgnutls.so.30 (0x0000ffff9f6e0000)
libhogweed.so.6 => /lib/aarch64-linux-gnu/libhogweed.so.6 (0x0000ffff9f670000)
libnettle.so.8 => /lib/aarch64-linux-gnu/libnettle.so.8 (0x0000ffff9f600000)
libgmp.so.10 => /lib/aarch64-linux-gnu/libgmp.so.10 (0x0000ffff9f560000)
libkrb5.so.3 => /lib/aarch64-linux-gnu/libkrb5.so.3 (0x0000ffff9f480000)
libk5crypto.so.3 => /lib/aarch64-linux-gnu/libk5crypto.so.3 (0x0000ffff9f430000)
libcom_err.so.2 => /lib/aarch64-linux-gnu/libcom_err.so.2 (0x0000ffff9f400000)
libkrb5support.so.0 => /lib/aarch64-linux-gnu/libkrb5support.so.0 (0x0000ffff9f3d0000)
libsasl2.so.2 => /lib/aarch64-linux-gnu/libsasl2.so.2 (0x0000ffff9f390000)
libbrotlicommon.so.1 => /lib/aarch64-linux-gnu/libbrotlicommon.so.1 (0x0000ffff9f350000)
libp11-kit.so.0 => /lib/aarch64-linux-gnu/libp11-kit.so.0 (0x0000ffff9f180000)
libtasn1.so.6 => /lib/aarch64-linux-gnu/libtasn1.so.6 (0x0000ffff9f140000)
libkeyutils.so.1 => /lib/aarch64-linux-gnu/libkeyutils.so.1 (0x0000ffff9f110000)
libresolv.so.2 => /lib/aarch64-linux-gnu/libresolv.so.2 (0x0000ffff9f0e0000)
libffi.so.8 => /lib/aarch64-linux-gnu/libffi.so.8 (0x0000ffff9f0b0000)
root@74c0362a3530:/#
These are the contents of main.c
#include <curl/curl.h>
int main(void)
{
CURL *curl = curl_easy_init();
if(curl) {
curl_easy_cleanup(curl);
}
return 0;
}
I was missing the .so
symlink of the shared library, which for some reason is only shipped with the complementary -dev
package:
E.g.:
root@74c0362a3530:/# dpkg-query -S /usr/lib/aarch64-linux-gnu/libbrotlidec.*
libbrotli-dev:arm64: /usr/lib/aarch64-linux-gnu/libbrotlidec.a
libbrotli-dev:arm64: /usr/lib/aarch64-linux-gnu/libbrotlidec.so
libbrotli1:arm64: /usr/lib/aarch64-linux-gnu/libbrotlidec.so.1
libbrotli1:arm64: /usr/lib/aarch64-linux-gnu/libbrotlidec.so.1.1.0
root@74c0362a3530:/#