GnuTLS | Cross-compile for macOS fails because of broken libdl check (#1775)

Read-only notification of GnuTLS library development activities <[email protected]>
Newsgroups gmane.comp.encryption.gpg.gnutls.devel
Message-ID <[email protected]>

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.

_______________________________________________
Gnutls-devel mailing list
[email protected]
http://lists.gnupg.org/mailman/listinfo/gnutls-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.