diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config.in | 12 | ||||
-rw-r--r-- | gcc/config/darwin.h | 16 | ||||
-rw-r--r-- | gcc/config/darwin10.h | 5 | ||||
-rw-r--r-- | gcc/config/darwin12.h | 7 | ||||
-rwxr-xr-x | gcc/configure | 76 | ||||
-rw-r--r-- | gcc/configure.ac | 60 |
7 files changed, 185 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 450086ec386..27e0615c15d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,19 @@ 2016-11-27 Iain Sandoe <iain@codesourcery.com> PR target/71767 + * configure.ac (with-ld64): New var, set for Darwin, set on + detection of ld64, gcc_cv_ld64_export_dynamic: New, New test. + * config/darwin.h: Use LD64_HAS_DYNAMIC export. DEF_LD64: New, + define. + * config/darwin10.h(DEF_LD64): Update for this target version. + * config/darwin12.h(LINK_GCC_C_SEQUENCE_SPEC): Remove rdynamic + test. (DEF_LD64): Update for this target version. + * configure: Regenerated. + * config.in: Regenerated. + +2016-11-27 Iain Sandoe <iain@codesourcery.com> + + PR target/71767 * config/darwin.c (imachopic_indirection_name): Make data section indirections linker-visible. * config/darwin.h (ASM_GENERATE_INTERNAL_LABEL): Make local diff --git a/gcc/config.in b/gcc/config.in index 93a03016499..c192638fc94 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -1946,6 +1946,18 @@ #endif +/* Define to 1 if ld64 supports '-export_dynamic'. */ +#ifndef USED_FOR_TARGET +#undef LD64_HAS_EXPORT_DYNAMIC +#endif + + +/* Define to ld64 version. */ +#ifndef USED_FOR_TARGET +#undef LD64_VERSION +#endif + + /* Define to the linker option to ignore unused dependencies. */ #ifndef USED_FOR_TARGET #undef LD_AS_NEEDED_OPTION diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index 045f70b2abb..541bcb3c8e5 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -165,6 +165,12 @@ extern GTY(()) int darwin_ms_struct; specifying the handling of options understood by generic Unix linkers, and for positional arguments like libraries. */ +#if LD64_HAS_EXPORT_DYNAMIC +#define DARWIN_EXPORT_DYNAMIC " %{rdynamic:-export_dynamic}" +#else +#define DARWIN_EXPORT_DYNAMIC " %{rdynamic: %nrdynamic is not supported}" +#endif + #define LINK_COMMAND_SPEC_A \ "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ %(linker)" \ @@ -185,7 +191,9 @@ extern GTY(()) int darwin_ms_struct; %{!nostdlib:%{!nodefaultlibs:\ %{%:sanitize(address): -lasan } \ %{%:sanitize(undefined): -lubsan } \ - %(link_ssp) %(link_gcc_c_sequence)\ + %(link_ssp) \ + " DARWIN_EXPORT_DYNAMIC " %<rdynamic \ + %(link_gcc_c_sequence) \ }}\ %{!nostdlib:%{!nostartfiles:%E}} %{T*} %{F*} }}}}}}}" @@ -932,4 +940,10 @@ extern void darwin_driver_init (unsigned int *,struct cl_decoded_option **); fall-back default. */ #define DEF_MIN_OSX_VERSION "10.5" +#ifndef LD64_VERSION +#define LD64_VERSION "85.2" +#else +#define DEF_LD64 LD64_VERSION +#endif + #endif /* CONFIG_DARWIN_H */ diff --git a/gcc/config/darwin10.h b/gcc/config/darwin10.h index 5829d788eb9..a81fbdccdc8 100644 --- a/gcc/config/darwin10.h +++ b/gcc/config/darwin10.h @@ -32,3 +32,8 @@ along with GCC; see the file COPYING3. If not see #undef DEF_MIN_OSX_VERSION #define DEF_MIN_OSX_VERSION "10.6" + +#ifndef LD64_VERSION +#undef DEF_LD64 +#define DEF_LD64 "97.7" +#endif diff --git a/gcc/config/darwin12.h b/gcc/config/darwin12.h index e3669826dc3..f88e2a46901 100644 --- a/gcc/config/darwin12.h +++ b/gcc/config/darwin12.h @@ -21,10 +21,15 @@ along with GCC; see the file COPYING3. If not see #undef LINK_GCC_C_SEQUENCE_SPEC #define LINK_GCC_C_SEQUENCE_SPEC \ "%:version-compare(>= 10.6 mmacosx-version-min= -no_compact_unwind) \ - %{rdynamic:-export_dynamic} %{!static:%{!static-libgcc: \ + %{!static:%{!static-libgcc: \ %:version-compare(>= 10.6 mmacosx-version-min= -lSystem) } } \ %{fno-pic|fno-PIC|fno-pie|fno-PIE|fapple-kext|mkernel|static|mdynamic-no-pic: \ %:version-compare(>= 10.7 mmacosx-version-min= -no_pie) } %G %L" #undef DEF_MIN_OSX_VERSION #define DEF_MIN_OSX_VERSION "10.8" + +#ifndef LD64_VERSION +#undef DEF_LD64 +#define DEF_LD64 "236.4" +#endif diff --git a/gcc/configure b/gcc/configure index 197a152dfa8..aa961b77acd 100755 --- a/gcc/configure +++ b/gcc/configure @@ -3639,6 +3639,11 @@ else fi +case $target in + *darwin*) ld64_flag=yes;; # Darwin can only use a ld64-compatible linker. + *) ld64_flag=no;; +esac + # With pre-defined ld # Check whether --with-ld was given. @@ -3651,6 +3656,8 @@ if test x"${DEFAULT_LINKER+set}" = x"set"; then as_fn_error "cannot execute: $DEFAULT_LINKER: check --with-ld or env. var. DEFAULT_LINKER" "$LINENO" 5 elif $DEFAULT_LINKER -v < /dev/null 2>&1 | grep GNU > /dev/null; then gnu_ld_flag=yes + elif $DEFAULT_LINKER -v < /dev/null 2>&1 | grep ld64- > /dev/null; then + ld64_flag=yes fi cat >>confdefs.h <<_ACEOF @@ -18423,7 +18430,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18426 "configure" +#line 18433 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -18529,7 +18536,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 18532 "configure" +#line 18539 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -28287,6 +28294,71 @@ _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_compress_debug" >&5 $as_echo "$gcc_cv_ld_compress_debug" >&6; } +if test x"$ld64_flag" = x"yes"; then + + # Set defaults for possibly untestable items. + gcc_cv_ld64_export_dynamic=0 + + if test "$build" = "$host"; then + darwin_try_test=1 + else + darwin_try_test=0 + fi + + # On Darwin, because of FAT library support, it is often possible to execute + # exes from compatible archs even when the host differs from the build system. + case "$build","$host" in + x86_64-*-darwin*,i?86-*-darwin* | powerpc64*-*-darwin*,powerpc*-*-darwin*) + darwin_try_test=1;; + *) ;; + esac + + # If the configurer specified a minimum ld64 version to be supported, then use + # that to determine feature support. + if test x"${gcc_cv_ld64_version}" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking ld64 major version" >&5 +$as_echo_n "checking ld64 major version... " >&6; } + IFS=. read gcc_cv_ld64_major gcc_cv_ld64_minor <<< "${gcc_cv_ld64_version}" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld64_major" >&5 +$as_echo "$gcc_cv_ld64_major" >&6; } + if test "$gcc_cv_ld64_major" -ge 236; then + gcc_cv_ld64_export_dynamic=1 + fi + elif test -x "$gcc_cv_ld" -a "$darwin_try_test" -eq 1; then + # If the version was not specified, try to find it. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker version" >&5 +$as_echo_n "checking linker version... " >&6; } + if test x"${gcc_cv_ld64_version}" = x; then + gcc_cv_ld64_version=`$gcc_cv_ld -v 2>&1 | grep ld64 | sed s/.*ld64-// | awk '{print $1}'` + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld64_version" >&5 +$as_echo "$gcc_cv_ld64_version" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker for -export_dynamic support" >&5 +$as_echo_n "checking linker for -export_dynamic support... " >&6; } + gcc_cv_ld64_export_dynamic=1 + if $gcc_cv_ld -export_dynamic < /dev/null 2>&1 | grep 'unknown option' > /dev/null; then + gcc_cv_ld64_export_dynamic=0 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld64_export_dynamic" >&5 +$as_echo "$gcc_cv_ld64_export_dynamic" >&6; } + fi + + if test x"${gcc_cv_ld64_version}" != x; then + +cat >>confdefs.h <<_ACEOF +#define LD64_VERSION "${gcc_cv_ld64_version}" +_ACEOF + + fi + + +cat >>confdefs.h <<_ACEOF +#define LD64_HAS_EXPORT_DYNAMIC $gcc_cv_ld64_export_dynamic +_ACEOF + +fi + # -------- # UNSORTED # -------- diff --git a/gcc/configure.ac b/gcc/configure.ac index 140b9f9ac90..998499ed82d 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -274,6 +274,11 @@ AC_ARG_WITH(gnu-ld, gnu_ld_flag="$with_gnu_ld", gnu_ld_flag=no) +case $target in + *darwin*) ld64_flag=yes;; # Darwin can only use a ld64-compatible linker. + *) ld64_flag=no;; +esac + # With pre-defined ld AC_ARG_WITH(ld, [AS_HELP_STRING([--with-ld], [arrange to use the specified ld (full pathname)])], @@ -283,6 +288,8 @@ if test x"${DEFAULT_LINKER+set}" = x"set"; then AC_MSG_ERROR([cannot execute: $DEFAULT_LINKER: check --with-ld or env. var. DEFAULT_LINKER]) elif $DEFAULT_LINKER -v < /dev/null 2>&1 | grep GNU > /dev/null; then gnu_ld_flag=yes + elif $DEFAULT_LINKER -v < /dev/null 2>&1 | grep ld64- > /dev/null; then + ld64_flag=yes fi AC_DEFINE_UNQUOTED(DEFAULT_LINKER,"$DEFAULT_LINKER", [Define to enable the use of a default linker.]) @@ -5266,6 +5273,59 @@ AC_DEFINE_UNQUOTED(LD_COMPRESS_DEBUG_OPTION, "$gcc_cv_ld_compress_debug_option", [Define to the linker option to enable compressed debug sections.]) AC_MSG_RESULT($gcc_cv_ld_compress_debug) +if test x"$ld64_flag" = x"yes"; then + + # Set defaults for possibly untestable items. + gcc_cv_ld64_export_dynamic=0 + + if test "$build" = "$host"; then + darwin_try_test=1 + else + darwin_try_test=0 + fi + + # On Darwin, because of FAT library support, it is often possible to execute + # exes from compatible archs even when the host differs from the build system. + case "$build","$host" in + x86_64-*-darwin*,i?86-*-darwin* | powerpc64*-*-darwin*,powerpc*-*-darwin*) + darwin_try_test=1;; + *) ;; + esac + + # If the configurer specified a minimum ld64 version to be supported, then use + # that to determine feature support. + if test x"${gcc_cv_ld64_version}" != x; then + AC_MSG_CHECKING(ld64 major version) + IFS=. read gcc_cv_ld64_major gcc_cv_ld64_minor <<< "${gcc_cv_ld64_version}" + AC_MSG_RESULT($gcc_cv_ld64_major) + if test "$gcc_cv_ld64_major" -ge 236; then + gcc_cv_ld64_export_dynamic=1 + fi + elif test -x "$gcc_cv_ld" -a "$darwin_try_test" -eq 1; then + # If the version was not specified, try to find it. + AC_MSG_CHECKING(linker version) + if test x"${gcc_cv_ld64_version}" = x; then + gcc_cv_ld64_version=`$gcc_cv_ld -v 2>&1 | grep ld64 | sed s/.*ld64-// | awk '{print $1}'` + fi + AC_MSG_RESULT($gcc_cv_ld64_version) + + AC_MSG_CHECKING(linker for -export_dynamic support) + gcc_cv_ld64_export_dynamic=1 + if $gcc_cv_ld -export_dynamic < /dev/null 2>&1 | grep 'unknown option' > /dev/null; then + gcc_cv_ld64_export_dynamic=0 + fi + AC_MSG_RESULT($gcc_cv_ld64_export_dynamic) + fi + + if test x"${gcc_cv_ld64_version}" != x; then + AC_DEFINE_UNQUOTED(LD64_VERSION, "${gcc_cv_ld64_version}", + [Define to ld64 version.]) + fi + + AC_DEFINE_UNQUOTED(LD64_HAS_EXPORT_DYNAMIC, $gcc_cv_ld64_export_dynamic, + [Define to 1 if ld64 supports '-export_dynamic'.]) +fi + # -------- # UNSORTED # -------- |