From: Michael Tremer Date: Wed, 18 May 2016 21:28:11 +0000 (+0100) Subject: binutils: Update to 2.26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea5329d682a0ad5fd651fef449270a03f2e00eaa;p=ipfire-3.x.git binutils: Update to 2.26 Fixes: #11120 Signed-off-by: Michael Tremer --- diff --git a/binutils/binutils.nm b/binutils/binutils.nm index 451e434d1..e450d7980 100644 --- a/binutils/binutils.nm +++ b/binutils/binutils.nm @@ -4,7 +4,7 @@ ############################################################################### name = binutils -version = 2.24 +version = 2.26 release = 1 maintainer = Michael Tremer @@ -18,10 +18,7 @@ description tools for the manipulation of object code in various object file formats. end -source_dl - http://ftp.gnu.org/gnu/binutils/ - ftp://ftp.kernel.org/pub/linux/devel/binutils -end +source_dl = http://ftp.gnu.org/gnu/binutils/ build requires diff --git a/binutils/patches/binutils-2.20.51.0.10-copy-osabi.patch0 b/binutils/patches/binutils-2.20.51.0.10-copy-osabi.patch0 deleted file mode 100644 index 86cb44787..000000000 --- a/binutils/patches/binutils-2.20.51.0.10-copy-osabi.patch0 +++ /dev/null @@ -1,19 +0,0 @@ -*** ../binutils-2.20.51.0.10.original/bfd/elf.c 2010-08-10 15:04:55.000000000 +0100 ---- bfd/elf.c 2010-08-10 15:05:42.000000000 +0100 -*************** _bfd_elf_copy_private_bfd_data (bfd *ibf -*** 1074,1079 **** ---- 1074,1087 ---- - - /* Copy object attributes. */ - _bfd_elf_copy_obj_attributes (ibfd, obfd); -+ -+ /* If the input BFD has the OSABI field set and the -+ output BFD does not, then copy the value. */ -+ if (elf_elfheader (ibfd)->e_ident [EI_OSABI] != ELFOSABI_NONE -+ && elf_elfheader (obfd)->e_ident [EI_OSABI] == ELFOSABI_NONE) -+ elf_elfheader (obfd)->e_ident [EI_OSABI] = -+ elf_elfheader (ibfd)->e_ident [EI_OSABI]; -+ - return TRUE; - } - diff --git a/binutils/patches/binutils-2.20.51.0.10-sec-merge-emit.patch0 b/binutils/patches/binutils-2.20.51.0.10-sec-merge-emit.patch0 deleted file mode 100644 index 388e143f1..000000000 --- a/binutils/patches/binutils-2.20.51.0.10-sec-merge-emit.patch0 +++ /dev/null @@ -1,24 +0,0 @@ -*** ../binutils-2.20.51.0.10.orig/bfd/merge.c 2010-08-20 12:19:33.000000000 +0100 ---- bfd/merge.c 2010-08-20 12:18:01.000000000 +0100 -*************** sec_merge_emit (bfd *abfd, struct sec_me -*** 307,312 **** ---- 307,315 ---- - len = -off & (entry->alignment - 1); - if (len != 0) - { -+ /* We should never have an entry with an alignment -+ greater than the section's alignment. */ -+ BFD_ASSERT (len <= (bfd_size_type) (1 << alignment_power)); - if (bfd_bwrite (pad, len, abfd) != len) - goto err; - off += len; -*************** sec_merge_emit (bfd *abfd, struct sec_me -*** 324,329 **** ---- 327,333 ---- - /* Trailing alignment needed? */ - off = sec->size - off; - if (off != 0 -+ && alignment_power - && bfd_bwrite (pad, off, abfd) != off) - goto err; - diff --git a/binutils/patches/binutils-2.20.51.0.2-libtool-lib64.patch b/binutils/patches/binutils-2.20.51.0.2-libtool-lib64.patch new file mode 100644 index 000000000..142fc7e27 --- /dev/null +++ b/binutils/patches/binutils-2.20.51.0.2-libtool-lib64.patch @@ -0,0 +1,236 @@ +diff -rcp ../binutils-2.20.51.0.7.original/bfd/configure ./bfd/configure +--- a/bfd/configure 2010-04-08 14:53:48.000000000 +0100 ++++ b/bfd/configure 2010-04-08 14:56:50.000000000 +0100 +@@ -10762,10 +10762,34 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390*|powerpc*|ppc*|sparc*) ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ fi ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac ++ + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on +diff -rcp ../binutils-2.20.51.0.7.original/binutils/configure ./binutils/configure +--- a/binutils/configure 2010-04-08 14:53:45.000000000 +0100 ++++ b/binutils/configure 2010-04-08 14:56:21.000000000 +0100 +@@ -10560,10 +10560,34 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390*|powerpc*|ppc*|sparc*) ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ fi ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac ++ + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on +diff -rcp ../binutils-2.20.51.0.7.original/gas/configure ./gas/configure +--- a/gas/configure 2010-04-08 14:53:47.000000000 +0100 ++++ b/gas/configure 2010-04-08 14:57:24.000000000 +0100 +@@ -10547,10 +10547,34 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390*|powerpc*|ppc*|sparc*) ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ fi ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac ++ + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on +diff -rcp ../binutils-2.20.51.0.7.original/gprof/configure ./gprof/configure +--- a/gprof/configure 2010-04-08 14:53:45.000000000 +0100 ++++ b/gprof/configure 2010-04-08 14:57:50.000000000 +0100 +@@ -10485,10 +10485,34 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390*|powerpc*|ppc*|sparc*) ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ fi ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac ++ + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on +diff -rcp ../binutils-2.20.51.0.7.original/ld/configure ./ld/configure +--- a/ld/configure 2010-04-08 14:53:44.000000000 +0100 ++++ b/ld/configure 2010-04-08 14:58:21.000000000 +0100 +@@ -10966,10 +10966,34 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390*|powerpc*|ppc*|sparc*) ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ fi ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac ++ + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on +Only in .: .#libtool.m4 +Only in .: #libtool.m4# +diff -rcp ../binutils-2.20.51.0.7.original/opcodes/configure ./opcodes/configure +--- a/opcodes/configure 2010-04-08 14:53:45.000000000 +0100 ++++ b/opcodes/configure 2010-04-08 14:59:10.000000000 +0100 +@@ -10496,10 +10496,34 @@ + # before this can be enabled. + hardcode_into_libs=yes + ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390*|powerpc*|ppc*|sparc*) ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ fi ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac ++ + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on diff --git a/binutils/patches/binutils-2.20.51.0.2-set-long-long.patch0 b/binutils/patches/binutils-2.20.51.0.2-set-long-long.patch0 deleted file mode 100644 index 667a3cc78..000000000 --- a/binutils/patches/binutils-2.20.51.0.2-set-long-long.patch0 +++ /dev/null @@ -1,60 +0,0 @@ -diff -rcp ../binutils-2.20.51.0.7.original/bfd/configure ./bfd/configure -*** ../binutils-2.20.51.0.7.original/bfd/configure 2010-04-08 15:23:58.000000000 +0100 ---- ./bfd/configure 2010-04-08 15:24:06.000000000 +0100 -*************** if test "x${ac_cv_sizeof_long}" = "x8"; -*** 12819,12829 **** - BFD_HOST_64BIT_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long" -! elif test "x${ac_cv_sizeof_long_long}" = "x8"; then - BFD_HOST_64BIT_LONG_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long long" -! if test "x${ac_cv_sizeof_void_p}" = "x8"; then - BFD_HOSTPTR_T="unsigned long long" - fi - fi ---- 12819,12831 ---- - BFD_HOST_64BIT_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long" -! fi -! if test "x${ac_cv_sizeof_long_long}" = "x8"; then - BFD_HOST_64BIT_LONG_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long long" -! if test "x${ac_cv_sizeof_void_p}" = "x8" \ -! -a "x${ac_cv_sizeof_long}" != "x8"; then - BFD_HOSTPTR_T="unsigned long long" - fi - fi -diff -rcp ../binutils-2.20.51.0.7.original/bfd/configure.in ./bfd/configure.in -*** ../binutils-2.20.51.0.7.original/bfd/configure.in 2010-04-08 15:23:58.000000000 +0100 ---- ./bfd/configure.in 2010-04-08 15:24:06.000000000 +0100 -*************** if test "x${ac_cv_sizeof_long}" = "x8"; -*** 153,163 **** - BFD_HOST_64BIT_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long" -! elif test "x${ac_cv_sizeof_long_long}" = "x8"; then - BFD_HOST_64BIT_LONG_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long long" -! if test "x${ac_cv_sizeof_void_p}" = "x8"; then - BFD_HOSTPTR_T="unsigned long long" - fi - fi ---- 153,165 ---- - BFD_HOST_64BIT_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long" -! fi -! if test "x${ac_cv_sizeof_long_long}" = "x8"; then - BFD_HOST_64BIT_LONG_LONG=1 - test -n "${HOST_64BIT_TYPE}" || HOST_64BIT_TYPE="long long" - test -n "${HOST_U_64BIT_TYPE}" || HOST_U_64BIT_TYPE="unsigned long long" -! if test "x${ac_cv_sizeof_void_p}" = "x8" \ -! -a "x${ac_cv_sizeof_long}" != "x8"; then - BFD_HOSTPTR_T="unsigned long long" - fi - fi diff --git a/binutils/patches/binutils-2.20.51.0.2-version.patch0 b/binutils/patches/binutils-2.20.51.0.2-version.patch0 deleted file mode 100644 index 9f728dff1..000000000 --- a/binutils/patches/binutils-2.20.51.0.2-version.patch0 +++ /dev/null @@ -1,61 +0,0 @@ -diff -rcp ../binutils-2.20.51.0.7.original/bfd/Makefile.am ./bfd/Makefile.am -*** ../binutils-2.20.51.0.7.original/bfd/Makefile.am 2010-04-08 15:07:55.000000000 +0100 ---- ./bfd/Makefile.am 2010-04-08 15:23:14.000000000 +0100 -*************** bfdver.h: $(srcdir)/version.h $(srcdir)/ -*** 953,964 **** - report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ - if test "x$(RELEASE)" = x ; then \ - bfd_version_date=`sed -n -e 's/.*DATE //p' < $(srcdir)/version.h` ;\ -! bfd_version_string="\"$(VERSION).$${bfd_version_date}\"" ;\ -! bfd_soversion="$(VERSION).$${bfd_version_date}" ;\ - fi ;\ - sed -e "s,@bfd_version@,$$bfd_version," \ - -e "s,@bfd_version_string@,$$bfd_version_string," \ -! -e "s,@bfd_version_package@,$$bfd_version_package," \ - -e "s,@report_bugs_to@,$$report_bugs_to," \ - < $(srcdir)/version.h > $@; \ - echo "$${bfd_soversion}" > libtool-soversion ---- 953,964 ---- - report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ - if test "x$(RELEASE)" = x ; then \ - bfd_version_date=`sed -n -e 's/.*DATE //p' < $(srcdir)/version.h` ;\ -! bfd_version_string="\"$(VERSION)-%{release} $${bfd_version_date}\"" ;\ -! bfd_soversion="$(VERSION)-%{release}" ;\ - fi ;\ - sed -e "s,@bfd_version@,$$bfd_version," \ - -e "s,@bfd_version_string@,$$bfd_version_string," \ -! -e "s,@bfd_version_package@,\"version \"," \ - -e "s,@report_bugs_to@,$$report_bugs_to," \ - < $(srcdir)/version.h > $@; \ - echo "$${bfd_soversion}" > libtool-soversion -diff -rcp ../binutils-2.20.51.0.7.original/bfd/Makefile.in ./bfd/Makefile.in -*** ../binutils-2.20.51.0.7.original/bfd/Makefile.in 2010-04-08 15:07:55.000000000 +0100 ---- ./bfd/Makefile.in 2010-04-08 15:23:14.000000000 +0100 -*************** bfdver.h: $(srcdir)/version.h $(srcdir)/ -*** 1982,1993 **** - report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ - if test "x$(RELEASE)" = x ; then \ - bfd_version_date=`sed -n -e 's/.*DATE //p' < $(srcdir)/version.h` ;\ -! bfd_version_string="\"$(VERSION).$${bfd_version_date}\"" ;\ -! bfd_soversion="$(VERSION).$${bfd_version_date}" ;\ - fi ;\ - sed -e "s,@bfd_version@,$$bfd_version," \ - -e "s,@bfd_version_string@,$$bfd_version_string," \ -! -e "s,@bfd_version_package@,$$bfd_version_package," \ - -e "s,@report_bugs_to@,$$report_bugs_to," \ - < $(srcdir)/version.h > $@; \ - echo "$${bfd_soversion}" > libtool-soversion ---- 1982,1993 ---- - report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ - if test "x$(RELEASE)" = x ; then \ - bfd_version_date=`sed -n -e 's/.*DATE //p' < $(srcdir)/version.h` ;\ -! bfd_version_string="\"$(VERSION)-%{release} $${bfd_version_date}\"" ;\ -! bfd_soversion="$(VERSION)-%{release}" ;\ - fi ;\ - sed -e "s,@bfd_version@,$$bfd_version," \ - -e "s,@bfd_version_string@,$$bfd_version_string," \ -! -e "s,@bfd_version_package@,\"version \"," \ - -e "s,@report_bugs_to@,$$report_bugs_to," \ - < $(srcdir)/version.h > $@; \ - echo "$${bfd_soversion}" > libtool-soversion - diff --git a/binutils/patches/binutils-2.22.52.0.1-export-demangle.h.patch0 b/binutils/patches/binutils-2.22.52.0.1-export-demangle.h.patch0 deleted file mode 100644 index 9a9f3fa81..000000000 --- a/binutils/patches/binutils-2.22.52.0.1-export-demangle.h.patch0 +++ /dev/null @@ -1,57 +0,0 @@ -*** ../binutils-2.22.52.0.1.orig/bfd/Makefile.am 2012-03-06 14:00:33.229957572 +0000 ---- bfd/Makefile.am 2012-04-27 16:46:05.410974817 +0100 -*************** if INSTALL_LIBBFD -*** 18,24 **** - bfdlibdir = @bfdlibdir@ - bfdincludedir = @bfdincludedir@ - bfdlib_LTLIBRARIES = libbfd.la -! bfdinclude_HEADERS = $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/bfdlink.h - else !INSTALL_LIBBFD - # Empty these so that the respective installation directories will not be created. - bfdlibdir = ---- 18,24 ---- - bfdlibdir = @bfdlibdir@ - bfdincludedir = @bfdincludedir@ - bfdlib_LTLIBRARIES = libbfd.la -! bfdinclude_HEADERS = $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/bfdlink.h $(INCDIR)/demangle.h - else !INSTALL_LIBBFD - # Empty these so that the respective installation directories will not be created. - bfdlibdir = -*** ../binutils-2.22.52.0.1.orig/bfd/Makefile.in 2012-03-06 14:00:32.952957600 +0000 ---- bfd/Makefile.in 2012-04-27 16:46:19.718975214 +0100 -*************** RECURSIVE_TARGETS = all-recursive check- -*** 138,144 **** - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive - am__bfdinclude_HEADERS_DIST = $(INCDIR)/plugin-api.h bfd.h \ -! $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/bfdlink.h - HEADERS = $(bfdinclude_HEADERS) - RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive ---- 138,145 ---- - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive - am__bfdinclude_HEADERS_DIST = $(INCDIR)/plugin-api.h bfd.h \ -! $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h $(INCDIR)/bfdlink.h \ -! $(INCDIR)/demangle.h - HEADERS = $(bfdinclude_HEADERS) - RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -*************** libbfd_la_LDFLAGS = $(am__append_1) -rel -*** 331,337 **** - @INSTALL_LIBBFD_FALSE@bfdinclude_HEADERS = $(am__append_2) - @INSTALL_LIBBFD_TRUE@bfdinclude_HEADERS = $(BFD_H) \ - @INSTALL_LIBBFD_TRUE@ $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \ -! @INSTALL_LIBBFD_TRUE@ $(INCDIR)/bfdlink.h $(am__append_2) - @INSTALL_LIBBFD_FALSE@rpath_bfdlibdir = @bfdlibdir@ - @INSTALL_LIBBFD_FALSE@noinst_LTLIBRARIES = libbfd.la - AM_CFLAGS = $(WARN_CFLAGS) ---- 332,339 ---- - @INSTALL_LIBBFD_FALSE@bfdinclude_HEADERS = $(am__append_2) - @INSTALL_LIBBFD_TRUE@bfdinclude_HEADERS = $(BFD_H) \ - @INSTALL_LIBBFD_TRUE@ $(INCDIR)/ansidecl.h $(INCDIR)/symcat.h \ -! @INSTALL_LIBBFD_TRUE@ $(INCDIR)/bfdlink.h $(INCDIR)/demangle.h \ -! @INSTALL_LIBBFD_TRUE@ $(am__append_2) - @INSTALL_LIBBFD_FALSE@rpath_bfdlibdir = @bfdlibdir@ - @INSTALL_LIBBFD_FALSE@noinst_LTLIBRARIES = libbfd.la - AM_CFLAGS = $(WARN_CFLAGS) diff --git a/binutils/patches/binutils-2.22.52.0.1-relro-on-by-default.patch b/binutils/patches/binutils-2.22.52.0.1-relro-on-by-default.patch new file mode 100644 index 000000000..ba8318df9 --- /dev/null +++ b/binutils/patches/binutils-2.22.52.0.1-relro-on-by-default.patch @@ -0,0 +1,58 @@ +diff -upr ../binutils-2.22.52.0.1.orig/ld/testsuite/config/default.exp ld/testsuite/config/default.exp +--- a/ld/testsuite/config/default.exp 2012-03-06 14:00:31.141957656 +0000 ++++ b/ld/testsuite/config/default.exp 2012-03-06 14:09:33.492940503 +0000 +@@ -23,7 +23,7 @@ + # + + if ![info exists ld] then { +- set ld [findfile $base_dir/ld-new $base_dir/ld-new [transform ld]] ++ set ld "[findfile $base_dir/ld-new $base_dir/ld-new [transform ld]] -znorelro" + } + + if ![info exists as] then { +@@ -60,7 +60,7 @@ if {![file isdirectory tmpdir/ld]} then + catch "exec ln -s ld tmpdir/ld/collect-ld" status + catch "exec ln -s ../../../gas/as-new tmpdir/ld/as" status + } +-set gcc_B_opt "-B[pwd]/tmpdir/ld/" ++set gcc_B_opt "-B[pwd]/tmpdir/ld/ -Wl,-z,norelro" + + # load the linker path + set ld_L_opt "" +@@ -279,7 +279,7 @@ + } + + if ![info exists LD] then { +- set LD [findfile $base_dir/ld-new ./ld-new [transform ld]] ++ set LD "[findfile $base_dir/ld-new ./ld-new [transform ld]] -znorelro" + } + + if ![info exists LDFLAGS] then { +diff -cpr ../binutils-2.22.52.0.1.orig/ld/testsuite/ld-bootstrap/bootstrap.exp ld/testsuite/ld-bootstrap/bootstrap.exp +--- a/ld/testsuite/ld-bootstrap/bootstrap.exp 2012-03-06 14:00:30.503957676 +0000 ++++ b/ld/testsuite/ld-bootstrap/bootstrap.exp 2012-03-06 15:03:33.949837926 +0000 +@@ -71,7 +71,13 @@ + + # This test can only be run if we have the ld build directory, + # since we need the object files. +- if {$ld != "$objdir/ld-new"} { ++ set ldexe $ld ++ set ldparm [string first " " $ld] ++ if { $ldparm > 0 } then { ++ set ldparm [expr $ldparm - 1] ++ set ldexe [string range $ld 0 $ldparm] ++ } ++ if {$ldexe != "$objdir/ld-new"} { + untested $testname + continue + } +--- binutils-2.26.orig/ld/emultempl/elf32.em 2016-01-25 10:11:33.990291993 +0000 ++++ binutils-2.26/ld/emultempl/elf32.em 2016-01-25 10:21:40.333016777 +0000 +@@ -104,6 +104,7 @@ gld${EMULATION_NAME}_before_parse (void) + config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`; + config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`; + `if test -n "$CALL_NOP_BYTE" ; then echo link_info.call_nop_byte = $CALL_NOP_BYTE; fi`; ++ link_info.relro = TRUE; + } + + EOF diff --git a/binutils/patches/binutils-2.22.52.0.1-warn-textrel.patch b/binutils/patches/binutils-2.22.52.0.1-warn-textrel.patch deleted file mode 100644 index 72a0477ec..000000000 --- a/binutils/patches/binutils-2.22.52.0.1-warn-textrel.patch +++ /dev/null @@ -1,51 +0,0 @@ -textrels are bad for forcing copy-on-write (this affects everyone), -and for security/runtime code generation, this affects security ppl. -But in either case, it doesn't matter who needs textrels, it's -the very fact that they're needed at all. - -2006-06-10 Ned Ludd , Mike Frysinger - - * bfd/elflink.c (bfd_elf_final_link): Check all objects for TEXTRELs. - * ld/ldmain.c (main): Change textrel warning default to true. - * ld/testsuite/lib/ld-lib.exp (default_ld_simple_link): Scrub TEXTREL - warnings from ld output. - ---- a/bfd/elflink.c -+++ b/bfd/elflink.c -@@ -8652,7 +8652,7 @@ bfd_elf_final_link (bfd *abfd, struct bf - goto error_return; - - /* Check for DT_TEXTREL (late, in case the backend removes it). */ -- if (((info->warn_shared_textrel && info->shared) -+ if ((info->warn_shared_textrel - || info->error_textrel) - && (o = bfd_get_section_by_name (dynobj, ".dynamic")) != NULL) - { -@@ -8702,7 +8702,7 @@ bfd_elf_final_link (bfd *abfd, struct bf - (_("%P%X: read-only segment has dynamic relocations.\n")); - else - info->callbacks->einfo -- (_("%P: warning: creating a DT_TEXTREL in a shared object.\n")); -+ (_("%P: warning: creating a DT_TEXTREL in object.\n")); - break; - } - } ---- a/ld/ldmain.c -+++ b/ld/ldmain.c -@@ -282,2 +282,3 @@ main (int argc, char **argv) - link_info.spare_dynamic_tags = 5; -+ link_info.warn_shared_textrel = TRUE; - link_info.sharable_sections = FALSE; ---- a/ld/testsuite/lib/ld-lib.exp -+++ b/ld/testsuite/lib/ld-lib.exp -@@ -181,6 +181,10 @@ proc default_ld_simple_link { ld target - # symbol, since the default linker script might use ENTRY. - regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output - -+ # Gentoo tweak: -+ # We want to ignore TEXTREL warnings since we force enable them by default -+ regsub -all "^lt-ld-new: warning: creating a DT_TEXTREL in object\." $exec_output "\\1" exec_output -+ - if [string match "" $exec_output] then { - return 1 - } else { diff --git a/binutils/patches/binutils-2.22.52.0.2-flexible-tests.patch b/binutils/patches/binutils-2.22.52.0.2-flexible-tests.patch deleted file mode 100644 index af6c92709..000000000 --- a/binutils/patches/binutils-2.22.52.0.2-flexible-tests.patch +++ /dev/null @@ -1,25 +0,0 @@ -making some of the address matches more flexible fixes tests when using -pax/relro/hash patches - ---- binutils/ld/testsuite/ld-ifunc/ifunc-2-local-x86-64.d -+++ binutils/ld/testsuite/ld-ifunc/ifunc-2-local-x86-64.d -@@ -4,6 +4,6 @@ - #target: x86_64-*-* - - #... --[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> --[ \t0-9a-f]+:[ \t0-9a-f]+lea[ \t]+.*\(%rip\),%rax.*[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> -+[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*\+0x[a-f0-9]+@plt> -+[ \t0-9a-f]+:[ \t0-9a-f]+lea[ \t]+.*\(%rip\),%rax.*[ \t0-9a-fq]+<\*ABS\*\+0x[a-f0-9]+@plt> - #pass ---- binutils/ld/testsuite/ld-ifunc/ifunc-2-x86-64.d -+++ binutils/ld/testsuite/ld-ifunc/ifunc-2-x86-64.d -@@ -4,6 +4,6 @@ - #target: x86_64-*-* - - #... --[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> --[ \t0-9a-f]+:[ \t0-9a-f]+lea[ \t]+.*\(%rip\),%rax.*[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> -+[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*\+0x[a-f0-9]+@plt> -+[ \t0-9a-f]+:[ \t0-9a-f]+lea[ \t]+.*\(%rip\),%rax.*[ \t0-9a-fq]+<\*ABS\*\+0x[a-f0-9]+@plt> - #pass diff --git a/binutils/patches/binutils-2.22.52.0.4-no-config-h-check.patch0 b/binutils/patches/binutils-2.22.52.0.4-no-config-h-check.patch0 deleted file mode 100644 index 2fc32e3b9..000000000 --- a/binutils/patches/binutils-2.22.52.0.4-no-config-h-check.patch0 +++ /dev/null @@ -1,32 +0,0 @@ -*** ../binutils-2.22.52.0.4.orig/bfd/bfd-in.h 2012-08-02 10:56:34.561769686 +0100 ---- bfd/bfd-in.h 2012-08-02 11:13:27.134797755 +0100 -*************** -*** 25,35 **** - #ifndef __BFD_H_SEEN__ - #define __BFD_H_SEEN__ - -- /* PR 14072: Ensure that config.h is included first. */ -- #if !defined PACKAGE && !defined PACKAGE_VERSION -- #error config.h must be included before this header -- #endif -- - #ifdef __cplusplus - extern "C" { - #endif ---- 25,30 ---- -*** ../binutils-2.22.52.0.4.orig/bfd/bfd-in2.h 2012-08-02 10:56:34.349769680 +0100 ---- bfd/bfd-in2.h 2012-08-02 11:13:40.015798113 +0100 -*************** -*** 32,42 **** - #ifndef __BFD_H_SEEN__ - #define __BFD_H_SEEN__ - -- /* PR 14072: Ensure that config.h is included first. */ -- #if !defined PACKAGE && !defined PACKAGE_VERSION -- #error config.h must be included before this header -- #endif -- - #ifdef __cplusplus - extern "C" { - #endif ---- 32,37 ---- diff --git a/binutils/patches/binutils-2.23.2-aarch64-em.patch0 b/binutils/patches/binutils-2.23.2-aarch64-em.patch0 deleted file mode 100644 index f4aae4c5c..000000000 --- a/binutils/patches/binutils-2.23.2-aarch64-em.patch0 +++ /dev/null @@ -1,47 +0,0 @@ -*** ../binutils-2.23.2.orig/ld/emultempl/aarch64elf.em 2013-06-05 09:46:17.499278813 +0100 ---- ld/emultempl/aarch64elf.em 2013-06-05 09:54:36.981292659 +0100 -*************** gld${EMULATION_NAME}_after_allocation (v -*** 264,270 **** - } - - static void -! gld${EMULATION_NAME}_finish (void) - { - if (! link_info.relocatable) - { ---- 264,270 ---- - } - - static void -! gld${EMULATION_NAME}_local_finish (void) - { - if (! link_info.relocatable) - { -*************** gld${EMULATION_NAME}_finish (void) -*** 276,282 **** - } - } - -! finish_default (); - } - - /* This is a convenient point to tell BFD about target specific flags. ---- 276,282 ---- - } - } - -! gld${EMULATION_NAME}_finish (); - } - - /* This is a convenient point to tell BFD about target specific flags. -*************** LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS= -*** 413,416 **** - LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse - - # Call the extra arm-elf function -! LDEMUL_FINISH=gld${EMULATION_NAME}_finish ---- 413,416 ---- - LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse - - # Call the extra arm-elf function -! LDEMUL_FINISH=gld${EMULATION_NAME}_local_finish diff --git a/binutils/patches/binutils-2.23.2-kernel-ld-r.patch0 b/binutils/patches/binutils-2.23.2-kernel-ld-r.patch0 deleted file mode 100644 index 2ba70c599..000000000 --- a/binutils/patches/binutils-2.23.2-kernel-ld-r.patch0 +++ /dev/null @@ -1,2734 +0,0 @@ -diff -cpr ../binutils-2.23.2.orig/bfd/bfd.c bfd/bfd.c -*** ../binutils-2.23.2.orig/bfd/bfd.c 2013-05-14 16:39:24.681717759 +0100 ---- bfd/bfd.c 2013-05-14 16:40:06.988718932 +0100 -*************** CODE_FRAGMENT -*** 43,48 **** ---- 43,56 ---- - . both_direction = 3 - . }; - . -+ .enum bfd_lto_object_type -+ . { -+ . lto_non_object, -+ . lto_non_ir_object, -+ . lto_ir_object, -+ . lto_mixed_object -+ . }; -+ . - .struct bfd - .{ - . {* A unique identifier of the BFD *} -*************** CODE_FRAGMENT -*** 190,195 **** ---- 198,206 ---- - . {* The last section on the section list. *} - . struct bfd_section *section_last; - . -+ . {* The object-only section on the section list. *} -+ . struct bfd_section *object_only_section; -+ . - . {* The number of sections. *} - . unsigned int section_count; - . -*************** CODE_FRAGMENT -*** 308,313 **** ---- 319,327 ---- - . {* Set if only required symbols should be added in the link hash table for - . this object. Used by VMS linkers. *} - . unsigned int selective_search : 1; -+ . -+ . {* LTO object type. *} -+ . unsigned int lto_type : 2; - .}; - . - */ -*************** bfd_demangle (bfd *abfd, const char *nam -*** 2026,2028 **** ---- 2040,2075 ---- - - return res; - } -+ -+ /* -+ FUNCTION -+ bfd_group_signature -+ -+ SYNOPSIS -+ asymbol *bfd_group_signature (asection *group, asymbol **isympp); -+ -+ DESCRIPTION -+ Return a pointer to the symbol used as a signature for GROUP. -+ */ -+ -+ asymbol * -+ bfd_group_signature (asection *group, asymbol **isympp) -+ { -+ bfd *abfd = group->owner; -+ Elf_Internal_Shdr *ghdr; -+ -+ if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) -+ return NULL; -+ -+ ghdr = &elf_section_data (group)->this_hdr; -+ if (ghdr->sh_link < elf_numsections (abfd)) -+ { -+ const struct elf_backend_data *bed = get_elf_backend_data (abfd); -+ Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link]; -+ -+ if (symhdr->sh_type == SHT_SYMTAB -+ && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym) -+ return isympp[ghdr->sh_info - 1]; -+ } -+ return NULL; -+ } -diff -cpr ../binutils-2.23.2.orig/bfd/bfd-in2.h bfd/bfd-in2.h -*** ../binutils-2.23.2.orig/bfd/bfd-in2.h 2013-05-14 16:39:24.640717758 +0100 ---- bfd/bfd-in2.h 2013-05-14 16:42:03.217722154 +0100 -*************** struct bfd_section *bfd_create_gnu_debug -*** 1050,1055 **** ---- 1050,1058 ---- - bfd_boolean bfd_fill_in_gnu_debuglink_section - (bfd *abfd, struct bfd_section *sect, const char *filename); - -+ const char *bfd_extract_object_only_section -+ (bfd *abfd); -+ - /* Extracted from libbfd.c. */ - - /* Byte swapping macros for user section data. */ -*************** extern asection std_section[4]; -*** 1594,1599 **** ---- 1597,1605 ---- - || ((SEC) == bfd_com_section_ptr) \ - || ((SEC) == bfd_ind_section_ptr)) - -+ /* GNU object-only section name. */ -+ #define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only" -+ - /* Macros to handle insertion and deletion of a bfd's sections. These - only handle the list pointers, ie. do not adjust section_count, - target_index etc. */ -*************** enum bfd_direction -*** 5681,5686 **** ---- 5687,5700 ---- - both_direction = 3 - }; - -+ enum bfd_lto_object_type -+ { -+ lto_non_object, -+ lto_non_ir_object, -+ lto_ir_object, -+ lto_mixed_object -+ }; -+ - struct bfd - { - /* A unique identifier of the BFD */ -*************** struct bfd -*** 5828,5833 **** ---- 5842,5850 ---- - /* The last section on the section list. */ - struct bfd_section *section_last; - -+ /* The object-only section on the section list. */ -+ struct bfd_section *object_only_section; -+ - /* The number of sections. */ - unsigned int section_count; - -*************** struct bfd -*** 5946,5951 **** ---- 5963,5971 ---- - /* Set if only required symbols should be added in the link hash table for - this object. Used by VMS linkers. */ - unsigned int selective_search : 1; -+ -+ /* LTO object type. */ -+ unsigned int lto_type : 2; - }; - - typedef enum bfd_error -*************** void bfd_emul_set_commonpagesize (const -*** 6167,6172 **** ---- 6187,6194 ---- - - char *bfd_demangle (bfd *, const char *, int); - -+ asymbol *bfd_group_signature (asection *group, asymbol **isympp); -+ - /* Extracted from archive.c. */ - symindex bfd_get_next_mapent - (bfd *abfd, symindex previous, carsym **sym); -diff -cpr ../binutils-2.23.2.orig/bfd/elf.c bfd/elf.c -*** ../binutils-2.23.2.orig/bfd/elf.c 2013-05-14 16:39:25.317717777 +0100 ---- bfd/elf.c 2013-05-14 16:40:06.993718932 +0100 -*************** static const struct bfd_elf_special_sect -*** 2092,2097 **** ---- 2092,2098 ---- - { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, - { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE }, - { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, -+ { STRING_COMMA_LEN (".gnu_object_only"), 0, SHT_GNU_OBJECT_ONLY, SHF_EXCLUDE }, - { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 }, - { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 }, - { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 }, -diff -cpr ../binutils-2.23.2.orig/bfd/elflink.c bfd/elflink.c -*** ../binutils-2.23.2.orig/bfd/elflink.c 2013-05-14 16:39:25.280717776 +0100 ---- bfd/elflink.c 2013-05-14 16:40:06.997718932 +0100 -*************** elf_link_add_archive_symbols (bfd *abfd, -*** 5127,5132 **** ---- 5127,5135 ---- - something wrong with the archive. */ - if (element->archive_pass != 0) - { -+ /* Don't load the IR archive member twice. */ -+ if (element->lto_type == lto_ir_object) -+ continue; - bfd_set_error (bfd_error_bad_value); - goto error_return; - } -diff -cpr ../binutils-2.23.2.orig/bfd/format.c bfd/format.c -*** ../binutils-2.23.2.orig/bfd/format.c 2013-05-14 16:39:24.265717748 +0100 ---- bfd/format.c 2013-05-14 16:40:07.006718933 +0100 -*************** bfd_check_format (bfd *abfd, bfd_format -*** 95,100 **** ---- 95,127 ---- - return bfd_check_format_matches (abfd, format, NULL); - } - -+ /* Set lto_type in ABFD. */ -+ -+ static void -+ bfd_set_lto_type (bfd *abfd) -+ { -+ if (abfd->format == bfd_object -+ && abfd->lto_type == lto_non_object -+ && (abfd->flags & (DYNAMIC | EXEC_P)) == 0) -+ { -+ asection *sec; -+ enum bfd_lto_object_type type = lto_non_ir_object; -+ for (sec = abfd->sections; sec != NULL; sec = sec->next) -+ { -+ if (strcmp (sec->name, GNU_OBJECT_ONLY_SECTION_NAME) == 0) -+ { -+ type = lto_mixed_object; -+ abfd->object_only_section = sec; -+ break; -+ } -+ else if (type != lto_ir_object -+ && strncmp (sec->name, ".gnu.lto_", 9) == 0) -+ type = lto_ir_object; -+ } -+ abfd->lto_type = type; -+ } -+ } -+ - struct bfd_preserve - { - void *marker; -*************** bfd_check_format_matches (bfd *abfd, bfd -*** 136,142 **** - } - - if (abfd->format != bfd_unknown) -! return abfd->format == format; - - if (matching != NULL || *bfd_associated_vector != NULL) - { ---- 163,172 ---- - } - - if (abfd->format != bfd_unknown) -! { -! bfd_set_lto_type (abfd); -! return abfd->format == format; -! } - - if (matching != NULL || *bfd_associated_vector != NULL) - { -*************** bfd_check_format_matches (bfd *abfd, bfd -*** 322,327 **** ---- 352,360 ---- - - if (matching_vector) - free (matching_vector); -+ -+ bfd_set_lto_type (abfd); -+ - - /* File position has moved, BTW. */ - return TRUE; -diff -cpr ../binutils-2.23.2.orig/bfd/opncls.c bfd/opncls.c -*** ../binutils-2.23.2.orig/bfd/opncls.c 2013-05-14 16:39:23.701717732 +0100 ---- bfd/opncls.c 2013-05-14 16:40:07.008718933 +0100 -*************** bfd_fill_in_gnu_debuglink_section (bfd * -*** 1569,1571 **** ---- 1569,1637 ---- - - return TRUE; - } -+ -+ /* -+ FUNCTION -+ bfd_extract_object_only_section -+ -+ SYNOPSIS -+ const char *bfd_extract_object_only_section -+ (bfd *abfd); -+ -+ DESCRIPTION -+ -+ Takes a @var{ABFD} and extract the .gnu_object_only section into -+ a temporary file. -+ -+ RETURNS -+ The name of the temporary file is returned if all is ok. -+ Otherwise <> is returned and bfd_error is set. -+ */ -+ -+ const char * -+ bfd_extract_object_only_section (bfd *abfd) -+ { -+ asection *sec = abfd->object_only_section; -+ const char *name; -+ FILE *file; -+ bfd_byte *memhunk = NULL; -+ size_t off, size; -+ bfd_error_type err; -+ -+ /* Get a temporary object-only file. */ -+ name = make_temp_file (".obj-only.o"); -+ -+ /* Open the object-only file. */ -+ file = real_fopen (name, FOPEN_WB); -+ if (!bfd_get_full_section_contents (abfd, sec, &memhunk)) -+ { -+ err = bfd_get_error (); -+ -+ loser: -+ free (memhunk); -+ fclose (file); -+ unlink (name); -+ bfd_set_error (err); -+ return NULL; -+ } -+ -+ off = 0; -+ size = sec->size; -+ while (off != size) -+ { -+ size_t written, nwrite = size - off; -+ -+ written = fwrite (memhunk + off, 1, nwrite, file); -+ if (written < nwrite && ferror (file)) -+ { -+ err = bfd_error_system_call; -+ goto loser; -+ } -+ -+ off += written; -+ } -+ -+ free (memhunk); -+ fclose (file); -+ return name; -+ } -diff -cpr ../binutils-2.23.2.orig/bfd/plugin.c bfd/plugin.c -*** ../binutils-2.23.2.orig/bfd/plugin.c 2013-05-14 16:39:25.137717772 +0100 ---- bfd/plugin.c 2013-05-14 16:40:07.010718933 +0100 -*************** register_claim_file (ld_plugin_claim_fil -*** 130,135 **** ---- 130,268 ---- - return LDPS_OK; - } - -+ static asection bfd_plugin_fake_text_section -+ = BFD_FAKE_SECTION (bfd_plugin_fake_text_section, 0, 0, ".text", 0); -+ static asection bfd_plugin_fake_common_section -+ = BFD_FAKE_SECTION (bfd_plugin_fake_common_section, SEC_IS_COMMON, 0, -+ NULL, 0); -+ -+ /* Get symbols from object only section. */ -+ -+ static void -+ bfd_plugin_get_symbols_in_object_only (bfd *abfd) -+ { -+ struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; -+ const char *object_only_file; -+ bfd *nbfd; -+ long storage; -+ long object_only_nsyms, added_nsyms, i; -+ asymbol **object_only_syms, **added_syms; -+ -+ plugin_data->object_only_syms = NULL; -+ plugin_data->object_only_nsyms = 0; -+ -+ if (abfd->sections == NULL && abfd->my_archive == NULL) -+ { -+ nbfd = bfd_openr (abfd->filename, NULL); -+ if (nbfd == NULL || !bfd_check_format (nbfd, bfd_object)) -+ { -+ (*_bfd_error_handler) -+ (_("%s: failed to open to extract object only section: %s"), -+ abfd->filename, bfd_errmsg (bfd_get_error ())); -+ bfd_close (nbfd); -+ return; -+ } -+ } -+ else -+ { -+ if (!bfd_check_format (abfd, bfd_object)) -+ { -+ (*_bfd_error_handler) -+ (_("%B: invalid file to extract object only section: %s"), -+ abfd, bfd_errmsg (bfd_get_error ())); -+ return; -+ } -+ nbfd = abfd; -+ } -+ -+ if (nbfd->lto_type == lto_mixed_object -+ && (nbfd->flags & HAS_SYMS) != 0) -+ { -+ object_only_file = bfd_extract_object_only_section (nbfd); -+ if (object_only_file == NULL) -+ (*_bfd_error_handler) -+ (_("%B: failed to extract object only section: %s"), -+ abfd, bfd_errmsg (bfd_get_error ())); -+ } -+ else -+ object_only_file = NULL; -+ -+ /* Close the new bfd we just opened. */ -+ if (nbfd != abfd) -+ bfd_close (nbfd); -+ -+ /* Return if there is no object only section or there is no -+ symbol in object only section. */ -+ if (!object_only_file) -+ return; -+ -+ /* Open the file containing object only section. */ -+ nbfd = bfd_openr (object_only_file, NULL); -+ if (!bfd_check_format (nbfd, bfd_object)) -+ { -+ (*_bfd_error_handler) -+ (_("%B: failed to open object only section: %s"), -+ abfd, bfd_errmsg (bfd_get_error ())); -+ goto quit; -+ } -+ -+ storage = bfd_get_symtab_upper_bound (nbfd); -+ if (storage <= 0) -+ { -+ if (storage < 0) -+ (*_bfd_error_handler) -+ (_("%B: failed to get symbol table in object only section: %s"), -+ abfd, bfd_errmsg (bfd_get_error ())); -+ -+ goto quit; -+ } -+ -+ object_only_syms = (asymbol **) bfd_malloc (storage); -+ object_only_nsyms = bfd_canonicalize_symtab (nbfd, object_only_syms); -+ -+ /* FIXME: We waste some spaces if not all symbols are copied. */ -+ added_syms = (asymbol **) bfd_alloc (abfd, storage); -+ added_nsyms = 0; -+ -+ /* Copy only global symbols from object only section. */ -+ for (i = 0; i < object_only_nsyms; i++) -+ { -+ asection *sec = object_only_syms[i]->section; -+ flagword flags = object_only_syms[i]->flags; -+ asymbol *s; -+ -+ if (bfd_is_com_section (sec)) -+ sec = &bfd_plugin_fake_common_section; -+ else if (bfd_is_und_section (sec)) -+ ; -+ else if ((flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0) -+ sec = &bfd_plugin_fake_text_section; -+ else -+ continue; -+ -+ s = bfd_alloc (abfd, sizeof (asymbol)); -+ BFD_ASSERT (s); -+ added_syms[added_nsyms++] = s; -+ -+ s->section = sec; -+ s->the_bfd = abfd; -+ s->name = xstrdup (object_only_syms[i]->name); -+ s->value = 0; -+ s->flags = flags; -+ s->udata.p = NULL; -+ } -+ -+ plugin_data->object_only_syms = added_syms; -+ plugin_data->object_only_nsyms = added_nsyms; -+ -+ free (object_only_syms); -+ -+ quit: -+ /* Close and remove the object only section file. */ -+ bfd_close (nbfd); -+ unlink (object_only_file); -+ } -+ - static enum ld_plugin_status - add_symbols (void * handle, - int nsyms, -*************** add_symbols (void * handle, -*** 142,148 **** - plugin_data->nsyms = nsyms; - plugin_data->syms = syms; - -! if (nsyms != 0) - abfd->flags |= HAS_SYMS; - - abfd->tdata.plugin_data = plugin_data; ---- 275,283 ---- - plugin_data->nsyms = nsyms; - plugin_data->syms = syms; - -! bfd_plugin_get_symbols_in_object_only (abfd); -! -! if ((nsyms + plugin_data->object_only_nsyms) != 0) - abfd->flags |= HAS_SYMS; - - abfd->tdata.plugin_data = plugin_data; -*************** static long -*** 389,395 **** - bfd_plugin_get_symtab_upper_bound (bfd *abfd) - { - struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; -! long nsyms = plugin_data->nsyms; - - BFD_ASSERT (nsyms >= 0); - ---- 524,531 ---- - bfd_plugin_get_symtab_upper_bound (bfd *abfd) - { - struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; -! /* Add symbols from object only section. */ -! long nsyms = plugin_data->nsyms + plugin_data->object_only_nsyms; - - BFD_ASSERT (nsyms >= 0); - -*************** bfd_plugin_canonicalize_symtab (bfd *abf -*** 423,434 **** - struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; - long nsyms = plugin_data->nsyms; - const struct ld_plugin_symbol *syms = plugin_data->syms; -! static asection fake_section; -! static asection fake_common_section; -! int i; -! -! fake_section.name = ".text"; -! fake_common_section.flags = SEC_IS_COMMON; - - for (i = 0; i < nsyms; i++) - { ---- 559,565 ---- - struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; - long nsyms = plugin_data->nsyms; - const struct ld_plugin_symbol *syms = plugin_data->syms; -! int i, j; - - for (i = 0; i < nsyms; i++) - { -*************** bfd_plugin_canonicalize_symtab (bfd *abf -*** 441,450 **** - s->name = syms[i].name; - s->value = 0; - s->flags = convert_flags (&syms[i]); - switch (syms[i].def) - { - case LDPK_COMMON: -! s->section = &fake_common_section; - break; - case LDPK_UNDEF: - case LDPK_WEAKUNDEF: ---- 572,582 ---- - s->name = syms[i].name; - s->value = 0; - s->flags = convert_flags (&syms[i]); -+ s->udata.p = NULL; - switch (syms[i].def) - { - case LDPK_COMMON: -! s->section = &bfd_plugin_fake_common_section; - break; - case LDPK_UNDEF: - case LDPK_WEAKUNDEF: -*************** bfd_plugin_canonicalize_symtab (bfd *abf -*** 452,466 **** - break; - case LDPK_DEF: - case LDPK_WEAKDEF: -! s->section = &fake_section; - break; - default: - BFD_ASSERT (0); - } -- -- s->udata.p = (void *) &syms[i]; - } - - return nsyms; - } - ---- 584,601 ---- - break; - case LDPK_DEF: - case LDPK_WEAKDEF: -! s->section = &bfd_plugin_fake_text_section; - break; - default: - BFD_ASSERT (0); - } - } - -+ /* Copy symbols from object only section. */ -+ nsyms += plugin_data->object_only_nsyms; -+ for (j = 0; j < plugin_data->object_only_nsyms; j++, i++) -+ alocation[i] = plugin_data->object_only_syms[j]; -+ - return nsyms; - } - -diff -cpr ../binutils-2.23.2.orig/bfd/plugin.h bfd/plugin.h -*** ../binutils-2.23.2.orig/bfd/plugin.h 2013-05-14 16:39:25.481717782 +0100 ---- bfd/plugin.h 2013-05-14 16:40:07.010718933 +0100 -*************** typedef struct plugin_data_struct -*** 30,35 **** ---- 30,37 ---- - { - int nsyms; - const struct ld_plugin_symbol *syms; -+ int object_only_nsyms; -+ asymbol **object_only_syms; - } - plugin_data_struct; - -diff -cpr ../binutils-2.23.2.orig/bfd/section.c bfd/section.c -*** ../binutils-2.23.2.orig/bfd/section.c 2013-05-14 16:39:26.180717801 +0100 ---- bfd/section.c 2013-05-14 16:43:06.082723897 +0100 -*************** CODE_FRAGMENT -*** 571,576 **** ---- 571,579 ---- - . || ((SEC) == bfd_com_section_ptr) \ - . || ((SEC) == bfd_ind_section_ptr)) - . -+ .{* GNU object-only section name. *} -+ .#define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only" -+ . - .{* Macros to handle insertion and deletion of a bfd's sections. These - . only handle the list pointers, ie. do not adjust section_count, - . target_index etc. *} -diff -cpr ../binutils-2.23.2.orig/binutils/objcopy.c binutils/objcopy.c -*** ../binutils-2.23.2.orig/binutils/objcopy.c 2013-05-14 16:39:36.214718079 +0100 ---- binutils/objcopy.c 2013-05-14 16:45:04.631727183 +0100 -*************** is_specified_symbol (const char *name, h -*** 943,972 **** - return htab_find (htab, name) != NULL; - } - -- /* Return a pointer to the symbol used as a signature for GROUP. */ -- -- static asymbol * -- group_signature (asection *group) -- { -- bfd *abfd = group->owner; -- Elf_Internal_Shdr *ghdr; -- -- if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) -- return NULL; -- -- ghdr = &elf_section_data (group)->this_hdr; -- if (ghdr->sh_link < elf_numsections (abfd)) -- { -- const struct elf_backend_data *bed = get_elf_backend_data (abfd); -- Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link]; -- -- if (symhdr->sh_type == SHT_SYMTAB -- && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym) -- return isympp[ghdr->sh_info - 1]; -- } -- return NULL; -- } -- - /* Return TRUE if the section is a DWO section. */ - - static bfd_boolean ---- 943,948 ---- -*************** is_strip_section (bfd *abfd ATTRIBUTE_UN -*** 1034,1040 **** - /* PR binutils/3181 - If we are going to strip the group signature symbol, then - strip the group section too. */ -! gsym = group_signature (sec); - if (gsym != NULL) - gname = gsym->name; - else ---- 1010,1016 ---- - /* PR binutils/3181 - If we are going to strip the group signature symbol, then - strip the group section too. */ -! gsym = bfd_group_signature (sec, isympp); - if (gsym != NULL) - gname = gsym->name; - else -*************** setup_section (bfd *ibfd, sec_ptr isecti -*** 2633,2639 **** - - if ((isection->flags & SEC_GROUP) != 0) - { -! asymbol *gsym = group_signature (isection); - - if (gsym != NULL) - { ---- 2609,2615 ---- - - if ((isection->flags & SEC_GROUP) != 0) - { -! asymbol *gsym = bfd_group_signature (isection, isympp); - - if (gsym != NULL) - { -diff -cpr ../binutils-2.23.2.orig/binutils/readelf.c binutils/readelf.c -*** ../binutils-2.23.2.orig/binutils/readelf.c 2013-05-14 16:39:35.668718064 +0100 ---- binutils/readelf.c 2013-05-14 16:40:07.022718933 +0100 -*************** get_section_type_name (unsigned int sh_t -*** 3101,3106 **** ---- 3101,3107 ---- - case 0x7ffffffd: return "AUXILIARY"; - case 0x7fffffff: return "FILTER"; - case SHT_GNU_LIBLIST: return "GNU_LIBLIST"; -+ case SHT_GNU_OBJECT_ONLY: return "GNU_OBJECT_ONLY"; - - default: - if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC)) -diff -cpr ../binutils-2.23.2.orig/include/bfdlink.h include/bfdlink.h -*** ../binutils-2.23.2.orig/include/bfdlink.h 2013-05-14 16:39:19.745717623 +0100 ---- include/bfdlink.h 2013-05-14 16:40:07.023718933 +0100 -*************** struct bfd_link_info -*** 380,385 **** ---- 380,391 ---- - /* TRUE if ok to have multiple definition. */ - unsigned int allow_multiple_definition: 1; - -+ /* TRUE if .gnu_object_only section should be created. */ -+ unsigned int emit_gnu_object_only: 1; -+ -+ /* TRUE if .gnu_object_only section is being created. */ -+ unsigned int emitting_gnu_object_only: 1; -+ - /* TRUE if ok to have version with no definition. */ - unsigned int allow_undefined_version: 1; - -diff -cpr ../binutils-2.23.2.orig/include/elf/common.h include/elf/common.h -*** ../binutils-2.23.2.orig/include/elf/common.h 2013-05-14 16:39:19.628717619 +0100 ---- include/elf/common.h 2013-05-14 16:40:07.023718933 +0100 -*************** -*** 472,477 **** ---- 472,478 ---- - #define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes */ - #define SHT_GNU_HASH 0x6ffffff6 /* GNU style symbol hash table */ - #define SHT_GNU_LIBLIST 0x6ffffff7 /* List of prelink dependencies */ -+ #define SHT_GNU_OBJECT_ONLY 0x6ffffff8 /* Object only */ - - /* The next three section types are defined by Solaris, and are named - SHT_SUNW*. We use them in GNU code, so we also define SHT_GNU* -diff -cpr ../binutils-2.23.2.orig/ld/emultempl/alphaelf.em ld/emultempl/alphaelf.em -*** ../binutils-2.23.2.orig/ld/emultempl/alphaelf.em 2013-05-14 16:39:37.461718114 +0100 ---- ld/emultempl/alphaelf.em 2013-05-14 16:40:07.030718933 +0100 -*************** alpha_finish (void) -*** 100,106 **** - if (limit_32bit) - elf_elfheader (link_info.output_bfd)->e_flags |= EF_ALPHA_32BIT; - -! finish_default (); - } - EOF - ---- 100,106 ---- - if (limit_32bit) - elf_elfheader (link_info.output_bfd)->e_flags |= EF_ALPHA_32BIT; - -! gld${EMULATION_NAME}_finish (); - } - EOF - -diff -cpr ../binutils-2.23.2.orig/ld/emultempl/armelf.em ld/emultempl/armelf.em -*** ../binutils-2.23.2.orig/ld/emultempl/armelf.em 2013-05-14 16:39:37.458718114 +0100 ---- ld/emultempl/armelf.em 2013-05-14 16:40:07.033718933 +0100 -*************** gld${EMULATION_NAME}_after_allocation (v -*** 366,372 **** - } - - static void -! gld${EMULATION_NAME}_finish (void) - { - struct bfd_link_hash_entry * h; - ---- 366,372 ---- - } - - static void -! arm_finish (void) - { - struct bfd_link_hash_entry * h; - -*************** gld${EMULATION_NAME}_finish (void) -*** 389,395 **** - } - } - -! finish_default (); - - if (thumb_entry_symbol) - { ---- 389,395 ---- - } - } - -! gld${EMULATION_NAME}_finish (); - - if (thumb_entry_symbol) - { -*************** LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS= -*** 690,693 **** - LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse - - # Call the extra arm-elf function -! LDEMUL_FINISH=gld${EMULATION_NAME}_finish ---- 690,693 ---- - LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse - - # Call the extra arm-elf function -! LDEMUL_FINISH=arm_finish -diff -cpr ../binutils-2.23.2.orig/ld/emultempl/elf32.em ld/emultempl/elf32.em -*** ../binutils-2.23.2.orig/ld/emultempl/elf32.em 2013-05-14 16:39:37.465718114 +0100 ---- ld/emultempl/elf32.em 2013-05-14 16:40:07.035718933 +0100 -*************** static void gld${EMULATION_NAME}_before_ -*** 68,73 **** ---- 68,74 ---- - static void gld${EMULATION_NAME}_after_allocation (void); - static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan - (asection *, const char *, int); -+ static void gld${EMULATION_NAME}_finish (void); - EOF - - if [ "x${USE_LIBPATH}" = xyes ] ; then -*************** output_rel_find (asection *sec, int isdy -*** 1764,1769 **** ---- 1765,1772 ---- - return last; - } - -+ static int orphan_init_done = 0; -+ - /* Place an orphan section. We use this to put random SHF_ALLOC - sections in the right segment. */ - -*************** gld${EMULATION_NAME}_place_orphan (asect -*** 1772,1778 **** - const char *secname, - int constraint) - { -! static struct orphan_save hold[] = - { - { ".text", - SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE, ---- 1775,1781 ---- - const char *secname, - int constraint) - { -! static struct orphan_save orig_hold[] = - { - { ".text", - SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE, -*************** gld${EMULATION_NAME}_place_orphan (asect -*** 1799,1804 **** ---- 1802,1808 ---- - SEC_HAS_CONTENTS, - 0, 0, 0, 0 }, - }; -+ static struct orphan_save hold[ARRAY_SIZE (orig_hold)]; - enum orphan_save_index - { - orphan_text = 0, -*************** gld${EMULATION_NAME}_place_orphan (asect -*** 1810,1816 **** - orphan_sdata, - orphan_nonalloc - }; -- static int orphan_init_done = 0; - struct orphan_save *place; - lang_output_section_statement_type *after; - lang_output_section_statement_type *os; ---- 1814,1819 ---- -*************** gld${EMULATION_NAME}_place_orphan (asect -*** 1887,1901 **** - - if (!orphan_init_done) - { -! struct orphan_save *ho; - - for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho) - if (ho->name != NULL) - { - ho->os = lang_output_section_find (ho->name); - if (ho->os != NULL && ho->os->flags == 0) - ho->os->flags = ho->flags; - } - orphan_init_done = 1; - } - ---- 1890,1911 ---- - - if (!orphan_init_done) - { -! struct orphan_save *ho, *horig; - - for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho) -+ for (ho = hold, horig = orig_hold; -+ ho < hold + ARRAY_SIZE (hold); -+ ++ho, ++horig) -+ { -+ *ho = *horig; -+ if (ho->name != NULL) - if (ho->name != NULL) - { - ho->os = lang_output_section_find (ho->name); - if (ho->os != NULL && ho->os->flags == 0) - ho->os->flags = ho->flags; - } -+ } - orphan_init_done = 1; - } - -*************** gld${EMULATION_NAME}_place_orphan (asect -*** 1965,1970 **** ---- 1975,2001 ---- - EOF - fi - -+ fragment <header.type = cmdline_is_bfd_enum; -+ new_opt->header.next = NULL; -+ new_opt->abfd.abfd = (bfd *) data; -+ -+ c = cmdline_object_only_archive_list.head; -+ if (c == NULL) -+ { -+ cmdline_object_only_archive_list.head = new_opt; -+ cmdline_object_only_archive_list.tail = &new_opt->header.next; -+ return; -+ } -+ -+ prev = NULL; -+ origin = abfd->origin; -+ for (; c != NULL; c = next) -+ { -+ if (c->header.type != cmdline_is_bfd_enum) -+ abort (); -+ -+ next = c->header.next; -+ -+ obfd = c->abfd.abfd; -+ oarchive = bfd_my_archive (obfd); -+ -+ if (strcmp (archive->filename, oarchive->filename) == 0) -+ { -+ bfd_boolean after; -+ -+ if (origin < obfd->origin) -+ { -+ /* Insert it before the current. */ -+ new_opt->header.next = c; -+ if (prev) -+ *prev = new_opt; -+ else -+ cmdline_object_only_archive_list.head = new_opt; -+ return; -+ } -+ -+ after = TRUE; -+ -+ /* Check origin. */ -+ while (next) -+ { -+ if (next->header.type != cmdline_is_bfd_enum) -+ abort (); -+ -+ nbfd = next->abfd.abfd; -+ norigin = nbfd->origin; -+ if (origin > norigin) -+ { -+ /* Insert it after NEXT. */ -+ break; -+ } -+ -+ narchive = bfd_my_archive (nbfd); -+ if (strcmp (archive->filename, narchive->filename) != 0) -+ { -+ /* Insert it befor NEXT. */ -+ after = FALSE; -+ break; -+ } -+ -+ c = next; -+ next = next->header.next; -+ } -+ -+ if (after && next) -+ { -+ c = next; -+ next = next->header.next; -+ } -+ -+ if (*cmdline_object_only_archive_list.tail == c->header.next) -+ cmdline_object_only_archive_list.tail -+ = &new_opt->header.next; -+ -+ prev = &c->header.next; -+ new_opt->header.next = next; -+ *prev = new_opt; -+ return; -+ } -+ -+ prev = &c->header.next; -+ } -+ -+ *cmdline_object_only_archive_list.tail = new_opt; -+ cmdline_object_only_archive_list.tail = &new_opt->header.next; -+ } -+ -+ -+ static void -+ cmdline_get_object_only_input_files (void) -+ { -+ cmdline_union_type *c, *next; -+ bfd *abfd, *archive; -+ bfd *nbfd, *narchive; -+ -+ /* Add files first. */ -+ for (c = cmdline_object_only_file_list.head; -+ c != NULL; c = c->header.next) -+ switch (c->header.type) -+ { -+ default: -+ abort (); -+ case cmdline_is_file_enum: -+ lang_add_input_file (c->file.filename, -+ lang_input_file_is_file_enum, NULL); -+ break; -+ case cmdline_is_bfd_enum: -+ abfd = c->abfd.abfd; -+ if (bfd_my_archive (abfd)) -+ abort (); -+ lang_add_input_file (abfd->filename, -+ lang_input_file_is_file_enum, NULL); -+ break; -+ } -+ -+ /* Add archive members next. */ -+ for (c = cmdline_object_only_archive_list.head; c != NULL; c = next) -+ { -+ if (c->header.type != cmdline_is_bfd_enum) -+ abort (); -+ -+ next = c->header.next; -+ -+ abfd = c->abfd.abfd; -+ archive = bfd_my_archive (abfd); -+ -+ /* Add the first archive of the archive member group. */ -+ lang_add_input_file (archive->filename, -+ lang_input_file_is_file_enum, NULL); -+ -+ /* Skip the rest members in the archive member group. */ -+ do -+ { -+ if (!next) -+ break; -+ -+ if (next->header.type != cmdline_is_bfd_enum) -+ abort (); -+ -+ next = next->header.next; -+ if (!next) -+ break; -+ nbfd = next->abfd.abfd; -+ narchive = bfd_my_archive (nbfd); -+ } -+ while (strcmp (archive->filename, narchive->filename) == 0); -+ } -+ } -+ -+ struct cmdline_arg -+ { -+ bfd *obfd; -+ asymbol **isympp; -+ int status; -+ }; -+ -+ /* Create a section in OBFD with the same -+ name and attributes as ISECTION in IBFD. */ -+ -+ static void -+ setup_section (bfd *ibfd, sec_ptr isection, void *p) -+ { -+ struct cmdline_arg *arg = (struct cmdline_arg *) p; -+ bfd *obfd = arg->obfd; -+ asymbol **isympp = arg->isympp; -+ const char *name = isection->name; -+ sec_ptr osection; -+ const char *err; -+ -+ /* Skip the object-only section. */ -+ if (ibfd->object_only_section == isection) -+ return; -+ -+ /* If we have already failed earlier on, do not keep on generating -+ complaints now. */ -+ if (arg->status) -+ return; -+ -+ osection = bfd_make_section_anyway_with_flags (obfd, name, -+ isection->flags); -+ -+ if (osection == NULL) -+ { -+ err = _("failed to create output section"); -+ goto loser; -+ } -+ -+ osection->size = isection->size; -+ osection->vma = isection->vma; -+ osection->lma = isection->lma; -+ osection->alignment_power = isection->alignment_power; -+ -+ /* Copy merge entity size. */ -+ osection->entsize = isection->entsize; -+ -+ /* This used to be mangle_section; we do here to avoid using -+ bfd_get_section_by_name since some formats allow multiple -+ sections with the same name. */ -+ isection->output_section = osection; -+ isection->output_offset = 0; -+ -+ if ((isection->flags & SEC_GROUP) != 0) -+ { -+ asymbol *gsym = bfd_group_signature (isection, isympp); -+ -+ if (gsym != NULL) -+ { -+ gsym->flags |= BSF_KEEP; -+ if (ibfd->xvec->flavour == bfd_target_elf_flavour) -+ elf_group_id (isection) = gsym; -+ } -+ } -+ -+ /* Allow the BFD backend to copy any private data it understands -+ from the input section to the output section. */ -+ if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection)) -+ { -+ err = _("failed to copy private data"); -+ goto loser; -+ } -+ -+ /* All went well. */ -+ return; -+ -+ loser: -+ arg->status = 1; -+ einfo (_("%P%F: setup_section: %s: %s\n"), err, name); -+ } -+ -+ /* Copy the data of input section ISECTION of IBFD -+ to an output section with the same name in OBFD. -+ If stripping then don't copy any relocation info. */ -+ -+ static void -+ copy_section (bfd *ibfd, sec_ptr isection, void *p) -+ { -+ struct cmdline_arg *arg = (struct cmdline_arg *) p; -+ bfd *obfd = arg->obfd; -+ asymbol **isympp = arg->isympp; -+ arelent **relpp; -+ long relcount; -+ sec_ptr osection; -+ bfd_size_type size; -+ long relsize; -+ flagword flags; -+ const char *err; -+ -+ /* Skip the object-only section. */ -+ if (ibfd->object_only_section == isection) -+ return; -+ -+ /* If we have already failed earlier on, do not keep on generating -+ complaints now. */ -+ if (arg->status) -+ return; -+ -+ flags = bfd_get_section_flags (ibfd, isection); -+ if ((flags & SEC_GROUP) != 0) -+ return; -+ -+ osection = isection->output_section; -+ size = bfd_get_section_size (isection); -+ -+ if (size == 0 || osection == 0) -+ return; -+ -+ relsize = bfd_get_reloc_upper_bound (ibfd, isection); -+ -+ if (relsize < 0) -+ { -+ /* Do not complain if the target does not support relocations. */ -+ if (relsize == -1 -+ && bfd_get_error () == bfd_error_invalid_operation) -+ relsize = 0; -+ else -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ } -+ -+ if (relsize == 0) -+ bfd_set_reloc (obfd, osection, NULL, 0); -+ else -+ { -+ relpp = (arelent **) xmalloc (relsize); -+ relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp); -+ if (relcount < 0) -+ { -+ err = _("relocation count is negative"); -+ goto loser; -+ } -+ -+ bfd_set_reloc (obfd, osection, -+ relcount == 0 ? NULL : relpp, relcount); -+ if (relcount == 0) -+ free (relpp); -+ } -+ -+ if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS) -+ { -+ bfd_byte *memhunk = NULL; -+ -+ if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size)) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ free (memhunk); -+ } -+ -+ /* All went well. */ -+ return; -+ -+ loser: -+ einfo (_("%P%F: copy_section: %s: %s\n"), err, isection->name); -+ } -+ /* Open the temporary bfd created in the same directory as PATH. */ -+ -+ static bfd * -+ cmdline_fopen_temp (const char *path, const char *target, -+ const char *mode) -+ { -+ #define template "ldXXXXXX" -+ const char *slash = strrchr (path, '/'); -+ char *tmpname; -+ size_t len; -+ int fd; -+ -+ #ifdef HAVE_DOS_BASED_FILE_SYSTEM -+ { -+ /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */ -+ char *bslash = strrchr (path, '\\'); -+ -+ if (slash == NULL || (bslash != NULL && bslash > slash)) -+ slash = bslash; -+ if (slash == NULL && path[0] != '\0' && path[1] == ':') -+ slash = path + 1; -+ } -+ #endif -+ -+ if (slash != (char *) NULL) -+ { -+ len = slash - path; -+ tmpname = (char *) xmalloc (len + sizeof (template) + 2); -+ memcpy (tmpname, path, len); -+ -+ #ifdef HAVE_DOS_BASED_FILE_SYSTEM -+ /* If tmpname is "X:", appending a slash will make it a root -+ directory on drive X, which is NOT the same as the current -+ directory on drive X. */ -+ if (len == 2 && tmpname[1] == ':') -+ tmpname[len++] = '.'; -+ #endif -+ tmpname[len++] = '/'; -+ } -+ else -+ { -+ tmpname = (char *) xmalloc (sizeof (template)); -+ len = 0; -+ } -+ -+ memcpy (tmpname + len, template, sizeof (template)); -+ #undef template -+ -+ #ifdef HAVE_MKSTEMP -+ fd = mkstemp (tmpname); -+ #else -+ tmpname = mktemp (tmpname); -+ if (tmpname == NULL) -+ return NULL; -+ fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600); -+ #endif -+ if (fd == -1) -+ return NULL; -+ return bfd_fopen (tmpname, target, mode, fd); -+ } -+ -+ /* Add the object-only section. */ -+ -+ static void -+ cmdline_add_object_only_section (bfd_byte *contents, size_t size) -+ { -+ bfd_vma start; -+ flagword flags; -+ enum bfd_architecture iarch; -+ unsigned int imach; -+ long symcount; -+ long symsize; -+ asymbol **isympp = NULL; -+ asymbol **osympp = NULL; -+ bfd *obfd = NULL, *ibfd; -+ const char *err; -+ struct arg -+ { -+ bfd *obfd; -+ asymbol **isympp; -+ int status; -+ } arg; -+ char **matching; -+ const char *ofilename = NULL; -+ asection *sec; -+ -+ ibfd = bfd_openr (output_filename, output_target); -+ if (!ibfd) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ if (!bfd_check_format_matches (ibfd, bfd_object, &matching)) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ obfd = cmdline_fopen_temp (output_filename, output_target, "w"); -+ if (!obfd) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ ofilename = bfd_get_filename (obfd); -+ -+ if (!bfd_set_format (obfd, bfd_object)) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ /* Copy the start address, flags and architecture of input file to -+ output file. */ -+ flags = bfd_get_file_flags (ibfd); -+ start = bfd_get_start_address (ibfd); -+ iarch = bfd_get_arch (ibfd); -+ imach = bfd_get_mach (ibfd); -+ if (!bfd_set_start_address (obfd, start) -+ || !bfd_set_file_flags (obfd, flags) -+ || !bfd_set_arch_mach (obfd, iarch, imach)) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ symsize = bfd_get_symtab_upper_bound (ibfd); -+ if (symsize < 0) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ isympp = (asymbol **) xmalloc (symsize); -+ symcount = bfd_canonicalize_symtab (ibfd, isympp); -+ if (symcount < 0) -+ { -+ err = bfd_errmsg (bfd_get_error ()); -+ goto loser; -+ } -+ -+ arg.obfd = obfd; -+ arg.isympp = isympp; -+ arg.status = 0; -+ -+ /* BFD mandates that all output sections be created and sizes set before -+ any output is done. Thus, we traverse all sections multiple times. */ -+ bfd_map_over_sections (ibfd, setup_section, &arg); -+ -+ if (arg.status) -+ { -+ err = _("error setting up sections"); -+ goto loser; -+ } -+ -+ /* Allow the BFD backend to copy any private data it understands -+ from the input section to the output section. */ -+ if (! bfd_copy_private_header_data (ibfd, obfd)) -+ { -+ err = _("error copying private header data"); -+ goto loser; -+ } -+ -+ /* Create the object-only section. */ -+ sec = bfd_make_section_with_flags (obfd, -+ GNU_OBJECT_ONLY_SECTION_NAME, -+ (SEC_HAS_CONTENTS -+ | SEC_READONLY -+ | SEC_DATA -+ | SEC_LINKER_CREATED)); -+ if (sec == NULL) -+ { -+ err = _("can't create object-only section"); -+ goto loser; -+ } -+ -+ if (! bfd_set_section_size (obfd, sec, size)) -+ { -+ err = _("can't set object-only section size"); -+ goto loser; -+ } -+ -+ if (ibfd->object_only_section) -+ { -+ /* Filter out the object-only section symbol. */ -+ long src_count = 0, dst_count = 0; -+ asymbol **from, **to; -+ -+ osympp = (asymbol **) xmalloc (symcount * sizeof (asymbol *)); -+ from = isympp; -+ to = osympp; -+ for (; src_count < symcount; src_count++) -+ { -+ asymbol *sym = from[src_count]; -+ if (bfd_get_section (sym) != ibfd->object_only_section) -+ to[dst_count++] = sym; -+ } -+ to[dst_count] = NULL; -+ symcount = dst_count; -+ bfd_set_symtab (obfd, osympp, symcount); -+ } -+ else -+ bfd_set_symtab (obfd, isympp, symcount); -+ -+ /* This has to happen after the symbol table has been set. */ -+ bfd_map_over_sections (ibfd, copy_section, &arg); -+ -+ if (arg.status) -+ { -+ err = _("error copying sections"); -+ goto loser; -+ } -+ -+ /* Copy the object-only section to the output. */ -+ if (! bfd_set_section_contents (obfd, sec, contents, 0, size)) -+ { -+ err = _("error adding object-only section"); -+ goto loser; -+ } -+ -+ /* Allow the BFD backend to copy any private data it understands -+ from the input BFD to the output BFD. This is done last to -+ permit the routine to look at the filtered symbol table, which is -+ important for the ECOFF code at least. */ -+ if (! bfd_copy_private_bfd_data (ibfd, obfd)) -+ { -+ err = _("error copying private BFD data"); -+ goto loser; -+ } -+ -+ if (!bfd_close (obfd)) -+ { -+ unlink (ofilename); -+ einfo (_("%P%F: failed to finish output with object-only section\n")); -+ } -+ -+ /* Must be freed after bfd_close (). */ -+ free (isympp); -+ if (osympp) -+ free (osympp); -+ -+ if (rename (ofilename, output_filename)) -+ { -+ unlink (ofilename); -+ einfo (_("%P%F: failed to rename output with object-only section\n")); -+ } -+ -+ return; -+ -+ loser: -+ if (isympp) -+ free (isympp); -+ if (osympp) -+ free (osympp); -+ if (obfd) -+ bfd_close (obfd); -+ if (ofilename) -+ unlink (ofilename); -+ einfo (_("%P%F: failed to add object-only section: %s\n"), err); -+ } -+ -+ /* Emit the final output with object-only section. */ -+ -+ void -+ cmdline_emit_object_only_section (void) -+ { -+ const char *saved_output_filename = output_filename; -+ int fd; -+ size_t size, off; -+ bfd_byte *contents; -+ struct stat st; -+ -+ /* Get a temporary object-only file. */ -+ output_filename = make_temp_file (".obj-only.o"); -+ -+ had_output_filename = FALSE; -+ link_info.input_bfds = NULL; -+ link_info.input_bfds_tail = &link_info.input_bfds; -+ -+ lang_init (TRUE); -+ -+ ld_parse_linker_script (); -+ -+ /* Set up the object-only output. */ -+ lang_final (); -+ -+ /* Open the object-only file for output. */ -+ lang_for_each_statement (ldlang_open_output); -+ -+ ldemul_create_output_section_statements (); -+ -+ if (!bfd_section_already_linked_table_init ()) -+ einfo (_("%P%F: Failed to create hash table\n")); -+ -+ /* Call cmdline_on_object_only_archive_list_p to check which member -+ should be loaded. */ -+ input_flags.whole_archive = TRUE; -+ -+ /* Set it to avoid adding more to cmdline lists. */ -+ link_info.emitting_gnu_object_only = TRUE; -+ -+ cmdline_get_object_only_input_files (); -+ -+ open_input_bfds (statement_list.head, FALSE); -+ -+ ldemul_after_open (); -+ -+ bfd_section_already_linked_table_free (); -+ -+ /* Make sure that we're not mixing architectures. We call this -+ after all the input files have been opened, but before we do any -+ other processing, so that any operations merge_private_bfd_data -+ does on the output file will be known during the rest of the -+ link. */ -+ lang_check (); -+ -+ /* Size up the common data. */ -+ lang_common (); -+ -+ /* Update wild statements. */ -+ update_wild_statements (statement_list.head); -+ -+ /* Run through the contours of the script and attach input sections -+ to the correct output sections. */ -+ map_input_to_output_sections (statement_list.head, NULL, NULL); -+ -+ /* Find any sections not attached explicitly and handle them. */ -+ lang_place_orphans (); -+ -+ /* Do anything special before sizing sections. This is where ELF -+ and other back-ends size dynamic sections. */ -+ ldemul_before_allocation (); -+ -+ /* Size up the sections. */ -+ lang_size_sections (NULL, ! RELAXATION_ENABLED); -+ -+ /* See if anything special should be done now we know how big -+ everything is. This is where relaxation is done. */ -+ ldemul_after_allocation (); -+ -+ ldemul_finish (); -+ -+ /* Make sure that the section addresses make sense. */ -+ if (command_line.check_section_addresses) -+ lang_check_section_addresses (); -+ -+ lang_end (); -+ -+ ldwrite (); -+ -+ lang_finish (); -+ -+ if (! bfd_close (link_info.output_bfd)) -+ einfo (_("%P%F:%s: final close failed on object-only output: %E\n"), -+ output_filename); -+ -+ /* Read in the object-only file. */ -+ fd = open (output_filename, O_RDONLY | O_BINARY); -+ if (fd < 0) -+ { -+ bfd_set_error (bfd_error_system_call); -+ einfo (_("%P%F:%s: cannot open object-only output: %E"), -+ output_filename); -+ } -+ -+ /* Get the object-only file size. */ -+ if (fstat (fd, &st) != 0) -+ { -+ bfd_set_error (bfd_error_system_call); -+ einfo (_("%P%F:%s: cannot stat object-only output: %E"), -+ output_filename); -+ } -+ -+ size = st.st_size; -+ off = 0; -+ contents = (bfd_byte *) xmalloc (size); -+ while (off != size) -+ { -+ ssize_t got; -+ -+ got = read (fd, contents + off, size - off); -+ if (got < 0) -+ { -+ bfd_set_error (bfd_error_system_call); -+ einfo (_("%P%F:%s: read failed on object-only output: %E"), -+ output_filename); -+ } -+ -+ off += got; -+ } -+ -+ close (fd); -+ -+ /* Remove the temporary object-only file. */ -+ unlink (output_filename); -+ -+ output_filename = saved_output_filename; -+ -+ cmdline_add_object_only_section (contents, size); -+ -+ free (contents); -+ } -+ -+ /* Extract the object-only section. */ -+ -+ static const char * -+ cmdline_extract_object_only_section (bfd *abfd) -+ { -+ const char *name = bfd_extract_object_only_section (abfd); -+ -+ if (name == NULL) -+ einfo (_("%P%F: cannot extract object-only section from %B: %E"), -+ abfd); -+ -+ /* It should be removed after it is done. */ -+ cmdline_list_append (&cmdline_temp_object_only_list, -+ cmdline_is_file_enum, (void *) name); -+ -+ return name; -+ } -+ -+ /* Check and handle the object-only section. */ -+ -+ void -+ cmdline_check_object_only_section (bfd *abfd, bfd_boolean lto) -+ { -+ const char *filename; -+ -+ if (link_info.emitting_gnu_object_only -+ || abfd->format != bfd_object) -+ return; -+ -+ if (lto) -+ { -+ /* For LTO link, we only need to extract object-only section -+ from the mixed object, add it to input, and put it on LTO -+ claimed output. */ -+ switch (abfd->lto_type) -+ { -+ default: -+ abort (); -+ case lto_mixed_object: -+ filename = cmdline_extract_object_only_section (abfd); -+ lang_add_input_file (filename, -+ lang_input_file_is_file_enum, NULL); -+ break; -+ case lto_non_ir_object: -+ case lto_ir_object: -+ break; -+ } -+ } -+ else if (link_info.relocatable) -+ { -+ /* For non-LTO relocatable link, we need to append non-IR object -+ file and the object file in object-only section to the object -+ only list. */ -+ switch (abfd->lto_type) -+ { -+ default: -+ abort (); -+ case lto_mixed_object: -+ filename = cmdline_extract_object_only_section (abfd); -+ cmdline_object_only_list_append (cmdline_is_file_enum, -+ (void *) filename); -+ break; -+ case lto_non_ir_object: -+ cmdline_object_only_list_append (cmdline_is_bfd_enum, abfd); -+ break; -+ case lto_ir_object: -+ break; -+ } -+ } -+ } -+ -+ /* Remove temporary object-only files. */ -+ -+ void -+ cmdline_remove_object_only_files (void) -+ { -+ cmdline_union_type *c; -+ -+ #ifdef ENABLE_PLUGINS -+ if (plugin_save_temps) -+ return; -+ #endif -+ -+ c = cmdline_temp_object_only_list.head; -+ for (; c != NULL; c = c->header.next) -+ switch (c->header.type) -+ { -+ default: -+ abort (); -+ case cmdline_is_file_enum: -+ unlink (c->file.filename); -+ break; -+ } -+ } -+ -+ -+ -diff -cpr ../binutils-2.23.2.orig/ld/ldlang.h ld/ldlang.h -*** ../binutils-2.23.2.orig/ld/ldlang.h 2013-05-14 16:39:36.861718097 +0100 ---- ld/ldlang.h 2013-05-14 16:40:07.053718934 +0100 -*************** extern lang_statement_list_type input_fi -*** 488,494 **** - extern int lang_statement_iteration; - - extern void lang_init -! (void); - extern void lang_finish - (void); - extern lang_memory_region_type * lang_memory_region_lookup ---- 488,494 ---- - extern int lang_statement_iteration; - - extern void lang_init -! (bfd_boolean); - extern void lang_finish - (void); - extern lang_memory_region_type * lang_memory_region_lookup -*************** ldlang_override_segment_assignment -*** 664,667 **** ---- 664,708 ---- - extern void - lang_ld_feature (char *); - -+ typedef enum -+ { -+ cmdline_is_file_enum, -+ cmdline_is_bfd_enum -+ } cmdline_enum_type; -+ -+ typedef struct cmdline_header_struct -+ { -+ union cmdline_union *next; -+ cmdline_enum_type type; -+ } cmdline_header_type; -+ -+ typedef struct cmdline_file_struct -+ { -+ cmdline_header_type header; -+ const char *filename; -+ } cmdline_file_type; -+ -+ typedef struct cmdline_bfd_struct -+ { -+ cmdline_header_type header; -+ bfd *abfd; -+ } cmdline_bfd_type; -+ -+ typedef union cmdline_union -+ { -+ cmdline_header_type header; -+ cmdline_file_type file; -+ cmdline_bfd_type abfd; -+ } cmdline_union_type; -+ -+ typedef struct cmdline_list -+ { -+ cmdline_union_type *head; -+ cmdline_union_type **tail; -+ } cmdline_list_type; -+ -+ extern void cmdline_emit_object_only_section (void); -+ extern void cmdline_check_object_only_section (bfd *, bfd_boolean); -+ extern void cmdline_remove_object_only_files (void); -+ - #endif -diff -cpr ../binutils-2.23.2.orig/ld/ldlex.h ld/ldlex.h -*** ../binutils-2.23.2.orig/ld/ldlex.h 2013-05-14 16:39:39.789718178 +0100 ---- ld/ldlex.h 2013-05-14 16:47:18.651730898 +0100 -*************** enum option_values -*** 133,138 **** ---- 133,139 ---- - #ifdef ENABLE_PLUGINS - OPTION_PLUGIN, - OPTION_PLUGIN_OPT, -+ OPTION_PLUGIN_SAVE_TEMPS, - #endif /* ENABLE_PLUGINS */ - OPTION_DEFAULT_SCRIPT, - OPTION_PRINT_OUTPUT_FORMAT, -diff -cpr ../binutils-2.23.2.orig/ld/ldmain.c ld/ldmain.c -*** ../binutils-2.23.2.orig/ld/ldmain.c 2013-05-14 16:39:36.862718097 +0100 ---- ld/ldmain.c 2013-05-14 16:40:07.055718934 +0100 -*************** main (int argc, char **argv) -*** 219,224 **** ---- 219,227 ---- - - xatexit (ld_cleanup); - -+ /* Remove temporary object-only files. */ -+ xatexit (cmdline_remove_object_only_files); -+ - /* Set up the sysroot directory. */ - ld_sysroot = get_sysroot (argc, argv); - if (*ld_sysroot) -*************** main (int argc, char **argv) -*** 295,301 **** - default_target = ldemul_choose_target (argc, argv); - config.maxpagesize = bfd_emul_get_maxpagesize (default_target); - config.commonpagesize = bfd_emul_get_commonpagesize (default_target); -! lang_init (); - ldemul_before_parse (); - lang_has_input_file = FALSE; - parse_args (argc, argv); ---- 298,304 ---- - default_target = ldemul_choose_target (argc, argv); - config.maxpagesize = bfd_emul_get_maxpagesize (default_target); - config.commonpagesize = bfd_emul_get_commonpagesize (default_target); -! lang_init (FALSE); - ldemul_before_parse (); - lang_has_input_file = FALSE; - parse_args (argc, argv); -*************** main (int argc, char **argv) -*** 310,343 **** - - ldemul_set_symbols (); - -! /* If we have not already opened and parsed a linker script, -! try the default script from command line first. */ -! if (saved_script_handle == NULL -! && command_line.default_script != NULL) -! { -! ldfile_open_command_file (command_line.default_script); -! parser_input = input_script; -! yyparse (); -! } -! -! /* If we have not already opened and parsed a linker script -! read the emulation's appropriate default script. */ -! if (saved_script_handle == NULL) -! { -! int isfile; -! char *s = ldemul_get_script (&isfile); -! -! if (isfile) -! ldfile_open_default_command_file (s); -! else -! { -! lex_string = s; -! lex_redirect (s, _("built in linker script"), 1); -! } -! parser_input = input_script; -! yyparse (); -! lex_string = NULL; -! } - - if (verbose) - { ---- 313,319 ---- - - ldemul_set_symbols (); - -! ld_parse_linker_script (); - - if (verbose) - { -*************** main (int argc, char **argv) -*** 444,449 **** ---- 420,427 ---- - if (! bfd_close (link_info.output_bfd)) - einfo (_("%F%B: final close failed: %E\n"), link_info.output_bfd); - -+ link_info.output_bfd = NULL; -+ - /* If the --force-exe-suffix is enabled, and we're making an - executable file and it doesn't end in .exe, copy it to one - which does. */ -*************** main (int argc, char **argv) -*** 490,495 **** ---- 468,476 ---- - } - } - -+ if (link_info.emit_gnu_object_only) -+ cmdline_emit_object_only_section (); -+ - END_PROGRESS (program_name); - - if (config.stats) -*************** add_archive_element (struct bfd_link_inf -*** 779,785 **** ---- 760,768 ---- - } - } - } -+ else - #endif /* ENABLE_PLUGINS */ -+ cmdline_check_object_only_section (input->the_bfd, FALSE); - - ldlang_add_file (input); - -*************** warning_callback (struct bfd_link_info * -*** 1152,1158 **** - einfo ("%P: %s%s\n", _("warning: "), warning); - else if (symbol == NULL) - einfo ("%B: %s%s\n", abfd, _("warning: "), warning); -! else - { - struct warning_callback_info cinfo; - ---- 1135,1141 ---- - einfo ("%P: %s%s\n", _("warning: "), warning); - else if (symbol == NULL) - einfo ("%B: %s%s\n", abfd, _("warning: "), warning); -! else if ((abfd->flags & BFD_PLUGIN) == 0) - { - struct warning_callback_info cinfo; - -*************** notice (struct bfd_link_info *info, -*** 1459,1461 **** ---- 1442,1479 ---- - - return TRUE; - } -+ -+ /* Parse the linker script. */ -+ -+ void -+ ld_parse_linker_script () -+ { -+ /* If we have not already opened and parsed a linker script, -+ try the default script from command line first. */ -+ if (saved_script_handle == NULL -+ && command_line.default_script != NULL) -+ { -+ ldfile_open_command_file (command_line.default_script); -+ parser_input = input_script; -+ yyparse (); -+ } -+ -+ /* If we have not already opened and parsed a linker script -+ read the emulation's appropriate default script. */ -+ if (saved_script_handle == NULL) -+ { -+ int isfile; -+ char *s = ldemul_get_script (&isfile); -+ -+ if (isfile) -+ ldfile_open_default_command_file (s); -+ else -+ { -+ lex_string = s; -+ lex_redirect (s, _("built in linker script"), 1); -+ } -+ parser_input = input_script; -+ yyparse (); -+ lex_string = NULL; -+ } -+ } -diff -cpr ../binutils-2.23.2.orig/ld/ldmain.h ld/ldmain.h -*** ../binutils-2.23.2.orig/ld/ldmain.h 2013-05-14 16:39:39.810718179 +0100 ---- ld/ldmain.h 2013-05-14 16:40:07.055718934 +0100 -*************** extern void add_ysym (const char *); -*** 43,46 **** ---- 43,48 ---- - extern void add_ignoresym (struct bfd_link_info *, const char *); - extern void add_keepsyms_file (const char *); - -+ extern void ld_parse_linker_script (void); -+ - #endif -diff -cpr ../binutils-2.23.2.orig/ld/lexsup.c ld/lexsup.c -*** ../binutils-2.23.2.orig/ld/lexsup.c 2013-05-14 16:39:36.709718093 +0100 ---- ld/lexsup.c 2013-05-14 16:40:07.058718934 +0100 -*************** static const struct ld_option ld_options -*** 168,173 **** ---- 168,176 ---- - '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH }, - { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT}, - '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH }, -+ { {"plugin-save-temps", no_argument, NULL, OPTION_PLUGIN_SAVE_TEMPS}, -+ '\0', NULL, N_("Store plugin intermediate files permanently"), -+ ONE_DASH }, - { {"flto", optional_argument, NULL, OPTION_IGNORE}, - '\0', NULL, N_("Ignored for GCC LTO option compatibility"), - ONE_DASH }, -*************** parse_args (unsigned argc, char **argv) -*** 958,963 **** ---- 961,969 ---- - if (plugin_opt_plugin_arg (optarg)) - einfo(_("%P%F: bad -plugin-opt option\n")); - break; -+ case OPTION_PLUGIN_SAVE_TEMPS: -+ plugin_save_temps = TRUE; -+ break; - #endif /* ENABLE_PLUGINS */ - case 'q': - link_info.emitrelocations = TRUE; -diff -cpr ../binutils-2.23.2.orig/ld/plugin.c ld/plugin.c -*** ../binutils-2.23.2.orig/ld/plugin.c 2013-05-14 16:39:37.435718113 +0100 ---- ld/plugin.c 2013-05-14 16:48:59.039733681 +0100 -*************** -*** 39,44 **** ---- 39,47 ---- - /* Report plugin symbols. */ - bfd_boolean report_plugin_symbols; - -+ /* Store plugin intermediate files permanently. */ -+ bfd_boolean plugin_save_temps; -+ - /* The suffix to append to the name of the real (claimed) object file - when generating a dummy BFD to hold the IR symbols sent from the - plugin. For cosmetic use only; appears in maps, crefs etc. */ -*************** plugin_opt_plugin_arg (const char *arg) -*** 217,222 **** ---- 220,236 ---- - if (!last_plugin) - return set_plugin_error (_("")); - -+ /* Ignore -pass-through= from GCC driver. */ -+ if (*arg == '-') -+ { -+ const char *p; -+ for (p = arg + 1; p; p++) -+ if (*p != '-') -+ break; -+ if (strncmp (p, "pass-through=", 13) == 0) -+ return 0; -+ } -+ - newarg = xmalloc (sizeof *newarg); - newarg->arg = arg; - newarg->next = NULL; -*************** plugin_maybe_claim (struct ld_plugin_inp -*** 876,881 **** ---- 890,898 ---- - close (file->fd); - if (claimed) - { -+ /* Check object only section. */ -+ cmdline_check_object_only_section (entry->the_bfd, TRUE); -+ - /* Discard the real file's BFD and substitute the dummy one. */ - - /* BFD archive handling caches elements so we can't call -*************** plugin_call_cleanup (void) -*** 929,942 **** - { - if (curplug->cleanup_handler && !curplug->cleanup_done) - { -! enum ld_plugin_status rv; -! curplug->cleanup_done = TRUE; -! called_plugin = curplug; -! rv = (*curplug->cleanup_handler) (); -! called_plugin = NULL; -! if (rv != LDPS_OK) -! info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), -! curplug->name, rv); - dlclose (curplug->dlhandle); - } - curplug = curplug->next; ---- 946,962 ---- - { - if (curplug->cleanup_handler && !curplug->cleanup_done) - { -! if (!plugin_save_temps) -! { -! enum ld_plugin_status rv; -! curplug->cleanup_done = TRUE; -! called_plugin = curplug; -! rv = (*curplug->cleanup_handler) (); -! called_plugin = NULL; -! if (rv != LDPS_OK) -! info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), -! curplug->name, rv); -! } - dlclose (curplug->dlhandle); - } - curplug = curplug->next; -diff -cpr ../binutils-2.23.2.orig/ld/plugin.h ld/plugin.h -*** ../binutils-2.23.2.orig/ld/plugin.h 2013-05-14 16:39:39.705718176 +0100 ---- ld/plugin.h 2013-05-14 16:40:07.059718934 +0100 -*************** -*** 24,29 **** ---- 24,32 ---- - /* Report plugin symbols. */ - extern bfd_boolean report_plugin_symbols; - -+ /* Store plugin intermediate files permanently. */ -+ extern bfd_boolean plugin_save_temps; -+ - /* Set at all symbols read time, to avoid recursively offering the plugin - its own newly-added input files and libs to claim. */ - extern bfd_boolean no_more_claiming; -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/armbpabi.sc ld/scripttempl/armbpabi.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/armbpabi.sc 2013-05-14 16:39:39.758718177 +0100 ---- ld/scripttempl/armbpabi.sc 2013-05-14 16:54:15.657742458 +0100 -*************** INTERP=".interp 0 : { *(.interp) } -*** 30,36 **** - PLT=".plt ${RELOCATING-0} : { *(.plt) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".sbss ${RELOCATING-0} : - { ---- 30,36 ---- - PLT=".plt ${RELOCATING-0} : { *(.plt) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".sbss ${RELOCATING-0} : - { -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elf32sh-symbian.sc ld/scripttempl/elf32sh-symbian.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/elf32sh-symbian.sc 2013-05-14 16:39:39.759718177 +0100 ---- ld/scripttempl/elf32sh-symbian.sc 2013-05-14 16:40:07.062718934 +0100 -*************** fi -*** 83,89 **** - PLT=".plt : { *(.plt) } :dynamic :dyn" - DYNAMIC=".dynamic : { *(.dynamic) } :dynamic :dyn" - RODATA=".rodata ALIGN(4) : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive) *(.gnu.lto_*) }" - test -z "$GOT" && GOT=".got ${RELOCATING-0} : { *(.got.plt) *(.got) } :dynamic :dyn" - INIT_ARRAY=".init_array ${RELOCATING-0} : - { ---- 83,89 ---- - PLT=".plt : { *(.plt) } :dynamic :dyn" - DYNAMIC=".dynamic : { *(.dynamic) } :dynamic :dyn" - RODATA=".rodata ALIGN(4) : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive) *(.gnu.lto_*) *(.gnu_object_only) }" - test -z "$GOT" && GOT=".got ${RELOCATING-0} : { *(.got.plt) *(.got) } :dynamic :dyn" - INIT_ARRAY=".init_array ${RELOCATING-0} : - { -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elf64hppa.sc ld/scripttempl/elf64hppa.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/elf64hppa.sc 2013-05-14 16:39:39.733718177 +0100 ---- ld/scripttempl/elf64hppa.sc 2013-05-14 16:55:16.076744133 +0100 -*************** fi -*** 127,133 **** - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".sbss ${RELOCATING-0} : - { ---- 127,133 ---- - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".sbss ${RELOCATING-0} : - { -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elf.sc ld/scripttempl/elf.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/elf.sc 2013-05-14 16:39:39.755718177 +0100 ---- ld/scripttempl/elf.sc 2013-05-14 16:54:44.618743261 +0100 -*************** RELA_IPLT=".rela.iplt ${RELOCATING-0} -*** 158,164 **** - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".${RODATA_NAME} ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".${SBSS_NAME} ${RELOCATING-0} : - { ---- 158,164 ---- - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".${RODATA_NAME} ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".${SBSS_NAME} ${RELOCATING-0} : - { -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/elfxtensa.sc ld/scripttempl/elfxtensa.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/elfxtensa.sc 2013-05-14 16:39:39.754718177 +0100 ---- ld/scripttempl/elfxtensa.sc 2013-05-14 16:55:44.908744932 +0100 -*************** fi -*** 140,146 **** - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" - INIT_LIT=".init.literal 0 : { *(.init.literal) }" - INIT=".init 0 : { *(.init) }" - FINI_LIT=".fini.literal 0 : { *(.fini.literal) }" ---- 140,146 ---- - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" - INIT_LIT=".init.literal 0 : { *(.init.literal) }" - INIT=".init 0 : { *(.init) }" - FINI_LIT=".fini.literal 0 : { *(.fini.literal) }" -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/mep.sc ld/scripttempl/mep.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/mep.sc 2013-05-14 16:39:39.755718177 +0100 ---- ld/scripttempl/mep.sc 2013-05-14 16:56:08.605745589 +0100 -*************** fi -*** 114,120 **** - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".sbss ${RELOCATING-0} : - { ---- 114,120 ---- - DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" - RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" - DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }" -! DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" - if test -z "${NO_SMALL_DATA}"; then - SBSS=".sbss ${RELOCATING-0} : - { -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/pep.sc ld/scripttempl/pep.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/pep.sc 2013-05-14 16:39:39.755718177 +0100 ---- ld/scripttempl/pep.sc 2013-05-14 16:40:07.064718934 +0100 -*************** SECTIONS -*** 154,159 **** ---- 154,160 ---- - *(.drectve) - ${RELOCATING+ *(.note.GNU-stack)} - ${RELOCATING+ *(.gnu.lto_*)} -+ ${RELOCATING+ *(.gnu_object_only)} - } - - .idata ${RELOCATING+BLOCK(__section_alignment__)} : -diff -cpr ../binutils-2.23.2.orig/ld/scripttempl/pe.sc ld/scripttempl/pe.sc -*** ../binutils-2.23.2.orig/ld/scripttempl/pe.sc 2013-05-14 16:39:39.758718177 +0100 ---- ld/scripttempl/pe.sc 2013-05-14 16:40:07.064718934 +0100 -*************** SECTIONS -*** 148,153 **** ---- 148,154 ---- - *(.drectve) - ${RELOCATING+ *(.note.GNU-stack)} - ${RELOCATING+ *(.gnu.lto_*)} -+ ${RELOCATING+ *(.gnu_object_only)} - } - - .idata ${RELOCATING+BLOCK(__section_alignment__)} : diff --git a/binutils/patches/binutils-2.23.52.0.1-addr2line-dynsymtab.patch b/binutils/patches/binutils-2.23.52.0.1-addr2line-dynsymtab.patch new file mode 100644 index 000000000..944f4fdd3 --- /dev/null +++ b/binutils/patches/binutils-2.23.52.0.1-addr2line-dynsymtab.patch @@ -0,0 +1,38 @@ +--- a/bfd/opncls.c 2013-03-14 11:25:30.338306122 +0000 ++++ b/bfd/opncls.c 2013-03-14 12:20:21.686397360 +0000 +@@ -1297,6 +1297,8 @@ + bfd_malloc (strlen (debug_file_directory) + 1 + + (canon_dirlen > dirlen ? canon_dirlen : dirlen) + + strlen (".debug/") ++#define FEDORA_LIB_DEBUG_DIR "/usr/lib/debug/" ++ + strlen (FEDORA_LIB_DEBUG_DIR) + strlen ("usr/") + + strlen (base) + + 1); + if (debugfile == NULL) +@@ -1332,6 +1334,26 @@ + if (check_func (debugfile, crc32)) + goto found; + ++ /* Then try in the global debug dir for Fedora libraries. */ ++ sprintf (debugfile, "%s%s%s", FEDORA_LIB_DEBUG_DIR, dir, base); ++ if (separate_debug_file_exists (debugfile, crc32)) ++ { ++ free (base); ++ free (dir); ++ free (canon_dir); ++ return debugfile; ++ } ++ ++ /* Then try in the usr subdirectory of the global debug dir for Fedora libraries. */ ++ sprintf (debugfile, "%s/usr%s%s", FEDORA_LIB_DEBUG_DIR, dir, base); ++ if (separate_debug_file_exists (debugfile, crc32)) ++ { ++ free (base); ++ free (dir); ++ free (canon_dir); ++ return debugfile; ++ } ++ + /* Then try in the global debugfile directory. */ + strcpy (debugfile, debug_file_directory); + dirlen = strlen (debug_file_directory) - 1; diff --git a/binutils/patches/binutils-2.23.52.0.1-addr2line-dynsymtab.patch0 b/binutils/patches/binutils-2.23.52.0.1-addr2line-dynsymtab.patch0 deleted file mode 100644 index 68f0470ae..000000000 --- a/binutils/patches/binutils-2.23.52.0.1-addr2line-dynsymtab.patch0 +++ /dev/null @@ -1,122 +0,0 @@ -*** ../binutils-2.23.52.0.1.orig/bfd/opncls.c 2013-03-14 11:25:30.338306122 +0000 ---- bfd/opncls.c 2013-03-14 12:20:21.686397360 +0000 -*************** find_separate_debug_file (bfd *abfd, con -*** 1297,1302 **** ---- 1297,1304 ---- - bfd_malloc (strlen (debug_file_directory) + 1 - + (canon_dirlen > dirlen ? canon_dirlen : dirlen) - + strlen (".debug/") -+ #define FEDORA_LIB_DEBUG_DIR "/usr/lib/debug/" -+ + strlen (FEDORA_LIB_DEBUG_DIR) + strlen ("usr/") - + strlen (base) - + 1); - if (debugfile == NULL) -*************** find_separate_debug_file (bfd *abfd, con -*** 1332,1337 **** ---- 1334,1359 ---- - if (check_func (debugfile, crc32)) - goto found; - -+ /* Then try in the global debug dir for Fedora libraries. */ -+ sprintf (debugfile, "%s%s%s", FEDORA_LIB_DEBUG_DIR, dir, base); -+ if (separate_debug_file_exists (debugfile, crc32)) -+ { -+ free (base); -+ free (dir); -+ free (canon_dir); -+ return debugfile; -+ } -+ -+ /* Then try in the usr subdirectory of the global debug dir for Fedora libraries. */ -+ sprintf (debugfile, "%s/usr%s%s", FEDORA_LIB_DEBUG_DIR, dir, base); -+ if (separate_debug_file_exists (debugfile, crc32)) -+ { -+ free (base); -+ free (dir); -+ free (canon_dir); -+ return debugfile; -+ } -+ - /* Then try in the global debugfile directory. */ - strcpy (debugfile, debug_file_directory); - dirlen = strlen (debug_file_directory) - 1; -*** ../binutils-2.23.52.0.1.orig/bfd/dwarf2.c 2013-03-14 11:25:30.608306129 +0000 ---- bfd/dwarf2.c 2013-03-14 13:14:18.102487075 +0000 -*************** find_line (bfd *abfd, -*** 3339,3346 **** ---- 3339,3349 ---- - struct dwarf2_debug *stash; - /* What address are we looking for? */ - bfd_vma addr; -+ /* What is the address without relocation ? */ -+ bfd_vma unrelocated_addr; - struct comp_unit* each; - bfd_vma found = FALSE; -+ bfd_vma possible_find = FALSE; - bfd_boolean do_line; - - *filename_ptr = NULL; -*************** find_line (bfd *abfd, -*** 3380,3385 **** ---- 3383,3394 ---- - else - abort (); - -+ /* If we are dealing with PIC code then the debug information -+ will be based on unrelocated addresses. Since we cannot be -+ sure if this is a PIC address we test both with and without -+ relocation. */ -+ unrelocated_addr = addr; -+ - if (section->output_section) - addr += section->output_section->vma + section->output_offset; - else -*************** find_line (bfd *abfd, -*** 3442,3447 **** ---- 3451,3466 ---- - stash)); - if (found) - goto done; -+ -+ if (! possible_find) -+ possible_find = ((each->arange.high == 0 -+ || comp_unit_contains_address (each, unrelocated_addr)) -+ && comp_unit_find_nearest_line (each, unrelocated_addr, -+ filename_ptr, -+ functionname_ptr, -+ linenumber_ptr, -+ discriminator_ptr, -+ stash)); - } - } - -*************** find_line (bfd *abfd, -*** 3535,3540 **** ---- 3554,3569 ---- - discriminator_ptr, - stash)); - -+ if (! found && ! do_line && ! possible_find) -+ possible_find = ((each->arange.high == 0 -+ || comp_unit_contains_address (each, unrelocated_addr)) -+ && comp_unit_find_nearest_line (each, unrelocated_addr, -+ filename_ptr, -+ functionname_ptr, -+ linenumber_ptr, -+ discriminator_ptr, -+ stash)); -+ - if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr) - == stash->sec->size) - { -*************** find_line (bfd *abfd, -*** 3552,3557 **** ---- 3581,3588 ---- - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) - unset_sections (stash); - -+ if (! found) -+ return possible_find; - return found; - } - diff --git a/binutils/patches/binutils-2.23.52.0.1-hardened-crtbegin.patch b/binutils/patches/binutils-2.23.52.0.1-hardened-crtbegin.patch deleted file mode 100644 index 996bce5fc..000000000 --- a/binutils/patches/binutils-2.23.52.0.1-hardened-crtbegin.patch +++ /dev/null @@ -1,39 +0,0 @@ -https://bugs.gentoo.org/391899 -https://bugs.gentoo.org/393321 - -Make sure the default ELF linker script does the right thing with our customer -PIE+PIC gcc objects (until we get a chance to rename them). - -2011-12-05 Magnus Granberg , Alphat-PC - - * scripttempl/elf.sc: Add support for crtbeginTS.o - ---- a/ld/scripttempl/elf.sc -+++ b/ld/scripttempl/elf.sc -@@ -225,8 +225,8 @@ - if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then - SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))" - SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))" -- CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors" -- DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors" -+ CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtbeginTS.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors" -+ DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtbeginTS.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors" - else - SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))" - SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))" -@@ -264,6 +264,7 @@ - - KEEP (*crtbegin.o(.ctors)) - KEEP (*crtbegin?.o(.ctors)) -+ KEEP (*crtbeginTS.o(.ctors)) - - /* We don't want to include the .ctor section from - the crtend.o file until after the sorted ctors. -@@ -280,6 +281,7 @@ - ${CONSTRUCTING+${DTOR_START}} - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) -+ KEEP (*crtbeginTS.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) diff --git a/binutils/patches/binutils-2.24-DW_FORM_ref_addr.patch0 b/binutils/patches/binutils-2.24-DW_FORM_ref_addr.patch0 deleted file mode 100644 index 92ef15054..000000000 --- a/binutils/patches/binutils-2.24-DW_FORM_ref_addr.patch0 +++ /dev/null @@ -1,44 +0,0 @@ -*** ../binutils-2.24.orig/bfd/dwarf2.c 2014-01-28 11:58:02.072737296 +0000 ---- bfd/dwarf2.c 2014-01-28 11:59:38.575739971 +0000 -*************** find_abstract_instance_name (struct comp -*** 2126,2131 **** ---- 2126,2153 ---- - abort (); - - info_ptr = unit->sec_info_ptr + die_ref; -+ -+ /* Now find the CU containing this pointer. */ -+ if (info_ptr >= unit->info_ptr_unit && info_ptr < unit->end_ptr) -+ ; -+ else -+ { -+ /* Check other CUs to see if they contain the abbrev. */ -+ struct comp_unit * u; -+ -+ for (u = unit->prev_unit; u != NULL; u = u->prev_unit) -+ if (info_ptr >= u->info_ptr_unit && info_ptr < u->end_ptr) -+ break; -+ -+ if (u == NULL) -+ for (u = unit->next_unit; u != NULL; u = u->next_unit) -+ if (info_ptr >= u->info_ptr_unit && info_ptr < u->end_ptr) -+ break; -+ -+ if (u) -+ unit = u; -+ /* else FIXME: What do we do now ? */ -+ } - } - else if (attr_ptr->form == DW_FORM_GNU_ref_alt) - { -*************** find_abstract_instance_name (struct comp -*** 2137,2142 **** ---- 2159,2166 ---- - bfd_set_error (bfd_error_bad_value); - return name; - } -+ /* FIXME: Do we need to locate the correct CU, in a similar -+ fashion to the code in the DW_FORM_ref_addr case above ? */ - } - else - info_ptr = unit->info_ptr_unit + die_ref; diff --git a/binutils/patches/binutils-2.24-aarch64-fix-final_link_relocate.patch b/binutils/patches/binutils-2.24-aarch64-fix-final_link_relocate.patch deleted file mode 100644 index 8c2d37b55..000000000 --- a/binutils/patches/binutils-2.24-aarch64-fix-final_link_relocate.patch +++ /dev/null @@ -1,54 +0,0 @@ -commit f44a1f8e513b37bcc52ba9ea0c172c3e94852756 -Author: Christophe Lyon -Date: Tue Jan 14 15:53:50 2014 +0100 - - 2014-01-14 Michael Hudson-Doyle - Kugan Vivekanandarajah - - bfd/ - * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Use correct - offset while calculating relocation address. - (elfNN_aarch64_create_small_pltn_entry): Likewise. - (elfNN_aarch64_init_small_plt0_entry): Likewise. - ---- a/bfd/elfnn-aarch64.c -+++ b/bfd/elfnn-aarch64.c -@@ -3844,7 +3844,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, - - value = (symbol_got_offset (input_bfd, h, r_symndx) - + globals->root.sgot->output_section->vma -- + globals->root.sgot->output_section->output_offset); -+ + globals->root.sgot->output_offset); - - value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, - 0, weak_undef_p); -@@ -3873,10 +3873,9 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, - case BFD_RELOC_AARCH64_TLSDESC_LDR: - if (globals->root.sgot == NULL) - return bfd_reloc_notsupported; -- - value = (symbol_tlsdesc_got_offset (input_bfd, h, r_symndx) - + globals->root.sgotplt->output_section->vma -- + globals->root.sgotplt->output_section->output_offset -+ + globals->root.sgotplt->output_offset - + globals->sgotplt_jump_table_size); - - value = _bfd_aarch64_elf_resolve_relocation (bfd_r_type, place, value, -@@ -6627,7 +6626,7 @@ elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h, - - plt_entry = plt->contents + h->plt.offset; - plt_entry_address = plt->output_section->vma -- + plt->output_section->output_offset + h->plt.offset; -+ + plt->output_offset + h->plt.offset; - gotplt_entry_address = gotplt->output_section->vma + - gotplt->output_offset + got_offset; - -@@ -6934,7 +6933,7 @@ elfNN_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED, - + GOT_ENTRY_SIZE * 2); - - plt_base = htab->root.splt->output_section->vma + -- htab->root.splt->output_section->output_offset; -+ htab->root.splt->output_offset; - - /* Fill in the top 21 bits for this: ADRP x16, PLT_GOT + n * 8. - ADRP: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ diff --git a/binutils/patches/binutils-2.24-aarch64-fix-gotplt-offset-ifunc.patch b/binutils/patches/binutils-2.24-aarch64-fix-gotplt-offset-ifunc.patch deleted file mode 100644 index 64a1d9c23..000000000 --- a/binutils/patches/binutils-2.24-aarch64-fix-gotplt-offset-ifunc.patch +++ /dev/null @@ -1,103 +0,0 @@ -commit 67428c4aa56d4183d0f531e0d752040745a94423 -Author: Will Newton -Date: Mon Nov 25 11:07:07 2013 +0000 - - bfd/elfnn-aarch64.c: Fix miscalculation of GOTPLT offset for ifunc syms. - - The .got.plt header size was not being correctly taken into account - when calculating the offset for relocations against ifunc symbols. - - bfd/ChangeLog: - - 2013-11-26 Will Newton - - * elfnn-aarch64.c (elfNN_aarch64_final_link_relocate): Ensure - PLT_INDEX is calculated using correct header size. - - ld/testsuite/ChangeLog: - - 2013-11-26 Will Newton - - * ld-aarch64/aarch64-elf.exp: Add ifunc-21 test. - * ld-aarch64/ifunc-21.d: New file. - * ld-aarch64/ifunc-21.s: Likewise. - -diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c -index 6bc414e..3cd3a18 100644 ---- a/bfd/elfnn-aarch64.c -+++ b/bfd/elfnn-aarch64.c -@@ -3589,7 +3589,8 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto, - - if (globals->root.splt != NULL) - { -- plt_index = h->plt.offset / globals->plt_entry_size - 1; -+ plt_index = ((h->plt.offset - globals->plt_header_size) / -+ globals->plt_entry_size); - off = (plt_index + 3) * GOT_ENTRY_SIZE; - base_got = globals->root.sgotplt; - } -diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp -index 5c150dd..a6b3ea2 100644 ---- a/ld/testsuite/ld-aarch64/aarch64-elf.exp -+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp -@@ -155,3 +155,4 @@ run_dump_test "ifunc-18b" - run_dump_test "ifunc-19a" - run_dump_test "ifunc-19b" - run_dump_test "ifunc-20" -+run_dump_test "ifunc-21" -diff --git a/ld/testsuite/ld-aarch64/ifunc-21.d b/ld/testsuite/ld-aarch64/ifunc-21.d -new file mode 100644 -index 0000000..fa139b2 ---- /dev/null -+++ b/ld/testsuite/ld-aarch64/ifunc-21.d -@@ -0,0 +1,31 @@ -+#source: ifunc-21.s -+#ld: -shared -z nocombreloc -+#objdump: -d -s -j .got.plt -j .text -+#target: aarch64*-*-* -+ -+# Ensure the .got.plt slot used is correct -+ -+.*: file format elf64-(little|big)aarch64 -+ -+Contents of section .text: -+ 02a0 .* -+Contents of section .got.plt: -+ 103a8 0+ 0+ 0+ 0+ .* -+ 103b8 0+ 0+ [0-9a-f]+ 0+ .* -+ -+Disassembly of section .text: -+ -+0+2a0 : -+ 2a0: d65f03c0 ret -+ -+0+2a4 : -+ 2a4: 90000080 adrp x0, 10000 <.*> -+ 2a8: f941e000 ldr x0, \[x0,#960\] -+ 2ac: d65f03c0 ret -+ -+Disassembly of section .got.plt: -+ -+.*: -+.* -+.* -+.* -diff --git a/ld/testsuite/ld-aarch64/ifunc-21.s b/ld/testsuite/ld-aarch64/ifunc-21.s -new file mode 100644 -index 0000000..a1563dc ---- /dev/null -+++ b/ld/testsuite/ld-aarch64/ifunc-21.s -@@ -0,0 +1,13 @@ -+ .text -+ .type ifunc, @gnu_indirect_function -+ .hidden ifunc -+ifunc: -+ ret -+ .size ifunc, .-ifunc -+ .type bar, @function -+ .globl bar -+bar: -+ adrp x0, :got:ifunc -+ ldr x0, [x0, #:got_lo12:ifunc] -+ ret -+ .size bar, .-bar diff --git a/binutils/patches/binutils-2.24-aarch64-fix-ie-relax.patch b/binutils/patches/binutils-2.24-aarch64-fix-ie-relax.patch deleted file mode 100644 index d9157eaf6..000000000 --- a/binutils/patches/binutils-2.24-aarch64-fix-ie-relax.patch +++ /dev/null @@ -1,40 +0,0 @@ -commit 44f814ce5066f10a3bed29c45d10e0d38f4fa433 -Author: Marcus Shawcroft -Date: Tue Apr 15 17:46:07 2014 +0100 - - [AArch64] Fix off by one error in instruction relaxation mask. - - The AArch64 TLSDESC to IE relaxation code uses a bit mask intended to - ensure that destination register in a relaxed ldr instruction is - always X0. The mask has an off by one error resulting in the most - significant bit of the destination register being retained in the - relaxed instruction. The issue generally appears when the compiler - emits TLS accesses code under high register pressure resulting in a - broken code sequence. - -diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c -index 42c83fb..8503419 100644 ---- a/bfd/elfnn-aarch64.c -+++ b/bfd/elfnn-aarch64.c -@@ -3957,7 +3957,7 @@ elfNN_aarch64_tls_relax (struct elf_aarch64_link_hash_table *globals, - ldr xd, [x0, #:tlsdesc_lo12:var] => ldr x0, [x0, #:gottprel_lo12:var] - */ - insn = bfd_getl32 (contents + rel->r_offset); -- insn &= 0xfffffff0; -+ insn &= 0xffffffe0; - bfd_putl32 (insn, contents + rel->r_offset); - return bfd_reloc_continue; - } -diff --git a/ld/testsuite/ld-aarch64/tls-relax-gdesc-ie.s b/ld/testsuite/ld-aarch64/tls-relax-gdesc-ie.s -index c20690c..38b3721 100644 ---- a/ld/testsuite/ld-aarch64/tls-relax-gdesc-ie.s -+++ b/ld/testsuite/ld-aarch64/tls-relax-gdesc-ie.s -@@ -4,7 +4,7 @@ var: - .word 2 - .text - adrp x0, :tlsdesc:var -- ldr x1, [x0, #:tlsdesc_lo12:var] -+ ldr x17, [x0, #:tlsdesc_lo12:var] - add x0, x0, :tlsdesc_lo12:var - .tlsdesccall var - blr x1 diff --git a/binutils/patches/binutils-2.24-aarch64-fix-static-ifunc.patch b/binutils/patches/binutils-2.24-aarch64-fix-static-ifunc.patch deleted file mode 100644 index 296f162de..000000000 --- a/binutils/patches/binutils-2.24-aarch64-fix-static-ifunc.patch +++ /dev/null @@ -1,118 +0,0 @@ -commit 14d96265dd8fd934d868c0b8e1991e2fefbe9fc8 -Author: Will Newton -Date: Mon Nov 25 14:44:59 2013 +0000 - - bfd/elfnn-aarch64.c: Handle static links with ifunc correctly. - - The code for handling GOT references to ifunc symbols in static links - was missing. - - bfd/ChangeLog: - - 2013-11-26 Will Newton - - * elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_symbol): - Handle STT_GNU_IFUNC symbols correctly in static links. - - ld/testsuite/ChangeLog: - - 2013-11-26 Will Newton - - * ld-aarch64/aarch64-elf.exp: Add ifunc-22. - * ld-aarch64/ifunc-22.d: New file. - * ld-aarch64/ifunc-22.s: Likewise. - -diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c -index 3cd3a18..9053635 100644 ---- a/bfd/elfnn-aarch64.c -+++ b/bfd/elfnn-aarch64.c -@@ -6824,7 +6824,34 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd, - + htab->root.sgot->output_offset - + (h->got.offset & ~(bfd_vma) 1)); - -- if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h)) -+ if (h->def_regular -+ && h->type == STT_GNU_IFUNC) -+ { -+ if (info->shared) -+ { -+ /* Generate R_AARCH64_GLOB_DAT. */ -+ goto do_glob_dat; -+ } -+ else -+ { -+ asection *plt; -+ -+ if (!h->pointer_equality_needed) -+ abort (); -+ -+ /* For non-shared object, we can't use .got.plt, which -+ contains the real function address if we need pointer -+ equality. We load the GOT entry with the PLT entry. */ -+ plt = htab->root.splt ? htab->root.splt : htab->root.iplt; -+ bfd_put_NN (output_bfd, (plt->output_section->vma -+ + plt->output_offset -+ + h->plt.offset), -+ htab->root.sgot->contents -+ + (h->got.offset & ~(bfd_vma) 1)); -+ return TRUE; -+ } -+ } -+ else if (info->shared && SYMBOL_REFERENCES_LOCAL (info, h)) - { - if (!h->def_regular) - return FALSE; -@@ -6837,6 +6864,7 @@ elfNN_aarch64_finish_dynamic_symbol (bfd *output_bfd, - } - else - { -+do_glob_dat: - BFD_ASSERT ((h->got.offset & 1) == 0); - bfd_put_NN (output_bfd, (bfd_vma) 0, - htab->root.sgot->contents + h->got.offset); -diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp -index a6b3ea2..692bf34 100644 ---- a/ld/testsuite/ld-aarch64/aarch64-elf.exp -+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp -@@ -156,3 +156,4 @@ run_dump_test "ifunc-19a" - run_dump_test "ifunc-19b" - run_dump_test "ifunc-20" - run_dump_test "ifunc-21" -+run_dump_test "ifunc-22" -diff --git a/ld/testsuite/ld-aarch64/ifunc-22.d b/ld/testsuite/ld-aarch64/ifunc-22.d -new file mode 100644 -index 0000000..f28b039 ---- /dev/null -+++ b/ld/testsuite/ld-aarch64/ifunc-22.d -@@ -0,0 +1,11 @@ -+#source: ifunc-22.s -+#objdump: -s -j .got -+#ld: -static -+#target: aarch64*-*-* -+ -+# Ensure GOT is populated correctly in static link -+ -+.*: file format elf64-(little|big)aarch64 -+ -+Contents of section \.got: -+ 4100f0 00000000 00000000 d0004000 00000000 ..........@..... -diff --git a/ld/testsuite/ld-aarch64/ifunc-22.s b/ld/testsuite/ld-aarch64/ifunc-22.s -new file mode 100644 -index 0000000..69a87bb ---- /dev/null -+++ b/ld/testsuite/ld-aarch64/ifunc-22.s -@@ -0,0 +1,14 @@ -+ .text -+ .type ifunc, @gnu_indirect_function -+ .global ifunc -+ifunc: -+ ret -+ .size ifunc, .-ifunc -+ .type _start, @function -+ .globl _start -+_start: -+ adrp x0, :got:ifunc -+ ldr x0, [x0, #:got_lo12:ifunc] -+ .size _start, .-_start -+ .data -+ .xword ifunc diff --git a/binutils/patches/binutils-2.24-aarch64-ld-shared-non-PIC-xfail.patch b/binutils/patches/binutils-2.24-aarch64-ld-shared-non-PIC-xfail.patch deleted file mode 100644 index 8525596a8..000000000 --- a/binutils/patches/binutils-2.24-aarch64-ld-shared-non-PIC-xfail.patch +++ /dev/null @@ -1,55 +0,0 @@ -commit 273dc279306c2b69fbc1407cc695397e4b015152 -Author: Will Newton -Date: Fri May 16 15:22:58 2014 +0100 - - ld/aarch64: xfail non-PIC shared object tests on aarch64 - - aarch64 does not support building non-PIC shared objects, so mark - tests for these as xfail. - - ld/testsuite/ChangeLog: - - 2014-05-20 Will Newton - - * ld-shared/shared.exp: Mark non-PIC shared object tests - as xfail on aarch64. - -#-- a/ld/testsuite/ChangeLog -#++ b/ld/testsuite/ChangeLog -#@ -1,3 +1,8 @@ -+2014-05-20 Will Newton -+ -+ * ld-shared/shared.exp: Mark non-PIC shared object tests -+ as xfail on aarch64. -+ - 2014-05-19 Andreas Tobler - - * ld-elf/shared.exp: Introduce the extralibs variable to control -diff --git a/ld/testsuite/ld-shared/shared.exp b/ld/testsuite/ld-shared/shared.exp -index 9996ece..c723ef7 100644 ---- a/ld/testsuite/ld-shared/shared.exp -+++ b/ld/testsuite/ld-shared/shared.exp -@@ -244,6 +244,7 @@ if ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o] - if [ string match $shared_needs_pic "yes" ] { - setup_xfail "arm*-*-linux*" - } -+ setup_xfail "aarch64*-*-linux*" - shared_test shnp "shared (non PIC)" mainnp.o sh1np.o sh2np.o shared - - # Test ELF shared library relocations with a non-zero load -@@ -270,6 +271,7 @@ if ![ld_compile "$CC $CFLAGS $SHCFLAG" $srcdir/$subdir/main.c $tmpdir/mainnp.o] - if [ string match $shared_needs_pic "yes" ] { - setup_xfail "arm*-*-linux*" - } -+ setup_xfail "aarch64*-*-linux*" - shared_test shnp "shared (non PIC, load offset)" \ - mainnp.o sh1np.o sh2np.o shared \ - "-T $srcdir/$subdir/elf-offset.ld" -@@ -326,6 +328,7 @@ if ![ld_compile "$CC $CFLAGS $SHCFLAG $picflag" $srcdir/$subdir/main.c $tmpdir/m - if [ string match $shared_needs_pic "yes" ] { - setup_xfail "arm*-*-linux*" - } -+ setup_xfail "aarch64*-*-linux*" - shared_test shmpnp "shared (PIC main, non PIC so)" mainp.o sh1np.o sh2np.o shared - } - } else { diff --git a/binutils/patches/binutils-2.24-arm-static-tls.patch b/binutils/patches/binutils-2.24-arm-static-tls.patch deleted file mode 100644 index 2b580f121..000000000 --- a/binutils/patches/binutils-2.24-arm-static-tls.patch +++ /dev/null @@ -1,42 +0,0 @@ -commit eea6dad2b3ae91189caa91145dd133bae0398d21 -Author: Kyle McMartin -Date: Fri Jun 20 11:14:09 2014 +0100 - - Similarly to the AArch64 patch, set DF_STATIC_TLS for consistency with - other architectures when we emit IE relocs in a shared library. - - * elf32-arm.c (elf32_arm_check_relocs): Set DF_STATIC_TLS when - emitting initial-exec relocs when not linking an executable. - ---- a/bfd/elf32-arm.c -+++ b/bfd/elf32-arm.c -@@ -12711,6 +12711,9 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info, - default: tls_type = GOT_NORMAL; break; - } - -+ if (!info->executable && (tls_type & GOT_TLS_IE)) -+ info->flags |= DF_STATIC_TLS; -+ - if (h != NULL) - { - h->got.refcount++; ---- a/ld/testsuite/ld-arm/tls-gdierelax2.d -+++ b/ld/testsuite/ld-arm/tls-gdierelax2.d -@@ -11,13 +11,13 @@ Disassembly of section .text: - [0-9a-f]+: e59f0004 ldr r0, \[pc, #4\] ; .* - [0-9a-f]+: e79f0000 ldr r0, \[pc, r0\] - [0-9a-f]+: e1a00000 nop ; .* -- [0-9a-f]+: 00008098 .word 0x00008098 -- [0-9a-f]+: 0000809c .word 0x0000809c -+ [0-9a-f]+: 000080a0 .word 0x000080a0 -+ [0-9a-f]+: 000080a4 .word 0x000080a4 - - [0-9a-f]+ : - [0-9a-f]+: 4801 ldr r0, \[pc, #4\] ; .* - [0-9a-f]+: 4478 add r0, pc - [0-9a-f]+: 6800 ldr r0, \[r0, #0\] - [0-9a-f]+: 46c0 nop ; .* -- [0-9a-f]+: 0000808a .word 0x0000808a -- [0-9a-f]+: 0000808c .word 0x0000808c -+ [0-9a-f]+: 00008092 .word 0x00008092 -+ [0-9a-f]+: 00008094 .word 0x00008094 diff --git a/binutils/patches/binutils-2.24-elfnn-aarch64.patch0 b/binutils/patches/binutils-2.24-elfnn-aarch64.patch0 deleted file mode 100644 index 469387b71..000000000 --- a/binutils/patches/binutils-2.24-elfnn-aarch64.patch0 +++ /dev/null @@ -1,21 +0,0 @@ -*** ../binutils-2.24.orig/bfd/elfnn-aarch64.c 2013-12-17 11:16:28.723807381 +0000 ---- bfd/elfnn-aarch64.c 2013-12-17 11:18:13.517804067 +0000 -*************** _aarch64_elf_section_data; -*** 1679,1686 **** - #define elf_aarch64_section_data(sec) \ - ((_aarch64_elf_section_data *) elf_section_data (sec)) - -! /* The size of the thread control block. */ -! #define TCB_SIZE 16 - - struct elf_aarch64_local_symbol - { ---- 1679,1686 ---- - #define elf_aarch64_section_data(sec) \ - ((_aarch64_elf_section_data *) elf_section_data (sec)) - -! /* The size of the thread control block which is defined to be two pointers. */ -! #define TCB_SIZE (ARCH_SIZE/8)*2 - - struct elf_aarch64_local_symbol - { diff --git a/binutils/patches/binutils-2.24-fake-zlib-sections.patch0 b/binutils/patches/binutils-2.24-fake-zlib-sections.patch0 deleted file mode 100644 index e02dd51e6..000000000 --- a/binutils/patches/binutils-2.24-fake-zlib-sections.patch0 +++ /dev/null @@ -1,30 +0,0 @@ -*** ../binutils-2.24.orig/bfd/compress.c 2014-04-28 16:35:20.429816317 +0100 ---- bfd/compress.c 2014-04-28 16:36:06.450963028 +0100 -*************** -*** 25,30 **** ---- 25,31 ---- - #ifdef HAVE_ZLIB_H - #include - #endif -+ #include "safe-ctype.h" - - #ifdef HAVE_ZLIB_H - static bfd_boolean -*************** bfd_is_section_compressed (bfd *abfd, se -*** 304,309 **** ---- 305,319 ---- - compressed = (bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12) - && CONST_STRNEQ ((char*) compressed_buffer, "ZLIB")); - -+ /* Check for the pathalogical case of a debug string section that -+ contains the string ZLIB.... as the first entry. We assume that -+ no uncompressed .debug_str section would ever be big enough to -+ have the first byte of its (big-endian) size be non-zero. */ -+ if (compressed -+ && strcmp (sec->name, ".debug_str") == 0 -+ && ISPRINT (compressed_buffer[4])) -+ compressed = FALSE; -+ - /* Restore compress_status. */ - sec->compress_status = saved; - return compressed; diff --git a/binutils/patches/binutils-2.24-fat-lto-objects.patch b/binutils/patches/binutils-2.24-fat-lto-objects.patch deleted file mode 100644 index fe9c334be..000000000 --- a/binutils/patches/binutils-2.24-fat-lto-objects.patch +++ /dev/null @@ -1,57 +0,0 @@ -commit b35d44f1af711925bfa4344ef00470fee67122f1 -Author: Kyrylo Tkachov -Date: Wed Nov 27 13:43:39 2013 +0000 - - [ld/testsuite/] - 2013-11-27 Kyrylo Tkachov - - * ld-plugin/lto.exp: Add -ffat-lto-objects. - * lib/ld-lib.exp (check_lto_available): Likewise. - ---- a/ld/testsuite/ld-plugin/lto.exp -+++ b/ld/testsuite/ld-plugin/lto.exp -@@ -57,7 +57,7 @@ set lto_link_tests { - "" "-O2" - {lto-3c.c} {} "libdummy.a"} - {"Build liblto-3.a" -- "" "-flto" -+ "" "-flto -ffat-lto-objects" - {lto-3b.c} {} "liblto-3.a"} - {"Build libdummy.a 5a" - "" "-flto" -@@ -111,7 +111,7 @@ set lto_link_tests { - "" "" - {pr12758a.s} {} "libdummy.a"} - {"Build libpr12758.a" -- "" "-flto -O2" -+ "" "-flto -O2 -ffat-lto-objects" - {pr12758b.c} {} "libpr12758.a"} - {"PR ld/12758" - "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group" "" -@@ -120,13 +120,13 @@ set lto_link_tests { - "" "" - {pr12760a.c} {} "libdummy.a"} - {"Build libpr12760.a" -- "" "-flto -O2" -+ "" "-flto -O2 -ffat-lto-objects" - {pr12760b.c} {} "libpr12760.a"} - {"PR ld/12760" - "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12760a.o -Wl,--start-group tmpdir/libpr12760.a -Wl,--end-group" "" - {dummy.c} {} "pr12760.exe" "c" "warning: Bad bar"} - {"Build libpr13183.a" -- "-T" "-flto -O2" -+ "-T" "-flto -O2 -ffat-lto-objects" - {pr13183a.c} {} "libpr13183.a"} - {"Build libdummy.a PR ld/13183" - "" "-flto -O2" ---- a/ld/testsuite/lib/ld-lib.exp -+++ b/ld/testsuite/lib/ld-lib.exp -@@ -1643,7 +1643,7 @@ proc check_lto_available { } { - set f [open $src "w"] - puts $f "" - close $f -- set status [remote_exec host $CC "-shared -B[pwd]/tmpdir/ld/ -flto -fuse-linker-plugin $src -o $output"] -+ set status [remote_exec host $CC "-shared -B[pwd]/tmpdir/ld/ -flto -ffat-lto-objects -fuse-linker-plugin $src -o $output"] - if { [lindex $status 0] == 0 } { - set lto_available_saved 1 - } else { diff --git a/binutils/patches/binutils-2.24-indirect-chain.patch0 b/binutils/patches/binutils-2.24-indirect-chain.patch0 deleted file mode 100644 index b255424a4..000000000 --- a/binutils/patches/binutils-2.24-indirect-chain.patch0 +++ /dev/null @@ -1,28 +0,0 @@ -*** ../binutils-2.24.orig/bfd/elflink.c 2014-08-21 09:17:27.753408085 +0100 ---- bfd/elflink.c 2014-08-21 10:04:52.174935912 +0100 -*************** _bfd_elf_add_default_symbol (bfd *abfd, -*** 1705,1710 **** ---- 1705,1716 ---- - ht = (struct elf_link_hash_entry *) hi->root.u.i.link; - (*bed->elf_backend_copy_indirect_symbol) (info, ht, hi); - -+ /* A reference to the SHORTNAME symbol from a dynamic library -+ will be satisfied by the versioned symbol at runtime. In -+ effect, we have a reference to the versioned symbol. */ -+ ht->ref_dynamic_nonweak |= hi->ref_dynamic_nonweak; -+ hi->dynamic_def |= ht->dynamic_def; -+ - /* See if the new flags lead us to realize that the symbol must - be dynamic. */ - if (! *dynsym) -*************** nondefault: -*** 1774,1779 **** ---- 1780,1787 ---- - if (hi->root.type == bfd_link_hash_indirect) - { - (*bed->elf_backend_copy_indirect_symbol) (info, h, hi); -+ h->ref_dynamic_nonweak |= hi->ref_dynamic_nonweak; -+ hi->dynamic_def |= h->dynamic_def; - - /* See if the new flags lead us to realize that the symbol - must be dynamic. */ diff --git a/binutils/patches/binutils-2.24-ldforcele.patch0 b/binutils/patches/binutils-2.24-ldforcele.patch0 deleted file mode 100644 index 6a46c7820..000000000 --- a/binutils/patches/binutils-2.24-ldforcele.patch0 +++ /dev/null @@ -1,58 +0,0 @@ -Common subdirectories: ../binutils-2.24.orig/ld/emulparams and ld/emulparams -Common subdirectories: ../binutils-2.24.orig/ld/emultempl and ld/emultempl -diff -cp ../binutils-2.24.orig/ld/ldlang.c ld/ldlang.c -*** ../binutils-2.24.orig/ld/ldlang.c 2014-05-09 10:35:04.589504928 +0100 ---- ld/ldlang.c 2014-05-09 10:35:55.515661478 +0100 -*************** lang_add_output_format (const char *form -*** 7096,7101 **** ---- 7096,7113 ---- - && little != NULL) - format = little; - -+ if (getenv ("LD_FORCE_LE") != NULL) -+ { -+ if (strcmp (format, "elf64-powerpc") == 0) -+ format = "elf64-powerpcle"; -+ else if (strcmp (format, "elf32-powerpc") == 0) -+ format = "elf32-powerpcle"; -+ else if (strcmp (format, "elf64-big") == 0) -+ format = "elf64-little"; -+ else if (strcmp (format, "elf32-big") == 0) -+ format = "elf32-little"; -+ } -+ - output_target = format; - } - } -Only in ld: ldlang.c.orig -diff -cp ../binutils-2.24.orig/ld/ldmain.c ld/ldmain.c -*** ../binutils-2.24.orig/ld/ldmain.c 2014-05-09 10:35:04.593504941 +0100 ---- ld/ldmain.c 2014-05-09 10:35:55.515661478 +0100 -*************** get_emulation (int argc, char **argv) -*** 603,608 **** ---- 603,620 ---- - } - } - -+ if ((strncmp (emulation, "elf64ppc", 8) == 0 -+ || strncmp (emulation, "elf32ppc", 8) == 0) -+ && getenv ("LD_FORCE_LE") != NULL) -+ { -+ size_t len = strlen (emulation); -+ char *le = xmalloc (len + 2); -+ memcpy (le, emulation, 5); -+ le[5] = 'l'; -+ memcpy (le + 6, emulation + 5, len - 4); -+ emulation = le; -+ } -+ - return emulation; - } - -Only in ld: ldmain.c.orig -Common subdirectories: ../binutils-2.24.orig/ld/ldscripts and ld/ldscripts -Common subdirectories: ../binutils-2.24.orig/ld/.libs and ld/.libs -Common subdirectories: ../binutils-2.24.orig/ld/po and ld/po -Common subdirectories: ../binutils-2.24.orig/ld/scripttempl and ld/scripttempl -Common subdirectories: ../binutils-2.24.orig/ld/testsuite and ld/testsuite -Common subdirectories: ../binutils-2.24.orig/ld/tmpdir and ld/tmpdir diff --git a/binutils/patches/binutils-2.24-pt-pax-flags-20131231.patch b/binutils/patches/binutils-2.24-pt-pax-flags-20131231.patch deleted file mode 100644 index cfb203511..000000000 --- a/binutils/patches/binutils-2.24-pt-pax-flags-20131231.patch +++ /dev/null @@ -1,1030 +0,0 @@ ---- binutils-2.24/bfd/elf-bfd.h -+++ binutils-2.24/bfd/elf-bfd.h -@@ -1577,6 +1577,9 @@ struct elf_obj_tdata - /* Segment flags for the PT_GNU_STACK segment. */ - unsigned int stack_flags; - -+ /* Segment flags for the PT_PAX_FLAGS segment. */ -+ unsigned int pax_flags; -+ - /* This is set to TRUE if the object was created by the backend - linker. */ - bfd_boolean linker; -@@ -1707,6 +1707,7 @@ - #define elf_eh_frame_hdr(bfd) (elf_tdata(bfd) -> o->eh_frame_hdr) - #define elf_linker(bfd) (elf_tdata(bfd) -> o->linker) - #define elf_stack_flags(bfd) (elf_tdata(bfd) -> o->stack_flags) -+#define elf_pax_flags(bfd) (elf_tdata(bfd) -> o->pax_flags) - #define elf_shstrtab(bfd) (elf_tdata(bfd) -> o->strtab_ptr) - #define elf_onesymtab(bfd) (elf_tdata(bfd) -> symtab_section) - #define elf_symtab_shndx(bfd) (elf_tdata(bfd) -> symtab_shndx_section) ---- binutils-2.24/bfd/elf.c -+++ binutils-2.24/bfd/elf.c -@@ -1158,6 +1158,7 @@ get_segment_type (unsigned int p_type) - case PT_GNU_EH_FRAME: pt = "EH_FRAME"; break; - case PT_GNU_STACK: pt = "STACK"; break; - case PT_GNU_RELRO: pt = "RELRO"; break; -+ case PT_PAX_FLAGS: pt = "PAX_FLAGS"; break; - default: pt = NULL; break; - } - return pt; -@@ -2477,6 +2478,9 @@ bfd_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int hdr_index) - case PT_GNU_RELRO: - return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "relro"); - -+ case PT_PAX_FLAGS: -+ return _bfd_elf_make_section_from_phdr (abfd, hdr, hdr_index, "pax_flags"); -+ - default: - /* Check for any processor-specific program segment types. */ - bed = get_elf_backend_data (abfd); -@@ -3551,6 +3555,11 @@ get_program_header_size (bfd *abfd, struct bfd_link_info *info) - ++segs; - } - -+ { -+ /* We need a PT_PAX_FLAGS segment. */ -+ ++segs; -+ } -+ - for (s = abfd->sections; s != NULL; s = s->next) - { - if ((s->flags & SEC_LOAD) != 0 -@@ -4153,6 +4162,20 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info) - } - } - -+ { -+ amt = sizeof (struct elf_segment_map); -+ m = bfd_zalloc (abfd, amt); -+ if (m == NULL) -+ goto error_return; -+ m->next = NULL; -+ m->p_type = PT_PAX_FLAGS; -+ m->p_flags = elf_pax_flags (abfd); -+ m->p_flags_valid = 1; -+ -+ *pm = m; -+ pm = &m->next; -+ } -+ - free (sections); - elf_tdata (abfd)->segment_map = mfirst; - } -@@ -5417,7 +5440,8 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd) - 6. PT_TLS segment includes only SHF_TLS sections. - 7. SHF_TLS sections are only in PT_TLS or PT_LOAD segments. - 8. PT_DYNAMIC should not contain empty sections at the beginning -- (with the possible exception of .dynamic). */ -+ (with the possible exception of .dynamic). -+ 9. PT_PAX_FLAGS segments do not include any sections. */ - #define IS_SECTION_IN_INPUT_SEGMENT(section, segment, bed) \ - ((((segment->p_paddr \ - ? IS_CONTAINED_BY_LMA (section, segment, segment->p_paddr) \ -@@ -5425,6 +5449,7 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd) - && (section->flags & SEC_ALLOC) != 0) \ - || IS_NOTE (segment, section)) \ - && segment->p_type != PT_GNU_STACK \ -+ && segment->p_type != PT_PAX_FLAGS \ - && (segment->p_type != PT_TLS \ - || (section->flags & SEC_THREAD_LOCAL)) \ - && (segment->p_type == PT_LOAD \ ---- binutils-2.24/bfd/elflink.c -+++ binutils-2.24/bfd/elflink.c -@@ -5545,17 +5545,30 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, - && ! (*bed->elf_backend_always_size_sections) (output_bfd, info)) - return FALSE; - -+ elf_pax_flags (output_bfd) = PF_NORANDEXEC; -+ if (info->execheap) -+ elf_pax_flags (output_bfd) |= PF_NOMPROTECT; -+ else if (info->noexecheap) -+ elf_pax_flags (output_bfd) |= PF_MPROTECT; -+ - /* Determine any GNU_STACK segment requirements, after the backend - has had a chance to set a default segment size. */ - if (info->execstack) -- elf_stack_flags (output_bfd) = PF_R | PF_W | PF_X; -+ { -+ elf_stack_flags (output_bfd) = PF_R | PF_W | PF_X; -+ elf_pax_flags (output_bfd) |= PF_EMUTRAMP; -+ } - else if (info->noexecstack) -- elf_stack_flags (output_bfd) = PF_R | PF_W; -+ { -+ elf_stack_flags (output_bfd) = PF_R | PF_W; -+ elf_pax_flags (output_bfd) |= PF_NOEMUTRAMP; -+ } - else - { - bfd *inputobj; - asection *notesec = NULL; - int exec = 0; - -+ elf_pax_flags (output_bfd) |= PF_NOEMUTRAMP; - for (inputobj = info->input_bfds; - inputobj; - inputobj = inputobj->link_next) -@@ -5567,7 +5581,11 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, - if (s) - { - if (s->flags & SEC_CODE) -- exec = PF_X; -+ { -+ elf_pax_flags (output_bfd) &= ~PF_NOEMUTRAMP; -+ elf_pax_flags (output_bfd) |= PF_EMUTRAMP; -+ exec = PF_X; -+ } - notesec = s; - } - else if (bed->default_execstack) ---- binutils-2.24/binutils/readelf.c -+++ binutils-2.24/binutils/readelf.c -@@ -2740,6 +2740,7 @@ get_segment_type (unsigned long p_type) - return "GNU_EH_FRAME"; - case PT_GNU_STACK: return "GNU_STACK"; - case PT_GNU_RELRO: return "GNU_RELRO"; -+ case PT_PAX_FLAGS: return "PAX_FLAGS"; - - default: - if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC)) ---- binutils-2.24/include/bfdlink.h -+++ binutils-2.24/include/bfdlink.h -@@ -322,6 +322,14 @@ struct bfd_link_info - /* TRUE if PT_GNU_RELRO segment should be created. */ - unsigned int relro: 1; - -+ /* TRUE if PT_PAX_FLAGS segment should be created with PF_NOMPROTECT -+ flags. */ -+ unsigned int execheap: 1; -+ -+ /* TRUE if PT_PAX_FLAGS segment should be created with PF_MPROTECT -+ flags. */ -+ unsigned int noexecheap: 1; -+ - /* TRUE if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment - should be created. */ - unsigned int eh_frame_hdr: 1; ---- binutils-2.24/include/elf/common.h -+++ binutils-2.24/include/elf/common.h -@@ -429,6 +429,7 @@ - #define PT_SUNW_EH_FRAME PT_GNU_EH_FRAME /* Solaris uses the same value */ - #define PT_GNU_STACK (PT_LOOS + 0x474e551) /* Stack flags */ - #define PT_GNU_RELRO (PT_LOOS + 0x474e552) /* Read-only after relocation */ -+#define PT_PAX_FLAGS (PT_LOOS + 0x5041580) /* PaX flags */ - - /* Program segment permissions, in program header p_flags field. */ - -@@ -439,6 +440,21 @@ - #define PF_MASKOS 0x0FF00000 /* New value, Oct 4, 1999 Draft */ - #define PF_MASKPROC 0xF0000000 /* Processor-specific reserved bits */ - -+/* Flags to control PaX behavior. */ -+ -+#define PF_PAGEEXEC (1 << 4) /* Enable PAGEEXEC */ -+#define PF_NOPAGEEXEC (1 << 5) /* Disable PAGEEXEC */ -+#define PF_SEGMEXEC (1 << 6) /* Enable SEGMEXEC */ -+#define PF_NOSEGMEXEC (1 << 7) /* Disable SEGMEXEC */ -+#define PF_MPROTECT (1 << 8) /* Enable MPROTECT */ -+#define PF_NOMPROTECT (1 << 9) /* Disable MPROTECT */ -+#define PF_RANDEXEC (1 << 10) /* Enable RANDEXEC */ -+#define PF_NORANDEXEC (1 << 11) /* Disable RANDEXEC */ -+#define PF_EMUTRAMP (1 << 12) /* Enable EMUTRAMP */ -+#define PF_NOEMUTRAMP (1 << 13) /* Disable EMUTRAMP */ -+#define PF_RANDMMAP (1 << 14) /* Enable RANDMMAP */ -+#define PF_NORANDMMAP (1 << 15) /* Disable RANDMMAP */ -+ - /* Values for section header, sh_type field. */ - - #define SHT_NULL 0 /* Section header table entry unused */ ---- binutils-2.24/ld/emultempl/elf32.em -+++ binutils-2.24/ld/emultempl/elf32.em -@@ -2285,6 +2285,16 @@ fragment <: -+[a-f0-9]+ <.text>: - [ ]*[a-f0-9]+: 0b 60 80 02 00 24 \[MMI\] addl r12=32,r1;; - [ ]*[a-f0-9]+: c0 c0 04 00 48 00 addl r12=24,r1 - [ ]*[a-f0-9]+: 00 00 04 00 nop.i 0x0;; ---- binutils-2.24/ld/testsuite/ld-ia64/merge2.d -+++ binutils-2.24/ld/testsuite/ld-ia64/merge2.d -@@ -4,7 +4,7 @@ - #objdump: -d - - #... --0+1e0 <.text>: -+[a-f0-9]+ <.text>: - [ ]*[a-f0-9]+: 0b 60 80 02 00 24 \[MMI\] addl r12=32,r1;; - [ ]*[a-f0-9]+: c0 c0 04 00 48 00 addl r12=24,r1 - [ ]*[a-f0-9]+: 00 00 04 00 nop.i 0x0;; ---- binutils-2.24/ld/testsuite/ld-ia64/merge3.d -+++ binutils-2.24/ld/testsuite/ld-ia64/merge3.d -@@ -4,7 +4,7 @@ - #objdump: -d - - #... --0+210 <.text>: -+[a-f0-9]+ <.text>: - [ ]*[a-f0-9]+: 0b 60 80 02 00 24 \[MMI\] addl r12=32,r1;; - [ ]*[a-f0-9]+: c0 40 05 00 48 00 addl r12=40,r1 - [ ]*[a-f0-9]+: 00 00 04 00 nop.i 0x0;; ---- binutils-2.24/ld/testsuite/ld-ia64/merge4.d -+++ binutils-2.24/ld/testsuite/ld-ia64/merge4.d -@@ -4,7 +4,7 @@ - #objdump: -d - - #... --0+240 <.text>: -+[a-f0-9]+ <.text>: - [ ]*[a-f0-9]+: 0b 60 80 02 00 24 \[MMI\] addl r12=32,r1;; - [ ]*[a-f0-9]+: c0 40 05 00 48 00 addl r12=40,r1 - [ ]*[a-f0-9]+: 00 00 04 00 nop.i 0x0;; ---- binutils-2.24/ld/testsuite/ld-ia64/merge5.d -+++ binutils-2.24/ld/testsuite/ld-ia64/merge5.d -@@ -4,7 +4,7 @@ - #objdump: -d - - #... --0+270 <.text>: -+[a-f0-9]+ <.text>: - [ ]*[a-f0-9]+: 0b 60 80 02 00 24 \[MMI\] addl r12=32,r1;; - [ ]*[a-f0-9]+: c0 40 05 00 48 00 addl r12=40,r1 - [ ]*[a-f0-9]+: 00 00 04 00 nop.i 0x0;; ---- binutils-2.24/ld/testsuite/ld-ia64/tlsbin.rd -+++ binutils-2.24/ld/testsuite/ld-ia64/tlsbin.rd -@@ -36,13 +36,14 @@ There are [0-9]+ program headers, starting at offset [0-9]+ - - Program Headers: - +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align -- +PHDR +0x0+40 0x40+40 0x40+40 0x0+188 0x0+188 R E 0x8 -- +INTERP +0x0+1c8 0x40+1c8 0x40+1c8 0x[0-9a-f]+ 0x[0-9a-f]+ R +0x1 -+ +PHDR +0x0+40 0x40+40 0x40+40 (0x[0-9a-f]+) \1 R E 0x8 -+ +INTERP +0x0+([0-9a-f]+) (0x40+\1) \2 0x[0-9a-f]+ 0x[0-9a-f]+ R +0x1 - .*Requesting program interpreter.* - +LOAD +0x0+ 0x40+ 0x40+ 0x0+1[0-9a-f]+ 0x0+1[0-9a-f]+ R E 0x10000 - +LOAD +0x0+1[0-9a-f]+ 0x60+1[0-9a-f]+ 0x60+1[0-9a-f]+ 0x0+0[0-9a-f]+ 0x0+0[0-9a-f]+ RW +0x10000 - +DYNAMIC +0x0+1[0-9a-f]+ 0x60+1[0-9a-f]+ 0x60+1[0-9a-f]+ 0x0+150 0x0+150 RW +0x8 - +TLS +0x0+1[0-9a-f]+ 0x60+1[0-9a-f]+ 0x60+1[0-9a-f]+ 0x0+60 0x0+a0 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - +IA_64_UNWIND .* R +0x8 - #... - ---- binutils-2.24/ld/testsuite/ld-ia64/tlspic.rd -+++ binutils-2.24/ld/testsuite/ld-ia64/tlspic.rd -@@ -40,6 +40,7 @@ Program Headers: - +LOAD +0x0+1[0-9a-f]+ 0x0+11[0-9a-f]+ 0x0+11[0-9a-f]+ 0x0+0[0-9a-f]+ 0x0+0[0-9a-f]+ RW +0x10000 - +DYNAMIC +0x0+1[0-9a-f]+ 0x0+11[0-9a-f]+ 0x0+11[0-9a-f]+ 0x0+140 0x0+140 RW +0x8 - +TLS +0x0+1[0-9a-f]+ 0x0+11[0-9a-f]+ 0x0+11[0-9a-f]+ 0x0+60 0x0+80 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - +IA_64_UNWIND +0x0+1[0-9a-f]+ 0x0+1[0-9a-f]+ 0x0+1[0-9a-f]+ 0x0+18 0x0+18 R +0x8 - #... - ---- binutils-2.24/ld/testsuite/ld-mips-elf/multi-got-no-shared.d -+++ binutils-2.24/ld/testsuite/ld-mips-elf/multi-got-no-shared.d -@@ -8,9 +8,9 @@ - .*: +file format.* - - Disassembly of section \.text: --004000b0 <[^>]*> 3c1c0043 lui gp,0x43 --004000b4 <[^>]*> 279c9ff0 addiu gp,gp,-24592 --004000b8 <[^>]*> afbc0008 sw gp,8\(sp\) -+004000d0 <[^>]*> 3c1c0043 lui gp,0x43 -+004000d4 <[^>]*> 279c9ff0 addiu gp,gp,-24592 -+004000d8 <[^>]*> afbc0008 sw gp,8\(sp\) - #... - 00408d60 <[^>]*> 3c1c0043 lui gp,0x43 - 00408d64 <[^>]*> 279c2c98 addiu gp,gp,11416 ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-3a.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-3a.sd -@@ -1,7 +1,7 @@ - - Elf file type is DYN \(Shared object file\) - Entry point .* --There are 5 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -9,6 +9,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+00000 * 0x0+00000 [^ ]+ * [^ ]+ * R E * 0x.* - * LOAD * [^ ]+ * 0x0+10000 * 0x0+10000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+00400 * 0x0+00400 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -18,3 +19,4 @@ Program Headers: - *0*2 * \.data \.got * - *0*3 * \.dynamic * - *0*4 * -+ *0*5 * ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-3b.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-3b.sd -@@ -1,7 +1,7 @@ - - Elf file type is EXEC \(Executable file\) - Entry point 0x44000 --There are 8 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -13,6 +13,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+80000 * 0x0+80000 [^ ]+ * [^ ]+ * RW * 0x.* - * LOAD * [^ ]+ * 0x0+a0000 * 0x0+a0000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+42000 * 0x0+42000 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -25,3 +26,4 @@ Program Headers: - *0*5 *\.got \.data * - *0*6 *\.dynamic * - *0*7 * -+ *0*8 * ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-4b.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-4b.sd -@@ -1,7 +1,7 @@ - - Elf file type is EXEC \(Executable file\) - Entry point 0x44000 --There are 8 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -13,6 +13,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+80000 * 0x0+80000 [^ ]+ * [^ ]+ * RW * 0x.* - * LOAD * [^ ]+ * 0x0+a0000 * 0x0+a0000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+42000 * 0x0+42000 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -25,3 +26,4 @@ Program Headers: - *0*5 * \.got \.data \.bss * - *0*6 * \.dynamic * - *0*7 * -+ *0*8 * ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-5b.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-5b.sd -@@ -1,7 +1,7 @@ - - Elf file type is EXEC \(Executable file\) - Entry point 0x44000 --There are 8 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -13,6 +13,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+80000 * 0x0+80000 [^ ]+ * [^ ]+ * RW * 0x.* - * LOAD * [^ ]+ * 0x0+a0000 * 0x0+a0000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+42000 * 0x0+42000 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -25,3 +26,4 @@ Program Headers: - *0*5 * \.got \.data \.bss * - *0*6 * \.dynamic * - *0*7 * -+ *0*8 * ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.sd -@@ -1,7 +1,7 @@ - - Elf file type is EXEC \(Executable file\) - Entry point 0x44000 --There are 8 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -13,6 +13,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+80000 * 0x0+80000 [^ ]+ * [^ ]+ * RW * 0x.* - * LOAD * [^ ]+ * 0x0+a0000 * 0x0+a0000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+42000 * 0x0+42000 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -25,3 +26,4 @@ Program Headers: - *0*5 * \.got \.data \.bss * - *0*6 * \.dynamic * - *0*7 * -+ *0*8 * ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.sd -@@ -1,7 +1,7 @@ - - Elf file type is EXEC \(Executable file\) - Entry point 0x44000 --There are 7 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -12,6 +12,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+80000 * 0x0+80000 [^ ]+ * [^ ]+ * RW * 0x.* - * LOAD * [^ ]+ * 0x0+a0000 * 0x0+a0000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+42000 * 0x0+42000 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -23,3 +24,4 @@ Program Headers: - *0*4 * \.got \.data \.bss * - *0*5 * \.dynamic * - *0*6 * -+ *0*7 * ---- binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.sd -+++ binutils-2.24/ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.sd -@@ -1,7 +1,7 @@ - - Elf file type is EXEC \(Executable file\) - Entry point 0x44000 --There are 8 program headers, starting at offset .* -+There are [0-9] program headers, starting at offset .* - - Program Headers: - * Type * Offset * VirtAddr * PhysAddr * FileSiz * MemSiz * Flg * Align -@@ -13,6 +13,7 @@ Program Headers: - * LOAD * [^ ]+ * 0x0+80000 * 0x0+80000 [^ ]+ * [^ ]+ * RW * 0x.* - * LOAD * [^ ]+ * 0x0+a0000 * 0x0+a0000 [^ ]+ * [^ ]+ * RW * 0x.* - * DYNAMIC * [^ ]+ * 0x0+42000 * 0x0+42000 .* -+ * PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - * NULL * .* - - *Section to Segment mapping: -@@ -25,3 +26,4 @@ Program Headers: - *0*5 * \.got \.data \.bss * - *0*6 * \.dynamic * - *0*7 * -+ *0*8 * ---- binutils-2.24/ld/testsuite/ld-powerpc/tlsexe32.r -+++ binutils-2.24/ld/testsuite/ld-powerpc/tlsexe32.r -@@ -33,13 +33,14 @@ There are [0-9]+ program headers, starting at offset [0-9]+ - - Program Headers: - +Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz +Flg Align -- +PHDR +0x000034 0x01800034 0x01800034 0x000c0 0x000c0 R E 0x4 -- +INTERP +0x0000f4 0x018000f4 0x018000f4 0x00011 0x00011 R +0x1 -+ +PHDR +0x000034 0x01800034 0x01800034 (0x000[0-9a-f]{2}) \1 R E 0x4 -+ +INTERP +0x000([0-9a-f]{3}) 0x01800\1 0x01800\1 0x00011 0x00011 R +0x1 - +\[Requesting program interpreter: .*\] - +LOAD .* R E 0x10000 - +LOAD .* RWE 0x10000 - +DYNAMIC .* RW +0x4 - +TLS .* 0x0001c 0x00038 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections\.\.\. -@@ -49,6 +50,7 @@ Program Headers: - +03 +\.tdata \.dynamic \.got \.plt - +04 +\.dynamic - +05 +\.tdata \.tbss -+ +06 + - - Relocation section '\.rela\.dyn' at offset .* contains 2 entries: - Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-powerpc/tlsso32.r -+++ binutils-2.24/ld/testsuite/ld-powerpc/tlsso32.r -@@ -35,6 +35,7 @@ Program Headers: - +LOAD .* RWE 0x10000 - +DYNAMIC .* RW +0x4 - +TLS .* 0x0+1c 0x0+38 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections\.\.\. -@@ -42,6 +43,7 @@ Program Headers: - +01 +\.tdata \.dynamic \.got \.plt - +02 +\.dynamic - +03 +\.tdata \.tbss -+ +04 + - - Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 18 entries: - Offset +Info +Type +Sym\. Value +Symbol's Name \+ Addend -@@ -52,9 +54,9 @@ Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 18 entries: - [0-9a-f ]+R_PPC_TPREL16 +0+30 +le0 \+ 0 - [0-9a-f ]+R_PPC_TPREL16_HA +0+34 +le1 \+ 0 - [0-9a-f ]+R_PPC_TPREL16_LO +0+34 +le1 \+ 0 --[0-9a-f ]+R_PPC_TPREL16 +0+103d0 +\.tdata \+ 103e4 --[0-9a-f ]+R_PPC_TPREL16_HA +0+103d0 +\.tdata \+ 103e8 --[0-9a-f ]+R_PPC_TPREL16_LO +0+103d0 +\.tdata \+ 103e8 -+[0-9a-f ]+R_PPC_TPREL16 +0+103[df]0 +\.tdata \+ 10[0-9a-f]{3} -+[0-9a-f ]+R_PPC_TPREL16_HA +0+103[df]0 +\.tdata \+ 10[0-9a-f]{3} -+[0-9a-f ]+R_PPC_TPREL16_LO +0+103[df]0 +\.tdata \+ 10[0-9a-f]{3} - [0-9a-f ]+R_PPC_DTPMOD32 +0 - [0-9a-f ]+R_PPC_DTPREL32 +0 - [0-9a-f ]+R_PPC_DTPMOD32 +0 ---- binutils-2.24/ld/testsuite/ld-s390/tlsbin.rd -+++ binutils-2.24/ld/testsuite/ld-s390/tlsbin.rd -@@ -36,6 +36,7 @@ There are [0-9]+ program headers, starting at offset [0-9]+ - +LOAD .* RW +0x1000 - +DYNAMIC .* RW +0x4 - +TLS .* 0x0+60 0x0+a0 R +0x20 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections... -@@ -52,6 +53,7 @@ Program Headers: - +03 +.tdata .dynamic .got * - +04 +.dynamic * - +05 +.tdata .tbss * -+ +06 + - - Relocation section '.rela.dyn' at offset .* contains 4 entries: - Offset +Info +Type +Sym.Value +Sym. Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-s390/tlsbin_64.rd -+++ binutils-2.24/ld/testsuite/ld-s390/tlsbin_64.rd -@@ -36,6 +36,7 @@ There are [0-9]+ program headers, starting at offset [0-9]+ - +LOAD .* RW +0x1000 - +DYNAMIC .* RW +0x8 - +TLS .* 0x0+60 0x0+a0 R +0x20 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections... -@@ -52,6 +53,7 @@ Program Headers: - +03 +.tdata .dynamic .got * - +04 +.dynamic * - +05 +.tdata .tbss * -+ +06 + - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 4 entries: - +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-s390/tlspic.rd -+++ binutils-2.24/ld/testsuite/ld-s390/tlspic.rd -@@ -39,6 +39,7 @@ Program Headers: - +LOAD .* RW +0x1000 - +DYNAMIC .* RW +0x4 - +TLS .* 0x0+60 0x0+80 R +0x20 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections... -@@ -46,6 +47,7 @@ Program Headers: - +01 +.tdata .dynamic .got - +02 +.dynamic - +03 +.tdata .tbss -+ +04 + - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries: - Offset +Info +Type +Sym.Value +Sym. Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-s390/tlspic_64.rd -+++ binutils-2.24/ld/testsuite/ld-s390/tlspic_64.rd -@@ -39,6 +39,7 @@ Program Headers: - +LOAD .* RW +0x1000 - +DYNAMIC .* RW +0x8 - +TLS .* 0x0+60 0x0+80 R +0x20 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections... -@@ -46,6 +47,7 @@ Program Headers: - +01 +.tdata .dynamic .got * - +02 +.dynamic * - +03 +.tdata .tbss * -+ +04 + - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries: - +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-sh/tlsbin-2.d -+++ binutils-2.24/ld/testsuite/ld-sh/tlsbin-2.d -@@ -44,6 +44,7 @@ Program Headers: - +LOAD.* - +DYNAMIC.* - +TLS +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x0+18 0x0+28 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections\.\.\. -@@ -53,6 +54,7 @@ Program Headers: - +03 +\.tdata \.dynamic \.got * - +04 +\.dynamic * - +05 +\.tdata \.tbss * -+ +06 + - - Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 4 entries: - Offset +Info +Type +Sym\.Value +Sym\. Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-sh/tlspic-2.d -+++ binutils-2.24/ld/testsuite/ld-sh/tlspic-2.d -@@ -32,7 +32,7 @@ Key to Flags: - - Elf file type is DYN \(Shared object file\) - Entry point 0x[0-9a-f]+ --There are 4 program headers, starting at offset [0-9]+ -+There are [0-9] program headers, starting at offset [0-9]+ - - Program Headers: - +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align -@@ -40,6 +40,7 @@ Program Headers: - +LOAD.* - +DYNAMIC.* - +TLS .* 0x0+18 0x0+20 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections\.\.\. -@@ -47,6 +48,7 @@ Program Headers: - +01 +\.tdata \.dynamic \.got * - +02 +\.dynamic * - +03 +\.tdata \.tbss * -+ +04 + - - Relocation section '\.rela\.dyn' at offset 0x[0-9a-f]+ contains 10 entries: - Offset +Info +Type +Sym\.Value +Sym\. Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-sparc/gotop32.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/gotop32.rd -@@ -31,6 +31,7 @@ Program Headers: - +LOAD +0x0+ 0x0+ 0x0+ 0x0+2000 0x0+2000 R E 0x10000 - +LOAD +0x0+2000 0x0+12000 0x0+12000 0x0+2000 0x0+2000 RW +0x10000 - +DYNAMIC +0x0+2000 0x0+12000 0x0+12000 0x0+70 0x0+70 RW +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/gotop64.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/gotop64.rd -@@ -31,6 +31,7 @@ Program Headers: - +LOAD +0x0+ 0x0+ 0x0+ 0x0+2000 0x0+2000 R E 0x100000 - +LOAD +0x0+2000 0x0+102000 0x0+102000 0x0+2000 0x0+2000 RW +0x100000 - +DYNAMIC +0x0+2000 0x0+102000 0x0+102000 0x0+e0 0x0+e0 RW +0x8 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/tlssunbin32.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/tlssunbin32.rd -@@ -30,13 +30,14 @@ There are [0-9]+ program headers, starting at offset [0-9]+ - - Program Headers: - +Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz +Flg Align -- +PHDR +0x0+34 0x0+10034 0x0+10034 0x0+c0 0x0+c0 R E 0x4 -- +INTERP +0x0+f4 0x0+100f4 0x0+100f4 0x0+11 0x0+11 R +0x1 -+ +PHDR +0x0+34 0x0+10034 0x0+10034 (0x[0-9a-f]+) \1 R E 0x4 -+ +INTERP +(0x[0-9a-f]+ ){3}0x0+11 0x0+11 R +0x1 - .*Requesting program interpreter.* - +LOAD .* R E 0x10000 - +LOAD .* RW +0x10000 - +DYNAMIC .* RW +0x4 - +TLS .* 0x0+1060 0x0+10a0 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 4 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/tlssunbin64.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/tlssunbin64.rd -@@ -30,13 +30,14 @@ There are [0-9]+ program headers, starting at offset [0-9]+ - - Program Headers: - +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align -- +PHDR +0x0+40 0x0+100040 0x0+100040 0x0+150 0x0+150 R E 0x8 -- +INTERP +0x0+190 0x0+100190 0x0+100190 0x0+19 0x0+19 R +0x1 -+ +PHDR +0x0+40 0x0+100040 0x0+100040 (0x[0-9a-f]+) \1 R E 0x8 -+ +INTERP +0x0+([0-9a-f]+) (0x0+10+\1) \2 0x0+19 0x0+19 R +0x1 - .*Requesting program interpreter.* - +LOAD .* R E 0x100000 - +LOAD .* RW +0x100000 - +DYNAMIC .* RW +0x8 - +TLS .* 0x0+60 0x0+a0 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 4 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/tlssunnopic32.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/tlssunnopic32.rd -@@ -32,6 +32,7 @@ Program Headers: - +LOAD .* RW +0x10000 - +DYNAMIC .* RW +0x4 - +TLS .* 0x0+ 0x0+24 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 12 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/tlssunnopic64.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/tlssunnopic64.rd -@@ -32,6 +32,7 @@ Program Headers: - +LOAD .* RW +0x100000 - +DYNAMIC .* RW +0x8 - +TLS .* 0x0+ 0x0+24 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/tlssunpic32.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/tlssunpic32.rd -@@ -36,6 +36,7 @@ Program Headers: - +LOAD +0x0+2000 0x0+12000 0x0+12000 0x0+184 0x0+184 RWE 0x10000 - +DYNAMIC +0x0+2060 0x0+12060 0x0+12060 0x0+98 0x0+98 RW +0x4 - +TLS +0x0+2000 0x0+12000 0x0+12000 0x0+60 0x0+80 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries: ---- binutils-2.24/ld/testsuite/ld-sparc/tlssunpic64.rd -+++ binutils-2.24/ld/testsuite/ld-sparc/tlssunpic64.rd -@@ -36,6 +36,7 @@ Program Headers: - +LOAD +0x0+2000 0x0+102000 0x0+102000 0x0+3a0 0x0+3a0 RWE 0x100000 - +DYNAMIC +0x0+2060 0x0+102060 0x0+102060 0x0+130 0x0+130 RW +0x8 - +TLS +0x0+2000 0x0+102000 0x0+102000 0x0+60 0x0+80 R +0x4 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - #... - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries: ---- binutils-2.24/ld/testsuite/ld-x86-64/tlsgdesc.rd -+++ binutils-2.24/ld/testsuite/ld-x86-64/tlsgdesc.rd -@@ -36,12 +36,14 @@ Program Headers: - +LOAD.* - +LOAD.* - +DYNAMIC.* -+ +PAX_FLAGS.* - - Section to Segment mapping: - +Segment Sections... - +00 +.hash .dynsym .dynstr .rela.dyn .rela.plt .plt .text * - +01 +.dynamic .got .got.plt * - +02 +.dynamic * -+ +03 + - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 8 entries: - +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend ---- binutils-2.24/ld/testsuite/ld-x86-64/tlspic.rd -+++ binutils-2.24/ld/testsuite/ld-x86-64/tlspic.rd -@@ -40,6 +40,7 @@ Program Headers: - +LOAD +0x0+131a 0x0+20131a 0x0+20131a 0x0+246 0x0+246 RW +0x200000 - +DYNAMIC +0x0+1380 0x0+201380 0x0+201380 0x0+130 0x0+130 RW +0x8 - +TLS +0x0+131a 0x0+20131a 0x0+20131a 0x0+60 0x0+80 R +0x1 -+ +PAX_FLAGS +0x0+ 0x0+ 0x0+ 0x0+ 0x0+ +0x[48] - - Section to Segment mapping: - +Segment Sections... -@@ -47,6 +48,7 @@ Program Headers: - +01 +.tdata .dynamic .got .got.plt * - +02 +.dynamic * - +03 +.tdata .tbss * -+ +04 + - - Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries: - +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend diff --git a/binutils/patches/binutils-2.24-set-section-macros.patch0 b/binutils/patches/binutils-2.24-set-section-macros.patch0 deleted file mode 100644 index 6171c4804..000000000 --- a/binutils/patches/binutils-2.24-set-section-macros.patch0 +++ /dev/null @@ -1,103 +0,0 @@ -diff -rcp ../binutils-2.24.orig/bfd/bfd-in2.h bfd/bfd-in2.h -*** ../binutils-2.24.orig/bfd/bfd-in2.h 2014-04-22 12:03:35.226872578 +0100 ---- bfd/bfd-in2.h 2014-04-22 12:07:51.556393678 +0100 -*************** typedef struct bfd_section *sec_ptr; -*** 294,302 **** - - #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0) - -- #define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)), ((ptr)->user_set_vma = TRUE), TRUE) -- #define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE) -- #define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE) - /* Find the address one past the end of SEC. */ - #define bfd_get_section_limit(bfd, sec) \ - (((bfd)->direction != write_direction && (sec)->rawsize != 0 \ ---- 294,299 ---- -*************** struct relax_table { -*** 1592,1597 **** ---- 1589,1620 ---- - int size; - }; - -+ /* Note: the following are provided as inline functions rather than macros -+ because not all callers use the return value. A macro implementation -+ would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some -+ compilers will complain about comma expressions that have no effect. */ -+ static inline bfd_boolean -+ bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val) -+ { -+ ptr->userdata = val; -+ return TRUE; -+ } -+ -+ static inline bfd_boolean -+ bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val) -+ { -+ ptr->vma = ptr->lma = val; -+ ptr->user_set_vma = TRUE; -+ return TRUE; -+ } -+ -+ static inline bfd_boolean -+ bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val) -+ { -+ ptr->alignment_power = val; -+ return TRUE; -+ } -+ - /* These sections are global, and are managed by BFD. The application - and target back end are not permitted to change the values in - these sections. */ -diff -rcp ../binutils-2.24.orig/bfd/bfd-in.h bfd/bfd-in.h -*** ../binutils-2.24.orig/bfd/bfd-in.h 2014-04-22 12:03:35.272868967 +0100 ---- bfd/bfd-in.h 2014-04-22 12:06:12.850914084 +0100 -*************** typedef struct bfd_section *sec_ptr; -*** 287,295 **** - - #define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0) - -- #define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma = (val)), ((ptr)->user_set_vma = TRUE), TRUE) -- #define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),TRUE) -- #define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),TRUE) - /* Find the address one past the end of SEC. */ - #define bfd_get_section_limit(bfd, sec) \ - (((bfd)->direction != write_direction && (sec)->rawsize != 0 \ ---- 287,292 ---- -diff -rcp ../binutils-2.24.orig/bfd/section.c bfd/section.c -*** ../binutils-2.24.orig/bfd/section.c 2014-04-22 12:03:35.215873442 +0100 ---- bfd/section.c 2014-04-22 12:06:55.795118059 +0100 -*************** CODE_FRAGMENT -*** 542,547 **** ---- 542,573 ---- - . int size; - .}; - . -+ .{* Note: the following are provided as inline functions rather than macros -+ . because not all callers use the return value. A macro implementation -+ . would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some -+ . compilers will complain about comma expressions that have no effect. *} -+ .static inline bfd_boolean -+ .bfd_set_section_userdata (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, void * val) -+ .{ -+ . ptr->userdata = val; -+ . return TRUE; -+ .} -+ . -+ .static inline bfd_boolean -+ .bfd_set_section_vma (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, bfd_vma val) -+ .{ -+ . ptr->vma = ptr->lma = val; -+ . ptr->user_set_vma = TRUE; -+ . return TRUE; -+ .} -+ . -+ .static inline bfd_boolean -+ .bfd_set_section_alignment (bfd * abfd ATTRIBUTE_UNUSED, asection * ptr, unsigned int val) -+ .{ -+ . ptr->alignment_power = val; -+ . return TRUE; -+ .} -+ . - .{* These sections are global, and are managed by BFD. The application - . and target back end are not permitted to change the values in - . these sections. *} diff --git a/binutils/patches/binutils-2.24-symbol-warning.patch b/binutils/patches/binutils-2.24-symbol-warning.patch deleted file mode 100644 index aff6c48a7..000000000 --- a/binutils/patches/binutils-2.24-symbol-warning.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 4c6d802e592b3762a149c343bc5722e065e57841 Mon Sep 17 00:00:00 2001 -From: H.J. Lu -Date: Wed, 26 Mar 2014 12:18:59 -0700 -Subject: [PATCH] Scan all input files for symbol reference warning - -This patch scans all input files for symbol reference warning if the -symbol reference doesn't exist in the current input file. - -ld/ - - PR ld/16756 - * ldmain.c (symbol_warning): New function. - (warning_callback): Use it. Scan all input files for a reference - to SYMBOL. - -ld/testsuite/ - - PR ld/16756 - * ld-plugin/lto.exp: Expect filename and line number for PR - ld/12760 test. ---- - ld/ChangeLog | 7 ++++ - ld/ldmain.c | 43 ++++++++++++++++---------- - ld/testsuite/ChangeLog | 64 ++++++++++++++++++++++------------------ - ld/testsuite/ld-plugin/lto.exp | 4 +- - 4 files changed, 70 insertions(+), 48 deletions(-) - -diff --git a/ld/ldmain.c b/ld/ldmain.c -index ffc9f84..14253a6 100644 ---- a/ld/ldmain.c -+++ b/ld/ldmain.c -@@ -1150,6 +1150,25 @@ struct warning_callback_info - asymbol **asymbols; - }; - -+/* Look through the relocs to see if we can find a plausible address -+ for SYMBOL in ABFD. Return TRUE if found. Otherwise return FALSE. */ -+ -+static bfd_boolean -+symbol_warning (const char *warning, const char *symbol, bfd *abfd) -+{ -+ struct warning_callback_info cinfo; -+ -+ if (!bfd_generic_link_read_symbols (abfd)) -+ einfo (_("%B%F: could not read symbols: %E\n"), abfd); -+ -+ cinfo.found = FALSE; -+ cinfo.warning = warning; -+ cinfo.symbol = symbol; -+ cinfo.asymbols = bfd_get_outsymbols (abfd); -+ bfd_map_over_sections (abfd, warning_find_reloc, &cinfo); -+ return cinfo.found; -+} -+ - /* This is called when there is a reference to a warning symbol. */ - - static bfd_boolean ---- a/ld/ldmain.c 2014-06-24 14:04:00.700594584 -0400 -+++ b/ld/ldmain.c 2014-06-24 14:07:19.452270808 -0400 -@@ -1172,24 +1172,14 @@ - einfo ("%P: %s%s\n", _("warning: "), warning); - else if (symbol == NULL) - einfo ("%B: %s%s\n", abfd, _("warning: "), warning); -- else if ((abfd->flags & BFD_PLUGIN) == 0) -+ else if (! symbol_warning (warning, symbol, abfd)) - { -- struct warning_callback_info cinfo; -- -- /* Look through the relocs to see if we can find a plausible -- address. */ -- -- if (!bfd_generic_link_read_symbols (abfd)) -- einfo (_("%B%F: could not read symbols: %E\n"), abfd); -- -- cinfo.found = FALSE; -- cinfo.warning = warning; -- cinfo.symbol = symbol; -- cinfo.asymbols = bfd_get_outsymbols (abfd); -- bfd_map_over_sections (abfd, warning_find_reloc, &cinfo); -- -- if (! cinfo.found) -- einfo ("%B: %s%s\n", abfd, _("warning: "), warning); -+ bfd *b; -+ /* Search all input files for a reference to SYMBOL. */ -+ for (b = info->input_bfds; b; b = b->link_next) -+ if (b != abfd && symbol_warning (warning, symbol, b)) -+ return TRUE; -+ einfo ("%B: %s%s\n", abfd, _("warning: "), warning); - } - - return TRUE; -diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp -index af7307f..53543a6 100644 ---- a/ld/testsuite/ld-plugin/lto.exp -+++ b/ld/testsuite/ld-plugin/lto.exp -@@ -116,14 +116,14 @@ set lto_link_tests { - "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12758a.o -Wl,--start-group tmpdir/libpr12758.a -Wl,--end-group" "" - {dummy.c} {} "pr12758.exe"} - {"Build libdummy.a PR ld/12760" -- "" "" -+ "" "-g -O0" - {pr12760a.c} {} "libdummy.a"} - {"Build libpr12760.a" - "" "-flto -O2 -ffat-lto-objects" - {pr12760b.c} {} "libpr12760.a"} - {"PR ld/12760" - "-O2 -Wl,-e,foo -nostdlib -flto -fuse-linker-plugin tmpdir/pr12760a.o -Wl,--start-group tmpdir/libpr12760.a -Wl,--end-group" "" -- {dummy.c} {} "pr12760.exe" "c" "warning: Bad bar"} -+ {dummy.c} {} "pr12760.exe" "c" "pr12760a.c:6: warning: Bad bar"} - {"Build libpr13183.a" - "-T" "-flto -O2 -ffat-lto-objects" - {pr13183a.c} {} "libpr13183.a"} --- -1.7.1 diff --git a/binutils/patches/binutils-2.24-weak-sym-merge.patch0 b/binutils/patches/binutils-2.24-weak-sym-merge.patch0 deleted file mode 100644 index 0625f0d04..000000000 --- a/binutils/patches/binutils-2.24-weak-sym-merge.patch0 +++ /dev/null @@ -1,22 +0,0 @@ -*** ../binutils-2.24.orig/bfd/elflink.c 2014-08-15 14:12:59.933394436 +0100 ---- bfd/elflink.c 2014-08-15 14:40:54.787075416 +0100 -*************** _bfd_elf_merge_symbol (bfd *abfd, -*** 1437,1443 **** - if (!(oldbfd != NULL - && (oldbfd->flags & BFD_PLUGIN) != 0 - && (abfd->flags & BFD_PLUGIN) == 0)) -! *skip = TRUE; - - /* Merge st_other. If the symbol already has a dynamic index, - but visibility says it should not be visible, turn it into a ---- 1437,1446 ---- - if (!(oldbfd != NULL - && (oldbfd->flags & BFD_PLUGIN) != 0 - && (abfd->flags & BFD_PLUGIN) == 0)) -! { -! newdef = FALSE; -! *skip = TRUE; -! } - - /* Merge st_other. If the symbol already has a dynamic index, - but visibility says it should not be visible, turn it into a diff --git a/binutils/patches/binutils-2.26-fix-GOT-offset-calculation.patch b/binutils/patches/binutils-2.26-fix-GOT-offset-calculation.patch new file mode 100644 index 000000000..99e8b7080 --- /dev/null +++ b/binutils/patches/binutils-2.26-fix-GOT-offset-calculation.patch @@ -0,0 +1,17 @@ +--- binutils-2.26.orig/bfd/elf32-i386.c 2016-02-29 15:47:45.172597805 +0000 ++++ binutils-2.26/bfd/elf32-i386.c 2016-02-29 15:48:42.161904973 +0000 +@@ -4016,10 +4016,12 @@ elf_i386_relocate_section (bfd *output_b + + /* It is relative to .got.plt section. */ + if (h->got.offset != (bfd_vma) -1) +- /* Use GOT entry. */ ++ /* Use GOT entry. Mask off the least significant bit in ++ GOT offset which may be set by R_386_GOT32 processing ++ below. */ + relocation = (htab->elf.sgot->output_section->vma + + htab->elf.sgot->output_offset +- + h->got.offset - offplt); ++ + (h->got.offset & ~1) - offplt); + else + /* Use GOTPLT entry. */ + relocation = (h->plt.offset / plt_entry_size - 1 + 3) * 4; diff --git a/binutils/patches/binutils-2.26-lto.patch b/binutils/patches/binutils-2.26-lto.patch new file mode 100644 index 000000000..370545965 --- /dev/null +++ b/binutils/patches/binutils-2.26-lto.patch @@ -0,0 +1,2555 @@ +diff -rup binutils-2.26.orig/bfd/bfd.c binutils-2.26/bfd/bfd.c +--- binutils-2.26.orig/bfd/bfd.c 2016-02-19 09:35:36.231000625 +0000 ++++ binutils-2.26/bfd/bfd.c 2016-02-19 09:35:54.901106498 +0000 +@@ -57,6 +57,14 @@ CODE_FRAGMENT + . bfd_byte data[1]; + . }; + . ++.enum bfd_lto_object_type ++. { ++. lto_non_object, ++. lto_non_ir_object, ++. lto_ir_object, ++. lto_mixed_object ++. }; ++. + .struct bfd + .{ + . {* The filename the application opened the BFD with. *} +@@ -227,6 +235,9 @@ CODE_FRAGMENT + . {* Set if this is a plugin output file. *} + . unsigned int lto_output : 1; + . ++. {* LTO object type. *} ++. ENUM_BITFIELD (bfd_lto_object_type) lto_type : 2; ++. + . {* Set to dummy BFD created when claimed by a compiler plug-in + . library. *} + . bfd *plugin_dummy_bfd; +@@ -252,6 +263,9 @@ CODE_FRAGMENT + . {* The last section on the section list. *} + . struct bfd_section *section_last; + . ++. {* The object-only section on the section list. *} ++. struct bfd_section *object_only_section; ++. + . {* The number of sections. *} + . unsigned int section_count; + . +@@ -2270,3 +2284,36 @@ bfd_convert_section_contents (bfd *ibfd, + *ptr_size = size; + return TRUE; + } ++ ++/* ++FUNCTION ++ bfd_group_signature ++ ++SYNOPSIS ++ asymbol *bfd_group_signature (asection *group, asymbol **isympp); ++ ++DESCRIPTION ++ Return a pointer to the symbol used as a signature for GROUP. ++*/ ++ ++asymbol * ++bfd_group_signature (asection *group, asymbol **isympp) ++{ ++ bfd *abfd = group->owner; ++ Elf_Internal_Shdr *ghdr; ++ ++ if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) ++ return NULL; ++ ++ ghdr = &elf_section_data (group)->this_hdr; ++ if (ghdr->sh_link < elf_numsections (abfd)) ++ { ++ const struct elf_backend_data *bed = get_elf_backend_data (abfd); ++ Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link]; ++ ++ if (symhdr->sh_type == SHT_SYMTAB ++ && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym) ++ return isympp[ghdr->sh_info - 1]; ++ } ++ return NULL; ++} +diff -rup binutils-2.26.orig/bfd/bfd-in2.h binutils-2.26/bfd/bfd-in2.h +--- binutils-2.26.orig/bfd/bfd-in2.h 2016-02-19 09:35:36.280000903 +0000 ++++ binutils-2.26/bfd/bfd-in2.h 2016-02-19 09:35:54.900106492 +0000 +@@ -1089,6 +1089,9 @@ struct bfd_section *bfd_create_gnu_debug + bfd_boolean bfd_fill_in_gnu_debuglink_section + (bfd *abfd, struct bfd_section *sect, const char *filename); + ++const char *bfd_extract_object_only_section ++ (bfd *abfd); ++ + /* Extracted from libbfd.c. */ + + /* Byte swapping macros for user section data. */ +@@ -1654,6 +1657,9 @@ extern asection _bfd_std_section[4]; + #define BFD_COM_SECTION_NAME "*COM*" + #define BFD_IND_SECTION_NAME "*IND*" + ++/* GNU object-only section name. */ ++#define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only" ++ + /* Pointer to the common section. */ + #define bfd_com_section_ptr (&_bfd_std_section[0]) + /* Pointer to the undefined section. */ +@@ -6511,6 +6517,14 @@ struct bfd_build_id + bfd_byte data[1]; + }; + ++enum bfd_lto_object_type ++ { ++ lto_non_object, ++ lto_non_ir_object, ++ lto_ir_object, ++ lto_mixed_object ++ }; ++ + struct bfd + { + /* The filename the application opened the BFD with. */ +@@ -6681,6 +6695,9 @@ struct bfd + /* Set if this is a plugin output file. */ + unsigned int lto_output : 1; + ++ /* LTO object type. */ ++ ENUM_BITFIELD (bfd_lto_object_type) lto_type : 2; ++ + /* Set to dummy BFD created when claimed by a compiler plug-in + library. */ + bfd *plugin_dummy_bfd; +@@ -6706,6 +6723,9 @@ struct bfd + /* The last section on the section list. */ + struct bfd_section *section_last; + ++ /* The object-only section on the section list. */ ++ struct bfd_section *object_only_section; ++ + /* The number of sections. */ + unsigned int section_count; + +@@ -7026,6 +7046,8 @@ bfd_boolean bfd_convert_section_contents + (bfd *ibfd, asection *isec, bfd *obfd, + bfd_byte **ptr, bfd_size_type *ptr_size); + ++asymbol *bfd_group_signature (asection *group, asymbol **isympp); ++ + /* Extracted from archive.c. */ + symindex bfd_get_next_mapent + (bfd *abfd, symindex previous, carsym **sym); +diff -rup binutils-2.26.orig/bfd/elf.c binutils-2.26/bfd/elf.c +--- binutils-2.26.orig/bfd/elf.c 2016-02-19 09:35:36.280000903 +0000 ++++ binutils-2.26/bfd/elf.c 2016-02-19 09:35:54.904106515 +0000 +@@ -2387,6 +2387,7 @@ static const struct bfd_elf_special_sect + { STRING_COMMA_LEN (".gnu.linkonce.b"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, + { STRING_COMMA_LEN (".gnu.lto_"), -1, SHT_PROGBITS, SHF_EXCLUDE }, + { STRING_COMMA_LEN (".got"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, ++ { STRING_COMMA_LEN (".gnu_object_only"), 0, SHT_GNU_OBJECT_ONLY, SHF_EXCLUDE }, + { STRING_COMMA_LEN (".gnu.version"), 0, SHT_GNU_versym, 0 }, + { STRING_COMMA_LEN (".gnu.version_d"), 0, SHT_GNU_verdef, 0 }, + { STRING_COMMA_LEN (".gnu.version_r"), 0, SHT_GNU_verneed, 0 }, +diff -rup binutils-2.26.orig/bfd/format.c binutils-2.26/bfd/format.c +--- binutils-2.26.orig/bfd/format.c 2016-02-19 09:35:36.265000818 +0000 ++++ binutils-2.26/bfd/format.c 2016-02-19 09:36:21.420256880 +0000 +@@ -46,6 +46,9 @@ SUBSECTION + #include "sysdep.h" + #include "bfd.h" + #include "libbfd.h" ++#if BFD_SUPPORTS_PLUGINS ++#include "plugin.h" ++#endif + + /* IMPORT from targets.c. */ + extern const size_t _bfd_target_vector_entries; +@@ -179,6 +182,33 @@ bfd_preserve_finish (bfd *abfd ATTRIBUTE + preserve->marker = NULL; + } + ++/* Set lto_type in ABFD. */ ++ ++static void ++bfd_set_lto_type (bfd *abfd) ++{ ++ if (abfd->format == bfd_object ++ && abfd->lto_type == lto_non_object ++ && (abfd->flags & (DYNAMIC | EXEC_P)) == 0) ++ { ++ asection *sec; ++ enum bfd_lto_object_type type = lto_non_ir_object; ++ for (sec = abfd->sections; sec != NULL; sec = sec->next) ++ { ++ if (strcmp (sec->name, GNU_OBJECT_ONLY_SECTION_NAME) == 0) ++ { ++ type = lto_mixed_object; ++ abfd->object_only_section = sec; ++ break; ++ } ++ else if (type != lto_ir_object ++ && strncmp (sec->name, ".gnu.lto_", 9) == 0) ++ type = lto_ir_object; ++ } ++ abfd->lto_type = type; ++ } ++} ++ + /* + FUNCTION + bfd_check_format_matches +@@ -221,7 +251,10 @@ bfd_check_format_matches (bfd *abfd, bfd + } + + if (abfd->format != bfd_unknown) +- return abfd->format == format; ++ { ++ bfd_set_lto_type (abfd); ++ return abfd->format == format; ++ } + + if (matching != NULL || *bfd_associated_vector != NULL) + { +@@ -285,6 +318,13 @@ bfd_check_format_matches (bfd *abfd, bfd + || (*target)->match_priority > best_match) + continue; + ++#if BFD_SUPPORTS_PLUGINS ++ /* If the plugin target is explicitly specified when a BFD file ++ is opened, don't check it twice. */ ++ if (bfd_plugin_specified_p () && bfd_plugin_target_p (*target)) ++ continue; ++#endif ++ + /* If we already tried a match, the bfd is modified and may + have sections attached, which will confuse the next + _bfd_check_format call. */ +@@ -449,6 +489,8 @@ bfd_check_format_matches (bfd *abfd, bfd + if (matching_vector) + free (matching_vector); + ++ bfd_set_lto_type (abfd); ++ + /* File position has moved, BTW. */ + return TRUE; + } +diff -rup binutils-2.26.orig/bfd/opncls.c binutils-2.26/bfd/opncls.c +--- binutils-2.26.orig/bfd/opncls.c 2016-02-19 09:35:36.281000909 +0000 ++++ binutils-2.26/bfd/opncls.c 2016-02-19 09:35:54.905106520 +0000 +@@ -1717,3 +1717,69 @@ bfd_fill_in_gnu_debuglink_section (bfd * + + return TRUE; + } ++ ++/* ++FUNCTION ++ bfd_extract_object_only_section ++ ++SYNOPSIS ++ const char *bfd_extract_object_only_section ++ (bfd *abfd); ++ ++DESCRIPTION ++ ++ Takes a @var{ABFD} and extract the .gnu_object_only section into ++ a temporary file. ++ ++RETURNS ++ The name of the temporary file is returned if all is ok. ++ Otherwise <> is returned and bfd_error is set. ++*/ ++ ++const char * ++bfd_extract_object_only_section (bfd *abfd) ++{ ++ asection *sec = abfd->object_only_section; ++ const char *name; ++ FILE *file; ++ bfd_byte *memhunk = NULL; ++ size_t off, size; ++ bfd_error_type err; ++ ++ /* Get a temporary object-only file. */ ++ name = make_temp_file (".obj-only.o"); ++ ++ /* Open the object-only file. */ ++ file = real_fopen (name, FOPEN_WB); ++ if (!bfd_get_full_section_contents (abfd, sec, &memhunk)) ++ { ++ err = bfd_get_error (); ++ ++loser: ++ free (memhunk); ++ fclose (file); ++ unlink (name); ++ bfd_set_error (err); ++ return NULL; ++ } ++ ++ off = 0; ++ size = sec->size; ++ while (off != size) ++ { ++ size_t written, nwrite = size - off; ++ ++ written = fwrite (memhunk + off, 1, nwrite, file); ++ if (written < nwrite && ferror (file)) ++ { ++ err = bfd_error_system_call; ++ goto loser; ++ } ++ ++ off += written; ++ } ++ ++ free (memhunk); ++ fclose (file); ++ return name; ++} +diff -rup binutils-2.26.orig/bfd/plugin.c binutils-2.26/bfd/plugin.c +--- binutils-2.26.orig/bfd/plugin.c 2016-02-19 09:35:36.271000852 +0000 ++++ binutils-2.26/bfd/plugin.c 2016-02-19 09:35:54.905106520 +0000 +@@ -130,6 +130,146 @@ register_claim_file (ld_plugin_claim_fil + return LDPS_OK; + } + ++static asection bfd_plugin_fake_text_section ++ = BFD_FAKE_SECTION (bfd_plugin_fake_text_section, 0, 0, ".text", 0); ++static asection bfd_plugin_fake_common_section ++ = BFD_FAKE_SECTION (bfd_plugin_fake_common_section, SEC_IS_COMMON, 0, ++ NULL, 0); ++ ++/* Get symbols from object only section. */ ++ ++static void ++bfd_plugin_get_symbols_in_object_only (bfd *abfd) ++{ ++ struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; ++ const char *object_only_file; ++ bfd *nbfd; ++ long storage; ++ long object_only_nsyms, added_nsyms, i; ++ asymbol **object_only_syms, **added_syms; ++ ++ plugin_data->object_only_syms = NULL; ++ plugin_data->object_only_nsyms = 0; ++ ++ if (abfd->sections == NULL && abfd->my_archive == NULL) ++ { ++ nbfd = bfd_openr (abfd->filename, NULL); ++ if (nbfd == NULL) ++ { ++ (*_bfd_error_handler) ++ (_("%s: failed to open to extract object only section: %s"), ++ abfd->filename, bfd_errmsg (bfd_get_error ())); ++ goto error_return; ++ } ++ else if (!bfd_check_format (nbfd, bfd_object)) ++ { ++ /* There is no object only section if it isn't a bfd_object ++ file. */ ++error_return: ++ bfd_close (nbfd); ++ return; ++ } ++ } ++ else ++ { ++ if (!bfd_check_format (abfd, bfd_object)) ++ { ++ (*_bfd_error_handler) ++ (_("%B: invalid file to extract object only section: %s"), ++ abfd, bfd_errmsg (bfd_get_error ())); ++ return; ++ } ++ nbfd = abfd; ++ } ++ ++ if (nbfd->lto_type == lto_mixed_object ++ && (nbfd->flags & HAS_SYMS) != 0) ++ { ++ object_only_file = bfd_extract_object_only_section (nbfd); ++ if (object_only_file == NULL) ++ (*_bfd_error_handler) ++ (_("%B: failed to extract object only section: %s"), ++ abfd, bfd_errmsg (bfd_get_error ())); ++ } ++ else ++ object_only_file = NULL; ++ ++ /* Close the new bfd we just opened. */ ++ if (nbfd != abfd) ++ bfd_close (nbfd); ++ ++ /* Return if there is no object only section or there is no ++ symbol in object only section. */ ++ if (!object_only_file) ++ return; ++ ++ /* Open the file containing object only section. */ ++ nbfd = bfd_openr (object_only_file, NULL); ++ if (!bfd_check_format (nbfd, bfd_object)) ++ { ++ (*_bfd_error_handler) ++ (_("%B: failed to open object only section: %s"), ++ abfd, bfd_errmsg (bfd_get_error ())); ++ goto quit; ++ } ++ ++ storage = bfd_get_symtab_upper_bound (nbfd); ++ if (storage <= 0) ++ { ++ if (storage < 0) ++ (*_bfd_error_handler) ++ (_("%B: failed to get symbol table in object only section: %s"), ++ abfd, bfd_errmsg (bfd_get_error ())); ++ ++ goto quit; ++ } ++ ++ object_only_syms = (asymbol **) bfd_malloc (storage); ++ object_only_nsyms = bfd_canonicalize_symtab (nbfd, object_only_syms); ++ ++ /* FIXME: We waste some spaces if not all symbols are copied. */ ++ added_syms = (asymbol **) bfd_alloc (abfd, storage); ++ added_nsyms = 0; ++ ++ /* Copy only global symbols from object only section. */ ++ for (i = 0; i < object_only_nsyms; i++) ++ { ++ asection *sec = object_only_syms[i]->section; ++ flagword flags = object_only_syms[i]->flags; ++ asymbol *s; ++ ++ if (bfd_is_com_section (sec)) ++ sec = &bfd_plugin_fake_common_section; ++ else if (bfd_is_und_section (sec)) ++ ; ++ else if ((flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0) ++ sec = &bfd_plugin_fake_text_section; ++ else ++ continue; ++ ++ s = bfd_alloc (abfd, sizeof (asymbol)); ++ BFD_ASSERT (s); ++ added_syms[added_nsyms++] = s; ++ ++ s->section = sec; ++ s->the_bfd = abfd; ++ s->name = xstrdup (object_only_syms[i]->name); ++ s->value = 0; ++ s->flags = flags; ++ s->udata.p = NULL; ++ } ++ ++ plugin_data->object_only_syms = added_syms; ++ plugin_data->object_only_nsyms = added_nsyms; ++ ++ free (object_only_syms); ++ ++quit: ++ /* Close and remove the object only section file. */ ++ bfd_close (nbfd); ++ unlink (object_only_file); ++} ++ + static enum ld_plugin_status + add_symbols (void * handle, + int nsyms, +@@ -142,10 +282,13 @@ add_symbols (void * handle, + plugin_data->nsyms = nsyms; + plugin_data->syms = syms; + +- if (nsyms != 0) ++ abfd->tdata.plugin_data = plugin_data; ++ ++ bfd_plugin_get_symbols_in_object_only (abfd); ++ ++ if ((nsyms + plugin_data->object_only_nsyms) != 0) + abfd->flags |= HAS_SYMS; + +- abfd->tdata.plugin_data = plugin_data; + return LDPS_OK; + } + +@@ -440,7 +583,8 @@ static long + bfd_plugin_get_symtab_upper_bound (bfd *abfd) + { + struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; +- long nsyms = plugin_data->nsyms; ++ /* Add symbols from object only section. */ ++ long nsyms = plugin_data->nsyms + plugin_data->object_only_nsyms; + + BFD_ASSERT (nsyms >= 0); + +@@ -474,12 +618,7 @@ bfd_plugin_canonicalize_symtab (bfd *abf + struct plugin_data_struct *plugin_data = abfd->tdata.plugin_data; + long nsyms = plugin_data->nsyms; + const struct ld_plugin_symbol *syms = plugin_data->syms; +- static asection fake_section; +- static asection fake_common_section; +- int i; +- +- fake_section.name = ".text"; +- fake_common_section.flags = SEC_IS_COMMON; ++ int i, j; + + for (i = 0; i < nsyms; i++) + { +@@ -492,10 +631,11 @@ bfd_plugin_canonicalize_symtab (bfd *abf + s->name = syms[i].name; + s->value = 0; + s->flags = convert_flags (&syms[i]); ++ s->udata.p = NULL; + switch (syms[i].def) + { + case LDPK_COMMON: +- s->section = &fake_common_section; ++ s->section = &bfd_plugin_fake_common_section; + break; + case LDPK_UNDEF: + case LDPK_WEAKUNDEF: +@@ -503,15 +643,18 @@ bfd_plugin_canonicalize_symtab (bfd *abf + break; + case LDPK_DEF: + case LDPK_WEAKDEF: +- s->section = &fake_section; ++ s->section = &bfd_plugin_fake_text_section; + break; + default: + BFD_ASSERT (0); + } +- +- s->udata.p = (void *) &syms[i]; + } + ++ /* Copy symbols from object only section. */ ++ nsyms += plugin_data->object_only_nsyms; ++ for (j = 0; j < plugin_data->object_only_nsyms; j++, i++) ++ alocation[i] = plugin_data->object_only_syms[j]; ++ + return nsyms; + } + +diff -rup binutils-2.26.orig/bfd/plugin.h binutils-2.26/bfd/plugin.h +--- binutils-2.26.orig/bfd/plugin.h 2016-02-19 09:35:36.271000852 +0000 ++++ binutils-2.26/bfd/plugin.h 2016-02-19 09:35:54.906106526 +0000 +@@ -33,6 +33,8 @@ typedef struct plugin_data_struct + { + int nsyms; + const struct ld_plugin_symbol *syms; ++ int object_only_nsyms; ++ asymbol **object_only_syms; + } + plugin_data_struct; + +diff -rup binutils-2.26.orig/bfd/section.c binutils-2.26/bfd/section.c +--- binutils-2.26.orig/bfd/section.c 2016-02-19 09:35:36.276000881 +0000 ++++ binutils-2.26/bfd/section.c 2016-02-19 09:35:54.906106526 +0000 +@@ -588,6 +588,9 @@ CODE_FRAGMENT + .#define BFD_COM_SECTION_NAME "*COM*" + .#define BFD_IND_SECTION_NAME "*IND*" + . ++.{* GNU object-only section name. *} ++.#define GNU_OBJECT_ONLY_SECTION_NAME ".gnu_object_only" ++. + .{* Pointer to the common section. *} + .#define bfd_com_section_ptr (&_bfd_std_section[0]) + .{* Pointer to the undefined section. *} +diff -rup binutils-2.26.orig/binutils/objcopy.c binutils-2.26/binutils/objcopy.c +--- binutils-2.26.orig/binutils/objcopy.c 2016-02-19 09:35:36.287000943 +0000 ++++ binutils-2.26/binutils/objcopy.c 2016-02-19 09:35:54.908106537 +0000 +@@ -1108,30 +1108,6 @@ is_specified_symbol (const char *name, h + return htab_find (htab, name) != NULL; + } + +-/* Return a pointer to the symbol used as a signature for GROUP. */ +- +-static asymbol * +-group_signature (asection *group) +-{ +- bfd *abfd = group->owner; +- Elf_Internal_Shdr *ghdr; +- +- if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) +- return NULL; +- +- ghdr = &elf_section_data (group)->this_hdr; +- if (ghdr->sh_link < elf_numsections (abfd)) +- { +- const struct elf_backend_data *bed = get_elf_backend_data (abfd); +- Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link]; +- +- if (symhdr->sh_type == SHT_SYMTAB +- && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym) +- return isympp[ghdr->sh_info - 1]; +- } +- return NULL; +-} +- + /* Return TRUE if the section is a DWO section. */ + + static bfd_boolean +@@ -1237,7 +1213,7 @@ is_strip_section (bfd *abfd ATTRIBUTE_UN + /* PR binutils/3181 + If we are going to strip the group signature symbol, then + strip the group section too. */ +- gsym = group_signature (sec); ++ gsym = bfd_group_signature (sec, isympp); + if (gsym != NULL) + gname = gsym->name; + else +@@ -3091,7 +3067,7 @@ setup_section (bfd *ibfd, sec_ptr isecti + + if ((isection->flags & SEC_GROUP) != 0) + { +- asymbol *gsym = group_signature (isection); ++ asymbol *gsym = bfd_group_signature (isection, isympp); + + if (gsym != NULL) + { +diff -rup binutils-2.26.orig/binutils/readelf.c binutils-2.26/binutils/readelf.c +--- binutils-2.26.orig/binutils/readelf.c 2016-02-19 09:35:36.295000988 +0000 ++++ binutils-2.26/binutils/readelf.c 2016-02-19 09:35:54.911106554 +0000 +@@ -3900,6 +3900,7 @@ get_section_type_name (unsigned int sh_t + case 0x7ffffffd: return "AUXILIARY"; + case 0x7fffffff: return "FILTER"; + case SHT_GNU_LIBLIST: return "GNU_LIBLIST"; ++ case SHT_GNU_OBJECT_ONLY: return "GNU_OBJECT_ONLY"; + + default: + if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC)) +diff -rup binutils-2.26.orig/gas/testsuite/gas/elf/section9.d binutils-2.26/gas/testsuite/gas/elf/section9.d +--- binutils-2.26.orig/gas/testsuite/gas/elf/section9.d 2016-02-19 09:35:36.397001567 +0000 ++++ binutils-2.26/gas/testsuite/gas/elf/section9.d 2016-02-19 09:35:54.912106560 +0000 +@@ -4,4 +4,5 @@ + #... + [ ]*\[.*\][ ]+\.gnu\.lto_main[ ]+PROGBITS.*[ ]+E[ ]+.* + [ ]*\[.*\][ ]+\.gnu\.lto_\.pureconst[ ]+PROGBITS.*[ ]+E[ ]+.* ++[ ]*\[.*\][ ]+\.gnu_object_only[ ]+GNU_OBJECT_ONLY.*[ ]+E[ ]+.* + #pass +diff -rup binutils-2.26.orig/gas/testsuite/gas/elf/section9.s binutils-2.26/gas/testsuite/gas/elf/section9.s +--- binutils-2.26.orig/gas/testsuite/gas/elf/section9.s 2016-02-19 09:35:36.397001567 +0000 ++++ binutils-2.26/gas/testsuite/gas/elf/section9.s 2016-02-19 09:35:54.912106560 +0000 +@@ -2,3 +2,5 @@ + .byte 0,0,0,0 + .section .gnu.lto_.pureconst,"",%progbits + .byte 0,0,0,0 ++ .section .gnu_object_only ++ .byte 0,0,0,0 +diff -rup binutils-2.26.orig/include/bfdlink.h binutils-2.26/include/bfdlink.h +--- binutils-2.26.orig/include/bfdlink.h 2016-02-19 09:35:36.672003126 +0000 ++++ binutils-2.26/include/bfdlink.h 2016-02-19 09:35:54.913106566 +0000 +@@ -400,6 +400,12 @@ struct bfd_link_info + /* TRUE if ok to have multiple definition. */ + unsigned int allow_multiple_definition: 1; + ++ /* TRUE if .gnu_object_only section should be created. */ ++ unsigned int emit_gnu_object_only: 1; ++ ++ /* TRUE if .gnu_object_only section is being created. */ ++ unsigned int emitting_gnu_object_only: 1; ++ + /* TRUE if ok to have version with no definition. */ + unsigned int allow_undefined_version: 1; + +diff -rup binutils-2.26.orig/include/elf/common.h binutils-2.26/include/elf/common.h +--- binutils-2.26.orig/include/elf/common.h 2016-02-19 09:35:36.675003143 +0000 ++++ binutils-2.26/include/elf/common.h 2016-02-19 09:35:54.913106566 +0000 +@@ -478,6 +478,7 @@ + #define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes */ + #define SHT_GNU_HASH 0x6ffffff6 /* GNU style symbol hash table */ + #define SHT_GNU_LIBLIST 0x6ffffff7 /* List of prelink dependencies */ ++#define SHT_GNU_OBJECT_ONLY 0x6ffffff8 /* Object only */ + + /* The next three section types are defined by Solaris, and are named + SHT_SUNW*. We use them in GNU code, so we also define SHT_GNU* +diff -rup binutils-2.26.orig/ld/emultempl/aarch64elf.em binutils-2.26/ld/emultempl/aarch64elf.em +--- binutils-2.26.orig/ld/emultempl/aarch64elf.em 2016-02-19 09:35:36.698003274 +0000 ++++ binutils-2.26/ld/emultempl/aarch64elf.em 2016-02-19 09:35:54.914106571 +0000 +@@ -271,7 +271,7 @@ gld${EMULATION_NAME}_after_allocation (v + } + + static void +-gld${EMULATION_NAME}_finish (void) ++aarch64_finish (void) + { + if (!bfd_link_relocatable (&link_info)) + { +@@ -283,7 +283,7 @@ gld${EMULATION_NAME}_finish (void) + } + } + +- finish_default (); ++ gld${EMULATION_NAME}_finish (); + } + + /* This is a convenient point to tell BFD about target specific flags. +@@ -435,4 +435,4 @@ LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS= + LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse + + # Call the extra arm-elf function +-LDEMUL_FINISH=gld${EMULATION_NAME}_finish ++LDEMUL_FINISH=aarch64_finish +diff -rup binutils-2.26.orig/ld/emultempl/alphaelf.em binutils-2.26/ld/emultempl/alphaelf.em +--- binutils-2.26.orig/ld/emultempl/alphaelf.em 2016-02-19 09:35:36.698003274 +0000 ++++ binutils-2.26/ld/emultempl/alphaelf.em 2016-02-19 09:35:54.914106571 +0000 +@@ -104,7 +104,7 @@ alpha_finish (void) + if (limit_32bit) + elf_elfheader (link_info.output_bfd)->e_flags |= EF_ALPHA_32BIT; + +- finish_default (); ++ gld${EMULATION_NAME}_finish (); + } + EOF + +diff -rup binutils-2.26.orig/ld/emultempl/armelf.em binutils-2.26/ld/emultempl/armelf.em +--- binutils-2.26.orig/ld/emultempl/armelf.em 2016-02-19 09:35:36.698003274 +0000 ++++ binutils-2.26/ld/emultempl/armelf.em 2016-02-19 09:35:54.914106571 +0000 +@@ -377,7 +377,7 @@ gld${EMULATION_NAME}_after_allocation (v + } + + static void +-gld${EMULATION_NAME}_finish (void) ++arm_finish (void) + { + struct bfd_link_hash_entry * h; + +@@ -404,7 +404,7 @@ gld${EMULATION_NAME}_finish (void) + } + } + +- finish_default (); ++ gld${EMULATION_NAME}_finish (); + + if (thumb_entry_symbol) + { +@@ -730,4 +730,4 @@ LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS= + LDEMUL_BEFORE_PARSE=gld"${EMULATION_NAME}"_before_parse + + # Call the extra arm-elf function +-LDEMUL_FINISH=gld${EMULATION_NAME}_finish ++LDEMUL_FINISH=arm_finish +diff -rup binutils-2.26.orig/ld/emultempl/avrelf.em binutils-2.26/ld/emultempl/avrelf.em +--- binutils-2.26.orig/ld/emultempl/avrelf.em 2016-02-19 09:35:36.698003274 +0000 ++++ binutils-2.26/ld/emultempl/avrelf.em 2016-02-19 09:35:54.915106577 +0000 +@@ -209,7 +209,7 @@ avr_finish (void) + else + elf_elfheader (abfd)->e_flags &= ~EF_AVR_LINKRELAX_PREPARED; + +- finish_default (); ++ gld${EMULATION_NAME}_finish (); + } + EOF + +diff -rup binutils-2.26.orig/ld/emultempl/elf32.em binutils-2.26/ld/emultempl/elf32.em +--- binutils-2.26.orig/ld/emultempl/elf32.em 2016-02-19 09:35:36.700003285 +0000 ++++ binutils-2.26/ld/emultempl/elf32.em 2016-02-19 09:35:54.915106577 +0000 +@@ -66,6 +66,7 @@ static void gld${EMULATION_NAME}_before_ + static void gld${EMULATION_NAME}_after_allocation (void); + static lang_output_section_statement_type *gld${EMULATION_NAME}_place_orphan + (asection *, const char *, int); ++static void gld${EMULATION_NAME}_finish (void); + EOF + + if [ "x${USE_LIBPATH}" = xyes ] ; then +@@ -1795,6 +1796,8 @@ output_rel_find (asection *sec, int isdy + return last; + } + ++static int orphan_init_done = 0; ++ + /* Place an orphan section. We use this to put random SHF_ALLOC + sections in the right segment. */ + +@@ -1803,7 +1806,7 @@ gld${EMULATION_NAME}_place_orphan (asect + const char *secname, + int constraint) + { +- static struct orphan_save hold[] = ++ static struct orphan_save orig_hold[] = + { + { ".text", + SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE, +@@ -1833,6 +1836,7 @@ gld${EMULATION_NAME}_place_orphan (asect + SEC_HAS_CONTENTS, + 0, 0, 0, 0 }, + }; ++ static struct orphan_save hold[ARRAY_SIZE (orig_hold)]; + enum orphan_save_index + { + orphan_text = 0, +@@ -1845,7 +1849,6 @@ gld${EMULATION_NAME}_place_orphan (asect + orphan_sdata, + orphan_nonalloc + }; +- static int orphan_init_done = 0; + struct orphan_save *place; + lang_output_section_statement_type *after; + lang_output_section_statement_type *os; +@@ -1924,15 +1927,22 @@ gld${EMULATION_NAME}_place_orphan (asect + + if (!orphan_init_done) + { +- struct orphan_save *ho; ++ struct orphan_save *ho, *horig; + + for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho) ++ for (ho = hold, horig = orig_hold; ++ ho < hold + ARRAY_SIZE (hold); ++ ++ho, ++horig) ++ { ++ *ho = *horig; ++ if (ho->name != NULL) + if (ho->name != NULL) + { + ho->os = lang_output_section_find (ho->name); + if (ho->os != NULL && ho->os->flags == 0) + ho->os->flags = ho->flags; + } ++ } + orphan_init_done = 1; + } + +@@ -2017,6 +2027,27 @@ gld${EMULATION_NAME}_place_orphan (asect + EOF + fi + ++fragment <header.type = cmdline_is_bfd_enum; ++ new_opt->header.next = NULL; ++ new_opt->abfd.abfd = (bfd *) data; ++ ++ c = cmdline_object_only_archive_list.head; ++ if (c == NULL) ++ { ++ cmdline_object_only_archive_list.head = new_opt; ++ cmdline_object_only_archive_list.tail = &new_opt->header.next; ++ return; ++ } ++ ++ prev = NULL; ++ origin = abfd->origin; ++ for (; c != NULL; c = next) ++ { ++ if (c->header.type != cmdline_is_bfd_enum) ++ abort (); ++ ++ next = c->header.next; ++ ++ obfd = c->abfd.abfd; ++ oarchive = bfd_my_archive (obfd); ++ ++ if (strcmp (archive->filename, oarchive->filename) == 0) ++ { ++ bfd_boolean after; ++ ++ if (origin < obfd->origin) ++ { ++ /* Insert it before the current. */ ++ new_opt->header.next = c; ++ if (prev) ++ *prev = new_opt; ++ else ++ cmdline_object_only_archive_list.head = new_opt; ++ return; ++ } ++ ++ after = TRUE; ++ ++ /* Check origin. */ ++ while (next) ++ { ++ if (next->header.type != cmdline_is_bfd_enum) ++ abort (); ++ ++ nbfd = next->abfd.abfd; ++ norigin = nbfd->origin; ++ if (origin > norigin) ++ { ++ /* Insert it after NEXT. */ ++ break; ++ } ++ ++ narchive = bfd_my_archive (nbfd); ++ if (strcmp (archive->filename, narchive->filename) != 0) ++ { ++ /* Insert it befor NEXT. */ ++ after = FALSE; ++ break; ++ } ++ ++ c = next; ++ next = next->header.next; ++ } ++ ++ if (after && next) ++ { ++ c = next; ++ next = next->header.next; ++ } ++ ++ if (*cmdline_object_only_archive_list.tail == c->header.next) ++ cmdline_object_only_archive_list.tail ++ = &new_opt->header.next; ++ ++ prev = &c->header.next; ++ new_opt->header.next = next; ++ *prev = new_opt; ++ return; ++ } ++ ++ prev = &c->header.next; ++ } ++ ++ *cmdline_object_only_archive_list.tail = new_opt; ++ cmdline_object_only_archive_list.tail = &new_opt->header.next; ++} ++ ++/* Get object-only input files. */ ++ ++static void ++cmdline_get_object_only_input_files (void) ++{ ++ cmdline_union_type *c, *next; ++ bfd *abfd, *archive; ++ bfd *nbfd, *narchive; ++ ++ /* Add files first. */ ++ for (c = cmdline_object_only_file_list.head; ++ c != NULL; c = c->header.next) ++ switch (c->header.type) ++ { ++ default: ++ abort (); ++ case cmdline_is_file_enum: ++ lang_add_input_file (c->file.filename, ++ lang_input_file_is_file_enum, NULL); ++ break; ++ case cmdline_is_bfd_enum: ++ abfd = c->abfd.abfd; ++ if (bfd_my_archive (abfd)) ++ abort (); ++ lang_add_input_file (abfd->filename, ++ lang_input_file_is_file_enum, NULL); ++ break; ++ } ++ ++ /* Add archive members next. */ ++ for (c = cmdline_object_only_archive_list.head; c != NULL; c = next) ++ { ++ if (c->header.type != cmdline_is_bfd_enum) ++ abort (); ++ ++ next = c->header.next; ++ ++ abfd = c->abfd.abfd; ++ archive = bfd_my_archive (abfd); ++ ++ /* Add the first archive of the archive member group. */ ++ lang_add_input_file (archive->filename, ++ lang_input_file_is_file_enum, NULL); ++ ++ /* Skip the rest members in the archive member group. */ ++ do ++ { ++ if (!next) ++ break; ++ ++ if (next->header.type != cmdline_is_bfd_enum) ++ abort (); ++ ++ next = next->header.next; ++ if (!next) ++ break; ++ nbfd = next->abfd.abfd; ++ narchive = bfd_my_archive (nbfd); ++ } ++ while (strcmp (archive->filename, narchive->filename) == 0); ++ } ++} ++ ++struct cmdline_arg ++{ ++ bfd *obfd; ++ asymbol **isympp; ++ int status; ++}; ++ ++/* Create a section in OBFD with the same ++ name and attributes as ISECTION in IBFD. */ ++ ++static void ++setup_section (bfd *ibfd, sec_ptr isection, void *p) ++{ ++ struct cmdline_arg *arg = (struct cmdline_arg *) p; ++ bfd *obfd = arg->obfd; ++ asymbol **isympp = arg->isympp; ++ const char *name = isection->name; ++ sec_ptr osection; ++ const char *err; ++ ++ /* Skip the object-only section. */ ++ if (ibfd->object_only_section == isection) ++ return; ++ ++ /* If we have already failed earlier on, do not keep on generating ++ complaints now. */ ++ if (arg->status) ++ return; ++ ++ osection = bfd_make_section_anyway_with_flags (obfd, name, ++ isection->flags); ++ ++ if (osection == NULL) ++ { ++ err = _("failed to create output section"); ++ goto loser; ++ } ++ ++ osection->size = isection->size; ++ osection->vma = isection->vma; ++ osection->lma = isection->lma; ++ osection->alignment_power = isection->alignment_power; ++ ++ /* Copy merge entity size. */ ++ osection->entsize = isection->entsize; ++ ++ /* This used to be mangle_section; we do here to avoid using ++ bfd_get_section_by_name since some formats allow multiple ++ sections with the same name. */ ++ isection->output_section = osection; ++ isection->output_offset = 0; ++ ++ if ((isection->flags & SEC_GROUP) != 0) ++ { ++ asymbol *gsym = bfd_group_signature (isection, isympp); ++ ++ if (gsym != NULL) ++ { ++ gsym->flags |= BSF_KEEP; ++ if (ibfd->xvec->flavour == bfd_target_elf_flavour) ++ elf_group_id (isection) = gsym; ++ } ++ } ++ ++ /* Allow the BFD backend to copy any private data it understands ++ from the input section to the output section. */ ++ if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection)) ++ { ++ err = _("failed to copy private data"); ++ goto loser; ++ } ++ ++ /* All went well. */ ++ return; ++ ++loser: ++ arg->status = 1; ++ einfo (_("%P%F: setup_section: %s: %s\n"), err, name); ++} ++ ++/* Copy the data of input section ISECTION of IBFD ++ to an output section with the same name in OBFD. ++ If stripping then don't copy any relocation info. */ ++ ++static void ++copy_section (bfd *ibfd, sec_ptr isection, void *p) ++{ ++ struct cmdline_arg *arg = (struct cmdline_arg *) p; ++ bfd *obfd = arg->obfd; ++ asymbol **isympp = arg->isympp; ++ arelent **relpp; ++ long relcount; ++ sec_ptr osection; ++ bfd_size_type size; ++ long relsize; ++ flagword flags; ++ const char *err; ++ ++ /* Skip the object-only section. */ ++ if (ibfd->object_only_section == isection) ++ return; ++ ++ /* If we have already failed earlier on, do not keep on generating ++ complaints now. */ ++ if (arg->status) ++ return; ++ ++ flags = bfd_get_section_flags (ibfd, isection); ++ if ((flags & SEC_GROUP) != 0) ++ return; ++ ++ osection = isection->output_section; ++ size = bfd_get_section_size (isection); ++ ++ if (size == 0 || osection == 0) ++ return; ++ ++ relsize = bfd_get_reloc_upper_bound (ibfd, isection); ++ ++ if (relsize < 0) ++ { ++ /* Do not complain if the target does not support relocations. */ ++ if (relsize == -1 ++ && bfd_get_error () == bfd_error_invalid_operation) ++ relsize = 0; ++ else ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ } ++ ++ if (relsize == 0) ++ bfd_set_reloc (obfd, osection, NULL, 0); ++ else ++ { ++ relpp = (arelent **) xmalloc (relsize); ++ relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp); ++ if (relcount < 0) ++ { ++ err = _("relocation count is negative"); ++ goto loser; ++ } ++ ++ bfd_set_reloc (obfd, osection, ++ relcount == 0 ? NULL : relpp, relcount); ++ if (relcount == 0) ++ free (relpp); ++ } ++ ++ if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS) ++ { ++ bfd_byte *memhunk = NULL; ++ ++ if (!bfd_get_full_section_contents (ibfd, isection, &memhunk)) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size)) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ free (memhunk); ++ } ++ ++ /* All went well. */ ++ return; ++ ++loser: ++ einfo (_("%P%F: copy_section: %s: %s\n"), err, isection->name); ++} ++/* Open the temporary bfd created in the same directory as PATH. */ ++ ++static bfd * ++cmdline_fopen_temp (const char *path, const char *target, ++ const char *mode) ++{ ++#define template "ldXXXXXX" ++ const char *slash = strrchr (path, '/'); ++ char *tmpname; ++ size_t len; ++ int fd; ++ ++#ifdef HAVE_DOS_BASED_FILE_SYSTEM ++ { ++ /* We could have foo/bar\\baz, or foo\\bar, or d:bar. */ ++ char *bslash = strrchr (path, '\\'); ++ ++ if (slash == NULL || (bslash != NULL && bslash > slash)) ++ slash = bslash; ++ if (slash == NULL && path[0] != '\0' && path[1] == ':') ++ slash = path + 1; ++ } ++#endif ++ ++ if (slash != (char *) NULL) ++ { ++ len = slash - path; ++ tmpname = (char *) xmalloc (len + sizeof (template) + 2); ++ memcpy (tmpname, path, len); ++ ++#ifdef HAVE_DOS_BASED_FILE_SYSTEM ++ /* If tmpname is "X:", appending a slash will make it a root ++ directory on drive X, which is NOT the same as the current ++ directory on drive X. */ ++ if (len == 2 && tmpname[1] == ':') ++ tmpname[len++] = '.'; ++#endif ++ tmpname[len++] = '/'; ++ } ++ else ++ { ++ tmpname = (char *) xmalloc (sizeof (template)); ++ len = 0; ++ } ++ ++ memcpy (tmpname + len, template, sizeof (template)); ++#undef template ++ ++#ifdef HAVE_MKSTEMP ++ fd = mkstemp (tmpname); ++#else ++ tmpname = mktemp (tmpname); ++ if (tmpname == NULL) ++ return NULL; ++ fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600); ++#endif ++ if (fd == -1) ++ return NULL; ++ return bfd_fopen (tmpname, target, mode, fd); ++} ++ ++/* Add the object-only section. */ ++ ++static void ++cmdline_add_object_only_section (bfd_byte *contents, size_t size) ++{ ++ bfd_vma start; ++ flagword flags; ++ enum bfd_architecture iarch; ++ unsigned int imach; ++ long symcount; ++ long symsize; ++ asymbol **isympp = NULL; ++ asymbol **osympp = NULL; ++ bfd *obfd = NULL, *ibfd; ++ const char *err; ++ struct arg ++ { ++ bfd *obfd; ++ asymbol **isympp; ++ int status; ++ } arg; ++ char **matching; ++ char *ofilename = NULL; ++ asection *sec; ++ ++ ibfd = bfd_openr (output_filename, output_target); ++ if (!ibfd) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ if (!bfd_check_format_matches (ibfd, bfd_object, &matching)) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ obfd = cmdline_fopen_temp (output_filename, output_target, "w"); ++ if (!obfd) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ /* To be used after bfd_close (). */ ++ ofilename = xstrdup (bfd_get_filename (obfd)); ++ ++ if (!bfd_set_format (obfd, bfd_object)) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ /* Copy the start address, flags and architecture of input file to ++ output file. */ ++ flags = bfd_get_file_flags (ibfd); ++ start = bfd_get_start_address (ibfd); ++ iarch = bfd_get_arch (ibfd); ++ imach = bfd_get_mach (ibfd); ++ if (!bfd_set_start_address (obfd, start) ++ || !bfd_set_file_flags (obfd, flags) ++ || !bfd_set_arch_mach (obfd, iarch, imach)) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ symsize = bfd_get_symtab_upper_bound (ibfd); ++ if (symsize < 0) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ isympp = (asymbol **) xmalloc (symsize); ++ symcount = bfd_canonicalize_symtab (ibfd, isympp); ++ if (symcount < 0) ++ { ++ err = bfd_errmsg (bfd_get_error ()); ++ goto loser; ++ } ++ ++ arg.obfd = obfd; ++ arg.isympp = isympp; ++ arg.status = 0; ++ ++ /* BFD mandates that all output sections be created and sizes set before ++ any output is done. Thus, we traverse all sections multiple times. */ ++ bfd_map_over_sections (ibfd, setup_section, &arg); ++ ++ if (arg.status) ++ { ++ err = _("error setting up sections"); ++ goto loser; ++ } ++ ++ /* Allow the BFD backend to copy any private data it understands ++ from the input section to the output section. */ ++ if (! bfd_copy_private_header_data (ibfd, obfd)) ++ { ++ err = _("error copying private header data"); ++ goto loser; ++ } ++ ++ /* Create the object-only section. */ ++ sec = bfd_make_section_with_flags (obfd, ++ GNU_OBJECT_ONLY_SECTION_NAME, ++ (SEC_HAS_CONTENTS ++ | SEC_READONLY ++ | SEC_DATA ++ | SEC_LINKER_CREATED)); ++ if (sec == NULL) ++ { ++ err = _("can't create object-only section"); ++ goto loser; ++ } ++ ++ if (! bfd_set_section_size (obfd, sec, size)) ++ { ++ err = _("can't set object-only section size"); ++ goto loser; ++ } ++ ++ if (ibfd->object_only_section) ++ { ++ /* Filter out the object-only section symbol. */ ++ long src_count = 0, dst_count = 0; ++ asymbol **from, **to; ++ ++ osympp = (asymbol **) xmalloc (symcount * sizeof (asymbol *)); ++ from = isympp; ++ to = osympp; ++ for (; src_count < symcount; src_count++) ++ { ++ asymbol *sym = from[src_count]; ++ if (bfd_get_section (sym) != ibfd->object_only_section) ++ to[dst_count++] = sym; ++ } ++ to[dst_count] = NULL; ++ symcount = dst_count; ++ bfd_set_symtab (obfd, osympp, symcount); ++ } ++ else ++ bfd_set_symtab (obfd, isympp, symcount); ++ ++ /* This has to happen after the symbol table has been set. */ ++ bfd_map_over_sections (ibfd, copy_section, &arg); ++ ++ if (arg.status) ++ { ++ err = _("error copying sections"); ++ goto loser; ++ } ++ ++ /* Copy the object-only section to the output. */ ++ if (! bfd_set_section_contents (obfd, sec, contents, 0, size)) ++ { ++ err = _("error adding object-only section"); ++ goto loser; ++ } ++ ++ /* Allow the BFD backend to copy any private data it understands ++ from the input BFD to the output BFD. This is done last to ++ permit the routine to look at the filtered symbol table, which is ++ important for the ECOFF code at least. */ ++ if (! bfd_copy_private_bfd_data (ibfd, obfd)) ++ { ++ err = _("error copying private BFD data"); ++ goto loser; ++ } ++ ++ if (!bfd_close (obfd)) ++ { ++ unlink (ofilename); ++ einfo (_("%P%F: failed to finish output with object-only section\n")); ++ } ++ ++ /* Must be freed after bfd_close (). */ ++ free (isympp); ++ if (osympp) ++ free (osympp); ++ ++ if (rename (ofilename, output_filename)) ++ { ++ unlink (ofilename); ++ einfo (_("%P%F: failed to rename output with object-only section\n")); ++ } ++ ++ free (ofilename); ++ return; ++ ++loser: ++ if (isympp) ++ free (isympp); ++ if (osympp) ++ free (osympp); ++ if (obfd) ++ bfd_close (obfd); ++ if (ofilename) ++ unlink (ofilename); ++ einfo (_("%P%F: failed to add object-only section: %s\n"), err); ++} ++ ++/* Emit the final output with object-only section. */ ++ ++void ++cmdline_emit_object_only_section (void) ++{ ++ const char *saved_output_filename = output_filename; ++ int fd; ++ size_t size, off; ++ bfd_byte *contents; ++ struct stat st; ++ ++ /* Get a temporary object-only file. */ ++ output_filename = make_temp_file (".obj-only.o"); ++ ++ had_output_filename = FALSE; ++ link_info.input_bfds = NULL; ++ link_info.input_bfds_tail = &link_info.input_bfds; ++ ++ lang_init (TRUE); ++ ldexp_init (TRUE); ++ ++ ld_parse_linker_script (); ++ ++ /* Set up the object-only output. */ ++ lang_final (); ++ ++ /* Open the object-only file for output. */ ++ lang_for_each_statement (ldlang_open_output); ++ ++ ldemul_create_output_section_statements (); ++ ++ if (!bfd_section_already_linked_table_init ()) ++ einfo (_("%P%F: Failed to create hash table\n")); ++ ++ /* Call cmdline_on_object_only_archive_list_p to check which member ++ should be loaded. */ ++ input_flags.whole_archive = TRUE; ++ ++ /* Set it to avoid adding more to cmdline lists. */ ++ link_info.emitting_gnu_object_only = TRUE; ++ ++ /* Get object-only input files. */ ++ cmdline_get_object_only_input_files (); ++ ++ /* Open object-only input files. */ ++ open_input_bfds (statement_list.head, FALSE); ++ ++ ldemul_after_open (); ++ ++ bfd_section_already_linked_table_free (); ++ ++ /* Make sure that we're not mixing architectures. We call this ++ after all the input files have been opened, but before we do any ++ other processing, so that any operations merge_private_bfd_data ++ does on the output file will be known during the rest of the ++ link. */ ++ lang_check (); ++ ++ /* Size up the common data. */ ++ lang_common (); ++ ++ /* Update wild statements. */ ++ update_wild_statements (statement_list.head); ++ ++ /* Run through the contours of the script and attach input sections ++ to the correct output sections. */ ++ map_input_to_output_sections (statement_list.head, NULL, NULL); ++ ++ /* Find any sections not attached explicitly and handle them. */ ++ lang_place_orphans (); ++ ++ /* Do anything special before sizing sections. This is where ELF ++ and other back-ends size dynamic sections. */ ++ ldemul_before_allocation (); ++ ++ /* Size up the sections. */ ++ lang_size_sections (NULL, ! RELAXATION_ENABLED); ++ ++ /* See if anything special should be done now we know how big ++ everything is. This is where relaxation is done. */ ++ ldemul_after_allocation (); ++ ++ ldemul_finish (); ++ ++ /* Make sure that the section addresses make sense. */ ++ if (command_line.check_section_addresses) ++ lang_check_section_addresses (); ++ ++ lang_end (); ++ ++ ldwrite (); ++ ++ ldexp_finish (TRUE); ++ lang_finish (); ++ ++ if (! bfd_close (link_info.output_bfd)) ++ einfo (_("%P%F:%s: final close failed on object-only output: %E\n"), ++ output_filename); ++ ++ /* Read in the object-only file. */ ++ fd = open (output_filename, O_RDONLY | O_BINARY); ++ if (fd < 0) ++ { ++ bfd_set_error (bfd_error_system_call); ++ einfo (_("%P%F:%s: cannot open object-only output: %E"), ++ output_filename); ++ } ++ ++ /* Get the object-only file size. */ ++ if (fstat (fd, &st) != 0) ++ { ++ bfd_set_error (bfd_error_system_call); ++ einfo (_("%P%F:%s: cannot stat object-only output: %E"), ++ output_filename); ++ } ++ ++ size = st.st_size; ++ off = 0; ++ contents = (bfd_byte *) xmalloc (size); ++ while (off != size) ++ { ++ ssize_t got; ++ ++ got = read (fd, contents + off, size - off); ++ if (got < 0) ++ { ++ bfd_set_error (bfd_error_system_call); ++ einfo (_("%P%F:%s: read failed on object-only output: %E"), ++ output_filename); ++ } ++ ++ off += got; ++ } ++ ++ close (fd); ++ ++ /* Remove the temporary object-only file. */ ++ unlink (output_filename); ++ ++ output_filename = saved_output_filename; ++ ++ cmdline_add_object_only_section (contents, size); ++ ++ free (contents); ++} ++ ++/* Extract the object-only section. */ ++ ++static const char * ++cmdline_extract_object_only_section (bfd *abfd) ++{ ++ const char *name = bfd_extract_object_only_section (abfd); ++ ++ if (name == NULL) ++ einfo (_("%P%F: cannot extract object-only section from %B: %E"), ++ abfd); ++ ++ /* It should be removed after it is done. */ ++ cmdline_list_append (&cmdline_temp_object_only_list, ++ cmdline_is_file_enum, (void *) name); ++ ++ return name; ++} ++ ++/* Check and handle the object-only section. */ ++ ++void ++cmdline_check_object_only_section (bfd *abfd, bfd_boolean lto) ++{ ++ const char *filename; ++ ++ if (link_info.emitting_gnu_object_only ++ || abfd->format != bfd_object) ++ return; ++ ++ if (lto) ++ { ++ /* For LTO link, we only need to extract object-only section ++ from the mixed object, add it to input, and put it on LTO ++ claimed output. */ ++ switch (abfd->lto_type) ++ { ++ default: ++ abort (); ++ case lto_mixed_object: ++ filename = cmdline_extract_object_only_section (abfd); ++ lang_add_input_file (filename, ++ lang_input_file_is_file_enum, NULL); ++ break; ++ case lto_non_ir_object: ++ case lto_ir_object: ++ break; ++ } ++ } ++ else if (bfd_link_relocatable (&link_info)) ++ { ++ /* For non-LTO relocatable link, we need to append non-IR object ++ file and the object file in object-only section to the object ++ only list. */ ++ switch (abfd->lto_type) ++ { ++ default: ++ abort (); ++ case lto_mixed_object: ++ filename = cmdline_extract_object_only_section (abfd); ++ cmdline_object_only_list_append (cmdline_is_file_enum, ++ (void *) filename); ++ break; ++ case lto_non_ir_object: ++ cmdline_object_only_list_append (cmdline_is_bfd_enum, abfd); ++ break; ++ case lto_ir_object: ++ break; ++ } ++ } ++} ++ ++/* Remove temporary object-only files. */ ++ ++void ++cmdline_remove_object_only_files (void) ++{ ++ cmdline_union_type *c; ++ ++#ifdef ENABLE_PLUGINS ++ if (plugin_save_temps) ++ return; ++#endif ++ ++ c = cmdline_temp_object_only_list.head; ++ for (; c != NULL; c = c->header.next) ++ switch (c->header.type) ++ { ++ default: ++ abort (); ++ case cmdline_is_file_enum: ++ unlink (c->file.filename); ++ break; ++ } ++} +diff -rup binutils-2.26.orig/ld/ldlang.h binutils-2.26/ld/ldlang.h +--- binutils-2.26.orig/ld/ldlang.h 2016-02-19 09:35:36.701003291 +0000 ++++ binutils-2.26/ld/ldlang.h 2016-02-19 09:35:54.921106611 +0000 +@@ -517,7 +517,7 @@ extern struct asneeded_minfo **asneeded_ + extern void (*output_bfd_hash_table_free_fn) (struct bfd_link_hash_table *); + + extern void lang_init +- (void); ++ (bfd_boolean); + extern void lang_finish + (void); + extern lang_memory_region_type * lang_memory_region_lookup +@@ -693,4 +693,45 @@ lang_ld_feature (char *); + extern void + lang_print_memory_usage (void); + ++typedef enum ++{ ++ cmdline_is_file_enum, ++ cmdline_is_bfd_enum ++} cmdline_enum_type; ++ ++typedef struct cmdline_header_struct ++{ ++ union cmdline_union *next; ++ cmdline_enum_type type; ++} cmdline_header_type; ++ ++typedef struct cmdline_file_struct ++{ ++ cmdline_header_type header; ++ const char *filename; ++} cmdline_file_type; ++ ++typedef struct cmdline_bfd_struct ++{ ++ cmdline_header_type header; ++ bfd *abfd; ++} cmdline_bfd_type; ++ ++typedef union cmdline_union ++{ ++ cmdline_header_type header; ++ cmdline_file_type file; ++ cmdline_bfd_type abfd; ++} cmdline_union_type; ++ ++typedef struct cmdline_list ++{ ++ cmdline_union_type *head; ++ cmdline_union_type **tail; ++} cmdline_list_type; ++ ++extern void cmdline_emit_object_only_section (void); ++extern void cmdline_check_object_only_section (bfd *, bfd_boolean); ++extern void cmdline_remove_object_only_files (void); ++ + #endif +diff -rup binutils-2.26.orig/ld/ldlex.h binutils-2.26/ld/ldlex.h +--- binutils-2.26.orig/ld/ldlex.h 2016-02-19 09:35:36.701003291 +0000 ++++ binutils-2.26/ld/ldlex.h 2016-02-19 09:35:54.921106611 +0000 +@@ -134,6 +134,7 @@ enum option_values + #ifdef ENABLE_PLUGINS + OPTION_PLUGIN, + OPTION_PLUGIN_OPT, ++ OPTION_PLUGIN_SAVE_TEMPS, + #endif /* ENABLE_PLUGINS */ + OPTION_DEFAULT_SCRIPT, + OPTION_PRINT_OUTPUT_FORMAT, +diff -rup binutils-2.26.orig/ld/ldmain.c binutils-2.26/ld/ldmain.c +--- binutils-2.26.orig/ld/ldmain.c 2016-02-19 09:35:36.701003291 +0000 ++++ binutils-2.26/ld/ldmain.c 2016-02-19 09:35:54.922106617 +0000 +@@ -219,6 +219,9 @@ main (int argc, char **argv) + + xatexit (ld_cleanup); + ++ /* Remove temporary object-only files. */ ++ xatexit (cmdline_remove_object_only_files); ++ + /* Set up the sysroot directory. */ + ld_sysroot = get_sysroot (argc, argv); + if (*ld_sysroot) +@@ -291,8 +294,8 @@ main (int argc, char **argv) + default_target = ldemul_choose_target (argc, argv); + config.maxpagesize = bfd_emul_get_maxpagesize (default_target); + config.commonpagesize = bfd_emul_get_commonpagesize (default_target); +- lang_init (); +- ldexp_init (); ++ lang_init (FALSE); ++ ldexp_init (FALSE); + ldemul_before_parse (); + lang_has_input_file = FALSE; + parse_args (argc, argv); +@@ -307,34 +310,7 @@ main (int argc, char **argv) + + ldemul_set_symbols (); + +- /* If we have not already opened and parsed a linker script, +- try the default script from command line first. */ +- if (saved_script_handle == NULL +- && command_line.default_script != NULL) +- { +- ldfile_open_command_file (command_line.default_script); +- parser_input = input_script; +- yyparse (); +- } +- +- /* If we have not already opened and parsed a linker script +- read the emulation's appropriate default script. */ +- if (saved_script_handle == NULL) +- { +- int isfile; +- char *s = ldemul_get_script (&isfile); +- +- if (isfile) +- ldfile_open_default_command_file (s); +- else +- { +- lex_string = s; +- lex_redirect (s, _("built in linker script"), 1); +- } +- parser_input = input_script; +- yyparse (); +- lex_string = NULL; +- } ++ ld_parse_linker_script (); + + if (verbose) + { +@@ -445,7 +421,7 @@ main (int argc, char **argv) + fprintf (stderr, "lookup = %p val %lx\n", h, h ? h->u.def.value : 1); + } + #endif +- ldexp_finish (); ++ ldexp_finish (FALSE); + lang_finish (); + + /* Even if we're producing relocatable output, some non-fatal errors should +@@ -465,6 +441,8 @@ main (int argc, char **argv) + if (! bfd_close (link_info.output_bfd)) + einfo (_("%F%B: final close failed: %E\n"), link_info.output_bfd); + ++ link_info.output_bfd = NULL; ++ + /* If the --force-exe-suffix is enabled, and we're making an + executable file and it doesn't end in .exe, copy it to one + which does. */ +@@ -512,6 +490,9 @@ main (int argc, char **argv) + } + } + ++ if (link_info.emit_gnu_object_only) ++ cmdline_emit_object_only_section (); ++ + END_PROGRESS (program_name); + + if (config.stats) +@@ -805,7 +786,9 @@ add_archive_element (struct bfd_link_inf + *subsbfd = input->the_bfd; + } + } ++ else + #endif /* ENABLE_PLUGINS */ ++ cmdline_check_object_only_section (input->the_bfd, FALSE); + + ldlang_add_file (input); + +@@ -1484,3 +1467,38 @@ notice (struct bfd_link_info *info, + + return TRUE; + } ++ ++/* Parse the linker script. */ ++ ++void ++ld_parse_linker_script () ++{ ++ /* If we have not already opened and parsed a linker script, ++ try the default script from command line first. */ ++ if (saved_script_handle == NULL ++ && command_line.default_script != NULL) ++ { ++ ldfile_open_command_file (command_line.default_script); ++ parser_input = input_script; ++ yyparse (); ++ } ++ ++ /* If we have not already opened and parsed a linker script ++ read the emulation's appropriate default script. */ ++ if (saved_script_handle == NULL) ++ { ++ int isfile; ++ char *s = ldemul_get_script (&isfile); ++ ++ if (isfile) ++ ldfile_open_default_command_file (s); ++ else ++ { ++ lex_string = s; ++ lex_redirect (s, _("built in linker script"), 1); ++ } ++ parser_input = input_script; ++ yyparse (); ++ lex_string = NULL; ++ } ++} +diff -rup binutils-2.26.orig/ld/ldmain.h binutils-2.26/ld/ldmain.h +--- binutils-2.26.orig/ld/ldmain.h 2016-02-19 09:35:36.701003291 +0000 ++++ binutils-2.26/ld/ldmain.h 2016-02-19 09:35:54.922106617 +0000 +@@ -59,4 +59,6 @@ extern void add_wrap (const char *); + extern void add_ignoresym (struct bfd_link_info *, const char *); + extern void add_keepsyms_file (const char *); + ++extern void ld_parse_linker_script (void); ++ + #endif +diff -rup binutils-2.26.orig/ld/lexsup.c binutils-2.26/ld/lexsup.c +--- binutils-2.26.orig/ld/lexsup.c 2016-02-19 09:35:36.700003285 +0000 ++++ binutils-2.26/ld/lexsup.c 2016-02-19 09:35:54.923106623 +0000 +@@ -169,6 +169,9 @@ static const struct ld_option ld_options + '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH }, + { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT}, + '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH }, ++ { {"plugin-save-temps", no_argument, NULL, OPTION_PLUGIN_SAVE_TEMPS}, ++ '\0', NULL, N_("Store plugin intermediate files permanently"), ++ ONE_DASH }, + { {"flto", optional_argument, NULL, OPTION_IGNORE}, + '\0', NULL, N_("Ignored for GCC LTO option compatibility"), + ONE_DASH }, +@@ -1020,6 +1023,9 @@ parse_args (unsigned argc, char **argv) + if (plugin_opt_plugin_arg (optarg)) + einfo (_("%P%F: bad -plugin-opt option\n")); + break; ++ case OPTION_PLUGIN_SAVE_TEMPS: ++ plugin_save_temps = TRUE; ++ break; + #endif /* ENABLE_PLUGINS */ + case 'q': + link_info.emitrelocations = TRUE; +diff -rup binutils-2.26.orig/ld/plugin.c binutils-2.26/ld/plugin.c +--- binutils-2.26.orig/ld/plugin.c 2016-02-19 09:35:36.702003296 +0000 ++++ binutils-2.26/ld/plugin.c 2016-02-19 09:35:54.923106623 +0000 +@@ -57,6 +57,9 @@ extern int errno; + /* Report plugin symbols. */ + bfd_boolean report_plugin_symbols; + ++/* Store plugin intermediate files permanently. */ ++bfd_boolean plugin_save_temps; ++ + /* The suffix to append to the name of the real (claimed) object file + when generating a dummy BFD to hold the IR symbols sent from the + plugin. For cosmetic use only; appears in maps, crefs etc. */ +@@ -1182,6 +1185,9 @@ plugin_maybe_claim (lang_input_statement + { + bfd *abfd = entry->the_bfd->plugin_dummy_bfd; + ++ /* Check object only section. */ ++ cmdline_check_object_only_section (entry->the_bfd, TRUE); ++ + /* Discard the real file's BFD and substitute the dummy one. */ + + /* BFD archive handling caches elements so we can't call +@@ -1227,14 +1233,17 @@ plugin_call_cleanup (void) + { + if (curplug->cleanup_handler && !curplug->cleanup_done) + { +- enum ld_plugin_status rv; +- curplug->cleanup_done = TRUE; +- called_plugin = curplug; +- rv = (*curplug->cleanup_handler) (); +- called_plugin = NULL; +- if (rv != LDPS_OK) +- info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), +- curplug->name, rv); ++ if (!plugin_save_temps) ++ { ++ enum ld_plugin_status rv; ++ curplug->cleanup_done = TRUE; ++ called_plugin = curplug; ++ rv = (*curplug->cleanup_handler) (); ++ called_plugin = NULL; ++ if (rv != LDPS_OK) ++ info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), ++ curplug->name, rv); ++ } + dlclose (curplug->dlhandle); + } + curplug = curplug->next; +diff -rup binutils-2.26.orig/ld/plugin.h binutils-2.26/ld/plugin.h +--- binutils-2.26.orig/ld/plugin.h 2016-02-19 09:35:36.702003296 +0000 ++++ binutils-2.26/ld/plugin.h 2016-02-19 09:35:54.924106628 +0000 +@@ -24,6 +24,9 @@ + /* Report plugin symbols. */ + extern bfd_boolean report_plugin_symbols; + ++/* Store plugin intermediate files permanently. */ ++extern bfd_boolean plugin_save_temps; ++ + /* Set at all symbols read time, to avoid recursively offering the plugin + its own newly-added input files and libs to claim. */ + extern bfd_boolean no_more_claiming; +diff -rup binutils-2.26.orig/ld/scripttempl/armbpabi.sc binutils-2.26/ld/scripttempl/armbpabi.sc +--- binutils-2.26.orig/ld/scripttempl/armbpabi.sc 2016-02-19 09:35:36.704003308 +0000 ++++ binutils-2.26/ld/scripttempl/armbpabi.sc 2016-02-19 09:35:54.924106628 +0000 +@@ -36,7 +36,7 @@ INTERP=".interp 0 : { *(.interp) } + PLT=".plt ${RELOCATING-0} : { *(.plt) }" + RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" + DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }" +-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" ++DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" + if test -z "${NO_SMALL_DATA}"; then + SBSS=".sbss ${RELOCATING-0} : + { +diff -rup binutils-2.26.orig/ld/scripttempl/elf32sh-symbian.sc binutils-2.26/ld/scripttempl/elf32sh-symbian.sc +--- binutils-2.26.orig/ld/scripttempl/elf32sh-symbian.sc 2016-02-19 09:35:36.705003313 +0000 ++++ binutils-2.26/ld/scripttempl/elf32sh-symbian.sc 2016-02-19 09:35:54.925106634 +0000 +@@ -88,7 +88,7 @@ fi + PLT=".plt : { *(.plt) } :dynamic :dyn" + DYNAMIC=".dynamic : { *(.dynamic) } :dynamic :dyn" + RODATA=".rodata ALIGN(4) : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" +-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive) *(.gnu.lto_*) }" ++DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.directive) *(.gnu.lto_*) *(.gnu_object_only) }" + test -z "$GOT" && GOT=".got ${RELOCATING-0} : { *(.got.plt) *(.got) } :dynamic :dyn" + INIT_ARRAY=".init_array ${RELOCATING-0} : + { +diff -rup binutils-2.26.orig/ld/scripttempl/elf64hppa.sc binutils-2.26/ld/scripttempl/elf64hppa.sc +--- binutils-2.26.orig/ld/scripttempl/elf64hppa.sc 2016-02-19 09:35:36.705003313 +0000 ++++ binutils-2.26/ld/scripttempl/elf64hppa.sc 2016-02-19 09:35:54.925106634 +0000 +@@ -132,7 +132,7 @@ fi + DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" + RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" + DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" +-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" ++DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" + if test -z "${NO_SMALL_DATA}"; then + SBSS=".sbss ${RELOCATING-0} : + { +diff -rup binutils-2.26.orig/ld/scripttempl/elf.sc binutils-2.26/ld/scripttempl/elf.sc +--- binutils-2.26.orig/ld/scripttempl/elf.sc 2016-02-19 09:35:36.705003313 +0000 ++++ binutils-2.26/ld/scripttempl/elf.sc 2016-02-19 09:35:54.924106628 +0000 +@@ -170,7 +170,7 @@ RELA_IPLT=".rela.iplt ${RELOCATING-0} + DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" + RODATA=".${RODATA_NAME} ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }" + DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" +-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" ++DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" + if test -z "${NO_SMALL_DATA}"; then + SBSS=".${SBSS_NAME} ${RELOCATING-0} : + { +diff -rup binutils-2.26.orig/ld/scripttempl/elfxtensa.sc binutils-2.26/ld/scripttempl/elfxtensa.sc +--- binutils-2.26.orig/ld/scripttempl/elfxtensa.sc 2016-02-19 09:35:36.705003313 +0000 ++++ binutils-2.26/ld/scripttempl/elfxtensa.sc 2016-02-19 09:35:54.925106634 +0000 +@@ -145,7 +145,7 @@ fi + DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" + RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" + DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }" +-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" ++DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" + INIT_LIT=".init.literal 0 : { *(.init.literal) }" + INIT=".init 0 : { *(.init) }" + FINI_LIT=".fini.literal 0 : { *(.fini.literal) }" +diff -rup binutils-2.26.orig/ld/scripttempl/mep.sc binutils-2.26/ld/scripttempl/mep.sc +--- binutils-2.26.orig/ld/scripttempl/mep.sc 2016-02-19 09:35:36.706003319 +0000 ++++ binutils-2.26/ld/scripttempl/mep.sc 2016-02-19 09:35:54.926106640 +0000 +@@ -119,7 +119,7 @@ fi + DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" + RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" + DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro .data.rel.ro.*) }" +-DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }" ++DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.gnu_object_only) }" + if test -z "${NO_SMALL_DATA}"; then + SBSS=".sbss ${RELOCATING-0} : + { +diff -rup binutils-2.26.orig/ld/scripttempl/pep.sc binutils-2.26/ld/scripttempl/pep.sc +--- binutils-2.26.orig/ld/scripttempl/pep.sc 2016-02-19 09:35:36.706003319 +0000 ++++ binutils-2.26/ld/scripttempl/pep.sc 2016-02-19 09:35:54.926106640 +0000 +@@ -178,6 +178,7 @@ SECTIONS + *(.drectve) + ${RELOCATING+ *(.note.GNU-stack)} + ${RELOCATING+ *(.gnu.lto_*)} ++ ${RELOCATING+ *(.gnu_object_only)} + } + + .idata ${RELOCATING+BLOCK(__section_alignment__)} : +diff -rup binutils-2.26.orig/ld/scripttempl/pe.sc binutils-2.26/ld/scripttempl/pe.sc +--- binutils-2.26.orig/ld/scripttempl/pe.sc 2016-02-19 09:35:36.706003319 +0000 ++++ binutils-2.26/ld/scripttempl/pe.sc 2016-02-19 09:35:54.926106640 +0000 +@@ -165,6 +165,7 @@ SECTIONS + *(.drectve) + ${RELOCATING+ *(.note.GNU-stack)} + ${RELOCATING+ *(.gnu.lto_*)} ++ ${RELOCATING+ *(.gnu_object_only)} + } + + .idata ${RELOCATING+BLOCK(__section_alignment__)} : +diff -rup binutils-2.26.orig/ld/testsuite/ld-plugin/lto.exp binutils-2.26/ld/testsuite/ld-plugin/lto.exp +--- binutils-2.26.orig/ld/testsuite/ld-plugin/lto.exp 2016-02-19 09:35:36.807003892 +0000 ++++ binutils-2.26/ld/testsuite/ld-plugin/lto.exp 2016-02-19 09:36:15.450223025 +0000 +@@ -79,6 +79,15 @@ set lto_link_tests [list \ + [list "Build liblto-3.a" \ + "" "-flto $lto_fat" \ + {lto-3b.c} {} "liblto-3.a"] \ ++ [list "Compile 4a" \ ++ "" "-flto $lto_fat" \ ++ {lto-4a.c} {} ""] \ ++ [list "Compile 4b" \ ++ "" "-O2" \ ++ {lto-4b.c} {} ""] \ ++ [list "Compile 4c" \ ++ "" "-O2" \ ++ {lto-4c.c} {} ""] \ + [list "Compile 5a" \ + "" "-flto $lto_fat" \ + {lto-5a.c} {} ""] \ +@@ -94,6 +103,12 @@ set lto_link_tests [list \ + [list "Compile 9" \ + "" "-O2 -finline -flto" \ + {lto-9.cc} {} "" "c++"] \ ++ [list "Compile 10a" \ ++ "" "-O2" \ ++ {lto-10a.c} {} ""] \ ++ [list "Compile 10b" \ ++ "" "-O2 -flto $lto_fat" \ ++ {lto-10b.c} {} ""] \ + [list "Compile 11a" \ + "" "-O -flto" \ + {lto-11a.c} {} ""] \ +@@ -291,9 +306,21 @@ set lto_run_tests [list \ + [list "LTO 3c" \ + "-O2 -flto -fuse-linker-plugin tmpdir/lto-3a.o tmpdir/lto-3c.o -Wl,--whole-archive tmpdir/liblto-3.a -Wl,--no-whole-archive tmpdir/liblto-3.a" "" \ + {dummy.c} "lto-3d.exe" "lto-3.out" "" "c"] \ ++ [list "LTO 4a" \ ++ "-O2 -flto -fuse-linker-plugin tmpdir/lto-4r-a.o" "" \ ++ {dummy.c} "lto-4a.exe" "lto-4.out" "" "c"] \ ++ [list "LTO 4c" \ ++ "-O2 -flto -fuse-linker-plugin tmpdir/lto-4r-c.o" "" \ ++ {dummy.c} "lto-4c.exe" "lto-4.out" "" "c"] \ ++ [list "LTO 4d" \ ++ "-O2 -flto -fuse-linker-plugin tmpdir/lto-4r-d.o" "" \ ++ {dummy.c} "lto-4d.exe" "lto-4.out" "" "c"] \ + [list "LTO 5" \ + "-O2 -flto -fuse-linker-plugin tmpdir/lto-5.o" "" \ + {dummy.c} "lto-5.exe" "lto-5.out" "" "c"] \ ++ [list "LTO 10" \ ++ "-O2 -flto -fuse-linker-plugin tmpdir/lto-10.o" "" \ ++ {dummy.c} "lto-10.exe" "lto-10.out" "" "c"] \ + [list "LTO 11" \ + "-O -flto -fuse-linker-plugin tmpdir/liblto-11.a" "" \ + {dummy.c} "lto-11.exe" "lto-11.out" "" "c"] \ +@@ -378,6 +405,15 @@ if { [is_elf_format] && [check_lto_share + } + } + ++set testname "Build liblto-4.a" ++remote_file host delete "tmpdir/liblto-4.a" ++set catch_output [run_host_cmd "$ar" "rc tmpdir/liblto-4.a tmpdir/lto-4a.o tmpdir/lto-4b.o tmpdir/lto-4c.o"] ++if {![string match "" $catch_output]} { ++ unresolved $testname ++ restore_notify ++ return ++} ++ + set testname "Build liblto-11.a" + remote_file host delete "tmpdir/liblto-11.a" + set catch_output [run_host_cmd "$ar" "rc $plug_opt tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"] +@@ -424,8 +460,30 @@ return + # Run "ld -r" to generate inputs for complex LTO tests. + run_dump_test "lto-3r" + remote_exec host "mv" "tmpdir/dump tmpdir/lto-3.o" ++run_dump_test "lto-4r-a" ++remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-a.o" ++run_dump_test "lto-4r-b" ++remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-b.o" ++run_dump_test "lto-4r-c" ++remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-c.o" ++run_dump_test "lto-4r-d" ++remote_exec host "mv" "tmpdir/dump tmpdir/lto-4r-d.o" + run_dump_test "lto-5r" + remote_exec host "mv" "tmpdir/dump tmpdir/lto-5.o" ++run_dump_test "lto-10r" ++remote_exec host "mv" "tmpdir/dump tmpdir/lto-10.o" ++set testname "nm mixed object" ++set lto_plugin [run_host_cmd "$CC" "-print-prog-name=liblto_plugin.so tmpdir/lto-10.o"] ++if { [ regexp "liblto_plugin.so" $lto_plugin ] } { ++ set exec_output [run_host_cmd "$NM" "--plugin $lto_plugin tmpdir/lto-10.o"] ++ if { [ regexp "T main" $exec_output ] } { ++ pass $testname ++ } { ++ fail $testname ++ } ++} { ++ fail $testname ++ } + + run_cc_link_tests $lto_link_symbol_tests + diff --git a/binutils/patches/binutils-2.26-x86-PIE-relocations.patch b/binutils/patches/binutils-2.26-x86-PIE-relocations.patch new file mode 100644 index 000000000..c39c3aaf9 --- /dev/null +++ b/binutils/patches/binutils-2.26-x86-PIE-relocations.patch @@ -0,0 +1,46 @@ +--- binutils-2.26.orig/bfd/elf32-i386.c 2016-03-18 10:04:17.245507884 +0000 ++++ binutils-2.26/bfd/elf32-i386.c 2016-03-18 10:05:59.336070167 +0000 +@@ -1830,7 +1830,8 @@ do_size: + && (sec->flags & SEC_ALLOC) != 0 + && (r_type != R_386_PC32 + || (h != NULL +- && (! SYMBOLIC_BIND (info, h) ++ && (! (bfd_link_pie (info) ++ || SYMBOLIC_BIND (info, h)) + || h->root.type == bfd_link_hash_defweak + || !h->def_regular)))) + || (ELIMINATE_COPY_RELOCS +@@ -4287,8 +4288,8 @@ r_386_got32: + else if (h != NULL + && h->dynindx != -1 + && (r_type == R_386_PC32 +- || !bfd_link_pic (info) +- || !SYMBOLIC_BIND (info, h) ++ || !(bfd_link_executable (info) ++ || SYMBOLIC_BIND (info, h)) + || !h->def_regular)) + outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); + else +--- binutils-2.26.orig/bfd/elf64-x86-64.c 2016-03-18 10:04:17.244507878 +0000 ++++ binutils-2.26/bfd/elf64-x86-64.c 2016-03-18 10:06:46.686331624 +0000 +@@ -2029,7 +2029,8 @@ do_size: + && (sec->flags & SEC_ALLOC) != 0 + && (! IS_X86_64_PCREL_TYPE (r_type) + || (h != NULL +- && (! SYMBOLIC_BIND (info, h) ++ && (! (bfd_link_pie (info) ++ || SYMBOLIC_BIND (info, h)) + || h->root.type == bfd_link_hash_defweak + || !h->def_regular)))) + || (ELIMINATE_COPY_RELOCS +@@ -4631,8 +4632,8 @@ direct: + else if (h != NULL + && h->dynindx != -1 + && (IS_X86_64_PCREL_TYPE (r_type) +- || ! bfd_link_pic (info) +- || ! SYMBOLIC_BIND (info, h) ++ || !(bfd_link_executable (info) ++ || SYMBOLIC_BIND (info, h)) + || ! h->def_regular)) + { + outrel.r_info = htab->r_info (h->dynindx, r_type); diff --git a/binutils/patches/binutils-HEAD-change-ld-notice-interface.patch b/binutils/patches/binutils-HEAD-change-ld-notice-interface.patch deleted file mode 100644 index db2ea9b1e..000000000 --- a/binutils/patches/binutils-HEAD-change-ld-notice-interface.patch +++ /dev/null @@ -1,398 +0,0 @@ -From 4613510308cea27713e8c7424b2afee9b99f6226 Mon Sep 17 00:00:00 2001 -From: Alan Modra -Date: Tue, 12 Aug 2014 10:43:33 +0930 -Subject: [PATCH] Change ld "notice" interface for better handling of - indirect symbols - -The main aim of this change was to have non_ir_ref set correctly on -new indirect symbols. I could have added a "copy" param to the "notice" -function, so that indirect symbols could be created in plugin_notice, -but it seemed cleaner to create indirect syms earlier and pass them -rather than "string" to "notice". - -include/ - * bfdlink.h (struct bfd_link_callbacks ): Remove "string" - param, add "inh". -bfd/ - * coff-aux.c (coff_m68k_aux_link_add_one_symbol): Only call "notice" - here when not calling the generic add_symbol function. Formatting. - Correct handling of indirect symbols. Update notice call. - * elflink.c (_bfd_elf_notice_as_needed): Update notice call. - * linker.c (_bfd_generic_link_add_one_symbol): Create indirect - symbols early. Update notice call. Add comments regarding weak - symbols vs. indirect. -ld/ - * ldmain.c (notice): Update args. - * plugin.c (plugin_notice): Likewise. Follow warning sym link. - Handle new indirect symbol. ---- - bfd/coff-aux.c | 62 ++++++++++++++++++++++------------------- - bfd/elflink.c | 2 +- - bfd/linker.c | 82 +++++++++++++++++++++++++++++-------------------------- - include/bfdlink.h | 13 ++++----- - ld/ldmain.c | 6 ++-- - ld/plugin.c | 33 ++++++++++++---------- - 9 files changed, 128 insertions(+), 91 deletions(-) - -diff --git a/bfd/coff-aux.c b/bfd/coff-aux.c -index e79c77a..d95b98b 100644 ---- a/bfd/coff-aux.c -+++ b/bfd/coff-aux.c -@@ -73,20 +73,17 @@ coff_m68k_aux_link_add_one_symbol (struct bfd_link_info *info, - bfd_boolean collect, - struct bfd_link_hash_entry **hashp) - { -- struct bfd_link_hash_entry *h; -+ struct bfd_link_hash_entry *h, *inh, *t; - -- if ((flags & (BSF_WARNING | BSF_CONSTRUCTOR | BSF_WEAK)) == 0 && -- !bfd_is_und_section (section) && -- !bfd_is_com_section (section)) -+ if ((flags & (BSF_WARNING | BSF_CONSTRUCTOR | BSF_WEAK)) == 0 -+ && !bfd_is_und_section (section) -+ && !bfd_is_com_section (section)) - { - /* The new symbol is a definition or an indirect definition */ - - /* This bit copied from linker.c */ - if (hashp != NULL && *hashp != NULL) -- { -- h = *hashp; -- BFD_ASSERT (strcmp (h->root.string, name) == 0); -- } -+ h = *hashp; - else - { - h = bfd_link_hash_lookup (info->hash, name, TRUE, copy, FALSE); -@@ -98,37 +95,46 @@ coff_m68k_aux_link_add_one_symbol (struct bfd_link_info *info, - } - } - -- if (info->notice_hash != (struct bfd_hash_table *) NULL -- && (bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) -- != (struct bfd_hash_entry *) NULL)) -- { -- if (! (*info->callbacks->notice) (info, h, abfd, section, value, -- flags, string)) -- return FALSE; -- } -- - if (hashp != (struct bfd_link_hash_entry **) NULL) - *hashp = h; - /* end duplication from linker.c */ - -- if (h->type == bfd_link_hash_defined -- || h->type == bfd_link_hash_indirect) -+ t = h; -+ inh = NULL; -+ if (h->type == bfd_link_hash_indirect) - { -- asection *msec; -+ inh = h->u.i.link; -+ t = inh; -+ } - -- if (h->type == bfd_link_hash_defined) -- msec = h->u.def.section; -- else -- msec = bfd_ind_section_ptr; -+ if (t->type == bfd_link_hash_defined) -+ { -+ asection *msec = t->u.def.section; -+ bfd_boolean special = FALSE; - - if (bfd_is_abs_section (msec) && !bfd_is_abs_section (section)) - { -- h->u.def.section = section; -- h->u.def.value = value; -- return TRUE; -+ t->u.def.section = section; -+ t->u.def.value = value; -+ special = TRUE; - } - else if (bfd_is_abs_section (section) && !bfd_is_abs_section (msec)) -- return TRUE; -+ special = TRUE; -+ -+ if (special) -+ { -+ if (info->notice_all -+ || (info->notice_hash != NULL -+ && bfd_hash_lookup (info->notice_hash, name, -+ FALSE, FALSE) != NULL)) -+ { -+ if (!(*info->callbacks->notice) (info, h, inh, -+ abfd, section, value, flags)) -+ return FALSE; -+ } -+ -+ return TRUE; -+ } - } - } - -diff --git a/bfd/elflink.c b/bfd/elflink.c -index 69a87a6..de0a734 100644 ---- a/bfd/elflink.c -+++ b/bfd/elflink.c -@@ -3299,7 +3299,7 @@ _bfd_elf_notice_as_needed (bfd *ibfd, - struct bfd_link_info *info, - enum notice_asneeded_action act) - { -- return (*info->callbacks->notice) (info, NULL, ibfd, NULL, act, 0, NULL); -+ return (*info->callbacks->notice) (info, NULL, NULL, ibfd, NULL, act, 0); - } - - /* Add symbols from an ELF object file to the linker hash table. */ -diff --git a/bfd/linker.c b/bfd/linker.c -index 1a5ecef..abdf5b0 100644 ---- a/bfd/linker.c -+++ b/bfd/linker.c -@@ -1442,13 +1442,23 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, - { - enum link_row row; - struct bfd_link_hash_entry *h; -+ struct bfd_link_hash_entry *inh = NULL; - bfd_boolean cycle; - - BFD_ASSERT (section != NULL); - - if (bfd_is_ind_section (section) - || (flags & BSF_INDIRECT) != 0) -- row = INDR_ROW; -+ { -+ row = INDR_ROW; -+ /* Create the indirect symbol here. This is for the benefit of -+ the plugin "notice" function. -+ STRING is the name of the symbol we want to indirect to. */ -+ inh = bfd_wrapped_link_hash_lookup (abfd, info, string, TRUE, -+ copy, FALSE); -+ if (inh == NULL) -+ return FALSE; -+ } - else if ((flags & BSF_WARNING) != 0) - row = WARN_ROW; - else if ((flags & BSF_CONSTRUCTOR) != 0) -@@ -1493,8 +1503,8 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, - || (info->notice_hash != NULL - && bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL)) - { -- if (! (*info->callbacks->notice) (info, h, -- abfd, section, value, flags, string)) -+ if (! (*info->callbacks->notice) (info, h, inh, -+ abfd, section, value, flags)) - return FALSE; - } - -@@ -1728,44 +1738,40 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info, - return FALSE; - /* Fall through. */ - case IND: -- /* Create an indirect symbol. */ -- { -- struct bfd_link_hash_entry *inh; -- -- /* STRING is the name of the symbol we want to indirect -- to. */ -- inh = bfd_wrapped_link_hash_lookup (abfd, info, string, TRUE, -- copy, FALSE); -- if (inh == NULL) -+ if (inh->type == bfd_link_hash_indirect -+ && inh->u.i.link == h) -+ { -+ (*_bfd_error_handler) -+ (_("%B: indirect symbol `%s' to `%s' is a loop"), -+ abfd, name, string); -+ bfd_set_error (bfd_error_invalid_operation); - return FALSE; -- if (inh->type == bfd_link_hash_indirect -- && inh->u.i.link == h) -- { -- (*_bfd_error_handler) -- (_("%B: indirect symbol `%s' to `%s' is a loop"), -- abfd, name, string); -- bfd_set_error (bfd_error_invalid_operation); -- return FALSE; -- } -- if (inh->type == bfd_link_hash_new) -- { -- inh->type = bfd_link_hash_undefined; -- inh->u.undef.abfd = abfd; -- bfd_link_add_undef (info->hash, inh); -- } -+ } -+ if (inh->type == bfd_link_hash_new) -+ { -+ inh->type = bfd_link_hash_undefined; -+ inh->u.undef.abfd = abfd; -+ bfd_link_add_undef (info->hash, inh); -+ } - -- /* If the indirect symbol has been referenced, we need to -- push the reference down to the symbol we are -- referencing. */ -- if (h->type != bfd_link_hash_new) -- { -- row = UNDEF_ROW; -- cycle = TRUE; -- } -+ /* If the indirect symbol has been referenced, we need to -+ push the reference down to the symbol we are referencing. */ -+ if (h->type != bfd_link_hash_new) -+ { -+ /* ??? If inh->type == bfd_link_hash_undefweak this -+ converts inh to bfd_link_hash_undefined. */ -+ row = UNDEF_ROW; -+ cycle = TRUE; -+ } - -- h->type = bfd_link_hash_indirect; -- h->u.i.link = inh; -- } -+ h->type = bfd_link_hash_indirect; -+ h->u.i.link = inh; -+ /* Not setting h = h->u.i.link here means that when cycle is -+ set above we'll always go to REFC, and then cycle again -+ to the indirected symbol. This means that any successful -+ change of an existing symbol to indirect counts as a -+ reference. ??? That may not be correct when the existing -+ symbol was defweak. */ - break; - - case SET: -diff --git a/include/bfdlink.h b/include/bfdlink.h -index 58dba2a..125683d 100644 ---- a/include/bfdlink.h -+++ b/include/bfdlink.h -@@ -640,15 +640,14 @@ struct bfd_link_callbacks - (struct bfd_link_info *, const char *name, - bfd *abfd, asection *section, bfd_vma address); - /* A function which is called when a symbol in notice_hash is -- defined or referenced. H is the symbol. ABFD, SECTION and -- ADDRESS are the (new) value of the symbol. If SECTION is -- bfd_und_section, this is a reference. FLAGS are the symbol -- BSF_* flags. STRING is the name of the symbol to indirect to if -- the sym is indirect, or the warning string if a warning sym. */ -+ defined or referenced. H is the symbol, INH the indirect symbol -+ if applicable. ABFD, SECTION and ADDRESS are the (new) value of -+ the symbol. If SECTION is bfd_und_section, this is a reference. -+ FLAGS are the symbol BSF_* flags. */ - bfd_boolean (*notice) - (struct bfd_link_info *, struct bfd_link_hash_entry *h, -- bfd *abfd, asection *section, bfd_vma address, flagword flags, -- const char *string); -+ struct bfd_link_hash_entry *inh, -+ bfd *abfd, asection *section, bfd_vma address, flagword flags); - /* Error or warning link info message. */ - void (*einfo) - (const char *fmt, ...); -diff --git a/ld/ldmain.c b/ld/ldmain.c -index ea25afe..77235d5 100644 ---- a/ld/ldmain.c -+++ b/ld/ldmain.c -@@ -137,7 +137,7 @@ static bfd_boolean unattached_reloc - (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma); - static bfd_boolean notice - (struct bfd_link_info *, struct bfd_link_hash_entry *, -- bfd *, asection *, bfd_vma, flagword, const char *); -+ struct bfd_link_hash_entry *, bfd *, asection *, bfd_vma, flagword); - - static struct bfd_link_callbacks link_callbacks = - { -@@ -1461,11 +1461,11 @@ unattached_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED, - static bfd_boolean - notice (struct bfd_link_info *info, - struct bfd_link_hash_entry *h, -+ struct bfd_link_hash_entry *inh ATTRIBUTE_UNUSED, - bfd *abfd, - asection *section, - bfd_vma value, -- flagword flags ATTRIBUTE_UNUSED, -- const char *string ATTRIBUTE_UNUSED) -+ flagword flags ATTRIBUTE_UNUSED) - { - const char *name; - -diff --git a/ld/plugin.c b/ld/plugin.c -index 8d6ae05..8cca7d0 100644 ---- a/ld/plugin.c -+++ b/ld/plugin.c -@@ -127,8 +127,9 @@ static const size_t tv_header_size = ARRAY_SIZE (tv_header_tags); - - /* Forward references. */ - static bfd_boolean plugin_notice (struct bfd_link_info *, -- struct bfd_link_hash_entry *, bfd *, -- asection *, bfd_vma, flagword, const char *); -+ struct bfd_link_hash_entry *, -+ struct bfd_link_hash_entry *, -+ bfd *, asection *, bfd_vma, flagword); - - #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) - -@@ -962,16 +963,21 @@ plugin_call_cleanup (void) - static bfd_boolean - plugin_notice (struct bfd_link_info *info, - struct bfd_link_hash_entry *h, -+ struct bfd_link_hash_entry *inh, - bfd *abfd, - asection *section, - bfd_vma value, -- flagword flags, -- const char *string) -+ flagword flags) - { -+ struct bfd_link_hash_entry *orig_h = h; -+ - if (h != NULL) - { - bfd *sym_bfd; - -+ if (h->type == bfd_link_hash_warning) -+ h = h->u.i.link; -+ - /* Nothing to do here if this def/ref is from an IR dummy BFD. */ - if (is_ir_dummy_bfd (abfd)) - ; -@@ -981,16 +987,15 @@ plugin_notice (struct bfd_link_info *info, - else if (bfd_is_ind_section (section) - || (flags & BSF_INDIRECT) != 0) - { -+ /* ??? Some of this is questionable. See comments in -+ _bfd_generic_link_add_one_symbol for case IND. */ - if (h->type != bfd_link_hash_new) - { -- struct bfd_link_hash_entry *inh; -- - h->non_ir_ref = TRUE; -- inh = bfd_wrapped_link_hash_lookup (abfd, info, string, FALSE, -- FALSE, FALSE); -- if (inh != NULL) -- inh->non_ir_ref = TRUE; -+ inh->non_ir_ref = TRUE; - } -+ else if (inh->type == bfd_link_hash_new) -+ inh->non_ir_ref = TRUE; - } - - /* Nothing to do here for warning symbols. */ -@@ -1031,13 +1036,13 @@ plugin_notice (struct bfd_link_info *info, - } - - /* Continue with cref/nocrossref/trace-sym processing. */ -- if (h == NULL -+ if (orig_h == NULL - || orig_notice_all - || (info->notice_hash != NULL -- && bfd_hash_lookup (info->notice_hash, h->root.string, -+ && bfd_hash_lookup (info->notice_hash, orig_h->root.string, - FALSE, FALSE) != NULL)) -- return (*orig_callbacks->notice) (info, h, -- abfd, section, value, flags, string); -+ return (*orig_callbacks->notice) (info, orig_h, inh, -+ abfd, section, value, flags); - return TRUE; - } - --- -1.9.3 - diff --git a/binutils/patches/binutils-default-test-flags.patch b/binutils/patches/binutils-default-test-flags.patch deleted file mode 100644 index 8870fabb9..000000000 --- a/binutils/patches/binutils-default-test-flags.patch +++ /dev/null @@ -1,35 +0,0 @@ -many tests rely on order of symbols and the gnu hash style/relro options -change that. so to avoid having to constantly thrash in the test files, -use the normal options that everyone tests against. - ---- binutils/ld/testsuite/lib/ld-lib.exp -+++ binutils/ld/testsuite/lib/ld-lib.exp -@@ -84,7 +84,7 @@ - global HOSTING_EMU - - remote_file host delete $target -- return [run_host_cmd_yesno "$ld" "$HOSTING_EMU -o $target -r $objects"] -+ return [run_host_cmd_yesno "$ld" "$HOSTING_EMU --hash-style=sysv -z norelro -o $target -r $objects"] - } - - # Check to see if ld is being invoked with a non-endian output format -@@ -158,7 +158,7 @@ - - remote_file host delete $target - -- return [run_host_cmd_yesno "$ld" "$HOSTING_EMU $flags -o $target $objs $libs"] -+ return [run_host_cmd_yesno "$ld" "$HOSTING_EMU --hash-style=sysv -z norelro $flags -o $target $objs $libs"] - } - - # Link a program using ld, without including any libraries. -@@ -189,7 +189,9 @@ - } - set ldexe [string replace $ldexe 0 [string last "/" $ldexe] ""] - if {[string match "*gcc*" $ldexe] || [string match "*++*" $ldexe]} then { -- set ldflags "$gcc_ld_flag $ldflags" -+ set ldflags "$gcc_ld_flag -Wl,--hash-style=sysv -Wl,-z,norelro $ldflags" -+ } else { -+ set ldflags "--hash-style=sysv -z norelro $ldflags" - } - - remote_file host delete $target diff --git a/binutils/patches/binutils-rh1312151.patch b/binutils/patches/binutils-rh1312151.patch new file mode 100644 index 000000000..e989b86fe --- /dev/null +++ b/binutils/patches/binutils-rh1312151.patch @@ -0,0 +1,22 @@ +--- binutils-2.26.orig/bfd/elflink.c 2016-02-26 13:21:54.134859610 +0000 ++++ binutils-2.26/bfd/elflink.c 2016-02-26 13:22:49.083168157 +0000 +@@ -555,6 +555,19 @@ bfd_elf_record_link_assignment (bfd *out + if (h == NULL) + return provide; + ++ if (h->versioned == unknown) ++ { ++ /* Set versioned if symbol version is unknown. */ ++ char *version = strrchr (name, ELF_VER_CHR); ++ if (version) ++ { ++ if (version > name && version[-1] != ELF_VER_CHR) ++ h->versioned = versioned_hidden; ++ else ++ h->versioned = versioned; ++ } ++ } ++ + switch (h->root.type) + { + case bfd_link_hash_defined: diff --git a/binutils/patches/binutils-use-new-ld-dtags.patch b/binutils/patches/binutils-use-new-ld-dtags.patch deleted file mode 100644 index e7388971f..000000000 --- a/binutils/patches/binutils-use-new-ld-dtags.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- binutils/ld/ldmain.c -+++ binutils/ld/ldmain.c -@@ -296,6 +296,7 @@ main (int argc, char **argv) - - link_info.allow_undefined_version = TRUE; - link_info.keep_memory = TRUE; -+ link_info.new_dtags = TRUE; - link_info.combreloc = TRUE; - link_info.strip_discarded = TRUE; - link_info.callbacks = &link_callbacks; ---- binutils/ld/ld.texinfo -+++ binutils/ld/ld.texinfo -@@ -2036,8 +2036,9 @@ - systems may not understand them. If you specify - @option{--enable-new-dtags}, the dynamic tags will be created as needed. - If you specify @option{--disable-new-dtags}, no new dynamic tags will be --created. By default, the new dynamic tags are not created. Note that --those options are only available for ELF systems. -+created. On Gentoo, by default, the new dynamic tags are created (this -+differs from upstream behaviour). Note that those options are only -+available for ELF systems. - - @kindex --hash-size=@var{number} - @item --hash-size=@var{number} diff --git a/binutils/patches/x86_64/binutils-2.20.51.0.2-libtool-lib64.patch0 b/binutils/patches/x86_64/binutils-2.20.51.0.2-libtool-lib64.patch0 deleted file mode 100644 index 0c61a1148..000000000 --- a/binutils/patches/x86_64/binutils-2.20.51.0.2-libtool-lib64.patch0 +++ /dev/null @@ -1,302 +0,0 @@ -diff -rcp ../binutils-2.20.51.0.7.original/bfd/configure ./bfd/configure -*** ../binutils-2.20.51.0.7.original/bfd/configure 2010-04-08 14:53:48.000000000 +0100 ---- ./bfd/configure 2010-04-08 14:56:50.000000000 +0100 -*************** fi -*** 10762,10771 **** - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on ---- 10762,10795 ---- - # before this can be enabled. - hardcode_into_libs=yes - -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390*|powerpc*|ppc*|sparc*) -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ fi -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on -diff -rcp ../binutils-2.20.51.0.7.original/binutils/configure ./binutils/configure -*** ../binutils-2.20.51.0.7.original/binutils/configure 2010-04-08 14:53:45.000000000 +0100 ---- ./binutils/configure 2010-04-08 14:56:21.000000000 +0100 -*************** fi -*** 10560,10569 **** - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on ---- 10560,10593 ---- - # before this can be enabled. - hardcode_into_libs=yes - -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390*|powerpc*|ppc*|sparc*) -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ fi -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on -diff -rcp ../binutils-2.20.51.0.7.original/gas/configure ./gas/configure -*** ../binutils-2.20.51.0.7.original/gas/configure 2010-04-08 14:53:47.000000000 +0100 ---- ./gas/configure 2010-04-08 14:57:24.000000000 +0100 -*************** fi -*** 10547,10556 **** - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on ---- 10547,10580 ---- - # before this can be enabled. - hardcode_into_libs=yes - -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390*|powerpc*|ppc*|sparc*) -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ fi -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on -diff -rcp ../binutils-2.20.51.0.7.original/gprof/configure ./gprof/configure -*** ../binutils-2.20.51.0.7.original/gprof/configure 2010-04-08 14:53:45.000000000 +0100 ---- ./gprof/configure 2010-04-08 14:57:50.000000000 +0100 -*************** fi -*** 10485,10494 **** - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on ---- 10485,10518 ---- - # before this can be enabled. - hardcode_into_libs=yes - -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390*|powerpc*|ppc*|sparc*) -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ fi -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on -diff -rcp ../binutils-2.20.51.0.7.original/ld/configure ./ld/configure -*** ../binutils-2.20.51.0.7.original/ld/configure 2010-04-08 14:53:44.000000000 +0100 ---- ./ld/configure 2010-04-08 14:58:21.000000000 +0100 -*************** fi -*** 10966,10975 **** - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on ---- 10966,10999 ---- - # before this can be enabled. - hardcode_into_libs=yes - -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390*|powerpc*|ppc*|sparc*) -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ fi -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on -Only in .: .#libtool.m4 -Only in .: #libtool.m4# -diff -rcp ../binutils-2.20.51.0.7.original/opcodes/configure ./opcodes/configure -*** ../binutils-2.20.51.0.7.original/opcodes/configure 2010-04-08 14:53:45.000000000 +0100 ---- ./opcodes/configure 2010-04-08 14:59:10.000000000 +0100 -*************** fi -*** 10496,10505 **** - # before this can be enabled. - hardcode_into_libs=yes - - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on ---- 10496,10529 ---- - # before this can be enabled. - hardcode_into_libs=yes - -+ # find out which ABI we are using -+ libsuff= -+ case "$host_cpu" in -+ x86_64*|s390*|powerpc*|ppc*|sparc*) -+ echo 'int i;' > conftest.$ac_ext -+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 -+ (eval $ac_compile) 2>&5 -+ ac_status=$? -+ echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; then -+ case `/usr/bin/file conftest.$ac_objext` in -+ *64-bit*) -+ libsuff=64 -+ if test x"$sys_lib_search_path_spec" = x"/lib /usr/lib /usr/local/lib"; then -+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" -+ fi -+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}" -+ ;; -+ esac -+ fi -+ rm -rf conftest* -+ ;; -+ esac -+ - # Append ld.so.conf contents to the search path - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` -! sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on