# HG changeset patch # User Andrew Janke # Date 1531967648 14400 # Node ID b4cb9d04f3cf20bf57faec0cb6efafc5e4d4318c # Parent d10027532f0a75c96d7a037b5ba8b10e89ec645e build: Use dynamic symbol lookup for functions in libraries on macOS (bug #53627). * configure.ac: Use "-no-undefined" linking by default only on platforms that need it. Don't link all dependencies on macOS by default. Consider changes of AMCOND_LINK_ALL_DEPS by other functions. * m4/acinclude.m4: Use "-bundle -undefined dynamic_lookup -bind_at_load" for linking shared libraries on macOS. * src/mkoctfile.in.cc (make_vars_map): Add path to octinterp and octave libraries to linker flags if linking with all dependencies. diff -r d10027532f0a -r b4cb9d04f3cf configure.ac --- a/configure.ac Sat May 01 21:18:50 2021 +0200 +++ b/configure.ac Wed Jul 18 22:34:08 2018 -0400 @@ -641,15 +641,23 @@ ### More configure argument checking related to linking +case $host_os in + msdosmsvc | mingw* | AIX | BeOS | OS/2 ) + DEFAULT_NO_UNDEFINED_LDFLAG="-no-undefined" + ;; + *) + DEFAULT_NO_UNDEFINED_LDFLAG="" + ;; +esac AC_ARG_ENABLE([no-undefined], - [AS_HELP_STRING([--disable-no-undefined], - [don't pass -no-undefined to libtool when linking Octave and its shared libraries])], + [AS_HELP_STRING([--enable-no-undefined], + [pass -no-undefined to libtool when linking Octave and its shared libraries. This is done by default for msdosmsvc, mingw*, AIX, BeOS, or OS/2 hosts.])], [case $enableval in yes) NO_UNDEFINED_LDFLAG="-no-undefined" ;; no) NO_UNDEFINED_LDFLAG="" ;; - *) AC_MSG_ERROR([bad value $enableval for --disable-no-undefined]) ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-no-undefined]) ;; esac], - [NO_UNDEFINED_LDFLAG="-no-undefined"]) + [NO_UNDEFINED_LDFLAG="$DEFAULT_NO_UNDEFINED_LDFLAG"]) AC_SUBST(NO_UNDEFINED_LDFLAG) AC_ARG_ENABLE([link-all-dependencies], @@ -658,17 +666,10 @@ [case $enableval in yes) link_all_deps=yes ;; no) link_all_deps=no ;; - *) AC_MSG_ERROR([bad value $enableval for --enable-link-all-depenencies]) + *) AC_MSG_ERROR([bad value $enableval for --enable-link-all-dependencies]) ;; esac], - [case $host_os in - darwin*) - link_all_deps=yes - ;; - *) - link_all_deps=no - ;; - esac]) + [link_all_deps=no]) AM_CONDITIONAL([AMCOND_LINK_ALL_DEPS], [test $link_all_deps = yes]) ### Check for BLAS and LAPACK libraries: @@ -2922,7 +2923,9 @@ OCT_LINK_OPTS="$LDFLAGS" OCT_GUI_LINK_OPTS="$LDFLAGS" -if test $link_all_deps = yes; then +if test $AMCOND_LINK_ALL_DEPS = yes; then + AC_DEFINE(OCTAVE_LINK_ALL_DEPS, 1, [Link with all dependencies.]) + OCT_LINK_DEPS="libinterp/liboctinterp.la liboctave/liboctave.la" OCT_GUI_LINK_DEPS="libgui/liboctgui.la libinterp/liboctinterp.la liboctave/liboctave.la" diff -r d10027532f0a -r b4cb9d04f3cf m4/acinclude.m4 --- a/m4/acinclude.m4 Sat May 01 21:18:50 2021 +0200 +++ b/m4/acinclude.m4 Wed Jul 18 22:34:08 2018 -0400 @@ -2613,10 +2613,10 @@ SH_LDFLAGS="-shared -Wl,-expect_unresolved -Wl,'*'" ;; *-*-darwin*) - DL_LDFLAGS="-bundle -bundle_loader ${ac_top_build_prefix}libinterp/octave ${LDFLAGS}" + DL_LDFLAGS="-bundle -undefined dynamic_lookup -bind_at_load -bundle_loader ${ac_top_build_prefix}libinterp/octave ${LDFLAGS}" dnl Contains variables that are defined and undefined at this point, so use dnl appropriate quoting to defer expansion of ${bindir} and ${version}. - MKOCTFILE_DL_LDFLAGS='-bundle -bundle_loader ${bindir}/octave-${version}'"${EXEEXT}" + MKOCTFILE_DL_LDFLAGS='-bundle -undefined dynamic_lookup -bind_at_load -bundle_loader ${bindir}/octave-${version}'"${EXEEXT}" SH_LDFLAGS="-dynamiclib -single_module ${LDFLAGS}" case $canonical_host_type in powerpc-*) diff -r d10027532f0a -r b4cb9d04f3cf src/mkoctfile.in.cc --- a/src/mkoctfile.in.cc Sat May 01 21:18:50 2021 +0200 +++ b/src/mkoctfile.in.cc Wed Jul 18 22:34:08 2018 -0400 @@ -246,8 +246,7 @@ std::string DEFAULT_LDFLAGS; -#if (defined (OCTAVE_USE_WINDOWS_API) || defined (CROSS)) || (defined __APPLE__ && defined __MACH__) - +#if (defined (OCTAVE_USE_WINDOWS_API) || defined (CROSS) || defined (OCTAVE_LINK_ALL_DEPS)) // We'll be linking the files we compile with -loctinterp and -loctave, // so we need to know where to find them. DEFAULT_LDFLAGS += "-L" + quote_path (vars["OCTLIBDIR"]);