[gnutls-devel] GnuTLS | Cross-compile for macOS fails because of broken libdl check (#1775)
Read-only notification of GnuTLS library development activities
gnutls-devel at lists.gnutls.org
Tue Dec 16 15:52:59 CET 2025
Pierre Ossman (Work account) created an issue: https://gitlab.com/gnutls/gnutls/-/issues/1775
Cross-compiling for macOS doesn't work, and you end up failing to link the library with these errors:
```console
...
ld: warning: ignoring file /usr/lib64/libzstd.so, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 )
ld: warning: ignoring file /usr/lib64/libz.so, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 )
ld: warning: ignoring file /usr/lib64/libgmp.so, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 )
...
Undefined symbols for architecture x86_64:
"_ZSTD_compress", referenced from:
__gnutls_compress in compress.o
"_ZSTD_compressBound", referenced from:
__gnutls_compress_bound in compress.o
...
```
The problem is that the following macro in `configure.ac` is too primitive and ends up with the wrong result, confusing ld64 and breaking the link:
```m4
AC_LIB_HAVE_LINKFLAGS(dl,, [#include <dlfcn.h>], [dladdr (0, 0);])
```
This makes a few bad assumptions:
a) That it cannot use `dladdr()` without `libdl` (i.e., it should try looking for the symbol without extra libraries)
b) That the link time location of `libdl` matches the runtime location of GnuTLS (two bad assumptions in one), which isn't true when cross compiling
End result is that it finds the *Linux* `/usr/lib64/libdl.so` and then blindly adds `-L/usr/lib64 -ldl` to the link line.
This then breaks during the link as command line `-L` has priority over the default library paths. ld64 happens to be clever enough to adjust things for the sysroot, but only for paths that actually exist in the sysroot. And `/usr/lib64` does not.
Manually trying to find libraries rather than trusting the compiler/environment is very rude behaviour IMHO. I would suggest replacing this with `AC_SEARCH_LIBS()`. Possibly with some override if there is a need to support weird setups.
--
Reply to this email directly or view it on GitLab: https://gitlab.com/gnutls/gnutls/-/issues/1775
You're receiving this email because of your account on gitlab.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gnupg.org/pipermail/gnutls-devel/attachments/20251216/74ecde20/attachment.html>
More information about the Gnutls-devel
mailing list