ccurlgccld

Unable to link libcurl statically and other libraries dynamically


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;
}

Solution

  • 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:/#