diff options
Diffstat (limited to 'abs/core')
| -rw-r--r-- | abs/core/binutils/PKGBUILD | 92 | ||||
| -rw-r--r-- | abs/core/binutils/binutils-2.24-gold-testsuite-plugin.patch | 229 | ||||
| -rw-r--r-- | abs/core/binutils/binutils-2.24-lto-testsuite.patch | 78 | ||||
| -rw-r--r-- | abs/core/binutils/binutils-2.24-shared-pie.patch | 99 | 
4 files changed, 450 insertions, 48 deletions
| diff --git a/abs/core/binutils/PKGBUILD b/abs/core/binutils/PKGBUILD index a4d2839..26ba4f9 100644 --- a/abs/core/binutils/PKGBUILD +++ b/abs/core/binutils/PKGBUILD @@ -1,87 +1,83 @@ -# $Id: PKGBUILD 171025 2012-11-15 12:26:41Z allan $ +# $Id$  # Maintainer: Allan McRae <allan@archlinux.org>  # toolchain build order: linux-api-headers->glibc->binutils->gcc->binutils->glibc  pkgname=binutils -pkgver=2.23.1 -pkgrel=1 +pkgver=2.24 +pkgrel=7  pkgdesc="A set of programs to assemble and manipulate binary and object files"  arch=('i686' 'x86_64')  url="http://www.gnu.org/software/binutils/"  license=('GPL')  groups=('base-devel') -depends=('glibc>=2.16' 'zlib') +depends=('glibc>=2.20' 'zlib')  checkdepends=('dejagnu' 'bc') -options=('!libtool' '!distcc' '!ccache') +conflicts=('binutils-multilib') +replaces=('binutils-multilib') +options=('staticlibs' '!distcc' '!ccache')  install=binutils.install -source=(ftp://ftp.gnu.org/gnu/binutils/binutils-${pkgver}.tar.bz2{,.sig}) -md5sums=('33adb18c3048d057ac58d07a3f1adb38' -         '1869b37216e7d7eff7e335a69e0882fd') +source=(ftp://ftp.gnu.org/gnu/binutils/binutils-${pkgver}.tar.bz2{,.sig} +        binutils-2.24-lto-testsuite.patch +        binutils-2.24-gold-testsuite-plugin.patch +        binutils-2.24-shared-pie.patch) +md5sums=('e0f71a7b2ddab0f8612336ac81d9636b' +         'SKIP' +         'e68a1f221545f082baa5bd417cd077af' +         'e46bbb03abaa5db58c12247644dc4857' +         'ec59461c4febab9cfe1c1ef33326bc50') +validpgpkeys=('EAF1C276A747E9ED86210CBAC3126D3B4AE55E93') + +prepare() { +  cd ${srcdir}/binutils-${pkgver} + +  # hack! - libiberty configure tests for header files using "$CPP $CPPFLAGS" +  sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" libiberty/configure + +  # fix lto testsuite with gcc-4.9 - commits b35d44f1 and 37a6ac44 +  patch -p1 -i $srcdir/binutils-2.24-lto-testsuite.patch + +  # fix gold testsuite with gcc-4.9 - commit ae447ddd +  patch -p1 -i $srcdir/binutils-2.24-gold-testsuite-plugin.patch + +  # fix issues with -static -fPIE -pie - commit 4199e3b8 +  patch -p1 -i $srcdir/binutils-2.24-shared-pie.patch + +  mkdir ${srcdir}/binutils-build +}  build() { -  cd ${srcdir} -  mkdir binutils-build && cd binutils-build +  cd ${srcdir}/binutils-build    ${srcdir}/binutils-${pkgver}/configure --prefix=/usr \      --with-lib-path=/usr/lib:/usr/local/lib \      --with-bugurl=https://bugs.archlinux.org/ \ -    --enable-ld=default --enable-gold \ -    --enable-plugins --enable-threads --enable-shared \ -    --disable-werror --disable-multilib +    --enable-threads --enable-shared --with-pic \ +    --enable-ld=default --enable-gold --enable-plugins \ +    --disable-werror    # check the host environment and makes sure all the necessary tools are available    make configure-host -  make tooldir=${pkgdir}/usr - -  # Rebuild libiberty.a with -fPIC -  cp -a libiberty libiberty-pic -  make -C libiberty-pic clean -  make CFLAGS="$CFLAGS -fPIC" -C libiberty-pic - -  # Rebuild libbfd.a with -fPIC -  # hidden visability prevent 3rd party shared libraries exporting bfd non-stable API -  cp -a bfd bfd-pic -  make -C bfd-pic clean -  make CFLAGS="$CFLAGS -fPIC -fvisibility=hidden" -C bfd-pic - -  # Rebuild libopcodes.a with -fPIC -  cp -a opcodes opcodes-pic -  make -C opcodes-pic clean  -  make CFLAGS="$CFLAGS -fPIC" -C opcodes-pic +  make tooldir=/usr  }  check() {    cd ${srcdir}/binutils-build    # unset LDFLAGS as testsuite makes assumptions about which ones are active -  # do not abort on errors - manually check log files -  make LDFLAGS="" -k check || true +  # ignore failures in gold testsuite... +  make -k LDFLAGS="" check || true  }  package() {    cd ${srcdir}/binutils-build    make prefix=${pkgdir}/usr tooldir=${pkgdir}/usr install -   -  # Add some useful headers -  install -m644 ${srcdir}/binutils-${pkgver}/include/libiberty.h ${pkgdir}/usr/include -  install -m644 ${srcdir}/binutils-${pkgver}/include/demangle.h ${pkgdir}/usr/include - -  # install libraries rebuilt with -fPIC -  install -m644 libiberty-pic/libiberty.a ${pkgdir}/usr/lib -  install -m644 bfd-pic/libbfd.a ${pkgdir}/usr/lib -  install -m644 opcodes/libopcodes.a ${pkgdir}/usr/lib -  # Remove Windows/Novell specific man pages +  # Remove unwanted files    rm ${pkgdir}/usr/share/man/man1/{dlltool,nlmconv,windres,windmc}* - -  # why are these distributed with binutils?    rm ${pkgdir}/usr/share/info/{configure,standards}.info -  # Remove these symlinks, they are not ABI stable. -  # Programs should compile static to the .a file. +  # No shared linking to these files outside binutils    rm ${pkgdir}/usr/lib/lib{bfd,opcodes}.so -  echo "INPUT ( /usr/lib/libbfd.a -liberty -lz )" >${pkgdir}/usr/lib/libbfd.so -  echo "INPUT ( /usr/lib/libopcodes.a -lbfd )" >${pkgdir}/usr/lib/libopcodes.so  } diff --git a/abs/core/binutils/binutils-2.24-gold-testsuite-plugin.patch b/abs/core/binutils/binutils-2.24-gold-testsuite-plugin.patch new file mode 100644 index 0000000..9f5acad --- /dev/null +++ b/abs/core/binutils/binutils-2.24-gold-testsuite-plugin.patch @@ -0,0 +1,229 @@ +diff --git a/gold/configure b/gold/configure +index 2257324..f61307b 100755 +--- a/gold/configure ++++ b/gold/configure +@@ -594,10 +594,12 @@ LTLIBOBJS + MAINT + MAINTAINER_MODE_FALSE + MAINTAINER_MODE_TRUE +-HAVE_PUBNAMES_FALSE +-HAVE_PUBNAMES_TRUE + DLOPEN_LIBS + CXXCPP ++HAVE_NO_USE_LINKER_PLUGIN_FALSE ++HAVE_NO_USE_LINKER_PLUGIN_TRUE ++HAVE_PUBNAMES_FALSE ++HAVE_PUBNAMES_TRUE + HAVE_ZLIB_FALSE + HAVE_ZLIB_TRUE + LIBOBJS +@@ -6991,6 +6993,50 @@ cat >>confdefs.h <<_ACEOF + _ACEOF +  +  ++save_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -Werror -gpubnames" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h.  */ ++int i; ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++  have_pubnames=yes ++else ++  have_pubnames=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++CFLAGS="$save_CFLAGS" ++ if test "$have_pubnames" = "yes"; then ++  HAVE_PUBNAMES_TRUE= ++  HAVE_PUBNAMES_FALSE='#' ++else ++  HAVE_PUBNAMES_TRUE='#' ++  HAVE_PUBNAMES_FALSE= ++fi ++ ++ ++save_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -Werror -fno-use-linker-plugin" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h.  */ ++int i; ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++  have_no_use_linker_plugin=yes ++else ++  have_no_use_linker_plugin=no ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++CFLAGS="$save_CFLAGS" ++ if test "$have_no_use_linker_plugin" = "yes"; then ++  HAVE_NO_USE_LINKER_PLUGIN_TRUE= ++  HAVE_NO_USE_LINKER_PLUGIN_FALSE='#' ++else ++  HAVE_NO_USE_LINKER_PLUGIN_TRUE='#' ++  HAVE_NO_USE_LINKER_PLUGIN_FALSE= ++fi ++ ++ + ac_ext=cpp + ac_cpp='$CXXCPP $CPPFLAGS' + ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -7515,28 +7561,6 @@ $as_echo "#define HAVE_STAT_ST_MTIM 1" >>confdefs.h +  + fi +  +-save_CXXFLAGS="$CXXFLAGS" +-CXXFLAGS="$CXXFLAGS -Werror -gpubnames" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h.  */ +-int i; +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +-  have_pubnames=yes +-else +-  have_pubnames=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-CXXFLAGS="$save_CXXFLAGS" +- if test "$have_pubnames" = "yes"; then +-  HAVE_PUBNAMES_TRUE= +-  HAVE_PUBNAMES_FALSE='#' +-else +-  HAVE_PUBNAMES_TRUE='#' +-  HAVE_PUBNAMES_FALSE= +-fi +- +- + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -7837,6 +7861,10 @@ if test -z "${HAVE_PUBNAMES_TRUE}" && test -z "${HAVE_PUBNAMES_FALSE}"; then +   as_fn_error "conditional \"HAVE_PUBNAMES\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 + fi ++if test -z "${HAVE_NO_USE_LINKER_PLUGIN_TRUE}" && test -z "${HAVE_NO_USE_LINKER_PLUGIN_FALSE}"; then ++  as_fn_error "conditional \"HAVE_NO_USE_LINKER_PLUGIN\" was never defined. ++Usually this means the macro was only invoked conditionally." "$LINENO" 5 ++fi + if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then +   as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. + Usually this means the macro was only invoked conditionally." "$LINENO" 5 +diff --git a/gold/configure.ac b/gold/configure.ac +index 803cf46..7ad7302 100644 +--- a/gold/configure.ac ++++ b/gold/configure.ac +@@ -520,6 +520,25 @@ dnl multiple declarations of functions like basename when compiling + dnl with C++. + AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp]) +  ++dnl Check if gcc supports the -gpubnames option. ++dnl Use -Werror in case of compilers that make unknown -g options warnings. ++dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS ++dnl gets set later by default Autoconf magic to include -Werror.  (We are ++dnl assuming here that there is no compiler that groks -gpubnames ++dnl but does not grok -Werror.) ++save_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -Werror -gpubnames" ++AC_COMPILE_IFELSE([int i;], [have_pubnames=yes], [have_pubnames=no]) ++CFLAGS="$save_CFLAGS" ++AM_CONDITIONAL(HAVE_PUBNAMES, test "$have_pubnames" = "yes") ++ ++dnl Check if gcc supports the -fno-use-linker-plugin option. ++save_CFLAGS="$CFLAGS" ++CFLAGS="$CFLAGS -Werror -fno-use-linker-plugin" ++AC_COMPILE_IFELSE([int i;], [have_no_use_linker_plugin=yes], [have_no_use_linker_plugin=no]) ++CFLAGS="$save_CFLAGS" ++AM_CONDITIONAL(HAVE_NO_USE_LINKER_PLUGIN, test "$have_no_use_linker_plugin" = "yes") ++ + AC_LANG_PUSH(C++) +  + AC_CHECK_HEADERS(unordered_set unordered_map) +@@ -601,18 +620,6 @@ if test "$gold_cv_stat_st_mtim" = "yes"; then + 	    [Define if struct stat has a field st_mtim with timespec for mtime]) + fi +  +-dnl Check if gcc supports the -gpubnames option. +-dnl Use -Werror in case of compilers that make unknown -g options warnings. +-dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS +-dnl gets set later by default Autoconf magic to include -Werror.  (We are +-dnl assuming here that there is no compiler that groks -gpubnames +-dnl but does not grok -Werror.) +-save_CXXFLAGS="$CXXFLAGS" +-CXXFLAGS="$CXXFLAGS -Werror -gpubnames" +-AC_COMPILE_IFELSE([int i;], [have_pubnames=yes], [have_pubnames=no]) +-CXXFLAGS="$save_CXXFLAGS" +-AM_CONDITIONAL(HAVE_PUBNAMES, test "$have_pubnames" = "yes") +- + AC_LANG_POP(C++) +  + AC_CHECK_HEADERS(locale.h) +diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am +index aa41290..52cc05e 100644 +--- a/gold/testsuite/Makefile.am ++++ b/gold/testsuite/Makefile.am +@@ -19,18 +19,25 @@ AM_CPPFLAGS = \ + 	-DLOCALEDIR="\"$(datadir)/locale\"" \ + 	@INCINTL@ +  ++# Some versions of GCC now automatically enable linker plugins, ++# but we want to run our tests without GCC's plugins. ++if HAVE_NO_USE_LINKER_PLUGIN ++OPT_NO_PLUGINS = -fno-use-linker-plugin ++endif ++ + # COMPILE1, LINK1, CXXCOMPILE1, CXXLINK1 are renamed from COMPILE, LINK, + # CXXCOMPILE and CXXLINK generated by automake 1.11.1.  FIXME: they should + # be updated if they are different from automake used by gold. + COMPILE1 = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LINK1 = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++LINK1 = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(OPT_NO_PLUGINS) \ ++	$(AM_LDFLAGS) $(LDFLAGS) -o $@ + CXXCOMPILE1 = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +-CXXLINK1 = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ +-	-o $@ ++CXXLINK1 = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPT_NO_PLUGINS) \ ++	$(AM_LDFLAGS) $(LDFLAGS) -o $@ +  +-# Strip out -Wp,-D_FORTIFY_SOURCE=, which is rrelevant for the gold ++# Strip out -Wp,-D_FORTIFY_SOURCE=, which is irrelevant for the gold + # testsuite and incompatible with -O0 used in gold tests, from + # COMPILE, LINK, CXXCOMPILE and CXXLINK. + COMPILE = `echo $(COMPILE1) | sed -e 's/-Wp,-D_FORTIFY_SOURCE=[0-9[0-9]]*//'` +diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in +index 60c2c10..da0a338 100644 +--- a/gold/testsuite/Makefile.in ++++ b/gold/testsuite/Makefile.in +@@ -2096,21 +2096,27 @@ AM_CPPFLAGS = \ + 	@INCINTL@ +  +  ++# Some versions of GCC now automatically enable linker plugins, ++# but we want to run our tests without GCC's plugins. ++@HAVE_NO_USE_LINKER_PLUGIN_TRUE@OPT_NO_PLUGINS = -fno-use-linker-plugin ++ + # COMPILE1, LINK1, CXXCOMPILE1, CXXLINK1 are renamed from COMPILE, LINK, + # CXXCOMPILE and CXXLINK generated by automake 1.11.1.  FIXME: they should + # be updated if they are different from automake used by gold. + COMPILE1 = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +  +-LINK1 = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++LINK1 = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(OPT_NO_PLUGINS) \ ++	$(AM_LDFLAGS) $(LDFLAGS) -o $@ ++ + CXXCOMPILE1 = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +  +-CXXLINK1 = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ +-	-o $@ ++CXXLINK1 = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(OPT_NO_PLUGINS) \ ++	$(AM_LDFLAGS) $(LDFLAGS) -o $@ +  +  +-# Strip out -Wp,-D_FORTIFY_SOURCE=, which is rrelevant for the gold ++# Strip out -Wp,-D_FORTIFY_SOURCE=, which is irrelevant for the gold + # testsuite and incompatible with -O0 used in gold tests, from + # COMPILE, LINK, CXXCOMPILE and CXXLINK. + COMPILE = `echo $(COMPILE1) | sed -e 's/-Wp,-D_FORTIFY_SOURCE=[0-9[0-9]]*//'` diff --git a/abs/core/binutils/binutils-2.24-lto-testsuite.patch b/abs/core/binutils/binutils-2.24-lto-testsuite.patch new file mode 100644 index 0000000..0f34726 --- /dev/null +++ b/abs/core/binutils/binutils-2.24-lto-testsuite.patch @@ -0,0 +1,78 @@ +index c5249f0..69946de 100644 +--- 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" +diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp +index 8df42ae..175449a 100644 +--- 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/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp +index b14f13c..765d85f 100644 +--- a/ld/testsuite/ld-plugin/lto.exp ++++ b/ld/testsuite/ld-plugin/lto.exp +@@ -324,7 +324,20 @@ if { [is_elf_format] && [check_lto_shared_available] } { +  + set testname "Build liblto-11.a" + remote_file host delete "tmpdir/liblto-11.a" +-set catch_output [run_host_cmd "$ar" "rc tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"] ++set plugin_names { ++    liblto_plugin.so ++    liblto_plugin-0.dll ++    cyglto_plugin-0.dll ++} ++set plug_opt "" ++foreach plug $plugin_names { ++    set plug_so [run_host_cmd $CC "--print-prog-name $plug"] ++    if { $plug_so ne $plug } then { ++	set plug_opt "--plugin $plug_so" ++	break ++    } ++} ++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"] + if {![string match "" $catch_output]} { +     unresolved $testname +     restore_notify + + diff --git a/abs/core/binutils/binutils-2.24-shared-pie.patch b/abs/core/binutils/binutils-2.24-shared-pie.patch new file mode 100644 index 0000000..d40aa47 --- /dev/null +++ b/abs/core/binutils/binutils-2.24-shared-pie.patch @@ -0,0 +1,99 @@ +diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em +index 9a2fe89..13f86f0 100644 +--- a/ld/emultempl/elf32.em ++++ b/ld/emultempl/elf32.em +@@ -1480,6 +1480,8 @@ gld${EMULATION_NAME}_before_allocation (void) +   const char *rpath; +   asection *sinterp; +   bfd *abfd; ++  struct elf_link_hash_entry *ehdr_start = NULL; ++  struct bfd_link_hash_entry ehdr_start_save; +  +   if (is_elf_hash_table (link_info.hash)) +     { +@@ -1504,6 +1506,16 @@ gld${EMULATION_NAME}_before_allocation (void) +              _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE); +              if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL) +                h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN; ++	     /* Don't leave the symbol undefined.  Undefined hidden ++		symbols typically won't have dynamic relocations, but ++		we most likely will need dynamic relocations for ++		__ehdr_start if we are building a PIE or shared ++		library.  */ ++	     ehdr_start = h; ++	     ehdr_start_save = h->root; ++	     h->root.type = bfd_link_hash_defined; ++	     h->root.u.def.section = bfd_abs_section_ptr; ++	     h->root.u.def.value = 0; +            } +        } +  +@@ -1620,6 +1632,14 @@ ${ELF_INTERPRETER_SET_DEFAULT} +  +   if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info)) +     einfo ("%P%F: failed to set dynamic section sizes: %E\n"); ++ ++  if (ehdr_start != NULL) ++    { ++      /* If we twiddled __ehdr_start to defined earlier, put it back ++	 as it was.  */ ++      ehdr_start->root.type = ehdr_start_save.type; ++      ehdr_start->root.u = ehdr_start_save.u; ++    } + } +  + EOF +diff --git a/ld/testsuite/ld-elf/ehdr_start-shared.d b/ld/testsuite/ld-elf/ehdr_start-shared.d +new file mode 100644 +index 0000000..c17516a +--- /dev/null ++++ b/ld/testsuite/ld-elf/ehdr_start-shared.d +@@ -0,0 +1,9 @@ ++#source: ehdr_start.s ++#ld: -e _start -shared ++#nm: -n ++#target: *-*-linux* *-*-gnu* *-*-nacl* ++#xfail: cris*-*-* frv-*-* ++ ++#... ++[0-9a-f]*000 [Adrt] __ehdr_start ++#pass +diff --git a/ld/testsuite/ld-elf/ehdr_start-userdef.d b/ld/testsuite/ld-elf/ehdr_start-userdef.d +index 2a88e98..b58ae3f 100644 +--- a/ld/testsuite/ld-elf/ehdr_start-userdef.d ++++ b/ld/testsuite/ld-elf/ehdr_start-userdef.d +@@ -2,6 +2,7 @@ + #ld: -e _start -T ehdr_start-userdef.t + #readelf: -Ws + #target: *-*-linux* *-*-gnu* *-*-nacl* ++#xfail: frv-*-* +  + #... + Symbol table '\.symtab' contains [0-9]+ entries: +diff --git a/ld/testsuite/ld-elf/ehdr_start-weak.d b/ld/testsuite/ld-elf/ehdr_start-weak.d +index 8bd9035..24ae34c 100644 +--- a/ld/testsuite/ld-elf/ehdr_start-weak.d ++++ b/ld/testsuite/ld-elf/ehdr_start-weak.d +@@ -2,6 +2,7 @@ + #ld: -e _start -T ehdr_start-missing.t + #nm: -n + #target: *-*-linux* *-*-gnu* *-*-nacl* ++#xfail: frv-*-* +  + #... + \s+[wU] __ehdr_start +diff --git a/ld/testsuite/ld-elf/ehdr_start.d b/ld/testsuite/ld-elf/ehdr_start.d +index 52e5b54..d538b66 100644 +--- a/ld/testsuite/ld-elf/ehdr_start.d ++++ b/ld/testsuite/ld-elf/ehdr_start.d +@@ -2,6 +2,7 @@ + #ld: -e _start + #nm: -n + #target: *-*-linux* *-*-gnu* *-*-nacl* ++#xfail: frv-*-* +  + #... + [0-9a-f]*000 [Adrt] __ehdr_start +--  +1.7.1 + | 
