summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Pashev <igor.pashev@nexenta.com>2012-12-03 19:01:30 +0400
committerIgor Pashev <igor.pashev@nexenta.com>2012-12-03 19:01:30 +0400
commit8ce8d223a716e16cd3ffd3aaa04d4dee7d35d4dd (patch)
treedf24ae9285d42b32bf3f9b74e0142a4e36b6f5f0
parent7a067c659745b5cd1cc33767cc4d554b40885a5c (diff)
downloadcibs-pkgs-8ce8d223a716e16cd3ffd3aaa04d4dee7d35d4dd.tar.gz
GNU binutils 2.22+
-rw-r--r--binutils/Makefile27
-rw-r--r--binutils/binutils.p5m301
-rw-r--r--binutils/patches/001_ld_makefile_patch.patch27
-rw-r--r--binutils/patches/002_gprof_profile_arcs.patch27
-rw-r--r--binutils/patches/003_gprof_see_also_monitor.patch13
-rw-r--r--binutils/patches/006_better_file_error.patch19
-rw-r--r--binutils/patches/012_check_ldrunpath_length.patch23
-rw-r--r--binutils/patches/013_bash_in_ld_testsuite.patch26
-rw-r--r--binutils/patches/014_hash_style-both.patch30
-rw-r--r--binutils/patches/014_hash_style-gnu.patch31
-rw-r--r--binutils/patches/127_x86_64_i386_biarch.patch22
-rw-r--r--binutils/patches/128_build_id.patch42
-rw-r--r--binutils/patches/128_ppc64_powerpc_biarch.patch15
-rw-r--r--binutils/patches/129_ld_mulitarch_dirs.patch72
-rw-r--r--binutils/patches/130_gold_disable_testsuite_build.patch26
-rw-r--r--binutils/patches/131_ld_bootstrap_testsuite.patch45
-rw-r--r--binutils/patches/134_gold_no_spu.patch13
-rw-r--r--binutils/patches/135_bfd_version.patch47
-rw-r--r--binutils/patches/140_pr10340.patch35
-rw-r--r--binutils/patches/156_pr10144.patch315
-rw-r--r--binutils/patches/157_ar_scripts_with_tilde.patch11
-rw-r--r--binutils/patches/158_ld_system_root.patch36
-rw-r--r--binutils/patches/160_gas_pr12698.diff54
-rw-r--r--binutils/patches/161_gold_dummy_zoption.diff25
-rw-r--r--binutils/patches/162_fpic_s390x.diff31
-rw-r--r--binutils/patches/163_multiarch_search_path.patch79
-rw-r--r--binutils/patches/167_pr13302.diff532
-rw-r--r--binutils/patches/168_readelf_go.patch13
-rw-r--r--binutils/patches/210-gold-time_cc-unistd_h_for_sysconf.patch14
-rw-r--r--binutils/patches/300_ld_altexec.patch80
-rw-r--r--binutils/patches/branch-updates.diff6396
-rw-r--r--binutils/patches/branch-version.diff52
-rw-r--r--binutils/patches/dyson-biarch.patch18
-rw-r--r--binutils/patches/libiberty-md5.diff32
-rw-r--r--binutils/patches/pr12548-anonymous-version-tag.patch19
-rw-r--r--binutils/patches/pr13449.diff20
-rw-r--r--binutils/patches/pr13534-01.diff118
-rw-r--r--binutils/patches/pr13534-02.diff136
-rw-r--r--binutils/patches/pr13534-03.diff29
-rw-r--r--binutils/patches/pr13534-04.diff82
-rw-r--r--binutils/patches/pr13534-05.diff61
-rw-r--r--binutils/patches/pr14069.diff43
-rw-r--r--binutils/patches/pr14493-ignore-without-bfd.patch36
-rw-r--r--binutils/patches/pr14493-readelf.patch15
-rw-r--r--binutils/patches/pr14493-sol2.patch394
-rw-r--r--binutils/patches/pr14493-strip.patch56
-rw-r--r--binutils/patches/series43
47 files changed, 9581 insertions, 0 deletions
diff --git a/binutils/Makefile b/binutils/Makefile
new file mode 100644
index 0000000..a4d2129
--- /dev/null
+++ b/binutils/Makefile
@@ -0,0 +1,27 @@
+include /usr/share/cibs/rules/ips.mk
+include /usr/share/cibs/rules/patch.mk
+include /usr/share/cibs/rules/archive.mk
+include /usr/share/cibs/rules/autotools.mk
+include /usr/share/cibs/rules/64.mk
+
+summary := GNU collection of binary tools, including the GNU linker and the GNU assembler
+license := GPL v3+
+license-file := COPYING3
+
+prefix = /usr/gnu
+
+PATH := /usr/perl5/bin:$(PATH)
+
+build-depends += \
+ flex
+
+name := binutils
+home := http://www.gnu.org/software/$(name)/
+version := 2.22
+archive := $(name)-$(version).tar.bz2
+download := http://ftp.gnu.org/gnu/$(name)/$(archive)
+checksum := \
+ md5:ee0f10756c84979622b992a4a61ea3f5 \
+ sha1:65b304a0b9a53a686ce50a01173d1f40f8efe404 \
+ sha256:6c7af8ed1c8cf9b4b9d6e6fe09a3e1d3d479fe63984ba8b9b26bf356b6313ca9 \
+ size:19973532
diff --git a/binutils/binutils.p5m b/binutils/binutils.p5m
new file mode 100644
index 0000000..366bf7c
--- /dev/null
+++ b/binutils/binutils.p5m
@@ -0,0 +1,301 @@
+set name=pkg.fmri value=pkg:/developer/gnu-$(name)@$(ips-version)
+set name=pkg.summary value="$(summary)"
+set name=info.upstream-url value="$(home)"
+set name=info.source-url value="$(download)"
+
+license $(license-file) license="$(license)"
+
+<transform file path=usr/gnu/bin/(.+) -> \
+emit link path=usr/bin/g%<1> target=../gnu/bin/%<1> >
+
+<transform file path=usr/gnu/share/man/man1/(.+) -> \
+emit link path=usr/share/man/man1/g%<1> target=../../../gnu/share/man/man1/%<1>>
+
+dir path=usr
+dir path=usr/share
+dir path=usr/share/info
+dir path=usr/gnu
+dir path=usr/gnu/share
+dir path=usr/gnu/share/man
+dir path=usr/gnu/share/man/man1
+dir path=usr/gnu/share/locale
+dir path=usr/gnu/share/locale/ms
+dir path=usr/gnu/share/locale/ms/LC_MESSAGES
+dir path=usr/gnu/share/locale/es
+dir path=usr/gnu/share/locale/es/LC_MESSAGES
+dir path=usr/gnu/share/locale/bg
+dir path=usr/gnu/share/locale/bg/LC_MESSAGES
+dir path=usr/gnu/share/locale/ga
+dir path=usr/gnu/share/locale/ga/LC_MESSAGES
+dir path=usr/gnu/share/locale/nl
+dir path=usr/gnu/share/locale/nl/LC_MESSAGES
+dir path=usr/gnu/share/locale/zh_TW
+dir path=usr/gnu/share/locale/zh_TW/LC_MESSAGES
+dir path=usr/gnu/share/locale/fr
+dir path=usr/gnu/share/locale/fr/LC_MESSAGES
+dir path=usr/gnu/share/locale/zh_CN
+dir path=usr/gnu/share/locale/zh_CN/LC_MESSAGES
+dir path=usr/gnu/share/locale/rw
+dir path=usr/gnu/share/locale/rw/LC_MESSAGES
+dir path=usr/gnu/share/locale/ru
+dir path=usr/gnu/share/locale/ru/LC_MESSAGES
+dir path=usr/gnu/share/locale/id
+dir path=usr/gnu/share/locale/id/LC_MESSAGES
+dir path=usr/gnu/share/locale/fi
+dir path=usr/gnu/share/locale/fi/LC_MESSAGES
+dir path=usr/gnu/share/locale/sv
+dir path=usr/gnu/share/locale/sv/LC_MESSAGES
+dir path=usr/gnu/share/locale/uk
+dir path=usr/gnu/share/locale/uk/LC_MESSAGES
+dir path=usr/gnu/share/locale/vi
+dir path=usr/gnu/share/locale/vi/LC_MESSAGES
+dir path=usr/gnu/share/locale/de
+dir path=usr/gnu/share/locale/de/LC_MESSAGES
+dir path=usr/gnu/share/locale/ja
+dir path=usr/gnu/share/locale/ja/LC_MESSAGES
+dir path=usr/gnu/share/locale/da
+dir path=usr/gnu/share/locale/da/LC_MESSAGES
+dir path=usr/gnu/share/locale/sk
+dir path=usr/gnu/share/locale/sk/LC_MESSAGES
+dir path=usr/gnu/share/locale/tr
+dir path=usr/gnu/share/locale/tr/LC_MESSAGES
+dir path=usr/gnu/share/locale/eo
+dir path=usr/gnu/share/locale/eo/LC_MESSAGES
+dir path=usr/gnu/share/locale/ro
+dir path=usr/gnu/share/locale/ro/LC_MESSAGES
+dir path=usr/gnu/share/locale/pt_BR
+dir path=usr/gnu/share/locale/pt_BR/LC_MESSAGES
+dir path=usr/gnu/lib
+dir path=usr/gnu/lib/$(MACH64)
+dir path=usr/gnu/lib/$(MACH64)/ldscripts
+dir path=usr/gnu/lib/$(MACH64)/amd64
+dir path=usr/gnu/bin
+dir path=usr/gnu/x86_64-pc-solaris2.11
+dir path=usr/gnu/x86_64-pc-solaris2.11/bin
+dir path=usr/include
+file path=usr/share/info/ld.info
+file path=usr/share/info/standards.info
+file path=usr/share/info/bfd.info
+file path=usr/share/info/configure.info
+file path=usr/share/info/gprof.info
+file path=usr/share/info/binutils.info
+file path=usr/share/info/as.info
+file path=usr/gnu/share/man/man1/strip.1
+file path=usr/gnu/share/man/man1/ranlib.1
+file path=usr/gnu/share/man/man1/windres.1
+file path=usr/gnu/share/man/man1/windmc.1
+file path=usr/gnu/share/man/man1/gprof.1
+file path=usr/gnu/share/man/man1/nm.1
+file path=usr/gnu/share/man/man1/objcopy.1
+file path=usr/gnu/share/man/man1/ld.1
+file path=usr/gnu/share/man/man1/objdump.1
+file path=usr/gnu/share/man/man1/strings.1
+file path=usr/gnu/share/man/man1/nlmconv.1
+file path=usr/gnu/share/man/man1/elfedit.1
+file path=usr/gnu/share/man/man1/readelf.1
+file path=usr/gnu/share/man/man1/ar.1
+file path=usr/gnu/share/man/man1/as.1
+file path=usr/gnu/share/man/man1/dlltool.1
+file path=usr/gnu/share/man/man1/size.1
+file path=usr/gnu/share/man/man1/c++filt.1
+file path=usr/gnu/share/man/man1/addr2line.1
+file path=usr/gnu/share/locale/ms/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/es/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/es/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/es/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/es/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/es/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/es/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/bg/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/bg/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/bg/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/ga/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/ga/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/ga/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/nl/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/nl/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/zh_TW/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/zh_TW/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/fr/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/fr/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/fr/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/fr/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/fr/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/fr/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/zh_CN/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/zh_CN/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/zh_CN/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/zh_CN/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/rw/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/rw/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/rw/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/rw/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/ru/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/ru/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/ru/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/ru/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/id/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/id/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/id/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/id/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/id/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/id/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/fi/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/fi/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/fi/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/fi/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/fi/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/fi/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/sv/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/sv/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/sv/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/sv/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/sv/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/uk/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/vi/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/vi/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/vi/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/vi/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/vi/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/de/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/de/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/ja/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/ja/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/ja/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/da/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/da/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/da/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/da/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/da/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/sk/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/tr/LC_MESSAGES/ld.mo
+file path=usr/gnu/share/locale/tr/LC_MESSAGES/gas.mo
+file path=usr/gnu/share/locale/tr/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/tr/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/tr/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/tr/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/eo/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/ro/LC_MESSAGES/bfd.mo
+file path=usr/gnu/share/locale/ro/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/ro/LC_MESSAGES/binutils.mo
+file path=usr/gnu/share/locale/ro/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/share/locale/pt_BR/LC_MESSAGES/gprof.mo
+file path=usr/gnu/share/locale/pt_BR/LC_MESSAGES/opcodes.mo
+file path=usr/gnu/lib/$(MACH64)/libbfd.a
+file path=usr/gnu/lib/$(MACH64)/libopcodes.a
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xdc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xdw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xs
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xd
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xs
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xs
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xdw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xdc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xd
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xs
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xd
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xdw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xdc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xd
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xd
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_sol2.xs
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386_ldso.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xdw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xdc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.x
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_i386.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_k1om.xbn
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xu
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64_sol2.xr
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xdw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xdc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xsc
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_l1om.xs
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xsw
+file path=usr/gnu/lib/$(MACH64)/ldscripts/elf_x86_64.xs
+file path=usr/gnu/lib/$(MACH64)/amd64/libiberty.a
+file path=usr/gnu/bin/nm
+file path=usr/gnu/bin/as
+file path=usr/gnu/bin/strings
+file path=usr/gnu/bin/objcopy
+file path=usr/gnu/bin/objdump
+file path=usr/gnu/bin/addr2line
+file path=usr/gnu/bin/gprof
+file path=usr/gnu/bin/ld.bfd
+file path=usr/gnu/bin/ranlib
+file path=usr/gnu/bin/readelf
+file path=usr/gnu/bin/elfedit
+file path=usr/gnu/bin/ar
+file path=usr/gnu/bin/strip
+file path=usr/gnu/bin/size
+file path=usr/gnu/bin/c++filt
+file path=usr/gnu/bin/ld
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/ar
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/ranlib
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/ld
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/strip
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/nm
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/objdump
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/as
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/ld.bfd
+file path=usr/gnu/x86_64-pc-solaris2.11/bin/objcopy
+file path=usr/include/bfdlink.h
+file path=usr/include/bfd.h
+file path=usr/include/dis-asm.h
+file path=usr/include/symcat.h
+file path=usr/include/ansidecl.h
diff --git a/binutils/patches/001_ld_makefile_patch.patch b/binutils/patches/001_ld_makefile_patch.patch
new file mode 100644
index 0000000..67160fe
--- /dev/null
+++ b/binutils/patches/001_ld_makefile_patch.patch
@@ -0,0 +1,27 @@
+Author:
+Description: Description: correct where ld scripts are installed
+Author: Chris Chimelis <chris@debian.org>
+Upstream status: N/A
+Date: ??
+--- a/ld/Makefile.am
++++ b/ld/Makefile.am
+@@ -24,7 +24,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- a/ld/Makefile.in
++++ b/ld/Makefile.in
+@@ -337,7 +337,7 @@
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/binutils/patches/002_gprof_profile_arcs.patch b/binutils/patches/002_gprof_profile_arcs.patch
new file mode 100644
index 0000000..7503927
--- /dev/null
+++ b/binutils/patches/002_gprof_profile_arcs.patch
@@ -0,0 +1,27 @@
+Author: Chris Chimelis <chris@debian.org>
+Description: Add more documentation about profiling and -fprofile-arcs.
+--- a/gprof/gprof.texi
++++ b/gprof/gprof.texi
+@@ -149,6 +149,10 @@
+ If more than one profile file is specified, the @code{gprof}
+ output shows the sum of the profile information in the given profile files.
+
++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need
++to add the @samp{-fprofile-arcs} to the compile command line in order
++for the call graphs to be properly stored in gmon.out.
++
+ @code{Gprof} calculates the amount of time spent in each routine.
+ Next, these times are propagated along the edges of the call graph.
+ Cycles are discovered, and calls into a cycle are made to share the time
+@@ -280,6 +284,11 @@
+ options. The same option, @samp{-pg}, alters either compilation or linking
+ to do what is necessary for profiling. Here are examples:
+
++If you use gcc 2.95.x or 3.0.x, you may need to add the
++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg}
++in order to allow the call-graphs to be properly included in the gmon.out
++file.
++
+ @example
+ cc -g -c myprog.c utils.c -pg
+ cc -o myprog myprog.o utils.o -pg
diff --git a/binutils/patches/003_gprof_see_also_monitor.patch b/binutils/patches/003_gprof_see_also_monitor.patch
new file mode 100644
index 0000000..6ac85ea
--- /dev/null
+++ b/binutils/patches/003_gprof_see_also_monitor.patch
@@ -0,0 +1,13 @@
+Author: Chris Chimelis <chris@debian.org>
+Description: Don't mention monitor(3) which doesn't exist in Debian. (#160654)
+--- a/gprof/gprof.texi
++++ b/gprof/gprof.texi
+@@ -197,7 +197,7 @@
+ @c man end
+
+ @c man begin SEEALSO
+-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}.
++cc(1), prof(1), and the Info entry for @file{gprof}.
+
+ ``An Execution Profiler for Modular Programs'',
+ by S. Graham, P. Kessler, M. McKusick;
diff --git a/binutils/patches/006_better_file_error.patch b/binutils/patches/006_better_file_error.patch
new file mode 100644
index 0000000..3cd9e00
--- /dev/null
+++ b/binutils/patches/006_better_file_error.patch
@@ -0,0 +1,19 @@
+Author: David Kimdon <dwhedon@gordian.com>
+Description: Specify which filename is causing an error if the filename is a
+directory. (#45832)
+--- a/bfd/opncls.c
++++ b/bfd/opncls.c
+@@ -183,6 +183,13 @@
+ {
+ bfd *nbfd;
+ const bfd_target *target_vec;
++ struct stat s;
++
++ if (stat (filename, &s) == 0)
++ if (S_ISDIR(s.st_mode)) {
++ bfd_set_error (bfd_error_file_not_recognized);
++ return NULL;
++ }
+
+ nbfd = _bfd_new_bfd ();
+ if (nbfd == NULL)
diff --git a/binutils/patches/012_check_ldrunpath_length.patch b/binutils/patches/012_check_ldrunpath_length.patch
new file mode 100644
index 0000000..5a35abc
--- /dev/null
+++ b/binutils/patches/012_check_ldrunpath_length.patch
@@ -0,0 +1,23 @@
+Author: Chris Chimelis <chris@debian.org>
+Description: Only generate an RPATH entry if LD_RUN_PATH is not empty, for
+cases where -rpath isn't specified. (#151024)
+--- a/ld/emultempl/elf32.em
++++ b/ld/emultempl/elf32.em
+@@ -1266,6 +1266,8 @@
+ && command_line.rpath == NULL)
+ {
+ lib_path = (const char *) getenv ("LD_RUN_PATH");
++ if ((lib_path) && (strlen (lib_path) == 0))
++ lib_path = NULL;
+ if (gld${EMULATION_NAME}_search_needed (lib_path, &n,
+ force))
+ break;
+@@ -1493,6 +1495,8 @@
+ rpath = command_line.rpath;
+ if (rpath == NULL)
+ rpath = (const char *) getenv ("LD_RUN_PATH");
++ if ((rpath) && (strlen (rpath) == 0))
++ rpath = NULL;
+
+ for (abfd = link_info.input_bfds; abfd; abfd = abfd->link_next)
+ if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
diff --git a/binutils/patches/013_bash_in_ld_testsuite.patch b/binutils/patches/013_bash_in_ld_testsuite.patch
new file mode 100644
index 0000000..f9e555c
--- /dev/null
+++ b/binutils/patches/013_bash_in_ld_testsuite.patch
@@ -0,0 +1,26 @@
+Author: Matthias Klose <doko@ubuntu.com>
+Description: Explicitely use bash for the ld testsuite.
+--- a/ld/testsuite/config/default.exp
++++ b/ld/testsuite/config/default.exp
+@@ -119,10 +119,10 @@
+ #makefile rules, with embedded shell variable expansions.
+ #make wants $$shell_var, we want $shell_var ...
+ set cmd "host='$target_triplet' && . $srcdir/../configure.host && sed -e 's,\\\$\\\$,\$,g' <<EOF\n\$$varname\nEOF"
+- set status [catch "exec sh -c [list $cmd]" result]
++ set status [catch "exec bash -c [list $cmd]" result]
+ if $status { error "Error getting native link files: $result" }
+ set cmd "CC='$CC' && eval echo \"$result\""
+- set status [catch "exec sh -c [list $cmd]" result]
++ set status [catch "exec bash -c [list $cmd]" result]
+ if $status { error "Error getting native link files: $result" }
+ set $varname $result
+ send_log "$varname = $result\n"
+@@ -132,7 +132,7 @@
+ proc get_target_emul {} {
+ global target_triplet
+ global srcdir
+- set status [catch "exec sh -c \"targ='$target_triplet' && . $srcdir/../configure.tgt && echo \\\$targ_emul\"" result]
++ set status [catch "exec bash -c \"targ='$target_triplet' && . $srcdir/../configure.tgt && echo \\\$targ_emul\"" result]
+ if $status { error "Error getting emulation name: $result" }
+ return $result
+ }
diff --git a/binutils/patches/014_hash_style-both.patch b/binutils/patches/014_hash_style-both.patch
new file mode 100644
index 0000000..61c3e61
--- /dev/null
+++ b/binutils/patches/014_hash_style-both.patch
@@ -0,0 +1,30 @@
+# DP: Default to --hash-style=both in ld.bfd and ld.gold.
+
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -287,6 +288,14 @@
+ emulation = get_emulation (argc, argv);
+ ldemul_choose_mode (emulation);
+ default_target = ldemul_choose_target (argc, argv);
++
++ /* Default to --hash-style=gnu */
++ if (strcmp (default_target, "elf32-tradbigmips") != 0
++ && strcmp (default_target, "elf32-tradlittlemips") != 0)
++ {
++ link_info.emit_gnu_hash = TRUE;
++ }
++
+ config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
+ config.commonpagesize = bfd_emul_get_commonpagesize (default_target);
+ lang_init ();
+--- a/gold/options.h
++++ b/gold/options.h
+@@ -794,7 +794,7 @@
+ N_("Min fraction of empty buckets in dynamic hash"),
+ N_("FRACTION"));
+
+- DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "sysv",
++ DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "both",
+ N_("Dynamic hash style"), N_("[sysv,gnu,both]"),
+ {"sysv", "gnu", "both"});
+
diff --git a/binutils/patches/014_hash_style-gnu.patch b/binutils/patches/014_hash_style-gnu.patch
new file mode 100644
index 0000000..b43b718
--- /dev/null
+++ b/binutils/patches/014_hash_style-gnu.patch
@@ -0,0 +1,31 @@
+# DP: Default to --hash-gnu=both in ld.bfd and ld.gold.
+
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -287,6 +288,15 @@
+ emulation = get_emulation (argc, argv);
+ ldemul_choose_mode (emulation);
+ default_target = ldemul_choose_target (argc, argv);
++
++ /* Default to --hash-style=gnu */
++ if (strcmp (default_target, "elf32-tradbigmips") != 0
++ && strcmp (default_target, "elf32-tradlittlemips") != 0)
++ {
++ link_info.emit_gnu_hash = TRUE;
++ link_info.emit_hash = FALSE;
++ }
++
+ config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
+ config.commonpagesize = bfd_emul_get_commonpagesize (default_target);
+ lang_init ();
+--- a/gold/options.h
++++ b/gold/options.h
+@@ -794,7 +794,7 @@
+ N_("Min fraction of empty buckets in dynamic hash"),
+ N_("FRACTION"));
+
+- DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "sysv",
++ DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "gnu",
+ N_("Dynamic hash style"), N_("[sysv,gnu,both]"),
+ {"sysv", "gnu", "both"});
+
diff --git a/binutils/patches/127_x86_64_i386_biarch.patch b/binutils/patches/127_x86_64_i386_biarch.patch
new file mode 100644
index 0000000..b0700e0
--- /dev/null
+++ b/binutils/patches/127_x86_64_i386_biarch.patch
@@ -0,0 +1,22 @@
+Author:
+Description: Description: Add (/usr)/lib32 to the search paths on x86_64.
+Author: Aurelien Jarno <aurel32.debian.org>
+Upstream status: Debian specific
+Index: binutils/ld/emulparams/elf_i386.sh
+===================================================================
+--- binutils.orig/ld/emulparams/elf_i386.sh 2012-10-28 16:32:06.388214837 +0400
++++ binutils/ld/emulparams/elf_i386.sh 2012-10-28 16:37:09.730487669 +0400
+@@ -14,3 +14,13 @@
+ NO_SMALL_DATA=yes
+ SEPARATE_GOTPLT=12
+ IREL_IN_PLT=
++
++# Linux modify the default library search path to first include
++# a 32-bit specific directory.
++case "$target" in
++ x86_64*-linux* | i[3-7]86*-linux* | x86_64*-kfreebsd*-gnu | i[3-7]86*-kfreebsd*-gnu)
++ case "$EMULATION_NAME" in
++ *i386*) LIBPATH_SUFFIX=32 ;;
++ esac
++ ;;
++esac
diff --git a/binutils/patches/128_build_id.patch b/binutils/patches/128_build_id.patch
new file mode 100644
index 0000000..cba02de
--- /dev/null
+++ b/binutils/patches/128_build_id.patch
@@ -0,0 +1,42 @@
+Author:
+Description: Description: Fix ld corrupt build ID generation
+Author: Nick Clifton
+Upstream status: Taken from Fedora (BZ 501582)
+--- a/bfd/compress.c
++++ b/bfd/compress.c
+@@ -174,7 +174,7 @@
+ case COMPRESS_SECTION_NONE:
+ if (p == NULL)
+ {
+- p = (bfd_byte *) bfd_malloc (sz);
++ p = (bfd_byte *) bfd_zmalloc (sz);
+ if (p == NULL)
+ return FALSE;
+ need_free = TRUE;
+--- a/bfd/elfcode.h
++++ b/bfd/elfcode.h
+@@ -1158,6 +1158,24 @@
+
+ if (i_shdr.contents)
+ (*process) (i_shdr.contents, i_shdr.sh_size, arg);
++ else
++ {
++ asection *sec;
++
++ sec = bfd_section_from_elf_index (abfd, count);
++ if (sec != NULL)
++ {
++ if (sec->contents == NULL)
++ {
++ /* Force rereading from file. */
++ sec->flags &= ~SEC_IN_MEMORY;
++ if (! bfd_malloc_and_get_section (abfd, sec, & sec->contents))
++ continue;
++ }
++ if (sec->contents != NULL)
++ (*process) (sec->contents, i_shdr.sh_size, arg);
++ }
++ }
+ }
+
+ return TRUE;
diff --git a/binutils/patches/128_ppc64_powerpc_biarch.patch b/binutils/patches/128_ppc64_powerpc_biarch.patch
new file mode 100644
index 0000000..b572db4
--- /dev/null
+++ b/binutils/patches/128_ppc64_powerpc_biarch.patch
@@ -0,0 +1,15 @@
+--- a/ld/emulparams/elf32ppccommon.sh 2011-03-01 21:36:22.239025005 +0000
++++ b/ld/emulparams/elf32ppccommon.sh 2011-03-01 21:38:13.187024999 +0000
+@@ -48,3 +48,12 @@
+ case "$EMULATION_NAME" in
+ *64*) LIBPATH_SUFFIX=64 ;;
+ esac
++
++# On 64bit, look for 32 bit target libraries in /lib32, /usr/lib32 etc., first.
++case "$target" in
++ powerpc64-*-linux* | ppc64-*-linux*)
++ case "$EMULATION_NAME" in
++ *32*) LIBPATH_SUFFIX=32 ;;
++ esac
++ ;;
++esac
diff --git a/binutils/patches/129_ld_mulitarch_dirs.patch b/binutils/patches/129_ld_mulitarch_dirs.patch
new file mode 100644
index 0000000..2beedf6
--- /dev/null
+++ b/binutils/patches/129_ld_mulitarch_dirs.patch
@@ -0,0 +1,72 @@
+# DP: Add multiarch directories to linker search path.
+
+Index: binutils-2.21.0.20110322/ld/genscripts.sh
+===================================================================
+--- binutils-2.21.0.20110322.orig/ld/genscripts.sh 2011-03-27 18:45:12.283057003 +0000
++++ binutils-2.21.0.20110322/ld/genscripts.sh 2011-03-27 18:51:20.623057182 +0000
+@@ -240,6 +240,65 @@
+ fi
+
+ LIB_SEARCH_DIRS=`echo ${LIB_PATH} | sed -e 's/:/ /g' -e 's/\([^ ][^ ]*\)/SEARCH_DIR(\\"\1\\");/g'`
++if [ -n "$DEB_HOST_MULTIARCH" ]; then
++ temp_dirs=' '
++ for dir in `echo ${LIB_PATH} | sed -e 's/:/ /g'`; do
++ case "$dir" in
++ ${tool_lib}*|*/${target_alias}/*)
++ ;;
++ */lib)
++ if [ -n "$DEB_HOST_MULTIARCH32" ]; then
++ case $EMULATION_NAME in
++ elf_i386|elf32*)
++ temp_dirs="${temp_dirs}${dir}/$DEB_HOST_MULTIARCH32 ";;
++ *)
++ temp_dirs="${temp_dirs}${dir}/$DEB_HOST_MULTIARCH "
++ esac
++ elif [ -n "$DEB_HOST_MULTIARCH64" ]; then
++ case $EMULATION_NAME in
++ elf*_64|elf64*)
++ temp_dirs="${temp_dirs}${dir}/$DEB_HOST_MULTIARCH64 ";;
++ *)
++ temp_dirs="${temp_dirs}${dir}/$DEB_HOST_MULTIARCH "
++ esac
++ else
++ temp_dirs="${temp_dirs}${dir}/$DEB_HOST_MULTIARCH "
++ fi
++ ;;
++ */lib32)
++ if [ -n "$DEB_HOST_MULTIARCH32" ]; then
++ dir2=$(echo $dir | sed "s,32$,,")
++ temp_dirs="${temp_dirs}${dir2}/$DEB_HOST_MULTIARCH32 "
++ fi
++ ;;
++ */lib64)
++ case "${target}" in
++ powerpc64-*-*|s390x-*-*|sparc64-*-*|x86_64-*-linux*)
++ #dir=$(echo $dir | sed "s,64$,,")
++ dir2=$(echo $dir | sed "s,64$,,")
++ temp_dirs="${temp_dirs}${dir2}/$DEB_HOST_MULTIARCH "
++ ;;
++ *)
++ if [ -n "$DEB_HOST_MULTIARCH64" ]; then
++ dir2=$(echo $dir | sed "s,64$,,")
++ temp_dirs="${temp_dirs}${dir2}/$DEB_HOST_MULTIARCH64 "
++ fi
++ ;;
++ esac
++ ;;
++ *)
++ ;;
++ esac
++ temp_dirs="${temp_dirs}${dir} "
++ done
++ LIB_SEARCH_DIRS=
++ for dir in $temp_dirs; do
++ if echo "$LIB_SEARCH_DIRS" | fgrep -q "\"$dir\""; then
++ continue
++ fi
++ LIB_SEARCH_DIRS="${LIB_SEARCH_DIRS}SEARCH_DIR(\"$dir\"); "
++ done
++fi
+
+ # We need it for testsuite.
+ set $EMULATION_LIBPATH
diff --git a/binutils/patches/130_gold_disable_testsuite_build.patch b/binutils/patches/130_gold_disable_testsuite_build.patch
new file mode 100644
index 0000000..0d00033
--- /dev/null
+++ b/binutils/patches/130_gold_disable_testsuite_build.patch
@@ -0,0 +1,26 @@
+Author:
+Description: Description: Disable build of gold/testsuite
+Author: Matthias Klose
+Upstream status: local
+--- a/gold/Makefile.am
++++ b/gold/Makefile.am
+@@ -2,7 +2,7 @@
+
+ AUTOMAKE_OPTIONS = foreign
+
+-SUBDIRS = po testsuite
++SUBDIRS = po
+
+ tooldir = $(exec_prefix)/$(target_alias)
+
+--- a/gold/Makefile.in
++++ b/gold/Makefile.in
+@@ -355,7 +355,7 @@
+ top_builddir = @top_builddir@
+ top_srcdir = @top_srcdir@
+ AUTOMAKE_OPTIONS = foreign
+-SUBDIRS = po testsuite
++SUBDIRS = po
+ tooldir = $(exec_prefix)/$(target_alias)
+ ACLOCAL_AMFLAGS = -I ../bfd -I ../config
+ AM_CFLAGS = $(WARN_CFLAGS) $(LFS_CFLAGS) $(RANDOM_SEED_CFLAGS)
diff --git a/binutils/patches/131_ld_bootstrap_testsuite.patch b/binutils/patches/131_ld_bootstrap_testsuite.patch
new file mode 100644
index 0000000..0c53a7b
--- /dev/null
+++ b/binutils/patches/131_ld_bootstrap_testsuite.patch
@@ -0,0 +1,45 @@
+Author:
+Description: Description: Fix ld-bootstrap testsuite when configured with --enable-plugins
+Author: Rafael Espindola
+Upstream status: proposed patch
+--- a/ld/testsuite/ld-bootstrap/bootstrap.exp
++++ b/ld/testsuite/ld-bootstrap/bootstrap.exp
+@@ -40,6 +40,15 @@
+ set plugins "no"
+ }
+
++remote_exec host "$nm --help" "" "/dev/null" "plugin-support"
++set tmp [file_contents "plugin-support"]
++regexp ".*\(--plugin\).*\n" $tmp foo plugins
++if [info exists plugins] then {
++ set plugins "yes"
++} else {
++ set plugins "no"
++}
++
+ # Bootstrap ld. First link the object files together using -r, in
+ # order to test -r. Then link the result into an executable, ld1, to
+ # really test -r. Use ld1 to link a fresh ld, ld2. Use ld2 to link a
+@@ -78,6 +87,11 @@
+ continue
+ }
+
++ if { $flags == "--static" && $plugins == "yes" } then {
++ untested $testname
++ continue
++ }
++
+ # If we only have a shared libbfd, we probably can't run the
+ # --static test.will fail.
+ if { $flags == "--static" && ! [string match "*libbfd.a*" $BFDLIB] } then {
+@@ -112,6 +126,10 @@
+ if { $plugins == "yes" } {
+ set extralibs "$extralibs -ldl"
+ }
++
++ if { $plugins == "yes" } {
++ set extralibs "$extralibs -ldl"
++ }
+
+ # On Irix 5, linking with --static only works if all the files are
+ # compiled using -non_shared.
diff --git a/binutils/patches/134_gold_no_spu.patch b/binutils/patches/134_gold_no_spu.patch
new file mode 100644
index 0000000..88cfc75
--- /dev/null
+++ b/binutils/patches/134_gold_no_spu.patch
@@ -0,0 +1,13 @@
+Author:
+Description: Description: Don't configure gold for spu target.
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -21929,7 +21929,7 @@
+ srcdiroption="--srcdir=$${topdir}/gold"; \
+ libsrcdir="$$s/gold"; \
+ $(SHELL) $${libsrcdir}/configure \
+- $(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
++ $$(echo $(HOST_CONFIGARGS) |sed 's/,spu//') --build=${build_alias} --host=${host_alias} \
+ --target=${target_alias} $${srcdiroption} \
+ || exit 1
+ @endif gold
diff --git a/binutils/patches/135_bfd_version.patch b/binutils/patches/135_bfd_version.patch
new file mode 100644
index 0000000..1e11ceb
--- /dev/null
+++ b/binutils/patches/135_bfd_version.patch
@@ -0,0 +1,47 @@
+Author:
+Description: Description: Fix bfd version handling for extra builds
+
+Index: binutils-2.21.0.20110216/bfd/Makefile.am
+===================================================================
+--- binutils-2.21.0.20110216.orig/bfd/Makefile.am 2011-02-01 12:25:32.000000000 +0000
++++ binutils-2.21.0.20110216/bfd/Makefile.am 2011-02-16 18:28:14.568229030 +0000
+@@ -948,14 +948,14 @@
+
+ bfdver.h: $(srcdir)/version.h $(srcdir)/Makefile.in
+ @echo "creating $@"
+- @bfd_version=`echo "$(VERSION)" | sed -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\
+- bfd_version_string="\"$(VERSION)\"" ;\
++ @bfd_version=`echo "$(VERSION)" | sed -e 's/-.*$$//' | sed -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\
++ bfd_version_string="\"`echo $(VERSION) | sed -e 's/-.*$$//'`\"" ;\
+ bfd_soversion="$(VERSION)" ;\
+ bfd_version_package="\"$(PKGVERSION)\"" ;\
+ 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_version_string="\"`echo $(VERSION) | sed -e 's/-.*$$//'`.$${bfd_version_date}\"" ;\
+ bfd_soversion="$(VERSION).$${bfd_version_date}" ;\
+ fi ;\
+ sed -e "s,@bfd_version@,$$bfd_version," \
+Index: binutils-2.21.0.20110216/bfd/Makefile.in
+===================================================================
+--- binutils-2.21.0.20110216.orig/bfd/Makefile.in 2011-02-01 12:25:32.000000000 +0000
++++ binutils-2.21.0.20110216/bfd/Makefile.in 2011-02-16 18:28:34.248228995 +0000
+@@ -1980,14 +1980,14 @@
+
+ bfdver.h: $(srcdir)/version.h $(srcdir)/Makefile.in
+ @echo "creating $@"
+- @bfd_version=`echo "$(VERSION)" | sed -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\
+- bfd_version_string="\"$(VERSION)\"" ;\
++ @bfd_version=`echo "$(VERSION)" | sed -e 's/-.*$$//' | sed -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\
++ bfd_version_string="\"`echo $(VERSION) | sed -e 's/-.*$$//'`\"" ;\
+ bfd_soversion="$(VERSION)" ;\
+ bfd_version_package="\"$(PKGVERSION)\"" ;\
+ 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_version_string="\"`echo $(VERSION) | sed -e 's/-.*$$//'`.$${bfd_version_date}\"" ;\
+ bfd_soversion="$(VERSION).$${bfd_version_date}" ;\
+ fi ;\
+ sed -e "s,@bfd_version@,$$bfd_version," \
diff --git a/binutils/patches/140_pr10340.patch b/binutils/patches/140_pr10340.patch
new file mode 100644
index 0000000..349d863
--- /dev/null
+++ b/binutils/patches/140_pr10340.patch
@@ -0,0 +1,35 @@
+# DP: Proposed patch for PR ld/10340, ld doesn't honor sysroot prefix for ldscripts
+
+Signed-off-by: Sven Rebhan <odinshorse@googlemail.com>
+
+Always try to prepend the sysroot prefix to absolute filenames first.
+
+--- a/ld/ldfile.c
++++ b/ld/ldfile.c
+@@ -308,18 +308,24 @@
+ directory first. */
+ if (! entry->is_archive)
+ {
+- if (entry->sysrooted && IS_ABSOLUTE_PATH (entry->filename))
++ /* For absolute pathnames, try to always open the file in the
++ sysroot first. If this fails, try to open the file at the
++ given location. */
++ entry->sysrooted = is_sysrooted_pathname(entry->filename, FALSE);
++ if (IS_ABSOLUTE_PATH (entry->filename) && ld_sysroot && ! entry->sysrooted)
+ {
+ char *name = concat (ld_sysroot, entry->filename,
+ (const char *) NULL);
+ if (ldfile_try_open_bfd (name, entry))
+ {
+ entry->filename = name;
++ entry->sysrooted = TRUE;
+ return TRUE;
+ }
+ free (name);
+ }
+- else if (ldfile_try_open_bfd (entry->filename, entry))
++
++ if (ldfile_try_open_bfd (entry->filename, entry))
+ {
+ entry->sysrooted = IS_ABSOLUTE_PATH (entry->filename)
+ && is_sysrooted_pathname (entry->filename, TRUE);
diff --git a/binutils/patches/156_pr10144.patch b/binutils/patches/156_pr10144.patch
new file mode 100644
index 0000000..145d19b
--- /dev/null
+++ b/binutils/patches/156_pr10144.patch
@@ -0,0 +1,315 @@
+## DP: Description: http://sourceware.org/ml/binutils/2010-09/msg00216.html
+
+2010-09-15 Maciej W. Rozycki <macro@codesourcery.com>
+
+ PR ld/10144
+
+ bfd/
+ * elfxx-mips.c (_bfd_mips_elf_check_relocs)
+ [R_MIPS_32, R_MIPS_REL32, R_MIPS_64]: Ignore relocs from
+ SEC_DEBUGGING sections.
+
+ ld/testsuite/
+ * lib/ld-lib.exp (run_ld_link_tests): Handle sources from other
+ directories.
+ (run_ld_link_exec_tests): Likewise.
+ (run_cc_link_tests): Likewise.
+ * ld-elf/comm-data1.sd: New test.
+ * ld-elf/comm-data1.s: Source for the new test.
+ * ld-elf/comm-data2.sd: New test.
+ * ld-elf/comm-data2.rd: Likewise.
+ * ld-elf/comm-data2.xd: Likewise.
+ * ld-elf/comm-data2.s: Source for the new tests.
+ * ld-elf/comm-data.exp: Run the new tests.
+ * ld-mips-elf/comm-data.exp: Likewise.
+
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data1.s
+@@ -0,0 +1,6 @@
++ .section .rodata,"a",%progbits
++ .balign 8
++ .globl foo
++ .type foo,%object
++foo:
++ .skip 4, 0
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data2.xd
+@@ -0,0 +1,2 @@
++Hex dump of section '\.debug_foo':
++ +0x0+ +00000000 00000000 00000000 00000000 +\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data2.s
+@@ -0,0 +1,14 @@
++ .text
++ .globl _start
++ .globl __start
++_start:
++__start:
++ .comm foo, 4, 4
++ .section .debug_foo,"",%progbits
++ .balign 16
++ .ifdef ELF64
++ .8byte foo
++ .else
++ .4byte foo
++ .endif
++ .balign 16
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data.exp
+@@ -0,0 +1,76 @@
++# Expect script for common symbol override.
++#
++# Copyright 2010 Free Software Foundation, Inc.
++#
++# This file is part of the GNU Binutils.
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
++# MA 02110-1301, USA.
++#
++
++#
++# Written by Maciej W. Rozycki <macro@codesourcery.com>
++#
++
++# Exclude non-ELF targets.
++if ![is_elf_format] {
++ return
++}
++
++# Exclude non-Linux targets; feel free to include your favourite one
++# if you like.
++if ![istarget *-*-linux*] {
++ return
++}
++
++set testname "Common symbol override test"
++
++# Define a global symbol.
++run_ld_link_tests [list \
++ [list \
++ "$testname (auxiliary shared object build)" \
++ "-shared" \
++ "" \
++ { comm-data1.s } \
++ { \
++ { readelf -s comm-data1.sd } \
++ } \
++ "libcomm-data.so" \
++ ] \
++]
++
++# Set the pointer size according to the ELF flavour.
++set AFLAGS ""
++if [is_elf64 "tmpdir/libcomm-data.so"] {
++ append AFLAGS " --defsym ELF64=1"
++}
++
++# Verify that a common symbol has been converted to an undefined
++# reference to the global symbol of the same name defined above
++# and that the debug reference has been dropped.
++run_ld_link_tests [list \
++ [list \
++ "$testname" \
++ "-Ltmpdir -lcomm-data" \
++ "$AFLAGS" \
++ { comm-data2.s } \
++ { \
++ { readelf -s comm-data2.sd } \
++ { readelf -r comm-data2.rd } \
++ { readelf "-x .debug_foo" comm-data2.xd } \
++ } \
++ "comm-data" \
++ ] \
++]
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data1.sd
+@@ -0,0 +1,10 @@
++Symbol table '\.dynsym' contains [0-9]+ entries:
++ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
++#...
++ +[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +foo
++#...
++Symbol table '\.symtab' contains [0-9]+ entries:
++ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
++#...
++ +[0-9]+: +[0-9a-f]+ +0 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +foo
++#pass
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data2.rd
+@@ -0,0 +1 @@
++There are no relocations in this file\.
+--- /dev/null
++++ b/ld/testsuite/ld-elf/comm-data2.sd
+@@ -0,0 +1,10 @@
++Symbol table '\.dynsym' contains [0-9]+ entries:
++ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
++#...
++ +[0-9]+: +0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +foo
++#...
++Symbol table '\.symtab' contains [0-9]+ entries:
++ +Num: +Value +Size +Type +Bind +Vis +Ndx +Name
++#...
++ +[0-9]+: +0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +foo
++#pass
+--- a/ld/testsuite/lib/ld-lib.exp
++++ b/ld/testsuite/lib/ld-lib.exp
+@@ -1252,11 +1252,12 @@
+
+ # Assemble each file in the test.
+ foreach src_file $src_files {
+- set objfile "tmpdir/[file rootname $src_file].o"
++ set fileroot "[file rootname [file tail $src_file]]"
++ set objfile "tmpdir/$fileroot.o"
+ lappend objfiles $objfile
+
+ if { [file extension $src_file] == ".c" } {
+- set as_file "tmpdir/[file rootname $src_file].s"
++ set as_file "tmpdir/$fileroot.s"
+ if ![ld_compile "$CC -S $CFLAGS $cflags" $srcdir/$subdir/$src_file $as_file] {
+ set is_unresolved 1
+ break
+@@ -1446,7 +1447,8 @@
+
+ # Assemble each file in the test.
+ foreach src_file $src_files {
+- set objfile "tmpdir/[file rootname $src_file].o"
++ set fileroot "[file rootname [file tail $src_file]]"
++ set objfile "tmpdir/$fileroot.o"
+ lappend objfiles $objfile
+
+ # We ignore warnings since some compilers may generate
+@@ -1565,7 +1567,8 @@
+
+ # Compile each file in the test.
+ foreach src_file $src_files {
+- set objfile "tmpdir/[file rootname $src_file].o"
++ set fileroot "[file rootname [file tail $src_file]]"
++ set objfile "tmpdir/$fileroot.o"
+ lappend objfiles $objfile
+
+ # We ignore warnings since some compilers may generate
+--- /dev/null
++++ b/ld/testsuite/ld-mips-elf/comm-data.exp
+@@ -0,0 +1,88 @@
++# Expect script for common symbol override, MIPS variation.
++#
++# Copyright 2010 Free Software Foundation, Inc.
++#
++# This file is part of the GNU Binutils.
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
++# MA 02110-1301, USA.
++#
++
++#
++# Written by Maciej W. Rozycki <macro@codesourcery.com>
++#
++
++# Exclude non-ELF targets.
++if ![is_elf_format] {
++ return
++}
++
++# Exclude non-Linux targets; feel free to include your favourite one
++# if you like.
++if ![istarget mips*-*-linux*] {
++ return
++}
++
++proc mips_comm_data_test { abi flag emul reloc } {
++
++ set testname "MIPS $abi/$reloc common symbol override test"
++ set AFLAGS "$flag -EB"
++ set LDFLAGS "-m$emul"
++
++ # Define a global symbol.
++ run_ld_link_tests [list \
++ [list \
++ "$testname (auxiliary shared object build)" \
++ "$LDFLAGS -shared" \
++ "$AFLAGS -call_shared" \
++ { ../ld-elf/comm-data1.s } \
++ { \
++ { readelf -s ../ld-elf/comm-data1.sd } \
++ } \
++ "libmips-$abi-$reloc-comm-data.so" \
++ ] \
++ ]
++
++ # Set the pointer size according to the ABI.
++ if { $abi == "n64" } {
++ append AFLAGS " --defsym ELF64=1"
++ }
++
++ # Verify that a common symbol has been converted to an undefined
++ # reference to the global symbol of the same name defined above
++ # and that the debug reference has been dropped.
++ run_ld_link_tests [list \
++ [list \
++ "$testname" \
++ "$LDFLAGS -z $reloc -Ltmpdir -lmips-$abi-$reloc-comm-data" \
++ "$AFLAGS -call_nonpic" \
++ { ../ld-elf/comm-data2.s } \
++ { \
++ { readelf -s ../ld-elf/comm-data2.sd } \
++ { readelf -r ../ld-elf/comm-data2.rd } \
++ { readelf "-x .debug_foo" ../ld-elf/comm-data2.xd } \
++ } \
++ "mips-$abi-$reloc-comm-data" \
++ ] \
++ ]
++}
++
++set abis { o32 -32 elf32btsmip n32 -n32 elf32btsmipn32 n64 -64 elf64btsmip }
++set relocs { copyreloc nocopyreloc }
++foreach { abi flag emul } $abis {
++ foreach reloc $relocs {
++ mips_comm_data_test $abi $flag $emul $reloc
++ }
++}
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -7583,6 +7583,19 @@
+ elf_hash_table (info)->dynobj = dynobj = abfd;
+ break;
+ }
++ /* Ignore relocs from SEC_DEBUGGING sections because such
++ sections are not SEC_ALLOC and thus ld.so will not process
++ them. Don't set has_static_relocs for the corresponding
++ symbol.
++
++ This is needed in cases such as a global symbol definition
++ in a shared library causing a common symbol from an object
++ file to be converted to an undefined reference. If that
++ happens, then all the relocations against this symbol from
++ SEC_DEBUGGING sections in the object file will resolve to
++ nil. */
++ if ((sec->flags & SEC_DEBUGGING) != 0)
++ break;
+ /* Fall through. */
+
+ default:
diff --git a/binutils/patches/157_ar_scripts_with_tilde.patch b/binutils/patches/157_ar_scripts_with_tilde.patch
new file mode 100644
index 0000000..0d3427e
--- /dev/null
+++ b/binutils/patches/157_ar_scripts_with_tilde.patch
@@ -0,0 +1,11 @@
+--- a/binutils/arlex.l
++++ b/binutils/arlex.l
+@@ -77,7 +77,7 @@
+ "(" { return '('; }
+ ")" { return ')'; }
+ "," { return ','; }
+-[A-Za-z0-9/\\$:.\-\_]+ {
++[A-Za-z0-9/\\$:.\-\_~]+ {
+ yylval.name = xstrdup (yytext);
+ return FILENAME;
+ }
diff --git a/binutils/patches/158_ld_system_root.patch b/binutils/patches/158_ld_system_root.patch
new file mode 100644
index 0000000..c04c72c
--- /dev/null
+++ b/binutils/patches/158_ld_system_root.patch
@@ -0,0 +1,36 @@
+--- a/ld/configure.in
++++ b/ld/configure.in
+@@ -38,7 +38,9 @@
+ *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
+ esac
+
++ if test "x$TARGET_SYSTEM_ROOT" != x/; then
+ TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'
++ fi
+ use_sysroot=yes
+
+ if test "x$prefix" = xNONE; then
+--- a/ld/configure
++++ b/ld/configure
+@@ -4139,7 +4139,9 @@
+ *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
+ esac
+
++ if test "x$TARGET_SYSTEM_ROOT" != x/; then
+ TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'
++ fi
+ use_sysroot=yes
+
+ if test "x$prefix" = xNONE; then
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -214,8 +214,8 @@
+ {
+ if (*TARGET_SYSTEM_ROOT == 0)
+ {
+- einfo ("%P%F: this linker was not configured to use sysroots\n");
+ ld_sysroot = "";
++ ld_canon_sysroot = "";
+ }
+ else
+ ld_canon_sysroot = lrealpath (ld_sysroot);
diff --git a/binutils/patches/160_gas_pr12698.diff b/binutils/patches/160_gas_pr12698.diff
new file mode 100644
index 0000000..3dd5869
--- /dev/null
+++ b/binutils/patches/160_gas_pr12698.diff
@@ -0,0 +1,54 @@
+# DP: Proposed patch for PR gas/12698
+
+2011-04-15 Bernd Schmidt <bernds@codesourcery.com>
+
+ gas/
+ * config/tc-arm.c (m_profile_p): New function.
+ (parse_psr, do_t_mrs, do_t_msr): Use m_profile_p.
+
+
+--- a/gas/config/tc-arm.c
++++ b/gas/config/tc-arm.c
+@@ -234,6 +234,15 @@
+ static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
+ static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
+
++/* Return whether FEATURES indicates an M profile CPU, without getting
++ confused by ARM_ANY. */
++static int
++m_profile_p (arm_feature_set features)
++{
++ return (ARM_CPU_HAS_FEATURE (features, arm_ext_v6m)
++ && !ARM_CPU_HAS_FEATURE (features, arm_ext_v7a));
++}
++
+ static int mfloat_abi_opt = -1;
+ /* Record user cpu selection for object attributes. */
+ static arm_feature_set selected_cpu = ARM_ARCH_NONE;
+@@ -5354,7 +5363,7 @@
+ const struct asm_psr *psr;
+ char *start;
+ bfd_boolean is_apsr = FALSE;
+- bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
++ bfd_boolean m_profile = m_profile_p (selected_cpu);
+
+ /* CPSR's and SPSR's can now be lowercase. This is just a convenience
+ feature for ease of use and backwards compatibility. */
+@@ -10947,7 +10956,7 @@
+ {
+ int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
+
+- if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
++ if (m_profile_p (selected_cpu))
+ constraint (flags != 0, _("selected processor does not support "
+ "requested special purpose register"));
+ else
+@@ -10979,7 +10988,7 @@
+ else
+ flags = inst.operands[0].imm;
+
+- if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
++ if (m_profile_p (selected_cpu))
+ {
+ int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
+
diff --git a/binutils/patches/161_gold_dummy_zoption.diff b/binutils/patches/161_gold_dummy_zoption.diff
new file mode 100644
index 0000000..fa7c504
--- /dev/null
+++ b/binutils/patches/161_gold_dummy_zoption.diff
@@ -0,0 +1,25 @@
+# DP: let gold accept a dummy -z buildd-<random-string> option.
+
+--- a/gold/options.h
++++ b/gold/options.h
+@@ -1162,6 +1162,9 @@
+ DEFINE_bool_alias(textoff, text, options::DASH_Z, '\0',
+ N_("Permit relocations in read-only segments (default)"),
+ NULL, true);
++ DEFINE_bool(buildd, options::DASH_Z, '\0', false,
++ N_("Dummy z option"),
++ NULL);
+
+ public:
+ typedef options::Dir_list Dir_list;
+--- a/gold/options.cc
++++ b/gold/options.cc
+@@ -859,6 +859,8 @@
+ {
+ int dummy_i = 0;
+ const char* dash_z_arg = *arg;
++ if (strncmp(dash_z_arg, "buildd", strlen("buildd")) == 0)
++ *arg = "buildd";
+ retval = parse_long_option(1, arg, true, arg, &dummy_i);
+ if (retval == NULL)
+ usage(_("unknown -z option"), dash_z_arg);
diff --git a/binutils/patches/162_fpic_s390x.diff b/binutils/patches/162_fpic_s390x.diff
new file mode 100644
index 0000000..d848a9f
--- /dev/null
+++ b/binutils/patches/162_fpic_s390x.diff
@@ -0,0 +1,31 @@
+# DP: Fix s390x build.
+
+2011-08-24 Aurelien Jarno <aurelien@aurel32.net>
+
+ * config/picflag.m4: use -FPIC on s390x.
+ * libiberty/configure: regenerate.
+
+--- binutils-2.21.53.20110823.orig/config/picflag.m4
++++ binutils-2.21.53.20110823/config/picflag.m4
+@@ -51,6 +51,9 @@
+ m68k-*-*)
+ $1=-fpic
+ ;;
++ s390x*-*-*)
++ $1=-fPIC
++ ;;
+ s390*-*-*)
+ $1=-fpic
+ ;;
+--- binutils-2.21.53.20110823.orig/libiberty/configure
++++ binutils-2.21.53.20110823/libiberty/configure
+@@ -4891,6 +4891,9 @@
+ m68k-*-*)
+ PICFLAG=-fpic
+ ;;
++ s390x*-*-*)
++ PICFLAG=-fPIC
++ ;;
+ s390*-*-*)
+ PICFLAG=-fpic
+ ;;
diff --git a/binutils/patches/163_multiarch_search_path.patch b/binutils/patches/163_multiarch_search_path.patch
new file mode 100644
index 0000000..9b8c116
--- /dev/null
+++ b/binutils/patches/163_multiarch_search_path.patch
@@ -0,0 +1,79 @@
+# DP: multiarch search paths
+
+--- binutils-2.21.53.20110810.orig/gold/Makefile.am
++++ binutils-2.21.53.20110810/gold/Makefile.am
+@@ -15,7 +15,7 @@
+ -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../elfcpp \
+ -DLOCALEDIR="\"$(datadir)/locale\"" \
+ -DBINDIR="\"$(bindir)\"" -DTOOLBINDIR="\"$(tooldir)/bin\"" \
+- @INCINTL@
++ @INCINTL@ @MULTIARCH_DIRNAME@
+
+ LIBIBERTY = ../libiberty/libiberty.a
+
+--- binutils-2.21.53.20110810.orig/gold/configure
++++ binutils-2.21.53.20110810/gold/configure
+@@ -594,6 +594,7 @@
+ MAINT
+ MAINTAINER_MODE_FALSE
+ MAINTAINER_MODE_TRUE
++MULTIARCH_DIRNAME
+ CXXCPP
+ HAVE_ZLIB_FALSE
+ HAVE_ZLIB_TRUE
+@@ -7133,6 +7134,14 @@
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
++if test x$target = x$host; then
++ multiarch=`$CC -print-multiarch 2>/dev/null`
++ if test -n "$multiarch"; then
++ MULTIARCH_DIRNAME='-DMULTIARCH_DIRNAME=\"'$multiarch'\"'
++ fi
++fi
++
++
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+ $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+--- binutils-2.21.53.20110810.orig/gold/configure.ac
++++ binutils-2.21.53.20110810/gold/configure.ac
+@@ -475,6 +475,14 @@
+
+ AC_LANG_POP(C++)
+
++if test x$target = x$host; then
++ multiarch=`$CC -print-multiarch 2>/dev/null`
++ if test -n "$multiarch"; then
++ MULTIARCH_DIRNAME='-DMULTIARCH_DIRNAME=\"'$multiarch'\"'
++ fi
++fi
++AC_SUBST(MULTIARCH_DIRNAME)
++
+ AM_MAINTAINER_MODE
+
+ AC_OUTPUT(Makefile testsuite/Makefile po/Makefile.in:po/Make-in)
+--- binutils-2.21.53.20110810.orig/gold/options.cc
++++ binutils-2.21.53.20110810/gold/options.cc
+@@ -1145,6 +1147,10 @@
+ {
+ // Even if they don't specify it, we add -L /lib and -L /usr/lib.
+ // FIXME: We should only do this when configured in native mode.
++#ifdef MULTIARCH_DIRNAME
++ this->add_to_library_path_with_sysroot("/lib/" MULTIARCH_DIRNAME);
++ this->add_to_library_path_with_sysroot("/usr/lib/" MULTIARCH_DIRNAME);
++#endif
+ this->add_to_library_path_with_sysroot("/lib");
+ this->add_to_library_path_with_sysroot("/usr/lib");
+ }
+--- binutils-2.21.53.20110810.orig/gold/Makefile.in
++++ binutils-2.21.53.20110810/gold/Makefile.in
+@@ -364,7 +364,7 @@
+ -I$(srcdir) -I$(srcdir)/../include -I$(srcdir)/../elfcpp \
+ -DLOCALEDIR="\"$(datadir)/locale\"" \
+ -DBINDIR="\"$(bindir)\"" -DTOOLBINDIR="\"$(tooldir)/bin\"" \
+- @INCINTL@
++ @INCINTL@ @MULTIARCH_DIRNAME@
+
+ LIBIBERTY = ../libiberty/libiberty.a
+ @PLUGINS_TRUE@LIBDL = -ldl
diff --git a/binutils/patches/167_pr13302.diff b/binutils/patches/167_pr13302.diff
new file mode 100644
index 0000000..13723eb
--- /dev/null
+++ b/binutils/patches/167_pr13302.diff
@@ -0,0 +1,532 @@
+# DP: Fix PR ld/13302, taken from the trunk
+
+bfd/
+
+2012-03-06 Jakub Jelinek <jakub@redhat.com>
+
+ * elf64-x86-64.c (elf_x86_64_relocate_section): For R_X86_64_RELATIVE
+ set relocate to TRUE.
+
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13302
+ * elf32-i386.c (elf_i386_relocate_section): Replace
+ R_386_IRELATIVE with R_386_RELATIVE.
+
+ * elf64-x86-64.c (elf_x86_64_relocate_section): Replace
+ R_X86_64_IRELATIVE with R_X86_64_RELATIVE.
+
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>.
+
+ * elf32-i386.c (elf_i386_relocate_section): Fix a typo in
+ comments.
+ * elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
+
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13302
+ * elf32-i386.c (elf_i386_link_hash_table): Add next_jump_slot_index
+ and next_irelative_index.
+ (elf_i386_link_hash_table_create): Initialize next_jump_slot_index
+ and next_irelative_index.
+ (elf_i386_allocate_dynrelocs): Increment reloc_count instead of
+ next_tls_desc_index.
+ (elf_i386_size_dynamic_sections): Set next_tls_desc_index and
+ next_irelative_index from reloc_count.
+ (elf_i386_finish_dynamic_symbol): Put R_386_IRELATIVE after
+ R_386_JUMP_SLOT.
+
+ * elf64-x86-64.c (elf_x86_64_link_hash_table): Add
+ next_jump_slot_index and next_irelative_index.
+ (elf_x86_64_link_hash_table_create): Initialize
+ next_jump_slot_index and next_irelative_index.
+ (elf_x86_64_size_dynamic_sections): Set next_irelative_index
+ from reloc_count.
+ (elf_x86_64_finish_dynamic_symbol): Put R_X86_64_IRELATIVE after
+ R_X86_64_JUMP_SLOT.
+
+ld/testsuite
+
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13302
+ * ld-i386/i386.exp: Run pr13302.
+
+ * ld-i386/pr13302.d: New.
+ * ld-i386/pr13302.s: Likewise.
+
+ * ld-x86-64/pr13082-5b.d: Updated.
+ * ld-x86-64/pr13082-6a.d: Likewise.
+ * ld-x86-64/pr13082-6b.d: Likewise.
+
+2011-10-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/13302
+ * ld-ifunc/ifunc-16-i386.d: New.
+ * ld-ifunc/ifunc-16-x86-64.d: Likewise.
+ * ld-ifunc/ifunc-16-x86.s: Likewise.
+
+diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
+index 7ef1fc1..d187305 100644
+--- a/bfd/elf32-i386.c
++++ b/bfd/elf32-i386.c
+@@ -806,6 +806,12 @@ struct elf_i386_link_hash_table
+
+ /* The index of the next unused R_386_TLS_DESC slot in .rel.plt. */
+ bfd_vma next_tls_desc_index;
++
++ /* The index of the next unused R_386_JUMP_SLOT slot in .rel.plt. */
++ bfd_vma next_jump_slot_index;
++
++ /* The index of the next unused R_386_IRELATIVE slot in .rel.plt. */
++ bfd_vma next_irelative_index;
+ };
+
+ /* Get the i386 ELF linker hash table from a link_info structure. */
+@@ -946,6 +952,8 @@ elf_i386_link_hash_table_create (bfd *abfd)
+ ret->sym_cache.abfd = NULL;
+ ret->srelplt2 = NULL;
+ ret->tls_module_base = NULL;
++ ret->next_jump_slot_index = 0;
++ ret->next_irelative_index = 0;
+
+ ret->loc_hash_table = htab_try_create (1024,
+ elf_i386_local_htab_hash,
+@@ -2275,7 +2283,7 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
+
+ /* We also need to make an entry in the .rel.plt section. */
+ htab->elf.srelplt->size += sizeof (Elf32_External_Rel);
+- htab->next_tls_desc_index++;
++ htab->elf.srelplt->reloc_count++;
+
+ if (get_elf_i386_backend_data (info->output_bfd)->is_vxworks
+ && !info->shared)
+@@ -2700,9 +2708,19 @@ elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+ incremented. However, when we reserve space for TLS descriptors,
+ it's not incremented, so in order to compute the space reserved
+ for them, it suffices to multiply the reloc count by the jump
+- slot size. */
++ slot size.
++
++ PR ld/13302: We start next_irelative_index at the end of .rela.plt
++ so that R_386_IRELATIVE entries come last. */
+ if (htab->elf.srelplt)
+- htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
++ {
++ htab->next_tls_desc_index = htab->elf.srelplt->reloc_count;
++ htab->sgotplt_jump_table_size = htab->next_tls_desc_index * 4;
++ htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
++ }
++ else if (htab->elf.irelplt)
++ htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
++
+
+ if (htab->elf.sgotplt)
+ {
+@@ -3232,13 +3250,14 @@ elf_i386_relocate_section (bfd *output_bfd,
+
+ case R_386_32:
+ /* Generate dynamic relcoation only when there is a
+- non-GOF reference in a shared object. */
++ non-GOT reference in a shared object. */
+ if (info->shared && h->non_got_ref)
+ {
+ Elf_Internal_Rela outrel;
+ bfd_byte *loc;
+ asection *sreloc;
+ bfd_vma offset;
++ bfd_boolean relocate;
+
+ /* Need a dynamic relocation to get the real function
+ adddress. */
+@@ -3259,15 +3278,14 @@ elf_i386_relocate_section (bfd *output_bfd,
+ || info->executable)
+ {
+ /* This symbol is resolved locally. */
+- outrel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
+- bfd_put_32 (output_bfd,
+- (h->root.u.def.value
+- + h->root.u.def.section->output_section->vma
+- + h->root.u.def.section->output_offset),
+- contents + offset);
++ outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
++ relocate = TRUE;
+ }
+ else
+- outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
++ {
++ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
++ relocate = FALSE;
++ }
+
+ sreloc = htab->elf.irelifunc;
+ loc = sreloc->contents;
+@@ -3280,7 +3298,8 @@ elf_i386_relocate_section (bfd *output_bfd,
+ we need to include the symbol value so that it
+ becomes an addend for the dynamic reloc. For an
+ internal symbol, we have updated addend. */
+- continue;
++ if (! relocate)
++ continue;
+ }
+ /* FALLTHROUGH */
+ case R_386_PC32:
+@@ -4364,13 +4383,13 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
+
+ if (plt == htab->elf.splt)
+ {
+- plt_index = h->plt.offset / plt_entry_size - 1;
+- got_offset = (plt_index + 3) * 4;
++ got_offset = h->plt.offset / plt_entry_size - 1;
++ got_offset = (got_offset + 3) * 4;
+ }
+ else
+ {
+- plt_index = h->plt.offset / plt_entry_size;
+- got_offset = plt_index * 4;
++ got_offset = h->plt.offset / plt_entry_size;
++ got_offset = got_offset * 4;
+ }
+
+ /* Fill in the entry in the procedure linkage table. */
+@@ -4431,18 +4450,6 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
+ + abed->plt->plt_got_offset);
+ }
+
+- /* Don't fill PLT entry for static executables. */
+- if (plt == htab->elf.splt)
+- {
+- bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
+- plt->contents + h->plt.offset
+- + abed->plt->plt_reloc_offset);
+- bfd_put_32 (output_bfd, - (h->plt.offset
+- + abed->plt->plt_plt_offset + 4),
+- plt->contents + h->plt.offset
+- + abed->plt->plt_plt_offset);
+- }
+-
+ /* Fill in the entry in the global offset table. */
+ bfd_put_32 (output_bfd,
+ (plt->output_section->vma
+@@ -4470,12 +4477,29 @@ elf_i386_finish_dynamic_symbol (bfd *output_bfd,
+ + h->root.u.def.section->output_offset),
+ gotplt->contents + got_offset);
+ rel.r_info = ELF32_R_INFO (0, R_386_IRELATIVE);
++ /* R_386_IRELATIVE comes last. */
++ plt_index = htab->next_irelative_index--;
+ }
+ else
+- rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
++ {
++ rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT);
++ plt_index = htab->next_jump_slot_index++;
++ }
+ loc = relplt->contents + plt_index * sizeof (Elf32_External_Rel);
+ bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
+
++ /* Don't fill PLT entry for static executables. */
++ if (plt == htab->elf.splt)
++ {
++ bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel),
++ plt->contents + h->plt.offset
++ + abed->plt->plt_reloc_offset);
++ bfd_put_32 (output_bfd, - (h->plt.offset
++ + abed->plt->plt_plt_offset + 4),
++ plt->contents + h->plt.offset
++ + abed->plt->plt_plt_offset);
++ }
++
+ if (!h->def_regular)
+ {
+ /* Mark the symbol as undefined, rather than as defined in
+diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
+index e4c3946..2206dd4 100644
+--- a/bfd/elf64-x86-64.c
++++ b/bfd/elf64-x86-64.c
+@@ -698,6 +698,11 @@ struct elf_x86_64_link_hash_table
+ /* The offset into sgot of the GOT entry used by the PLT entry
+ above. */
+ bfd_vma tlsdesc_got;
++
++ /* The index of the next R_X86_64_JUMP_SLOT entry in .rela.plt. */
++ bfd_vma next_jump_slot_index;
++ /* The index of the next R_X86_64_IRELATIVE entry in .rela.plt. */
++ bfd_vma next_irelative_index;
+ };
+
+ /* Get the x86-64 ELF linker hash table from a link_info structure. */
+@@ -839,6 +844,8 @@ elf_x86_64_link_hash_table_create (bfd *abfd)
+ ret->tls_ld_got.refcount = 0;
+ ret->sgotplt_jump_table_size = 0;
+ ret->tls_module_base = NULL;
++ ret->next_jump_slot_index = 0;
++ ret->next_irelative_index = 0;
+
+ if (ABI_64_P (abfd))
+ {
+@@ -2667,10 +2674,18 @@ elf_x86_64_size_dynamic_sections (bfd *output_bfd,
+ incremented. However, when we reserve space for TLS descriptors,
+ it's not incremented, so in order to compute the space reserved
+ for them, it suffices to multiply the reloc count by the jump
+- slot size. */
++ slot size.
++
++ PR ld/13302: We start next_irelative_index at the end of .rela.plt
++ so that R_X86_64_IRELATIVE entries come last. */
+ if (htab->elf.srelplt)
+- htab->sgotplt_jump_table_size
+- = elf_x86_64_compute_jump_table_size (htab);
++ {
++ htab->sgotplt_jump_table_size
++ = elf_x86_64_compute_jump_table_size (htab);
++ htab->next_irelative_index = htab->elf.srelplt->reloc_count - 1;
++ }
++ else if (htab->elf.irelplt)
++ htab->next_irelative_index = htab->elf.irelplt->reloc_count - 1;
+
+ if (htab->tlsdesc_plt)
+ {
+@@ -3141,11 +3156,12 @@ elf_x86_64_relocate_section (bfd *output_bfd,
+ }
+
+ /* Generate dynamic relcoation only when there is a
+- non-GOF reference in a shared object. */
++ non-GOT reference in a shared object. */
+ if (info->shared && h->non_got_ref)
+ {
+ Elf_Internal_Rela outrel;
+ asection *sreloc;
++ bfd_boolean relocate;
+
+ /* Need a dynamic relocation to get the real function
+ address. */
+@@ -3165,15 +3181,15 @@ elf_x86_64_relocate_section (bfd *output_bfd,
+ || info->executable)
+ {
+ /* This symbol is resolved locally. */
+- outrel.r_info = htab->r_info (0, R_X86_64_IRELATIVE);
+- outrel.r_addend = (h->root.u.def.value
+- + h->root.u.def.section->output_section->vma
+- + h->root.u.def.section->output_offset);
++ outrel.r_info = htab->r_info (0, R_X86_64_RELATIVE);
++ outrel.r_addend = relocation;
++ relocate = TRUE;
+ }
+ else
+ {
+ outrel.r_info = htab->r_info (h->dynindx, r_type);
+ outrel.r_addend = 0;
++ relocate = FALSE;
+ }
+
+ sreloc = htab->elf.irelifunc;
+@@ -3184,7 +3200,8 @@ elf_x86_64_relocate_section (bfd *output_bfd,
+ we need to include the symbol value so that it
+ becomes an addend for the dynamic reloc. For an
+ internal symbol, we have updated addend. */
+- continue;
++ if (! relocate)
++ continue;
+ }
+ /* FALLTHROUGH */
+ case R_X86_64_PC32:
+@@ -4205,13 +4222,13 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
+
+ if (plt == htab->elf.splt)
+ {
+- plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
+- got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
++ got_offset = h->plt.offset / PLT_ENTRY_SIZE - 1;
++ got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
+ }
+ else
+ {
+- plt_index = h->plt.offset / PLT_ENTRY_SIZE;
+- got_offset = plt_index * GOT_ENTRY_SIZE;
++ got_offset = h->plt.offset / PLT_ENTRY_SIZE;
++ got_offset = got_offset * GOT_ENTRY_SIZE;
+ }
+
+ /* Fill in the entry in the procedure linkage table. */
+@@ -4233,17 +4250,6 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
+ - 6),
+ plt->contents + h->plt.offset + 2);
+
+- /* Don't fill PLT entry for static executables. */
+- if (plt == htab->elf.splt)
+- {
+- /* Put relocation index. */
+- bfd_put_32 (output_bfd, plt_index,
+- plt->contents + h->plt.offset + 7);
+- /* Put offset for jmp .PLT0. */
+- bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
+- plt->contents + h->plt.offset + 12);
+- }
+-
+ /* Fill in the entry in the global offset table, initially this
+ points to the pushq instruction in the PLT which is at offset 6. */
+ bfd_put_64 (output_bfd, (plt->output_section->vma
+@@ -4267,11 +4273,25 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
+ rela.r_addend = (h->root.u.def.value
+ + h->root.u.def.section->output_section->vma
+ + h->root.u.def.section->output_offset);
++ /* R_X86_64_IRELATIVE comes last. */
++ plt_index = htab->next_irelative_index--;
+ }
+ else
+ {
+ rela.r_info = htab->r_info (h->dynindx, R_X86_64_JUMP_SLOT);
+ rela.r_addend = 0;
++ plt_index = htab->next_jump_slot_index++;
++ }
++
++ /* Don't fill PLT entry for static executables. */
++ if (plt == htab->elf.splt)
++ {
++ /* Put relocation index. */
++ bfd_put_32 (output_bfd, plt_index,
++ plt->contents + h->plt.offset + 7);
++ /* Put offset for jmp .PLT0. */
++ bfd_put_32 (output_bfd, - (h->plt.offset + PLT_ENTRY_SIZE),
++ plt->contents + h->plt.offset + 12);
+ }
+
+ bed = get_elf_backend_data (output_bfd);
+diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
+index 68b71fb..1727922 100644
+--- a/ld/testsuite/ld-i386/i386.exp
++++ b/ld/testsuite/ld-i386/i386.exp
+@@ -210,3 +210,4 @@ if { !([istarget "i?86-*-linux*"]
+
+ run_dump_test "compressed1"
+ run_dump_test "pr12627"
++run_dump_test "pr13302"
+diff --git a/ld/testsuite/ld-i386/pr13302.d b/ld/testsuite/ld-i386/pr13302.d
+new file mode 100644
+index 0000000..3d85d08
+--- /dev/null
++++ b/ld/testsuite/ld-i386/pr13302.d
+@@ -0,0 +1,12 @@
++#name: PR ld/13302
++#as: --32
++#ld: -pie -melf_i386
++#readelf: -r --wide
++
++Relocation section '.rel.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
++ Offset Info Type Sym. Value Symbol's Name
++[0-9a-f]+ +[0-9a-f]+ +R_386_RELATIVE +
++
++Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries:
++ Offset Info Type Sym. Value Symbol's Name
++[0-9a-f]+ +[0-9a-f]+ +R_386_IRELATIVE +
+diff --git a/ld/testsuite/ld-i386/pr13302.s b/ld/testsuite/ld-i386/pr13302.s
+new file mode 100644
+index 0000000..cfd2717
+--- /dev/null
++++ b/ld/testsuite/ld-i386/pr13302.s
+@@ -0,0 +1,11 @@
++ .text
++ .globl _start
++ .type ifunc, @gnu_indirect_function
++_start:
++ lea .Ljmp@GOTOFF(%ebx), %eax
++ifunc:
++ jmp *(%eax)
++ .section .data.rel.ro.local,"aw",@progbits
++ .align 4
++.Ljmp:
++ .long ifunc
+diff --git a/ld/testsuite/ld-ifunc/ifunc-16-i386.d b/ld/testsuite/ld-ifunc/ifunc-16-i386.d
+new file mode 100644
+index 0000000..8ae3d0a
+--- /dev/null
++++ b/ld/testsuite/ld-ifunc/ifunc-16-i386.d
+@@ -0,0 +1,10 @@
++#source: ifunc-16-x86.s
++#ld: -shared -m elf_i386
++#as: --32
++#readelf: -r --wide
++#target: x86_64-*-* i?86-*-*
++
++Relocation section '.rel.plt' at .*
++[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
++[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+0+[ ]+ifunc
++[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]*
+diff --git a/ld/testsuite/ld-ifunc/ifunc-16-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-16-x86-64.d
+new file mode 100644
+index 0000000..d69626d
+--- /dev/null
++++ b/ld/testsuite/ld-ifunc/ifunc-16-x86-64.d
+@@ -0,0 +1,10 @@
++#source: ifunc-16-x86.s
++#as: --64
++#ld: -shared -melf_x86_64
++#readelf: -r --wide
++#target: x86_64-*-*
++
++Relocation section '.rela.plt' at .*
++[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
++[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+0+[ ]+ifunc \+ 0
++[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]*
+diff --git a/ld/testsuite/ld-ifunc/ifunc-16-x86.s b/ld/testsuite/ld-ifunc/ifunc-16-x86.s
+new file mode 100644
+index 0000000..fb38253
+--- /dev/null
++++ b/ld/testsuite/ld-ifunc/ifunc-16-x86.s
+@@ -0,0 +1,17 @@
++ .text
++ .globl fct
++ .type fct, @gnu_indirect_function
++ .set fct,resolve
++ .hidden int_fct
++ .globl int_fct
++ .set int_fct,fct
++ .p2align 4,,15
++ .type resolve, @function
++resolve:
++ call ifunc@PLT
++ .size resolve, .-resolve
++ .globl g
++ .type g, @function
++g:
++ jmp int_fct@PLT
++ .size g, .-g
+diff --git a/ld/testsuite/ld-x86-64/pr13082-5b.d b/ld/testsuite/ld-x86-64/pr13082-5b.d
+index 1c5a5e7..48e37c3 100644
+--- a/ld/testsuite/ld-x86-64/pr13082-5b.d
++++ b/ld/testsuite/ld-x86-64/pr13082-5b.d
+@@ -6,7 +6,7 @@
+
+ Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name \+ Addend
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+
+ Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name \+ Addend
+diff --git a/ld/testsuite/ld-x86-64/pr13082-6a.d b/ld/testsuite/ld-x86-64/pr13082-6a.d
+index 9a1a655..de90bb8 100644
+--- a/ld/testsuite/ld-x86-64/pr13082-6a.d
++++ b/ld/testsuite/ld-x86-64/pr13082-6a.d
+@@ -6,7 +6,7 @@
+
+ Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name \+ Addend
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+
+ Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name \+ Addend
+diff --git a/ld/testsuite/ld-x86-64/pr13082-6b.d b/ld/testsuite/ld-x86-64/pr13082-6b.d
+index 792c348..66ff59b 100644
+--- a/ld/testsuite/ld-x86-64/pr13082-6b.d
++++ b/ld/testsuite/ld-x86-64/pr13082-6b.d
+@@ -6,7 +6,7 @@
+
+ Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name \+ Addend
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_IRELATIVE +[0-9a-f]+
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+
+ Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
+ Offset Info Type Sym. Value Symbol's Name \+ Addend
diff --git a/binutils/patches/168_readelf_go.patch b/binutils/patches/168_readelf_go.patch
new file mode 100644
index 0000000..d87b3b8
--- /dev/null
+++ b/binutils/patches/168_readelf_go.patch
@@ -0,0 +1,13 @@
+# DP: Recognize DW_LANG_Go in readelf (backport from trunk)
+
+--- a/binutils/dwarf.c
++++ b/binutils/dwarf.c
+@@ -1599,6 +1599,8 @@ read_and_display_attr_value (unsigned lo
+ case DW_LANG_D: printf ("(D)"); break;
+ /* DWARF 4 values. */
+ case DW_LANG_Python: printf ("(Python)"); break;
++ /* DWARF 5 values. */
++ case DW_LANG_Go: printf ("(Go)"); break;
+ /* MIPS extension. */
+ case DW_LANG_Mips_Assembler: printf ("(MIPS assembler)"); break;
+ /* UPC extension. */
diff --git a/binutils/patches/210-gold-time_cc-unistd_h_for_sysconf.patch b/binutils/patches/210-gold-time_cc-unistd_h_for_sysconf.patch
new file mode 100644
index 0000000..96fede3
--- /dev/null
+++ b/binutils/patches/210-gold-time_cc-unistd_h_for_sysconf.patch
@@ -0,0 +1,14 @@
+Index: binutils/gold/timer.cc
+===================================================================
+--- binutils.orig/gold/timer.cc
++++ binutils/gold/timer.cc
+@@ -50,6 +50,9 @@ Timer::start()
+ }
+
+ #if HAVE_SYSCONF && defined _SC_CLK_TCK
++# if HAVE_UNISTD_H
++# include <unistd.h>
++# endif
+ # define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */
+ #else
+ # ifdef CLK_TCK
diff --git a/binutils/patches/300_ld_altexec.patch b/binutils/patches/300_ld_altexec.patch
new file mode 100644
index 0000000..f14a251
--- /dev/null
+++ b/binutils/patches/300_ld_altexec.patch
@@ -0,0 +1,80 @@
+diff --git a/ld/ld.texinfo b/ld/ld.texinfo
+index 6c74ff5..1830306 100644
+--- a/ld/ld.texinfo
++++ b/ld/ld.texinfo
+@@ -2718,7 +2718,10 @@ You can change the behaviour of @command{ld} with the environment variables
+ @ifclear SingleFormat
+ @code{GNUTARGET},
+ @end ifclear
+-@code{LDEMULATION} and @code{COLLECT_NO_DEMANGLE}.
++@code{LDEMULATION},
++@code{COLLECT_NO_DEMANGLE}
++and
++@code{LD_ALTEXEC}.
+
+ @ifclear SingleFormat
+ @kindex GNUTARGET
+@@ -2756,6 +2759,12 @@ a similar fashion by the @code{gcc} linker wrapper program. The default
+ may be overridden by the @samp{--demangle} and @samp{--no-demangle}
+ options.
+
++@kindex LD_ALTEXEC
++@cindex alternative linker
++@code{LD_ALTEXEC} sets alternative linker. @command{ld} executes,
++and passes control to this alternative linker. For instance one
++can set @code{LD_ALTEXEC=echo} to debug linker command line.
++
+ @c man end
+ @end ifset
+
+diff --git a/ld/ldmain.c b/ld/ldmain.c
+index b2810a7..8b5612f 100644
+--- a/ld/ldmain.c
++++ b/ld/ldmain.c
+@@ -52,6 +52,7 @@
+ #endif
+
+ #include <string.h>
++#include <errno.h>
+
+ #ifdef HAVE_SBRK
+ #if !HAVE_DECL_SBRK
+@@ -173,12 +174,38 @@ ld_cleanup (void)
+ unlink_if_ordinary (output_filename);
+ }
+
++static void
++maybe_altexec(char **argv)
++{
++ char *LD_ALTEXEC;
++
++ /* If LD_ALTEXEC is not set or is empty, just return */
++ LD_ALTEXEC = getenv("LD_ALTEXEC");
++ if (LD_ALTEXEC == NULL)
++ return;
++
++ if (*LD_ALTEXEC == '\0')
++ return;
++
++ /* Unset LD_ALTEXEC for case when it points to this program itself ;-) */
++ if (unsetenv("LD_ALTEXEC"))
++ exit(errno);
++
++ argv[0] = LD_ALTEXEC;
++ execvp(LD_ALTEXEC, argv);
++
++ /* We are here only if execvp() failed */
++ exit(errno);
++}
++
+ int
+ main (int argc, char **argv)
+ {
+ char *emulation;
+ long start_time = get_run_time ();
+
++ maybe_altexec(argv);
++
+ #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
+ setlocale (LC_MESSAGES, "");
+ #endif
diff --git a/binutils/patches/branch-updates.diff b/binutils/patches/branch-updates.diff
new file mode 100644
index 0000000..dd9013b
--- /dev/null
+++ b/binutils/patches/branch-updates.diff
@@ -0,0 +1,6396 @@
+# DP: updates from the binutils-2.22 branch
+
+# git diff 10968a312d8c536be9993ed06bc88fbe0860d95d 20328dadc04ae46c8ca4b334c8d1d4c9aec9c5b7
+# exclude bfd/{configure{,.ac},Makefile.{am,in}}
+
+diff --git a/bfd/ChangeLog b/bfd/ChangeLog
+index 65db027..a568f1b 100644
+--- a/bfd/ChangeLog
++++ b/bfd/ChangeLog
+@@ -1,3 +1,206 @@
++2012-05-11 Ralf Corsépius <ralf.corsepius@rtems.org>
++
++ Backport from mainline:
++
++ 2012-04-24 Alan Modra <amodra@gmail.com>
++ PR ld/13991
++ * bfd/elf-bfd.h (_bfd_elf_link_just_syms): Define as
++ _bfd_generic_link_just_syms.
++ * bfd/elflink.c (_bfd_elf_link_just_syms): Delete.
++ * bfd/linker.c (_bfd_generic_link_just_syms): Set sec_info_type.
++
++ * bfd/bfd-in.h (discarded_section): Renamed from elf_discarded_section.
++ * bfd/section.c (SEC_INFO_TYPE_NONE, SEC_INFO_TYPE_STABS,
++ SEC_INFO_TYPE_MERGE, SEC_INFO_TYPE_EH_FRAME,
++ SEC_INFO_TYPE_JUST_SYMS): Renamed from corresponding ELF_INFO_TYPE.
++ * bfd/elf-eh-frame.c, * bfd/elf-m10200.c, * bfd/elf-m10300.c,
++ * bfd/elf.c, * bfd/elf32-arm.c, * bfd/elf32-avr.c, * bfd/elf32-bfin.c,
++ * bfd/elf32-cr16.c, * bfd/elf32-cr16c.c, * bfd/elf32-cris.c,
++ * bfd/elf32-crx.c, * bfd/elf32-d10v.c, * bfd/elf32-epiphany.c,
++ * bfd/elf32-fr30.c, * bfd/elf32-frv.c, * bfd/elf32-h8300.c,
++ * bfd/elf32-hppa.c, * bfd/elf32-i370.c, * bfd/elf32-i386.c,
++ * bfd/elf32-i860.c, * bfd/elf32-ip2k.c, * bfd/elf32-iq2000.c,
++ * bfd/elf32-lm32.c, * bfd/elf32-m32c.c, * bfd/elf32-m32r.c,
++ * bfd/elf32-m68hc1x.c, * bfd/elf32-m68k.c, * bfd/elf32-mcore.c,
++ * bfd/elf32-mep.c, * bfd/elf32-moxie.c, * bfd/elf32-msp430.c,
++ * bfd/elf32-mt.c, * bfd/elf32-openrisc.c, * bfd/elf32-ppc.c,
++ * bfd/elf32-rl78.c, * bfd/elf32-rx.c, * bfd/elf32-s390.c,
++ * bfd/elf32-score.c, * bfd/elf32-score7.c, * bfd/elf32-sh.c,
++ * bfd/elf32-spu.c, * bfd/elf32-tic6x.c, * bfd/elf32-tilepro.c,
++ * bfd/elf32-v850.c, * bfd/elf32-vax.c, * bfd/elf32-xc16x.c,
++ * bfd/elf32-xstormy16.c, * bfd/elf32-xtensa.c, * bfd/elf64-alpha.c,
++ * bfd/elf64-hppa.c, * bfd/elf64-ia64-vms.c, * bfd/elf64-mmix.c,
++ * bfd/elf64-ppc.c, * bfd/elf64-s390.c, * bfd/elf64-sh64.c,
++ * bfd/elf64-x86-64.c, * bfd/elflink.c, * bfd/elfnn-ia64.c,
++ * bfd/elfxx-mips.c, * bfd/elfxx-sparc.c, * bfd/elfxx-tilegx.c,
++ * bfd/reloc.c: Update all references.
++ * bfd/bfd-in2.h: Regenerate.
++
++2012-04-20 Nick Clifton <nickc@redhat.com>
++
++ Import this patch from the mainline:
++ 2012-03-21 Eliot Dresselhaus <eliot@sonic.net>
++
++ * elf32-tic6x.c (elf32_tic6x_merge_private_bfd_data): Return TRUE
++ for non-C6X objects.
++
++2012-02-01 Nick Clifton <nickc@redhat.com>
++
++ Import this patch from the mainline:
++ 2012-01-05 Nick Clifton <nickc@redhat.com>
++
++ PR ld/12161
++ * elf32-avr.c (elf32_avr_relax_delete_bytes): Read in relocs if
++ necessary.
++
++2012-01-27 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
++
++ Backport from mainline:
++ 2011-12-11 John Davis Anglin <dave.anglin@nrc-cnrc.gc.ca>
++
++ PR binutils/13476
++ * elf32-hppa.c (final_link_relocate): Convert R_PARISC_TLS_GD21L,
++ R_PARISC_TLS_LDM21L and R_PARISC_TLS_IE21L relocations to
++ R_PARISC_DPREL21L when not doing a shared link. Likewise convert
++ R_PARISC_TLS_GD14R, R_PARISC_TLS_LDM14R and R_PARISC_TLS_IE14R to
++ R_PARISC_DPREL14R. Handle R_PARISC_TLS_GD21L, R_PARISC_TLS_LDM21L
++ and R_PARISC_TLS_IE21L with R_PARISC_DLTIND21L.
++
++ Backport from mainline:
++ 2011-11-06 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
++
++ PR ld/13387
++ * elf32-hppa.c (elf32_hppa_hide_symbol): Make STT_GNU_IFUNC symbol
++ go through PLT. Reset plt field with init_plt_offset.
++ (elf32_hppa_adjust_dynamic_symbol): Ensure that a PLT slot is
++ allocated for symbols referenced by a plabel.
++
++2012-01-10 H.J. Lu <hongjiu.lu@intel.com>
++
++ Backport from mainline:
++ PR ld/13581
++ * elf64-x86-64.c (elf_x86_64_relocate_section): Remove ABI_64_P
++ check on R_X86_64_PCXX.
++
++2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ Backport from mainline:
++
++ 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ * reloc.c (BFD_RELOC_MIPS16_TLS_GD,BFD_RELOC_MIPS16_TLS_LDM,
++ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
++ BFD_RELOC_MIPS16_TLS_GOTTPREL,BFD_RELOC_MIPS16_TLS_TPREL_HI16,
++ BFD_RELOC_MIPS16_TLS_TPREL_LO16): New relocations for MIPS16 TLS.
++ * bfd-in2.h (bfd_reloc_code_real): Regenerate.
++ * libbfd.h (bfd_reloc_code_real_names): Regenerate.
++ * elf32-mips.c (elf_mips16_howto_table_rel): Add R_MIPS16_TLS_*
++ entries.
++ (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
++ mappings.
++ * elfn32-mips.c (elf_mips16_howto_table_rel,
++ elf_mips16_howto_table_rela): Add R_MIPS16_TLS_* entries.
++ (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
++ mappings.
++ * elf64-mips.c (mips16_elf64_howto_table_rel,
++ mips16_elf64_howto_table_rela): Add R_MIPS16_TLS_* entries.
++ (mips16_reloc_map): Add BFD_RELOC_MIPS16_TLS_* to R_MIPS16_TLS_*
++ mappings.
++ * elfxx-mips.c (TLS_RELOC_P,mips16_reloc_p,
++ _bfd_mips_elf_check_relocs): Add cases for R_MIPS16_TLS_* relocations.
++ (tls_gd_reloc_p): Add R_MIPS16_TLS_GD case.
++ (tls_ldm_reloc_p): Add R_MIPS16_TLS_LDM case.
++ (tls_gottprel_reloc_p): Add R_MIPS16_TLS_GOTTPREL case.
++ (mips_elf_calculate_relocation): Add cases for R_MIPS16_TLS_*,
++ R_MIPS_TLS_DTPREL32/64, and R_MIPS_TLS_TPREL32/64 relocations.
++
++2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ Backport from mainline:
++
++ 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++ Catherine Moore <clm@codesourcery.com>
++ Sandra Loosemore <sandra@codesourcery.com>
++ Richard Sandiford <rdsandiford@googlemail.com>
++
++ * elfxx-mips.c (mips_elf_local_pic_function_p): Return true when
++ H is a MIPS16 function with a kept 32-bit stub. Update comments.
++ (mips_elf_get_la25_target): New function.
++ (mips_elf_add_la25_intro): Change to use mips_elf_get_la25_target().
++ (mips_elf_add_la25_stub): Move compute of use_trampoline_p down,
++ change to use mips_elf_get_la25_target().
++ (mips_elf_relocation_needs_la25_stub): Add target_is_16_bit_code_p
++ parameter, add switch case for R_MIPS16_26.
++ (mips_elf_calculate_relocation): Redirect relocation to point to the
++ LA25 stub if it exists, instead of the MIPS16 stub. Update arguments
++ of call to mips_elf_relocation_needs_la25_stub(), don't use la25 stub
++ for mips16->mips16 calls.
++ (_bfd_mips_elf_check_relocs): Update arguments of call to
++ mips_elf_relocation_needs_la25_stub().
++ (mips_elf_create_la25_stub): Change to use mips_elf_get_la25_target().
++
++2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ Backport from mainline:
++
++ 2011-12-13 Chung-Lin Tang <cltang@codesourcery.com>
++
++ * elfxx-mips.c (mips_elf_calculate_relocation): Correct
++ R_MIPS16_HI16/R_MIPS16_LO16 handling of two cleared lower bits,
++ update comments.
++
++2011-12-10 David Daney <david.daney@cavium.com>
++
++ Backport from mainline:
++
++ 2011-12-10 David Daney <david.daney@cavium.com>
++
++ * elfxx-mips.c (mips_elf_link_hash_table.rld_value): Remove.
++ (mips_elf_link_hash_table.rld_symbol): New field;
++ (MIPS_ELF_RLD_MAP_SIZE): New macro.
++ (_bfd_mips_elf_add_symbol_hook): Remember __rld_obj_head symbol
++ in rld_symbol.
++ (_bfd_mips_elf_create_dynamic_sections): Remember __rld_map symbol
++ in rld_symbol.
++ (_bfd_mips_elf_size_dynamic_sections): Set correct size for .rld_map.
++ (_bfd_mips_elf_finish_dynamic_symbol): Remove .rld_map handling.
++ (_bfd_mips_elf_finish_dynamic_sections): Use rld_symbol to
++ calculate DT_MIPS_RLD_MAP value.
++ (_bfd_mips_elf_link_hash_table_create): Initialize rld_symbol,
++ quit initializing rld_value.
++
++2011-12-03 Alan Modra <amodra@gmail.com>
++
++ PR ld/13468
++ * elflink.c (bfd_elf_final_link): Don't segfault when checking
++ for DT_TEXTREL and .dynamic does not exist.
++
++2011-12-03 Alan Modra <amodra@gmail.com>
++
++ PR ld/13470
++ * elf32-ppc.c (ppc_elf_copy_indirect_symbol): Revert substantive
++ change in 2011-07-01 commit. Comment.
++ * elf64-ppc.c (ppc64_elf_copy_indirect_symbol): Likewise.
++
++2011-12-01 Mikael Pettersson <mikpe@it.uu.se>
++
++ Apply mainline patches
++ * elf32-m68k.c (elf_m68k_check_relocs) <R_68K_8, R68K_16, R_68K_32>: For
++ non-SEC_ALLOC sections break before GOT and PLT accounting.
++
++2011-12-01 Hans-Peter Nilsson <hp@axis.com>
++
++ Apply mainline patches
++ * elf32-cris.c (cris_elf_check_relocs) <plt accounting for
++ R_CRIS_8, R_CRIS_16, and R_CRIS_32>: Move early break for
++ non-SEC_ALLOC sections before GOT and PLT accounting.
++
++2011-11-21 Tristan Gingold <gingold@adacore.com>
++
++ * configure.in: Bump version to 2.22.0
++ * Makefile.am (RELEASE): Unset.
++ * configure, Makefile.in: Regenerate.
++
+ 2011-11-21 Tristan Gingold <gingold@adacore.com>
+
+ * configure.in: Bump version to 2.22
+diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
+index a477b49..7c5298a 100644
+--- a/bfd/bfd-in.h
++++ b/bfd/bfd-in.h
+@@ -295,11 +295,11 @@ typedef struct bfd_section *sec_ptr;
+ ? (sec)->rawsize : (sec)->size) / bfd_octets_per_byte (bfd))
+
+ /* Return TRUE if input section SEC has been discarded. */
+-#define elf_discarded_section(sec) \
++#define discarded_section(sec) \
+ (!bfd_is_abs_section (sec) \
+ && bfd_is_abs_section ((sec)->output_section) \
+- && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE \
+- && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
++ && (sec)->sec_info_type != SEC_INFO_TYPE_MERGE \
++ && (sec)->sec_info_type != SEC_INFO_TYPE_JUST_SYMS)
+
+ /* Forward define. */
+ struct stat;
+diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
+index 22fcdf6..34f9628 100644
+--- a/bfd/bfd-in2.h
++++ b/bfd/bfd-in2.h
+@@ -302,11 +302,11 @@ typedef struct bfd_section *sec_ptr;
+ ? (sec)->rawsize : (sec)->size) / bfd_octets_per_byte (bfd))
+
+ /* Return TRUE if input section SEC has been discarded. */
+-#define elf_discarded_section(sec) \
++#define discarded_section(sec) \
+ (!bfd_is_abs_section (sec) \
+ && bfd_is_abs_section ((sec)->output_section) \
+- && (sec)->sec_info_type != ELF_INFO_TYPE_MERGE \
+- && (sec)->sec_info_type != ELF_INFO_TYPE_JUST_SYMS)
++ && (sec)->sec_info_type != SEC_INFO_TYPE_MERGE \
++ && (sec)->sec_info_type != SEC_INFO_TYPE_JUST_SYMS)
+
+ /* Forward define. */
+ struct stat;
+@@ -1384,11 +1384,11 @@ typedef struct bfd_section
+
+ /* Type of sec_info information. */
+ unsigned int sec_info_type:3;
+-#define ELF_INFO_TYPE_NONE 0
+-#define ELF_INFO_TYPE_STABS 1
+-#define ELF_INFO_TYPE_MERGE 2
+-#define ELF_INFO_TYPE_EH_FRAME 3
+-#define ELF_INFO_TYPE_JUST_SYMS 4
++#define SEC_INFO_TYPE_NONE 0
++#define SEC_INFO_TYPE_STABS 1
++#define SEC_INFO_TYPE_MERGE 2
++#define SEC_INFO_TYPE_EH_FRAME 3
++#define SEC_INFO_TYPE_JUST_SYMS 4
+
+ /* Nonzero if this section uses RELA relocations, rather than REL. */
+ unsigned int use_rela_p:1;
+@@ -2780,6 +2780,15 @@ to compensate for the borrow when the low bits are added. */
+ /* MIPS16 low 16 bits. */
+ BFD_RELOC_MIPS16_LO16,
+
++/* MIPS16 TLS relocations */
++ BFD_RELOC_MIPS16_TLS_GD,
++ BFD_RELOC_MIPS16_TLS_LDM,
++ BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
++ BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
++ BFD_RELOC_MIPS16_TLS_GOTTPREL,
++ BFD_RELOC_MIPS16_TLS_TPREL_HI16,
++ BFD_RELOC_MIPS16_TLS_TPREL_LO16,
++
+ /* Relocation against a MIPS literal section. */
+ BFD_RELOC_MIPS_LITERAL,
+ BFD_RELOC_MICROMIPS_LITERAL,
+diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
+index d6e2ab2..2cfe2ba 100644
+--- a/bfd/elf-bfd.h
++++ b/bfd/elf-bfd.h
+@@ -1807,8 +1807,7 @@ extern void bfd_elf_set_group_contents
+ (bfd *, asection *, void *);
+ extern asection *_bfd_elf_check_kept_section
+ (asection *, struct bfd_link_info *);
+-extern void _bfd_elf_link_just_syms
+- (asection *, struct bfd_link_info *);
++#define _bfd_elf_link_just_syms _bfd_generic_link_just_syms
+ extern void _bfd_elf_copy_link_hash_symbol_type
+ (bfd *, struct bfd_link_hash_entry *, struct bfd_link_hash_entry *);
+ extern bfd_boolean _bfd_elf_size_group_sections
+diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
+index 54142b2..7b5cf7a 100644
+--- a/bfd/elf-eh-frame.c
++++ b/bfd/elf-eh-frame.c
+@@ -491,7 +491,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
+ return;
+
+ if (sec->size == 0
+- || sec->sec_info_type != ELF_INFO_TYPE_NONE)
++ || sec->sec_info_type != SEC_INFO_TYPE_NONE)
+ {
+ /* This file does not contain .eh_frame information. */
+ return;
+@@ -904,7 +904,7 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
+ BFD_ASSERT (cie_count == num_cies);
+
+ elf_section_data (sec)->sec_info = sec_info;
+- sec->sec_info_type = ELF_INFO_TYPE_EH_FRAME;
++ sec->sec_info_type = SEC_INFO_TYPE_EH_FRAME;
+ if (hdr_info->merge_cies)
+ {
+ sec_info->cies = local_cies;
+@@ -1137,7 +1137,7 @@ _bfd_elf_discard_section_eh_frame
+ struct eh_frame_hdr_info *hdr_info;
+ unsigned int ptr_size, offset;
+
+- if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
++ if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
+ return FALSE;
+
+ sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
+@@ -1307,7 +1307,7 @@ _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
+ struct eh_frame_sec_info *sec_info;
+ unsigned int lo, hi, mid;
+
+- if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
++ if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
+ return offset;
+ sec_info = (struct eh_frame_sec_info *) elf_section_data (sec)->sec_info;
+
+@@ -1395,7 +1395,7 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
+ unsigned int ptr_size;
+ struct eh_cie_fde *ent;
+
+- if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
++ if (sec->sec_info_type != SEC_INFO_TYPE_EH_FRAME)
+ /* FIXME: octets_per_byte. */
+ return bfd_set_section_contents (abfd, sec->output_section, contents,
+ sec->output_offset, sec->size);
+diff --git a/bfd/elf-m10200.c b/bfd/elf-m10200.c
+index a38f4db..d58c75c 100644
+--- a/bfd/elf-m10200.c
++++ b/bfd/elf-m10200.c
+@@ -401,7 +401,7 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c
+index 8276a2f..876ff4a 100644
+--- a/bfd/elf-m10300.c
++++ b/bfd/elf-m10300.c
+@@ -1509,7 +1509,7 @@ mn10300_elf_relocate_section (bfd *output_bfd,
+ h->root.root.root.string);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -2763,7 +2763,7 @@ mn10300_elf_relax_section (bfd *abfd,
+ isym->st_name);
+
+ if ((sym_sec->flags & SEC_MERGE)
+- && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ symval = isym->st_value;
+
+diff --git a/bfd/elf.c b/bfd/elf.c
+index aa40c33..9e23bee 100644
+--- a/bfd/elf.c
++++ b/bfd/elf.c
+@@ -3071,7 +3071,7 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
+ if (link_info != NULL)
+ {
+ /* Check discarded linkonce section. */
+- if (elf_discarded_section (s))
++ if (discarded_section (s))
+ {
+ asection *kept;
+ (*_bfd_error_handler)
+@@ -9390,7 +9390,7 @@ _bfd_elf_rela_local_sym (bfd *abfd,
+ + sym->st_value);
+ if ((sec->flags & SEC_MERGE)
+ && ELF_ST_TYPE (sym->st_info) == STT_SECTION
+- && sec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ rel->r_addend =
+ _bfd_merged_section_offset (abfd, psec,
+@@ -9421,7 +9421,7 @@ _bfd_elf_rel_local_sym (bfd *abfd,
+ {
+ asection *sec = *psec;
+
+- if (sec->sec_info_type != ELF_INFO_TYPE_MERGE)
++ if (sec->sec_info_type != SEC_INFO_TYPE_MERGE)
+ return sym->st_value + addend;
+
+ return _bfd_merged_section_offset (abfd, psec,
+@@ -9437,10 +9437,10 @@ _bfd_elf_section_offset (bfd *abfd,
+ {
+ switch (sec->sec_info_type)
+ {
+- case ELF_INFO_TYPE_STABS:
++ case SEC_INFO_TYPE_STABS:
+ return _bfd_stab_section_offset (sec, elf_section_data (sec)->sec_info,
+ offset);
+- case ELF_INFO_TYPE_EH_FRAME:
++ case SEC_INFO_TYPE_EH_FRAME:
+ return _bfd_elf_eh_frame_section_offset (abfd, info, sec, offset);
+ default:
+ if ((sec->flags & SEC_ELF_REVERSE_COPY) != 0)
+diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
+index 1f6c1a0..9355f66 100644
+--- a/bfd/elf32-arm.c
++++ b/bfd/elf32-arm.c
+@@ -4485,7 +4485,7 @@ cortex_a8_erratum_scan (bfd *input_bfd,
+ if (elf_section_type (section) != SHT_PROGBITS
+ || (elf_section_flags (section) & SHF_EXECINSTR) == 0
+ || (section->flags & SEC_EXCLUDE) != 0
+- || (section->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
++ || (section->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
+ || (section->output_section == bfd_abs_section_ptr))
+ continue;
+
+@@ -6556,7 +6556,7 @@ bfd_elf32_arm_vfp11_erratum_scan (bfd *abfd, struct bfd_link_info *link_info)
+ if (elf_section_type (sec) != SHT_PROGBITS
+ || (elf_section_flags (sec) & SHF_EXECINSTR) == 0
+ || (sec->flags & SEC_EXCLUDE) != 0
+- || sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
++ || sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
+ || sec->output_section == bfd_abs_section_ptr
+ || strcmp (sec->name, VFP11_ERRATUM_VENEER_SECTION_NAME) == 0)
+ continue;
+@@ -10305,7 +10305,7 @@ elf32_arm_relocate_section (bfd * output_bfd,
+ sym_type = h->type;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c
+index 6d20aef..97dc268 100644
+--- a/bfd/elf32-avr.c
++++ b/bfd/elf32-avr.c
+@@ -1189,7 +1189,7 @@ elf32_avr_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -1503,11 +1503,18 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
+ bfd_vma symval;
+ bfd_vma shrinked_insn_address;
+
++ if (isec->reloc_count == 0)
++ continue;
++
+ shrinked_insn_address = (sec->output_section->vma
+ + sec->output_offset + addr - count);
+
+- irelend = elf_section_data (isec)->relocs + isec->reloc_count;
+- for (irel = elf_section_data (isec)->relocs;
++ irel = elf_section_data (isec)->relocs;
++ /* PR 12161: Read in the relocs for this section if necessary. */
++ if (irel == NULL)
++ irel = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL, FALSE);
++
++ for (irelend = irel + isec->reloc_count;
+ irel < irelend;
+ irel++)
+ {
+@@ -1564,6 +1571,9 @@ elf32_avr_relax_delete_bytes (bfd *abfd,
+ /* else...Reference symbol is extern. No need for adjusting
+ the addend. */
+ }
++
++ if (elf_section_data (isec)->relocs == NULL)
++ free (irelend - isec->reloc_count);
+ }
+ }
+
+diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c
+index b112dfc..4941f40 100644
+--- a/bfd/elf32-bfin.c
++++ b/bfd/elf32-bfin.c
+@@ -1444,7 +1444,7 @@ bfin_relocate_section (bfd * output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -2663,7 +2663,7 @@ bfinfdpic_relocate_section (bfd * output_bfd,
+ osec = sec;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -4429,7 +4429,7 @@ bfinfdpic_elf_discard_info (bfd *ibfd,
+
+ /* Account for relaxation of .eh_frame section. */
+ for (s = ibfd->sections; s; s = s->next)
+- if (s->sec_info_type == ELF_INFO_TYPE_EH_FRAME)
++ if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
+ {
+ if (!_bfinfdpic_check_discarded_relocs (ibfd, s, info, &changed))
+ return FALSE;
+diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c
+index 0118131..38af05f 100644
+--- a/bfd/elf32-cr16.c
++++ b/bfd/elf32-cr16.c
+@@ -1431,7 +1431,7 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-cr16c.c b/bfd/elf32-cr16c.c
+index ca2d7cb..109936b 100644
+--- a/bfd/elf32-cr16c.c
++++ b/bfd/elf32-cr16c.c
+@@ -723,7 +723,7 @@ elf32_cr16c_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
+index 243a8ec..ec23f03 100644
+--- a/bfd/elf32-cris.c
++++ b/bfd/elf32-cris.c
+@@ -1180,7 +1180,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -3579,6 +3579,12 @@ cris_elf_check_relocs (bfd *abfd,
+ sec,
+ cris_elf_howto_table[r_type].name);
+ }
++
++ /* We don't need to handle relocs into sections not going into
++ the "real" output. */
++ if ((sec->flags & SEC_ALLOC) == 0)
++ break;
++
+ if (h != NULL)
+ {
+ h->non_got_ref = 1;
+@@ -3608,11 +3614,6 @@ cris_elf_check_relocs (bfd *abfd,
+ if (! info->shared)
+ break;
+
+- /* We don't need to handle relocs into sections not going into
+- the "real" output. */
+- if ((sec->flags & SEC_ALLOC) == 0)
+- break;
+-
+ /* We may need to create a reloc section in the dynobj and made room
+ for this reloc. */
+ if (sreloc == NULL)
+diff --git a/bfd/elf32-crx.c b/bfd/elf32-crx.c
+index d48932d..fd13447 100644
+--- a/bfd/elf32-crx.c
++++ b/bfd/elf32-crx.c
+@@ -873,7 +873,7 @@ elf32_crx_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-d10v.c b/bfd/elf32-d10v.c
+index 7d65395..e39a9b5 100644
+--- a/bfd/elf32-d10v.c
++++ b/bfd/elf32-d10v.c
+@@ -463,7 +463,7 @@ elf32_d10v_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-fr30.c b/bfd/elf32-fr30.c
+index 97b0d29..57be6ae 100644
+--- a/bfd/elf32-fr30.c
++++ b/bfd/elf32-fr30.c
+@@ -577,7 +577,7 @@ fr30_elf_relocate_section (output_bfd, info, input_bfd, input_section,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
+index 7f3c4dd..513f811 100644
+--- a/bfd/elf32-frv.c
++++ b/bfd/elf32-frv.c
+@@ -2812,7 +2812,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -5678,7 +5678,7 @@ frvfdpic_elf_discard_info (bfd *ibfd,
+
+ /* Account for relaxation of .eh_frame section. */
+ for (s = ibfd->sections; s; s = s->next)
+- if (s->sec_info_type == ELF_INFO_TYPE_EH_FRAME)
++ if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
+ {
+ if (!_frvfdpic_check_discarded_relocs (ibfd, s, info, &changed))
+ return FALSE;
+diff --git a/bfd/elf32-h8300.c b/bfd/elf32-h8300.c
+index 95d3983..ff1ee70 100644
+--- a/bfd/elf32-h8300.c
++++ b/bfd/elf32-h8300.c
+@@ -460,7 +460,7 @@ elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
+index 7f0f2cb..044b6fa 100644
+--- a/bfd/elf32-hppa.c
++++ b/bfd/elf32-hppa.c
+@@ -1789,10 +1789,12 @@ elf32_hppa_hide_symbol (struct bfd_link_info *info,
+ }
+ }
+
+- if (! hppa_elf_hash_entry (eh)->plabel)
++ /* STT_GNU_IFUNC symbol must go through PLT. */
++ if (! hppa_elf_hash_entry (eh)->plabel
++ && eh->type != STT_GNU_IFUNC)
+ {
+ eh->needs_plt = 0;
+- eh->plt = elf_hash_table (info)->init_plt_refcount;
++ eh->plt = elf_hash_table (info)->init_plt_offset;
+ }
+ }
+
+@@ -1814,6 +1816,13 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
+ if (eh->type == STT_FUNC
+ || eh->needs_plt)
+ {
++ /* If the symbol is used by a plabel, we must allocate a PLT slot.
++ The refcounts are not reliable when it has been hidden since
++ hide_symbol can be called before the plabel flag is set. */
++ if (hppa_elf_hash_entry (eh)->plabel
++ && eh->plt.refcount <= 0)
++ eh->plt.refcount = 1;
++
+ if (eh->plt.refcount <= 0
+ || (eh->def_regular
+ && eh->root.type != bfd_link_hash_defweak
+@@ -3340,10 +3349,16 @@ final_link_relocate (asection *input_section,
+ switch (r_type)
+ {
+ case R_PARISC_DLTIND21L:
++ case R_PARISC_TLS_GD21L:
++ case R_PARISC_TLS_LDM21L:
++ case R_PARISC_TLS_IE21L:
+ r_type = R_PARISC_DPREL21L;
+ break;
+
+ case R_PARISC_DLTIND14R:
++ case R_PARISC_TLS_GD14R:
++ case R_PARISC_TLS_LDM14R:
++ case R_PARISC_TLS_IE14R:
+ r_type = R_PARISC_DPREL14R;
+ break;
+
+@@ -3409,53 +3424,48 @@ final_link_relocate (asection *input_section,
+ case R_PARISC_DPREL21L:
+ case R_PARISC_DPREL14R:
+ case R_PARISC_DPREL14F:
+- case R_PARISC_TLS_GD21L:
+- case R_PARISC_TLS_LDM21L:
+- case R_PARISC_TLS_IE21L:
+ /* Convert instructions that use the linkage table pointer (r19) to
+ instructions that use the global data pointer (dp). This is the
+ most efficient way of using PIC code in an incomplete executable,
+ but the user must follow the standard runtime conventions for
+ accessing data for this to work. */
+- if (orig_r_type == R_PARISC_DLTIND21L
+- || (!info->shared
+- && (r_type == R_PARISC_TLS_GD21L
+- || r_type == R_PARISC_TLS_LDM21L
+- || r_type == R_PARISC_TLS_IE21L)))
++ if (orig_r_type != r_type)
+ {
+- /* Convert addil instructions if the original reloc was a
+- DLTIND21L. GCC sometimes uses a register other than r19 for
+- the operation, so we must convert any addil instruction
+- that uses this relocation. */
+- if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
+- insn = ADDIL_DP;
+- else
+- /* We must have a ldil instruction. It's too hard to find
+- and convert the associated add instruction, so issue an
+- error. */
+- (*_bfd_error_handler)
+- (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
+- input_bfd,
+- input_section,
+- (long) offset,
+- howto->name,
+- insn);
+- }
+- else if (orig_r_type == R_PARISC_DLTIND14F)
+- {
+- /* This must be a format 1 load/store. Change the base
+- register to dp. */
+- insn = (insn & 0xfc1ffff) | (27 << 21);
++ if (r_type == R_PARISC_DPREL21L)
++ {
++ /* GCC sometimes uses a register other than r19 for the
++ operation, so we must convert any addil instruction
++ that uses this relocation. */
++ if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
++ insn = ADDIL_DP;
++ else
++ /* We must have a ldil instruction. It's too hard to find
++ and convert the associated add instruction, so issue an
++ error. */
++ (*_bfd_error_handler)
++ (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
++ input_bfd,
++ input_section,
++ (long) offset,
++ howto->name,
++ insn);
++ }
++ else if (r_type == R_PARISC_DPREL14F)
++ {
++ /* This must be a format 1 load/store. Change the base
++ register to dp. */
++ insn = (insn & 0xfc1ffff) | (27 << 21);
++ }
+ }
+
+- /* For all the DP relative relocations, we need to examine the symbol's
+- section. If it has no section or if it's a code section, then
+- "data pointer relative" makes no sense. In that case we don't
+- adjust the "value", and for 21 bit addil instructions, we change the
+- source addend register from %dp to %r0. This situation commonly
+- arises for undefined weak symbols and when a variable's "constness"
+- is declared differently from the way the variable is defined. For
+- instance: "extern int foo" with foo defined as "const int foo". */
++ /* For all the DP relative relocations, we need to examine the symbol's
++ section. If it has no section or if it's a code section, then
++ "data pointer relative" makes no sense. In that case we don't
++ adjust the "value", and for 21 bit addil instructions, we change the
++ source addend register from %dp to %r0. This situation commonly
++ arises for undefined weak symbols and when a variable's "constness"
++ is declared differently from the way the variable is defined. For
++ instance: "extern int foo" with foo defined as "const int foo". */
+ if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
+ {
+ if ((insn & ((0x3f << 26) | (0x1f << 21)))
+@@ -3472,6 +3482,9 @@ final_link_relocate (asection *input_section,
+ case R_PARISC_DLTIND21L:
+ case R_PARISC_DLTIND14R:
+ case R_PARISC_DLTIND14F:
++ case R_PARISC_TLS_GD21L:
++ case R_PARISC_TLS_LDM21L:
++ case R_PARISC_TLS_IE21L:
+ case R_PARISC_TLS_GD14R:
+ case R_PARISC_TLS_LDM14R:
+ case R_PARISC_TLS_IE14R:
+@@ -3728,7 +3741,7 @@ elf32_hppa_relocate_section (bfd *output_bfd,
+ hh = hppa_elf_hash_entry (eh);
+ }
+
+- if (sym_sec != NULL && elf_discarded_section (sym_sec))
++ if (sym_sec != NULL && discarded_section (sym_sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rela, relend,
+ elf_hppa_howto_table + r_type,
+diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c
+index 8082927..516511f 100644
+--- a/bfd/elf32-i370.c
++++ b/bfd/elf32-i370.c
+@@ -1138,7 +1138,7 @@ i370_elf_relocate_section (bfd *output_bfd,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
+index d518d01..b925ca6 100644
+--- a/bfd/elf32-i386.c
++++ b/bfd/elf32-i386.c
+@@ -3178,7 +3178,7 @@ elf_i386_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -4846,7 +4846,7 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
+ + PLT_FDE_START_OFFSET);
+ }
+ if (htab->plt_eh_frame->sec_info_type
+- == ELF_INFO_TYPE_EH_FRAME)
++ == SEC_INFO_TYPE_EH_FRAME)
+ {
+ if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
+ htab->plt_eh_frame,
+diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c
+index 00c8ca7..88f4265 100644
+--- a/bfd/elf32-i860.c
++++ b/bfd/elf32-i860.c
+@@ -1128,7 +1128,7 @@ elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-ip2k.c b/bfd/elf32-ip2k.c
+index 0a251b8..43c7b1c 100644
+--- a/bfd/elf32-ip2k.c
++++ b/bfd/elf32-ip2k.c
+@@ -1436,7 +1436,7 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-iq2000.c b/bfd/elf32-iq2000.c
+index 63ef3dc..3954616 100644
+--- a/bfd/elf32-iq2000.c
++++ b/bfd/elf32-iq2000.c
+@@ -633,7 +633,7 @@ iq2000_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c
+index 07add20..a2b1003 100644
+--- a/bfd/elf32-lm32.c
++++ b/bfd/elf32-lm32.c
+@@ -893,7 +893,7 @@ lm32_elf_relocate_section (bfd *output_bfd,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -2372,7 +2372,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd,
+ /* Don't generate entries for weak symbols. */
+ if (!h || (h && h->root.type != bfd_link_hash_undefweak))
+ {
+- if (!elf_discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
++ if (!discarded_section (s) && !((bfd_get_section_flags (ibfd, s) & SEC_ALLOC) == 0))
+ {
+ switch (ELF32_R_TYPE (internal_relocs->r_info))
+ {
+@@ -2394,7 +2394,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd,
+ if (!strcmp (current->name, h->root.root.string))
+ break;
+ }
+- if (!current && !elf_discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
++ if (!current && !discarded_section (s) && (bfd_get_section_flags (ibfd, s) & SEC_ALLOC))
+ {
+ /* Will this have an entry in the GOT. */
+ if (ELF32_R_TYPE (internal_relocs->r_info) == R_LM32_16_GOT)
+diff --git a/bfd/elf32-m32c.c b/bfd/elf32-m32c.c
+index cf7ad99..bcdb55d 100644
+--- a/bfd/elf32-m32c.c
++++ b/bfd/elf32-m32c.c
+@@ -434,7 +434,7 @@ m32c_elf_relocate_section
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c
+index 51ef61e..b151a8a 100644
+--- a/bfd/elf32-m32r.c
++++ b/bfd/elf32-m32r.c
+@@ -2616,7 +2616,7 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c
+index 961dce4..4b9a1c0 100644
+--- a/bfd/elf32-m68hc1x.c
++++ b/bfd/elf32-m68hc1x.c
+@@ -970,7 +970,7 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ is_far = (h && (h->other & STO_M68HC12_FAR));
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c
+index 612525c..518a41a 100644
+--- a/bfd/elf32-m68k.c
++++ b/bfd/elf32-m68k.c
+@@ -2816,6 +2816,11 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
+ case R_68K_8:
+ case R_68K_16:
+ case R_68K_32:
++ /* We don't need to handle relocs into sections not going into
++ the "real" output. */
++ if ((sec->flags & SEC_ALLOC) == 0)
++ break;
++
+ if (h != NULL)
+ {
+ /* Make sure a plt entry is created for this symbol if it
+@@ -2829,8 +2834,7 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
+
+ /* If we are creating a shared library, we need to copy the
+ reloc into the shared library. */
+- if (info->shared
+- && (sec->flags & SEC_ALLOC) != 0)
++ if (info->shared)
+ {
+ /* When creating a shared object, we must copy these
+ reloc types into the output file. We create a reloc
+@@ -3713,7 +3717,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-mcore.c b/bfd/elf32-mcore.c
+index 31cc095..02aef53 100644
+--- a/bfd/elf32-mcore.c
++++ b/bfd/elf32-mcore.c
+@@ -466,7 +466,7 @@ mcore_elf_relocate_section (bfd * output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-mep.c b/bfd/elf32-mep.c
+index 6fecb25..e5104b3 100644
+--- a/bfd/elf32-mep.c
++++ b/bfd/elf32-mep.c
+@@ -500,7 +500,7 @@ mep_elf_relocate_section
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
+index fd3d4ba..61e8b45 100644
+--- a/bfd/elf32-mips.c
++++ b/bfd/elf32-mips.c
+@@ -830,6 +830,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS general dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_GD, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GD", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_LDM, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_LDM", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_HI16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_LO16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GOTTPREL", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_HI16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_LO16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
+ };
+
+ static reloc_howto_type elf_micromips_howto_table_rel[] =
+@@ -1796,6 +1901,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
+ { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
+ { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
+ { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
++ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
++ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
+ };
+
+ static const struct elf_reloc_map micromips_reloc_map[] =
+diff --git a/bfd/elf32-moxie.c b/bfd/elf32-moxie.c
+index 8463599..c340826 100644
+--- a/bfd/elf32-moxie.c
++++ b/bfd/elf32-moxie.c
+@@ -250,7 +250,7 @@ moxie_elf_relocate_section (bfd *output_bfd,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c
+index 9a5fb2a..2fa70d9 100644
+--- a/bfd/elf32-msp430.c
++++ b/bfd/elf32-msp430.c
+@@ -454,7 +454,7 @@ elf32_msp430_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-mt.c b/bfd/elf32-mt.c
+index 1be5d00..b87995e 100644
+--- a/bfd/elf32-mt.c
++++ b/bfd/elf32-mt.c
+@@ -354,7 +354,7 @@ mt_elf_relocate_section
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-openrisc.c b/bfd/elf32-openrisc.c
+index ada738e..e441f4d 100644
+--- a/bfd/elf32-openrisc.c
++++ b/bfd/elf32-openrisc.c
+@@ -373,7 +373,7 @@ openrisc_elf_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
+index 0c25c3e..d3925af 100644
+--- a/bfd/elf32-ppc.c
++++ b/bfd/elf32-ppc.c
+@@ -2987,10 +2987,6 @@ ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
+ edir->elf.needs_plt |= eind->elf.needs_plt;
+ edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
+
+- /* If we were called to copy over info for a weak sym, that's all. */
+- if (eind->elf.root.type != bfd_link_hash_indirect)
+- return;
+-
+ if (eind->dyn_relocs != NULL)
+ {
+ if (edir->dyn_relocs != NULL)
+@@ -3022,6 +3018,16 @@ ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
+ eind->dyn_relocs = NULL;
+ }
+
++ /* If we were called to copy over info for a weak sym, that's all.
++ You might think dyn_relocs need not be copied over; After all,
++ both syms will be dynamic or both non-dynamic so we're just
++ moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
++ code in ppc_elf_adjust_dynamic_symbol needs to check for
++ dyn_relocs in read-only sections, and it does so on what is the
++ DIR sym here. */
++ if (eind->elf.root.type != bfd_link_hash_indirect)
++ return;
++
+ /* Copy over the GOT refcount entries that we may have already seen to
+ the symbol which just became indirect. */
+ edir->elf.got.refcount += eind->elf.got.refcount;
+@@ -6225,7 +6231,7 @@ ppc_elf_relax_section (bfd *abfd,
+ attribute for a code section, and we are only looking at
+ branches. However, implement it correctly here as a
+ reference for other target relax_section functions. */
+- if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ /* At this stage in linking, no SEC_MERGE symbol has been
+ adjusted, so all references to such symbols need to be
+@@ -6880,7 +6886,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
+ sym_name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ {
+ /* For relocs against symbols from removed linkonce sections,
+ or sections discarded by a linker script, we just want the
+@@ -9048,7 +9054,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
+ BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
+ == htab->glink_eh_frame->size);
+
+- if (htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
++ if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
+ && !_bfd_elf_write_section_eh_frame (output_bfd, info,
+ htab->glink_eh_frame,
+ htab->glink_eh_frame->contents))
+diff --git a/bfd/elf32-rx.c b/bfd/elf32-rx.c
+index f049f6e..32820b4 100644
+--- a/bfd/elf32-rx.c
++++ b/bfd/elf32-rx.c
+@@ -510,7 +510,7 @@ rx_elf_relocate_section
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -1588,7 +1588,7 @@ rx_offset_for_reloc (bfd * abfd,
+ if (ssec)
+ {
+ if ((ssec->flags & SEC_MERGE)
+- && ssec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ && ssec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ symval = _bfd_merged_section_offset (abfd, & ssec,
+ elf_section_data (ssec)->sec_info,
+ symval);
+diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
+index 98437d0..11fb072 100644
+--- a/bfd/elf32-s390.c
++++ b/bfd/elf32-s390.c
+@@ -2282,7 +2282,7 @@ elf_s390_relocate_section (output_bfd, info, input_bfd, input_section,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c
+index b437624..ef849aa 100644
+--- a/bfd/elf32-score.c
++++ b/bfd/elf32-score.c
+@@ -2672,7 +2672,7 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-score7.c b/bfd/elf32-score7.c
+index 3e98bfc..3d228f3 100644
+--- a/bfd/elf32-score7.c
++++ b/bfd/elf32-score7.c
+@@ -2443,7 +2443,7 @@ s7_bfd_score_elf_relocate_section (bfd *output_bfd,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
+index ca2c4af..e56c3b5 100644
+--- a/bfd/elf32-sh.c
++++ b/bfd/elf32-sh.c
+@@ -4048,7 +4048,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
+ input_bfd, input_section, rel->r_offset));
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ /* Handled below. */
+ ;
+ else if (info->relocatable)
+@@ -4236,7 +4236,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
+index ae3ed10..40a9da2 100644
+--- a/bfd/elf32-spu.c
++++ b/bfd/elf32-spu.c
+@@ -4895,7 +4895,7 @@ spu_elf_relocate_section (bfd *output_bfd,
+ sym_name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
+index 19287fe..a879d3c 100644
+--- a/bfd/elf32-tic6x.c
++++ b/bfd/elf32-tic6x.c
+@@ -2334,7 +2334,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -4018,6 +4018,9 @@ elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
+ if (!_bfd_generic_verify_endian_match (ibfd, obfd))
+ return FALSE;
+
++ if (! is_tic6x_elf (ibfd) || ! is_tic6x_elf (obfd))
++ return TRUE;
++
+ if (!elf32_tic6x_merge_attributes (ibfd, obfd))
+ return FALSE;
+
+diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c
+index f2aed9c..a4e565d 100644
+--- a/bfd/elf32-tilepro.c
++++ b/bfd/elf32-tilepro.c
+@@ -2594,7 +2594,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c
+index 9e6f77d..0fbe080 100644
+--- a/bfd/elf32-v850.c
++++ b/bfd/elf32-v850.c
+@@ -2093,7 +2093,7 @@ v850_elf_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c
+index 643381c..fc3cb7c 100644
+--- a/bfd/elf32-vax.c
++++ b/bfd/elf32-vax.c
+@@ -1450,7 +1450,7 @@ elf_vax_relocate_section (bfd *output_bfd,
+ relocation = 0;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-xc16x.c b/bfd/elf32-xc16x.c
+index 11d9840..00c7841 100644
+--- a/bfd/elf32-xc16x.c
++++ b/bfd/elf32-xc16x.c
+@@ -381,7 +381,7 @@ elf32_xc16x_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ {
+ /* For relocs against symbols from removed linkonce sections,
+ or sections discarded by a linker script, we just want the
+diff --git a/bfd/elf32-xstormy16.c b/bfd/elf32-xstormy16.c
+index 6141783..86e1d5b 100644
+--- a/bfd/elf32-xstormy16.c
++++ b/bfd/elf32-xstormy16.c
+@@ -825,7 +825,7 @@ xstormy16_elf_relocate_section (bfd * output_bfd ATTRIBUTE_UNU
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
+index c6e4fb4..5a51eae 100644
+--- a/bfd/elf32-xtensa.c
++++ b/bfd/elf32-xtensa.c
+@@ -1712,7 +1712,7 @@ elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+ continue;
+ for (s = abfd->sections; s != NULL; s = s->next)
+ {
+- if (! elf_discarded_section (s)
++ if (! discarded_section (s)
+ && xtensa_is_littable_section (s)
+ && s != spltlittbl)
+ sgotloc->size += s->size;
+@@ -2656,7 +2656,7 @@ elf_xtensa_relocate_section (bfd *output_bfd,
+ sym_type = h->type;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -8960,9 +8960,9 @@ relax_section (bfd *abfd, asection *sec, struct bfd_link_info *link_info)
+ that here and adjust things accordingly. */
+ if (! elf_xtensa_ignore_discarded_relocs (sec)
+ && elf_xtensa_action_discarded (sec) == PRETEND
+- && sec->sec_info_type != ELF_INFO_TYPE_STABS
++ && sec->sec_info_type != SEC_INFO_TYPE_STABS
+ && target_sec != NULL
+- && elf_discarded_section (target_sec))
++ && discarded_section (target_sec))
+ {
+ /* It would be natural to call _bfd_elf_check_kept_section
+ here, but it's not exported from elflink.c. It's also a
+diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
+index 6076709..ddb1cd7 100644
+--- a/bfd/elf64-alpha.c
++++ b/bfd/elf64-alpha.c
+@@ -4106,7 +4106,7 @@ elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
+ sec = h->root.u.def.section;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend,
+ elf64_alpha_howto_table + r_type,
+@@ -4263,7 +4263,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ unless it has been done already. */
+ if ((sec->flags & SEC_MERGE)
+ && ELF_ST_TYPE (sym->st_info) == STT_SECTION
+- && sec->sec_info_type == ELF_INFO_TYPE_MERGE
++ && sec->sec_info_type == SEC_INFO_TYPE_MERGE
+ && gotent
+ && !gotent->reloc_xlated)
+ {
+@@ -4315,7 +4315,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ gotent = h->got_entries;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -4717,7 +4717,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+
+ if (r_symndx < symtab_hdr->sh_info
+ && sec != NULL && howto->pc_relative
+- && elf_discarded_section (sec))
++ && discarded_section (sec))
+ break;
+
+ if (h != NULL)
+diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
+index 057a92d..9d2dfcf 100644
+--- a/bfd/elf64-hppa.c
++++ b/bfd/elf64-hppa.c
+@@ -3919,7 +3919,7 @@ elf64_hppa_relocate_section (bfd *output_bfd,
+ }
+ }
+
+- if (sym_sec != NULL && elf_discarded_section (sym_sec))
++ if (sym_sec != NULL && discarded_section (sym_sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
+index 3feb1bb..bdd0c19 100644
+--- a/bfd/elf64-mips.c
++++ b/bfd/elf64-mips.c
+@@ -1590,6 +1590,111 @@ static reloc_howto_type mips16_elf64_howto_table_rel[] =
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS general dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_GD, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GD", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_LDM, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_LDM", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_HI16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_LO16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GOTTPREL", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_HI16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_LO16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
+ };
+
+ static reloc_howto_type mips16_elf64_howto_table_rela[] =
+@@ -1686,6 +1791,111 @@ static reloc_howto_type mips16_elf64_howto_table_rela[] =
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS general dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_GD, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GD", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_LDM, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_LDM", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_HI16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_LO16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GOTTPREL", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_HI16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_LO16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
+ };
+
+ static reloc_howto_type micromips_elf64_howto_table_rel[] =
+@@ -2908,6 +3118,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
+ { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
+ { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
+ { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
++ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
++ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
+ };
+
+ static const struct elf_reloc_map micromips_reloc_map[] =
+diff --git a/bfd/elf64-mmix.c b/bfd/elf64-mmix.c
+index ecc9ad0..9cc407f 100644
+--- a/bfd/elf64-mmix.c
++++ b/bfd/elf64-mmix.c
+@@ -1475,7 +1475,7 @@ mmix_elf_relocate_section (output_bfd, info, input_bfd, input_section,
+ name = h->root.root.string;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
+index 93d1314..52e9ce9 100644
+--- a/bfd/elf64-ppc.c
++++ b/bfd/elf64-ppc.c
+@@ -4435,10 +4435,6 @@ ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
+ edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
+ edir->elf.needs_plt |= eind->elf.needs_plt;
+
+- /* If we were called to copy over info for a weak sym, that's all. */
+- if (eind->elf.root.type != bfd_link_hash_indirect)
+- return;
+-
+ /* Copy over any dynamic relocs we may have on the indirect sym. */
+ if (eind->dyn_relocs != NULL)
+ {
+@@ -4471,6 +4467,16 @@ ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
+ eind->dyn_relocs = NULL;
+ }
+
++ /* If we were called to copy over info for a weak sym, that's all.
++ You might think dyn_relocs need not be copied over; After all,
++ both syms will be dynamic or both non-dynamic so we're just
++ moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
++ code in ppc64_elf_adjust_dynamic_symbol needs to check for
++ dyn_relocs in read-only sections, and it does so on what is the
++ DIR sym here. */
++ if (eind->elf.root.type != bfd_link_hash_indirect)
++ return;
++
+ /* Copy over got entries that we may have already seen to the
+ symbol which just became indirect. */
+ if (eind->elf.got.glist != NULL)
+@@ -6846,7 +6852,7 @@ adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
+ if (dsec == NULL)
+ {
+ for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
+- if (elf_discarded_section (dsec))
++ if (discarded_section (dsec))
+ {
+ ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
+ break;
+@@ -7027,7 +7033,7 @@ ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
+ if (sec == NULL || sec->size == 0)
+ continue;
+
+- if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
++ if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
+ continue;
+
+ if (sec->output_section == bfd_abs_section_ptr)
+@@ -8071,8 +8077,8 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
+ toc = bfd_get_section_by_name (ibfd, ".toc");
+ if (toc == NULL
+ || toc->size == 0
+- || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
+- || elf_discarded_section (toc))
++ || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
++ || discarded_section (toc))
+ continue;
+
+ toc_relocs = NULL;
+@@ -8085,7 +8091,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
+ for (sec = ibfd->sections; sec != NULL; sec = sec->next)
+ {
+ if (sec->reloc_count == 0
+- || !elf_discarded_section (sec)
++ || !discarded_section (sec)
+ || get_opd_info (sec)
+ || (sec->flags & SEC_ALLOC) == 0
+ || (sec->flags & SEC_DEBUGGING) != 0)
+@@ -8195,7 +8201,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
+ goto error_ret;
+
+ if (sym_sec == NULL
+- || elf_discarded_section (sym_sec))
++ || discarded_section (sym_sec))
+ continue;
+
+ if (!SYMBOL_CALLS_LOCAL (info, h))
+@@ -8275,7 +8281,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
+ int repeat;
+
+ if (sec->reloc_count == 0
+- || elf_discarded_section (sec)
++ || discarded_section (sec)
+ || get_opd_info (sec)
+ || (sec->flags & SEC_ALLOC) == 0
+ || (sec->flags & SEC_DEBUGGING) != 0)
+@@ -8497,7 +8503,7 @@ ppc64_elf_edit_toc (struct bfd_link_info *info)
+ for (sec = ibfd->sections; sec != NULL; sec = sec->next)
+ {
+ if (sec->reloc_count == 0
+- || elf_discarded_section (sec))
++ || discarded_section (sec))
+ continue;
+
+ relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
+@@ -12030,7 +12036,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
+ }
+ h = (struct ppc_link_hash_entry *) h_elf;
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend,
+ ppc64_elf_howto_table[r_type],
+@@ -13859,7 +13865,7 @@ ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
+
+
+ if (htab->glink_eh_frame != NULL
+- && htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
++ && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
+ && !_bfd_elf_write_section_eh_frame (output_bfd, info,
+ htab->glink_eh_frame,
+ htab->glink_eh_frame->contents))
+diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
+index 9884da0..e9138a6 100644
+--- a/bfd/elf64-s390.c
++++ b/bfd/elf64-s390.c
+@@ -2270,7 +2270,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c
+index bbef2a2..d8f2120 100644
+--- a/bfd/elf64-sh64.c
++++ b/bfd/elf64-sh64.c
+@@ -1514,7 +1514,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ _("Unexpected STO_SH5_ISA32 on local symbol is not handled"),
+ input_bfd, input_section, rel->r_offset));
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ /* Handled below. */
+ ;
+ else if (info->relocatable)
+@@ -1657,7 +1657,7 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
+index 3a2444b..9d826e7 100644
+--- a/bfd/elf64-x86-64.c
++++ b/bfd/elf64-x86-64.c
+@@ -3062,7 +3062,7 @@ elf_x86_64_relocate_section (bfd *output_bfd,
+ unresolved_reloc, warned);
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -3460,7 +3460,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
+ case R_X86_64_PC16:
+ case R_X86_64_PC32:
+ if (info->shared
+- && ABI_64_P (output_bfd)
+ && (input_section->flags & SEC_ALLOC) != 0
+ && (input_section->flags & SEC_READONLY) != 0
+ && h != NULL)
+@@ -4626,7 +4625,7 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
+ + PLT_FDE_START_OFFSET);
+ }
+ if (htab->plt_eh_frame->sec_info_type
+- == ELF_INFO_TYPE_EH_FRAME)
++ == SEC_INFO_TYPE_EH_FRAME)
+ {
+ if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
+ htab->plt_eh_frame,
+diff --git a/bfd/elflink.c b/bfd/elflink.c
+index fc4266b..da6be48 100644
+--- a/bfd/elflink.c
++++ b/bfd/elflink.c
+@@ -1,6 +1,6 @@
+ /* ELF linking support for BFD.
+ Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+- 2005, 2006, 2007, 2008, 2009, 2010, 2011
++ 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+ Free Software Foundation, Inc.
+
+ This file is part of BFD, the Binary File Descriptor library.
+@@ -937,7 +937,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
+ /* Silently discard TLS symbols from --just-syms. There's no way to
+ combine a static TLS block with a new TLS block for this executable. */
+ if (ELF_ST_TYPE (sym->st_info) == STT_TLS
+- && sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
++ && sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
+ {
+ *skip = TRUE;
+ return TRUE;
+@@ -2708,7 +2708,7 @@ _bfd_elf_link_sec_merge_syms (struct elf_link_hash_entry *h, void *data)
+ if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && ((sec = h->root.u.def.section)->flags & SEC_MERGE)
+- && sec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ && sec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ bfd *output_bfd = (bfd *) data;
+
+@@ -3499,7 +3499,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
+ /* ld --just-symbols and dynamic objects don't mix very well.
+ ld shouldn't allow it. */
+ if ((s = abfd->sections) != NULL
+- && s->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
++ && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
+ abort ();
+
+ /* If this dynamic lib was specified on the command line with
+@@ -3896,7 +3896,7 @@ error_free_dyn:
+ sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
+ if (sec == NULL)
+ sec = bfd_abs_section_ptr;
+- else if (elf_discarded_section (sec))
++ else if (discarded_section (sec))
+ {
+ /* Symbols from discarded section are undefined. We keep
+ its visibility. */
+@@ -4861,7 +4861,7 @@ error_free_dyn:
+ &string_offset))
+ goto error_return;
+ if (secdata->sec_info)
+- stab->sec_info_type = ELF_INFO_TYPE_STABS;
++ stab->sec_info_type = SEC_INFO_TYPE_STABS;
+ }
+ }
+ }
+@@ -6644,25 +6644,14 @@ bfd_elf_size_dynsym_hash_dynstr (bfd *output_bfd, struct bfd_link_info *info)
+ return TRUE;
+ }
+
+-/* Indicate that we are only retrieving symbol values from this
+- section. */
+-
+-void
+-_bfd_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
+-{
+- if (is_elf_hash_table (info->hash))
+- sec->sec_info_type = ELF_INFO_TYPE_JUST_SYMS;
+- _bfd_generic_link_just_syms (sec, info);
+-}
+-
+ /* Make sure sec_info_type is cleared if sec_info is cleared too. */
+
+ static void
+ merge_sections_remove_hook (bfd *abfd ATTRIBUTE_UNUSED,
+ asection *sec)
+ {
+- BFD_ASSERT (sec->sec_info_type == ELF_INFO_TYPE_MERGE);
+- sec->sec_info_type = ELF_INFO_TYPE_NONE;
++ BFD_ASSERT (sec->sec_info_type == SEC_INFO_TYPE_MERGE);
++ sec->sec_info_type = SEC_INFO_TYPE_NONE;
+ }
+
+ /* Finish SHF_MERGE section merging. */
+@@ -6690,7 +6679,7 @@ _bfd_elf_merge_sections (bfd *abfd, struct bfd_link_info *info)
+ sec, &secdata->sec_info))
+ return FALSE;
+ else if (secdata->sec_info)
+- sec->sec_info_type = ELF_INFO_TYPE_MERGE;
++ sec->sec_info_type = SEC_INFO_TYPE_MERGE;
+ }
+
+ if (elf_hash_table (info)->merge_info != NULL)
+@@ -8708,7 +8697,7 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
+ else if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+ && ((finfo->info->strip_discarded
+- && elf_discarded_section (h->root.u.def.section))
++ && discarded_section (h->root.u.def.section))
+ || (h->root.u.def.section->owner != NULL
+ && (h->root.u.def.section->owner->flags & BFD_PLUGIN) != 0)))
+ strip = TRUE;
+@@ -9007,8 +8996,8 @@ elf_section_ignore_discarded_relocs (asection *sec)
+
+ switch (sec->sec_info_type)
+ {
+- case ELF_INFO_TYPE_STABS:
+- case ELF_INFO_TYPE_EH_FRAME:
++ case SEC_INFO_TYPE_STABS:
++ case SEC_INFO_TYPE_EH_FRAME:
+ return TRUE;
+ default:
+ break;
+@@ -9193,7 +9182,7 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
+ *ppsection = NULL;
+ continue;
+ }
+- else if (isec->sec_info_type == ELF_INFO_TYPE_MERGE
++ else if (isec->sec_info_type == SEC_INFO_TYPE_MERGE
+ && ELF_ST_TYPE (isym->st_info) != STT_SECTION)
+ isym->st_value =
+ _bfd_merged_section_offset (output_bfd, &isec,
+@@ -9537,7 +9526,7 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
+ {
+ /* Complain if the definition comes from a
+ discarded section. */
+- if ((sec = *ps) != NULL && elf_discarded_section (sec))
++ if ((sec = *ps) != NULL && discarded_section (sec))
+ {
+ BFD_ASSERT (r_symndx != STN_UNDEF);
+ if (action_discarded & COMPLAIN)
+@@ -9874,19 +9863,19 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
+ }
+ else switch (o->sec_info_type)
+ {
+- case ELF_INFO_TYPE_STABS:
++ case SEC_INFO_TYPE_STABS:
+ if (! (_bfd_write_section_stabs
+ (output_bfd,
+ &elf_hash_table (finfo->info)->stab_info,
+ o, &elf_section_data (o)->sec_info, contents)))
+ return FALSE;
+ break;
+- case ELF_INFO_TYPE_MERGE:
++ case SEC_INFO_TYPE_MERGE:
+ if (! _bfd_write_merged_section (output_bfd, o,
+ elf_section_data (o)->sec_info))
+ return FALSE;
+ break;
+- case ELF_INFO_TYPE_EH_FRAME:
++ case SEC_INFO_TYPE_EH_FRAME:
+ {
+ if (! _bfd_elf_write_section_eh_frame (output_bfd, finfo->info,
+ o, contents))
+@@ -11188,15 +11177,12 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
+ goto error_return;
+
+ /* Check for DT_TEXTREL (late, in case the backend removes it). */
+- if ((info->warn_shared_textrel && info->shared)
+- || info->error_textrel)
++ if (((info->warn_shared_textrel && info->shared)
++ || info->error_textrel)
++ && (o = bfd_get_section_by_name (dynobj, ".dynamic")) != NULL)
+ {
+ bfd_byte *dyncon, *dynconend;
+
+- /* Fix up .dynamic entries. */
+- o = bfd_get_section_by_name (dynobj, ".dynamic");
+- BFD_ASSERT (o != NULL);
+-
+ dyncon = o->contents;
+ dynconend = o->contents + o->size;
+ for (; dyncon < dynconend; dyncon += bed->s->sizeof_dyn)
+@@ -12418,7 +12404,7 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
+
+ if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak)
+- && elf_discarded_section (h->root.u.def.section))
++ && discarded_section (h->root.u.def.section))
+ return TRUE;
+ else
+ return FALSE;
+@@ -12434,7 +12420,7 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
+ /* Need to: get the symbol; get the section. */
+ isym = &rcookie->locsyms[r_symndx];
+ isec = bfd_section_from_elf_index (rcookie->abfd, isym->st_shndx);
+- if (isec != NULL && elf_discarded_section (isec))
++ if (isec != NULL && discarded_section (isec))
+ return TRUE;
+ }
+ return FALSE;
+@@ -12485,7 +12471,7 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
+ if (stab != NULL
+ && (stab->size == 0
+ || bfd_is_abs_section (stab->output_section)
+- || stab->sec_info_type != ELF_INFO_TYPE_STABS))
++ || stab->sec_info_type != SEC_INFO_TYPE_STABS))
+ stab = NULL;
+
+ if (stab == NULL
+diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
+index 00ec8b0..2189566 100644
+--- a/bfd/elfn32-mips.c
++++ b/bfd/elfn32-mips.c
+@@ -1555,6 +1555,111 @@ static reloc_howto_type elf_mips16_howto_table_rel[] =
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS general dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_GD, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GD", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_LDM, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_LDM", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_HI16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_LO16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GOTTPREL", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_HI16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_LO16", /* name */
++ TRUE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
+ };
+
+ static reloc_howto_type elf_mips16_howto_table_rela[] =
+@@ -1651,6 +1756,111 @@ static reloc_howto_type elf_mips16_howto_table_rela[] =
+ 0x0000ffff, /* src_mask */
+ 0x0000ffff, /* dst_mask */
+ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS general dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_GD, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GD", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic variable reference. */
++ HOWTO (R_MIPS16_TLS_LDM, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_LDM", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_HI16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS local dynamic offset. */
++ HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_DTPREL_LO16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_GOTTPREL", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_HI16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
++
++ /* MIPS16 TLS thread pointer offset. */
++ HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
++ 0, /* rightshift */
++ 2, /* size (0 = byte, 1 = short, 2 = long) */
++ 16, /* bitsize */
++ FALSE, /* pc_relative */
++ 0, /* bitpos */
++ complain_overflow_signed, /* complain_on_overflow */
++ _bfd_mips_elf_generic_reloc, /* special_function */
++ "R_MIPS16_TLS_TPREL_LO16", /* name */
++ FALSE, /* partial_inplace */
++ 0x0000ffff, /* src_mask */
++ 0x0000ffff, /* dst_mask */
++ FALSE), /* pcrel_offset */
+ };
+
+ static reloc_howto_type elf_micromips_howto_table_rel[] =
+@@ -2724,6 +2934,15 @@ static const struct elf_reloc_map mips16_reloc_map[] =
+ { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
+ { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
+ { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
++ R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
++ R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
++ { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
+ };
+
+ static const struct elf_reloc_map micromips_reloc_map[] =
+diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c
+index 3e2ee0b..0f6b720 100644
+--- a/bfd/elfnn-ia64.c
++++ b/bfd/elfnn-ia64.c
+@@ -530,7 +530,7 @@ elfNN_ia64_relax_section (bfd *abfd, asection *sec,
+ symtype = h->type;
+ }
+
+- if (tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ /* At this stage in linking, no SEC_MERGE symbol has been
+ adjusted, so all references to such symbols need to be
+@@ -3861,7 +3861,7 @@ elfNN_ia64_relocate_section (bfd *output_bfd,
+ if (!info->relocatable
+ && (sym_sec->flags & SEC_MERGE) != 0
+ && ELF_ST_TYPE (sym->st_info) == STT_SECTION
+- && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE)
++ && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
+ {
+ struct elfNN_ia64_local_hash_entry *loc_h;
+
+@@ -3919,7 +3919,7 @@ elfNN_ia64_relocate_section (bfd *output_bfd,
+ continue;
+ }
+
+- if (sym_sec != NULL && elf_discarded_section (sym_sec))
++ if (sym_sec != NULL && discarded_section (sym_sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
+index 33a454d..7911050 100644
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -436,8 +436,8 @@ struct mips_elf_link_hash_table
+ entry is set to the address of __rld_obj_head as in IRIX5. */
+ bfd_boolean use_rld_obj_head;
+
+- /* This is the value of the __rld_map or __rld_obj_head symbol. */
+- bfd_vma rld_value;
++ /* The __rld_map or __rld_obj_head symbol. */
++ struct elf_link_hash_entry *rld_symbol;
+
+ /* This is set if we see any mips16 stub sections. */
+ bfd_boolean mips16_stubs_seen;
+@@ -529,6 +529,13 @@ struct mips_htab_traverse_info
+ || r_type == R_MIPS_TLS_TPREL64 \
+ || r_type == R_MIPS_TLS_TPREL_HI16 \
+ || r_type == R_MIPS_TLS_TPREL_LO16 \
++ || r_type == R_MIPS16_TLS_GD \
++ || r_type == R_MIPS16_TLS_LDM \
++ || r_type == R_MIPS16_TLS_DTPREL_HI16 \
++ || r_type == R_MIPS16_TLS_DTPREL_LO16 \
++ || r_type == R_MIPS16_TLS_GOTTPREL \
++ || r_type == R_MIPS16_TLS_TPREL_HI16 \
++ || r_type == R_MIPS16_TLS_TPREL_LO16 \
+ || r_type == R_MICROMIPS_TLS_GD \
+ || r_type == R_MICROMIPS_TLS_LDM \
+ || r_type == R_MICROMIPS_TLS_DTPREL_HI16 \
+@@ -768,6 +775,10 @@ static bfd *reldyn_sorting_bfd;
+ #define MIPS_ELF_GOT_SIZE(abfd) \
+ (get_elf_backend_data (abfd)->s->arch_size / 8)
+
++/* The size of the .rld_map section. */
++#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
++ (get_elf_backend_data (abfd)->s->arch_size / 8)
++
+ /* The size of a symbol-table entry. */
+ #define MIPS_ELF_SYM_SIZE(abfd) \
+ (get_elf_backend_data (abfd)->s->sizeof_sym)
+@@ -1571,9 +1582,10 @@ _bfd_mips_elf_init_stubs (struct bfd_link_info *info,
+ }
+
+ /* Return true if H is a locally-defined PIC function, in the sense
+- that it might need $25 to be valid on entry. Note that MIPS16
+- functions never need $25 to be valid on entry; they set up $gp
+- using PC-relative instructions instead. */
++ that it or its fn_stub might need $25 to be valid on entry.
++ Note that MIPS16 functions set up $gp using PC-relative instructions,
++ so they themselves never need $25 to be valid. Only non-MIPS16
++ entry points are of interest here. */
+
+ static bfd_boolean
+ mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
+@@ -1582,11 +1594,32 @@ mips_elf_local_pic_function_p (struct mips_elf_link_hash_entry *h)
+ || h->root.root.type == bfd_link_hash_defweak)
+ && h->root.def_regular
+ && !bfd_is_abs_section (h->root.root.u.def.section)
+- && !ELF_ST_IS_MIPS16 (h->root.other)
++ && (!ELF_ST_IS_MIPS16 (h->root.other)
++ || (h->fn_stub && h->need_fn_stub))
+ && (PIC_OBJECT_P (h->root.root.u.def.section->owner)
+ || ELF_ST_IS_MIPS_PIC (h->root.other)));
+ }
+
++/* Set *SEC to the input section that contains the target of STUB.
++ Return the offset of the target from the start of that section. */
++
++static bfd_vma
++mips_elf_get_la25_target (struct mips_elf_la25_stub *stub,
++ asection **sec)
++{
++ if (ELF_ST_IS_MIPS16 (stub->h->root.other))
++ {
++ BFD_ASSERT (stub->h->need_fn_stub);
++ *sec = stub->h->fn_stub;
++ return 0;
++ }
++ else
++ {
++ *sec = stub->h->root.root.u.def.section;
++ return stub->h->root.root.u.def.value;
++ }
++}
++
+ /* STUB describes an la25 stub that we have decided to implement
+ by inserting an LUI/ADDIU pair before the target function.
+ Create the section and redirect the function symbol to it. */
+@@ -1611,7 +1644,7 @@ mips_elf_add_la25_intro (struct mips_elf_la25_stub *stub,
+ sprintf (name, ".text.stub.%d", (int) htab_elements (htab->la25_stubs));
+
+ /* Create the section. */
+- input_section = stub->h->root.root.u.def.section;
++ mips_elf_get_la25_target (stub, &input_section);
+ s = htab->add_stub_section (name, input_section,
+ input_section->output_section);
+ if (s == NULL)
+@@ -1685,12 +1718,6 @@ mips_elf_add_la25_stub (struct bfd_link_info *info,
+ bfd_vma value;
+ void **slot;
+
+- /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
+- of the section and if we would need no more than 2 nops. */
+- s = h->root.root.u.def.section;
+- value = h->root.root.u.def.value;
+- use_trampoline_p = (value != 0 || s->alignment_power > 4);
+-
+ /* Describe the stub we want. */
+ search.stub_section = NULL;
+ search.offset = 0;
+@@ -1720,6 +1747,11 @@ mips_elf_add_la25_stub (struct bfd_link_info *info,
+ *stub = search;
+ *slot = stub;
+
++ /* Prefer to use LUI/ADDIU stubs if the function is at the beginning
++ of the section and if we would need no more than 2 nops. */
++ value = mips_elf_get_la25_target (stub, &s);
++ use_trampoline_p = (value != 0 || s->alignment_power > 4);
++
+ h->la25_stub = stub;
+ return (use_trampoline_p
+ ? mips_elf_add_la25_trampoline (stub, info)
+@@ -1860,6 +1892,13 @@ mips16_reloc_p (int r_type)
+ case R_MIPS16_CALL16:
+ case R_MIPS16_HI16:
+ case R_MIPS16_LO16:
++ case R_MIPS16_TLS_GD:
++ case R_MIPS16_TLS_LDM:
++ case R_MIPS16_TLS_DTPREL_HI16:
++ case R_MIPS16_TLS_DTPREL_LO16:
++ case R_MIPS16_TLS_GOTTPREL:
++ case R_MIPS16_TLS_TPREL_HI16:
++ case R_MIPS16_TLS_TPREL_LO16:
+ return TRUE;
+
+ default:
+@@ -1987,19 +2026,25 @@ micromips_branch_reloc_p (int r_type)
+ static inline bfd_boolean
+ tls_gd_reloc_p (unsigned int r_type)
+ {
+- return r_type == R_MIPS_TLS_GD || r_type == R_MICROMIPS_TLS_GD;
++ return (r_type == R_MIPS_TLS_GD
++ || r_type == R_MIPS16_TLS_GD
++ || r_type == R_MICROMIPS_TLS_GD);
+ }
+
+ static inline bfd_boolean
+ tls_ldm_reloc_p (unsigned int r_type)
+ {
+- return r_type == R_MIPS_TLS_LDM || r_type == R_MICROMIPS_TLS_LDM;
++ return (r_type == R_MIPS_TLS_LDM
++ || r_type == R_MIPS16_TLS_LDM
++ || r_type == R_MICROMIPS_TLS_LDM);
+ }
+
+ static inline bfd_boolean
+ tls_gottprel_reloc_p (unsigned int r_type)
+ {
+- return r_type == R_MIPS_TLS_GOTTPREL || r_type == R_MICROMIPS_TLS_GOTTPREL;
++ return (r_type == R_MIPS_TLS_GOTTPREL
++ || r_type == R_MIPS16_TLS_GOTTPREL
++ || r_type == R_MICROMIPS_TLS_GOTTPREL);
+ }
+
+ void
+@@ -4907,7 +4952,8 @@ is_gott_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h)
+ stub. */
+
+ static bfd_boolean
+-mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type)
++mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type,
++ bfd_boolean target_is_16_bit_code_p)
+ {
+ /* We specifically ignore branches and jumps from EF_PIC objects,
+ where the onus is on the compiler or programmer to perform any
+@@ -4921,7 +4967,6 @@ mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type)
+ {
+ case R_MIPS_26:
+ case R_MIPS_PC16:
+- case R_MIPS16_26:
+ case R_MICROMIPS_26_S1:
+ case R_MICROMIPS_PC7_S1:
+ case R_MICROMIPS_PC10_S1:
+@@ -4929,6 +4974,9 @@ mips_elf_relocation_needs_la25_stub (bfd *input_bfd, int r_type)
+ case R_MICROMIPS_PC23_S2:
+ return TRUE;
+
++ case R_MIPS16_26:
++ return !target_is_16_bit_code_p;
++
+ default:
+ return FALSE;
+ }
+@@ -5189,14 +5237,28 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ have already noticed that we were going to need the
+ stub. */
+ if (local_p)
+- sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
++ {
++ sec = elf_tdata (input_bfd)->local_stubs[r_symndx];
++ value = 0;
++ }
+ else
+ {
+ BFD_ASSERT (h->need_fn_stub);
+- sec = h->fn_stub;
++ if (h->la25_stub)
++ {
++ /* If a LA25 header for the stub itself exists, point to the
++ prepended LUI/ADDIU sequence. */
++ sec = h->la25_stub->stub_section;
++ value = h->la25_stub->offset;
++ }
++ else
++ {
++ sec = h->fn_stub;
++ value = 0;
++ }
+ }
+
+- symbol = sec->output_section->vma + sec->output_offset;
++ symbol = sec->output_section->vma + sec->output_offset + value;
+ /* The target is 16-bit, but the stub isn't. */
+ target_is_16_bit_code_p = FALSE;
+ }
+@@ -5246,7 +5308,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ /* If this is a direct call to a PIC function, redirect to the
+ non-PIC stub. */
+ else if (h != NULL && h->la25_stub
+- && mips_elf_relocation_needs_la25_stub (input_bfd, r_type))
++ && mips_elf_relocation_needs_la25_stub (input_bfd, r_type,
++ target_is_16_bit_code_p))
+ symbol = (h->la25_stub->stub_section->output_section->vma
+ + h->la25_stub->stub_section->output_offset
+ + h->la25_stub->offset);
+@@ -5318,6 +5381,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ case R_MIPS_TLS_GD:
+ case R_MIPS_TLS_GOTTPREL:
+ case R_MIPS_TLS_LDM:
++ case R_MIPS16_TLS_GD:
++ case R_MIPS16_TLS_GOTTPREL:
++ case R_MIPS16_TLS_LDM:
+ case R_MICROMIPS_TLS_GD:
+ case R_MICROMIPS_TLS_GOTTPREL:
+ case R_MICROMIPS_TLS_LDM:
+@@ -5487,6 +5553,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ break;
+
+ case R_MIPS_TLS_DTPREL_HI16:
++ case R_MIPS16_TLS_DTPREL_HI16:
+ case R_MICROMIPS_TLS_DTPREL_HI16:
+ value = (mips_elf_high (addend + symbol - dtprel_base (info))
+ & howto->dst_mask);
+@@ -5495,17 +5562,22 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ case R_MIPS_TLS_DTPREL_LO16:
+ case R_MIPS_TLS_DTPREL32:
+ case R_MIPS_TLS_DTPREL64:
++ case R_MIPS16_TLS_DTPREL_LO16:
+ case R_MICROMIPS_TLS_DTPREL_LO16:
+ value = (symbol + addend - dtprel_base (info)) & howto->dst_mask;
+ break;
+
+ case R_MIPS_TLS_TPREL_HI16:
++ case R_MIPS16_TLS_TPREL_HI16:
+ case R_MICROMIPS_TLS_TPREL_HI16:
+ value = (mips_elf_high (addend + symbol - tprel_base (info))
+ & howto->dst_mask);
+ break;
+
+ case R_MIPS_TLS_TPREL_LO16:
++ case R_MIPS_TLS_TPREL32:
++ case R_MIPS_TLS_TPREL64:
++ case R_MIPS16_TLS_TPREL_LO16:
+ case R_MICROMIPS_TLS_TPREL_LO16:
+ value = (symbol + addend - tprel_base (info)) & howto->dst_mask;
+ break;
+@@ -5527,10 +5599,11 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ 12: addu $v0,$v1
+ 14: move $gp,$v0
+ So the offsets of hi and lo relocs are the same, but the
+- $pc is four higher than $t9 would be, so reduce
+- both reloc addends by 4. */
++ base $pc is that used by the ADDIUPC instruction at $t9 + 4.
++ ADDIUPC clears the low two bits of the instruction address,
++ so the base is ($t9 + 4) & ~3. */
+ if (r_type == R_MIPS16_HI16)
+- value = mips_elf_high (addend + gp - p - 4);
++ value = mips_elf_high (addend + gp - ((p + 4) & ~(bfd_vma) 0x3));
+ /* The microMIPS .cpload sequence uses the same assembly
+ instructions as the traditional psABI version, but the
+ incoming $t9 has the low bit set. */
+@@ -5553,7 +5626,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ /* See the comment for R_MIPS16_HI16 above for the reason
+ for this conditional. */
+ if (r_type == R_MIPS16_LO16)
+- value = addend + gp - p;
++ value = addend + gp - (p & ~(bfd_vma) 0x3);
+ else if (r_type == R_MICROMIPS_LO16
+ || r_type == R_MICROMIPS_HI0_LO16)
+ value = addend + gp - p + 3;
+@@ -5637,6 +5710,9 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
+ case R_MIPS_TLS_GOTTPREL:
+ case R_MIPS_TLS_LDM:
+ case R_MIPS_GOT_DISP:
++ case R_MIPS16_TLS_GD:
++ case R_MIPS16_TLS_GOTTPREL:
++ case R_MIPS16_TLS_LDM:
+ case R_MICROMIPS_TLS_GD:
+ case R_MICROMIPS_TLS_GOTTPREL:
+ case R_MICROMIPS_TLS_LDM:
+@@ -7081,6 +7157,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
+ return FALSE;
+
+ mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
++ mips_elf_hash_table (info)->rld_symbol = h;
+ }
+
+ /* If this is a mips16 text symbol, add 1 to the value to make it
+@@ -7266,6 +7343,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
+
+ if (! bfd_elf_link_record_dynamic_symbol (info, h))
+ return FALSE;
++ mips_elf_hash_table (info)->rld_symbol = h;
+ }
+ }
+
+@@ -7767,8 +7845,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ can_make_dynamic_p = FALSE;
+ switch (r_type)
+ {
+- case R_MIPS16_GOT16:
+- case R_MIPS16_CALL16:
+ case R_MIPS_GOT16:
+ case R_MIPS_CALL16:
+ case R_MIPS_CALL_HI16:
+@@ -7781,6 +7857,11 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ case R_MIPS_TLS_GOTTPREL:
+ case R_MIPS_TLS_GD:
+ case R_MIPS_TLS_LDM:
++ case R_MIPS16_GOT16:
++ case R_MIPS16_CALL16:
++ case R_MIPS16_TLS_GOTTPREL:
++ case R_MIPS16_TLS_GD:
++ case R_MIPS16_TLS_LDM:
+ case R_MICROMIPS_GOT16:
+ case R_MICROMIPS_CALL16:
+ case R_MICROMIPS_CALL_HI16:
+@@ -7918,7 +7999,9 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ return FALSE;
+ }
+
+- if (h != NULL && mips_elf_relocation_needs_la25_stub (abfd, r_type))
++ if (h != NULL
++ && mips_elf_relocation_needs_la25_stub (abfd, r_type,
++ ELF_ST_IS_MIPS16 (h->other)))
+ ((struct mips_elf_link_hash_entry *) h)->has_nonpic_branches = TRUE;
+
+ switch (r_type)
+@@ -8015,12 +8098,14 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ break;
+
+ case R_MIPS_TLS_GOTTPREL:
++ case R_MIPS16_TLS_GOTTPREL:
+ case R_MICROMIPS_TLS_GOTTPREL:
+ if (info->shared)
+ info->flags |= DF_STATIC_TLS;
+ /* Fall through */
+
+ case R_MIPS_TLS_LDM:
++ case R_MIPS16_TLS_LDM:
+ case R_MICROMIPS_TLS_LDM:
+ if (tls_ldm_reloc_p (r_type))
+ {
+@@ -8030,6 +8115,7 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
+ /* Fall through */
+
+ case R_MIPS_TLS_GD:
++ case R_MIPS16_TLS_GD:
+ case R_MICROMIPS_TLS_GD:
+ /* This symbol requires a global offset table entry, or two
+ for TLS GD relocations. */
+@@ -9027,7 +9113,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
+ {
+ /* We add a room for __rld_map. It will be filled in by the
+ rtld to contain a pointer to the _r_debug structure. */
+- s->size += 4;
++ s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
+ }
+ else if (SGI_COMPAT (output_bfd)
+ && CONST_STRNEQ (name, ".compact_rel"))
+@@ -9299,7 +9385,7 @@ _bfd_mips_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ sec = h->root.u.def.section;
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+@@ -9615,9 +9701,9 @@ mips_elf_create_la25_stub (void **slot, void *data)
+ offset = stub->offset;
+
+ /* Work out the target address. */
+- target = (stub->h->root.root.u.def.section->output_section->vma
+- + stub->h->root.root.u.def.section->output_offset
+- + stub->h->root.root.u.def.value);
++ target = mips_elf_get_la25_target (stub, &s);
++ target += s->output_section->vma + s->output_offset;
++
+ target_high = ((target + 0x8000) >> 16) & 0xffff;
+ target_low = (target & 0xffff);
+
+@@ -10030,31 +10116,6 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
+ if (IRIX_COMPAT (output_bfd) == ict_irix6)
+ mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
+
+- if (! info->shared)
+- {
+- if (! mips_elf_hash_table (info)->use_rld_obj_head
+- && (strcmp (name, "__rld_map") == 0
+- || strcmp (name, "__RLD_MAP") == 0))
+- {
+- asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
+- BFD_ASSERT (s != NULL);
+- sym->st_value = s->output_section->vma + s->output_offset;
+- bfd_put_32 (output_bfd, 0, s->contents);
+- if (mips_elf_hash_table (info)->rld_value == 0)
+- mips_elf_hash_table (info)->rld_value = sym->st_value;
+- }
+- else if (mips_elf_hash_table (info)->use_rld_obj_head
+- && strcmp (name, "__rld_obj_head") == 0)
+- {
+- /* IRIX6 does not use a .rld_map section. */
+- if (IRIX_COMPAT (output_bfd) == ict_irix5
+- || IRIX_COMPAT (output_bfd) == ict_none)
+- BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
+- != NULL);
+- mips_elf_hash_table (info)->rld_value = sym->st_value;
+- }
+- }
+-
+ /* Keep dynamic MIPS16 symbols odd. This allows the dynamic linker to
+ treat MIPS16 symbols like any other. */
+ if (ELF_ST_IS_MIPS16 (sym->st_other))
+@@ -10517,7 +10578,19 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
+ break;
+
+ case DT_MIPS_RLD_MAP:
+- dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
++ {
++ struct elf_link_hash_entry *h;
++ h = mips_elf_hash_table (info)->rld_symbol;
++ if (!h)
++ {
++ dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
++ swap_out_p = FALSE;
++ break;
++ }
++ s = h->root.u.def.section;
++ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
++ + h->root.u.def.value);
++ }
+ break;
+
+ case DT_MIPS_OPTIONS:
+@@ -12794,7 +12867,7 @@ _bfd_mips_elf_link_hash_table_create (bfd *abfd)
+ ret->procedure_count = 0;
+ ret->compact_rel_size = 0;
+ ret->use_rld_obj_head = FALSE;
+- ret->rld_value = 0;
++ ret->rld_symbol = NULL;
+ ret->mips16_stubs_seen = FALSE;
+ ret->use_plts_and_copy_relocs = FALSE;
+ ret->is_vxworks = FALSE;
+diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
+index 9a15124..f3c631e 100644
+--- a/bfd/elfxx-sparc.c
++++ b/bfd/elfxx-sparc.c
+@@ -2970,7 +2970,7 @@ _bfd_sparc_elf_relocate_section (bfd *output_bfd,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c
+index c484562..e1c8946 100644
+--- a/bfd/elfxx-tilegx.c
++++ b/bfd/elfxx-tilegx.c
+@@ -2908,7 +2908,7 @@ tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
+ }
+ }
+
+- if (sec != NULL && elf_discarded_section (sec))
++ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, relend, howto, contents);
+
+diff --git a/bfd/libbfd.h b/bfd/libbfd.h
+index 200a6fa..0395ec2 100644
+--- a/bfd/libbfd.h
++++ b/bfd/libbfd.h
+@@ -1086,6 +1086,13 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
+ "BFD_RELOC_MIPS16_HI16",
+ "BFD_RELOC_MIPS16_HI16_S",
+ "BFD_RELOC_MIPS16_LO16",
++ "BFD_RELOC_MIPS16_TLS_GD",
++ "BFD_RELOC_MIPS16_TLS_LDM",
++ "BFD_RELOC_MIPS16_TLS_DTPREL_HI16",
++ "BFD_RELOC_MIPS16_TLS_DTPREL_LO16",
++ "BFD_RELOC_MIPS16_TLS_GOTTPREL",
++ "BFD_RELOC_MIPS16_TLS_TPREL_HI16",
++ "BFD_RELOC_MIPS16_TLS_TPREL_LO16",
+ "BFD_RELOC_MIPS_LITERAL",
+ "BFD_RELOC_MICROMIPS_LITERAL",
+ "BFD_RELOC_MICROMIPS_7_PCREL_S1",
+diff --git a/bfd/linker.c b/bfd/linker.c
+index 7a01e11..e5d20b2 100644
+--- a/bfd/linker.c
++++ b/bfd/linker.c
+@@ -1,6 +1,6 @@
+ /* linker.c -- BFD linker routines
+ Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+- 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
++ 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+ Free Software Foundation, Inc.
+ Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support
+
+@@ -810,6 +810,7 @@ void
+ _bfd_generic_link_just_syms (asection *sec,
+ struct bfd_link_info *info ATTRIBUTE_UNUSED)
+ {
++ sec->sec_info_type = SEC_INFO_TYPE_JUST_SYMS;
+ sec->output_section = bfd_abs_section_ptr;
+ sec->output_offset = sec->vma;
+ }
+diff --git a/bfd/reloc.c b/bfd/reloc.c
+index 6ac7148..e3f0343 100644
+--- a/bfd/reloc.c
++++ b/bfd/reloc.c
+@@ -2247,6 +2247,23 @@ ENUMDOC
+ MIPS16 low 16 bits.
+
+ ENUM
++ BFD_RELOC_MIPS16_TLS_GD
++ENUMX
++ BFD_RELOC_MIPS16_TLS_LDM
++ENUMX
++ BFD_RELOC_MIPS16_TLS_DTPREL_HI16
++ENUMX
++ BFD_RELOC_MIPS16_TLS_DTPREL_LO16
++ENUMX
++ BFD_RELOC_MIPS16_TLS_GOTTPREL
++ENUMX
++ BFD_RELOC_MIPS16_TLS_TPREL_HI16
++ENUMX
++ BFD_RELOC_MIPS16_TLS_TPREL_LO16
++ENUMDOC
++ MIPS16 TLS relocations
++
++ENUM
+ BFD_RELOC_MIPS_LITERAL
+ ENUMX
+ BFD_RELOC_MICROMIPS_LITERAL
+@@ -6218,7 +6235,7 @@ bfd_generic_get_relocated_section_contents (bfd *abfd,
+ bfd_reloc_status_type r;
+
+ symbol = *(*parent)->sym_ptr_ptr;
+- if (symbol->section && elf_discarded_section (symbol->section))
++ if (symbol->section && discarded_section (symbol->section))
+ {
+ bfd_byte *p;
+ static reloc_howto_type none_howto
+diff --git a/bfd/section.c b/bfd/section.c
+index 7c1f750..e60f247 100644
+--- a/bfd/section.c
++++ b/bfd/section.c
+@@ -382,11 +382,11 @@ CODE_FRAGMENT
+ .
+ . {* Type of sec_info information. *}
+ . unsigned int sec_info_type:3;
+-.#define ELF_INFO_TYPE_NONE 0
+-.#define ELF_INFO_TYPE_STABS 1
+-.#define ELF_INFO_TYPE_MERGE 2
+-.#define ELF_INFO_TYPE_EH_FRAME 3
+-.#define ELF_INFO_TYPE_JUST_SYMS 4
++.#define SEC_INFO_TYPE_NONE 0
++.#define SEC_INFO_TYPE_STABS 1
++.#define SEC_INFO_TYPE_MERGE 2
++.#define SEC_INFO_TYPE_EH_FRAME 3
++.#define SEC_INFO_TYPE_JUST_SYMS 4
+ .
+ . {* Nonzero if this section uses RELA relocations, rather than REL. *}
+ . unsigned int use_rela_p:1;
+diff --git a/bfd/version.h b/bfd/version.h
+index c6800ec..8784380 100644
+--- a/bfd/version.h
++++ b/bfd/version.h
+@@ -1,4 +1,4 @@
+-#define BFD_VERSION_DATE 20111121
++#define BFD_VERSION_DATE 20120704
+ #define BFD_VERSION @bfd_version@
+ #define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@
+ #define REPORT_BUGS_TO @report_bugs_to@
+diff --git a/binutils/ChangeLog b/binutils/ChangeLog
+index 2f5af61..30101e5 100644
+--- a/binutils/ChangeLog
++++ b/binutils/ChangeLog
+@@ -1,3 +1,10 @@
++2012-01-26 Nick Clifton <nickc@redhat.com>
++
++ PR binutils/13622
++ * readelf.c (process_section_groups): If there are no section
++ headers do not scan for section groups.
++ (process_note_sections): Likewise for note sections.
++
+ 2011-10-25 Alan Modra <amodra@gmail.com>
+
+ Apply mainline patches
+diff --git a/binutils/readelf.c b/binutils/readelf.c
+index 9e13190..bf053d9 100644
+--- a/binutils/readelf.c
++++ b/binutils/readelf.c
+@@ -4937,7 +4937,8 @@ process_section_groups (FILE * file)
+ if (section_headers == NULL)
+ {
+ error (_("Section headers are not available!\n"));
+- abort ();
++ /* PR 13622: This can happen with a corrupt ELF header. */
++ return 0;
+ }
+
+ section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
+@@ -12942,7 +12943,7 @@ process_note_sections (FILE * file)
+ int res = 1;
+
+ for (i = 0, section = section_headers;
+- i < elf_header.e_shnum;
++ i < elf_header.e_shnum && section != NULL;
+ i++, section++)
+ if (section->sh_type == SHT_NOTE)
+ res &= process_corefile_note_segment (file,
+diff --git a/gas/ChangeLog b/gas/ChangeLog
+index b29f95f..df24933 100644
+--- a/gas/ChangeLog
++++ b/gas/ChangeLog
+@@ -1,3 +1,23 @@
++2012-01-08 Richard Sandiford <rdsandiford@googlemail.com>
++
++ * config/tc-mips.c (s_tls_rel_directive): Call mips_clear_insn_labels.
++
++2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ Backport from mainline:
++
++ 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ * config/tc-mips.c (mips_pseudo_table): Add tprelword/tpreldword
++ entries.
++ (mips16_percent_op): Add MIPS16 TLS relocation ops.
++ (md_apply_fix): Add BFD_RELOC_MIPS16_TLS_* switch cases.
++ (s_tls_rel_directive): Rename from s_dtprel_internal(). Abstract out
++ directive string and reloc type as function parameters. Update
++ comments.
++ (s_dtprelword,s_dtpreldword): Change to use s_tls_rel_directive().
++ (s_tprelword,s_tpreldword): New functions.
++
+ 2011-11-15 Maciej W. Rozycki <macro@codesourcery.com>
+
+ Apply mainline patches
+diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
+index 0e4c66e..5324450 100644
+--- a/gas/config/tc-mips.c
++++ b/gas/config/tc-mips.c
+@@ -1352,6 +1352,8 @@ static void s_cprestore (int);
+ static void s_cpreturn (int);
+ static void s_dtprelword (int);
+ static void s_dtpreldword (int);
++static void s_tprelword (int);
++static void s_tpreldword (int);
+ static void s_gpvalue (int);
+ static void s_gpword (int);
+ static void s_gpdword (int);
+@@ -1431,6 +1433,8 @@ static const pseudo_typeS mips_pseudo_table[] =
+ {"cpreturn", s_cpreturn, 0},
+ {"dtprelword", s_dtprelword, 0},
+ {"dtpreldword", s_dtpreldword, 0},
++ {"tprelword", s_tprelword, 0},
++ {"tpreldword", s_tpreldword, 0},
+ {"gpvalue", s_gpvalue, 0},
+ {"gpword", s_gpword, 0},
+ {"gpdword", s_gpdword, 0},
+@@ -14040,7 +14044,14 @@ static const struct percent_op_match mips16_percent_op[] =
+ {"%gprel", BFD_RELOC_MIPS16_GPREL},
+ {"%got", BFD_RELOC_MIPS16_GOT16},
+ {"%call16", BFD_RELOC_MIPS16_CALL16},
+- {"%hi", BFD_RELOC_MIPS16_HI16_S}
++ {"%hi", BFD_RELOC_MIPS16_HI16_S},
++ {"%tlsgd", BFD_RELOC_MIPS16_TLS_GD},
++ {"%tlsldm", BFD_RELOC_MIPS16_TLS_LDM},
++ {"%dtprel_hi", BFD_RELOC_MIPS16_TLS_DTPREL_HI16},
++ {"%dtprel_lo", BFD_RELOC_MIPS16_TLS_DTPREL_LO16},
++ {"%tprel_hi", BFD_RELOC_MIPS16_TLS_TPREL_HI16},
++ {"%tprel_lo", BFD_RELOC_MIPS16_TLS_TPREL_LO16},
++ {"%gottprel", BFD_RELOC_MIPS16_TLS_GOTTPREL}
+ };
+
+
+@@ -15369,6 +15380,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
+ case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
+ case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
+ case BFD_RELOC_MIPS_TLS_GOTTPREL:
++ case BFD_RELOC_MIPS_TLS_TPREL32:
++ case BFD_RELOC_MIPS_TLS_TPREL64:
+ case BFD_RELOC_MIPS_TLS_TPREL_HI16:
+ case BFD_RELOC_MIPS_TLS_TPREL_LO16:
+ case BFD_RELOC_MICROMIPS_TLS_GD:
+@@ -15378,6 +15391,13 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
+ case BFD_RELOC_MICROMIPS_TLS_GOTTPREL:
+ case BFD_RELOC_MICROMIPS_TLS_TPREL_HI16:
+ case BFD_RELOC_MICROMIPS_TLS_TPREL_LO16:
++ case BFD_RELOC_MIPS16_TLS_GD:
++ case BFD_RELOC_MIPS16_TLS_LDM:
++ case BFD_RELOC_MIPS16_TLS_DTPREL_HI16:
++ case BFD_RELOC_MIPS16_TLS_DTPREL_LO16:
++ case BFD_RELOC_MIPS16_TLS_GOTTPREL:
++ case BFD_RELOC_MIPS16_TLS_TPREL_HI16:
++ case BFD_RELOC_MIPS16_TLS_TPREL_LO16:
+ S_SET_THREAD_LOCAL (fixP->fx_addsy);
+ /* fall through */
+
+@@ -16547,12 +16567,14 @@ s_cpreturn (int ignore ATTRIBUTE_UNUSED)
+ demand_empty_rest_of_line ();
+ }
+
+-/* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
+- a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
+- use in DWARF debug information. */
++/* Handle a .dtprelword, .dtpreldword, .tprelword, or .tpreldword
++ pseudo-op; DIRSTR says which. The pseudo-op generates a BYTES-size
++ DTP- or TP-relative relocation of type RTYPE, for use in either DWARF
++ debug information or MIPS16 TLS. */
+
+ static void
+-s_dtprel_internal (size_t bytes)
++s_tls_rel_directive (const size_t bytes, const char *dirstr,
++ bfd_reloc_code_real_type rtype)
+ {
+ expressionS ex;
+ char *p;
+@@ -16561,20 +16583,15 @@ s_dtprel_internal (size_t bytes)
+
+ if (ex.X_op != O_symbol)
+ {
+- as_bad (_("Unsupported use of %s"), (bytes == 8
+- ? ".dtpreldword"
+- : ".dtprelword"));
++ as_bad (_("Unsupported use of %s"), dirstr);
+ ignore_rest_of_line ();
+ }
+
+ p = frag_more (bytes);
+ md_number_to_chars (p, 0, bytes);
+- fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
+- (bytes == 8
+- ? BFD_RELOC_MIPS_TLS_DTPREL64
+- : BFD_RELOC_MIPS_TLS_DTPREL32));
+-
++ fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE, rtype);
+ demand_empty_rest_of_line ();
++ mips_clear_insn_labels ();
+ }
+
+ /* Handle .dtprelword. */
+@@ -16582,7 +16599,7 @@ s_dtprel_internal (size_t bytes)
+ static void
+ s_dtprelword (int ignore ATTRIBUTE_UNUSED)
+ {
+- s_dtprel_internal (4);
++ s_tls_rel_directive (4, ".dtprelword", BFD_RELOC_MIPS_TLS_DTPREL32);
+ }
+
+ /* Handle .dtpreldword. */
+@@ -16590,7 +16607,23 @@ s_dtprelword (int ignore ATTRIBUTE_UNUSED)
+ static void
+ s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
+ {
+- s_dtprel_internal (8);
++ s_tls_rel_directive (8, ".dtpreldword", BFD_RELOC_MIPS_TLS_DTPREL64);
++}
++
++/* Handle .tprelword. */
++
++static void
++s_tprelword (int ignore ATTRIBUTE_UNUSED)
++{
++ s_tls_rel_directive (4, ".tprelword", BFD_RELOC_MIPS_TLS_TPREL32);
++}
++
++/* Handle .tpreldword. */
++
++static void
++s_tpreldword (int ignore ATTRIBUTE_UNUSED)
++{
++ s_tls_rel_directive (8, ".tpreldword", BFD_RELOC_MIPS_TLS_TPREL64);
+ }
+
+ /* Handle the .gpvalue pseudo-op. This is used when generating NewABI PIC
+diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
+index 0631572..cbb2309 100644
+--- a/gas/testsuite/ChangeLog
++++ b/gas/testsuite/ChangeLog
+@@ -1,3 +1,8 @@
++2012-01-08 Richard Sandiford <rdsandiford@googlemail.com>
++
++ * gas/mips/tls-relw.s, gas/mips/tls-relw.d: New test.
++ * gas/mips/mips.exp: Run it.
++
+ 2011-11-14 Maciej W. Rozycki <macro@codesourcery.com>
+
+ Apply mainline patches
+diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
+index cbaaa70..2f49a2a 100644
+--- a/gas/testsuite/gas/mips/mips.exp
++++ b/gas/testsuite/gas/mips/mips.exp
+@@ -878,6 +878,7 @@ if { [istarget mips*-*-vxworks*] } {
+
+ run_list_test "tls-ill" "-32"
+ run_dump_test "tls-o32"
++ run_dump_test "tls-relw"
+ run_dump_test "jalr2"
+
+ run_dump_test_arches "aent" [mips_arch_list_matching mips1]
+diff --git a/gas/testsuite/gas/mips/tls-relw.d b/gas/testsuite/gas/mips/tls-relw.d
+new file mode 100644
+index 0000000..bc13b43
+--- /dev/null
++++ b/gas/testsuite/gas/mips/tls-relw.d
+@@ -0,0 +1,8 @@
++# as: -EB
++# objdump: -sj.data
++
++.*
++
++Contents of section \.data:
++ 0000 00000001 00000000 00000002 00000004 ................
++ 0010 00000000 00000003 00000010 00000000 ................
+diff --git a/gas/testsuite/gas/mips/tls-relw.s b/gas/testsuite/gas/mips/tls-relw.s
+new file mode 100644
+index 0000000..6890685
+--- /dev/null
++++ b/gas/testsuite/gas/mips/tls-relw.s
+@@ -0,0 +1,12 @@
++ .data
++start:
++ .word 1
++a:
++ .tprelword t1
++ .word 2
++ .word a-start
++b:
++ .dtprelword t2
++ .word 3
++ .word b-start
++ .word 0
+diff --git a/gold/ChangeLog b/gold/ChangeLog
+index 7f91606..437cf97 100644
+--- a/gold/ChangeLog
++++ b/gold/ChangeLog
+@@ -1,3 +1,185 @@
++2012-04-27 Doug Kwan <dougkwan@google.com>
++
++ Backport from mainline:
++
++ 2012-03-16 Doug Kwan <dougkwan@google.com>
++
++ * testsuite/Makefile.am: Disable test initpri3b.
++ * testsuite/Makefile.in: Regenerate.
++
++ 2012-03-14 Doug Kwan <dougkwan@google.com>
++
++ * gold/arm.cc (Target_arm::Scan::global): Generate
++ R_ARM_GLOB_DAT dynamic relocations for protected symbols in
++ shared objects.
++
++2012-04-06 Ian Lance Taylor <iant@google.com>
++
++ * timer.cc: #include <unistd.h>.
++
++2011-12-19 Ian Lance Taylor <iant@google.com>
++
++ Copy from mainline to binutils 2.22 branch:
++
++ 2011-12-17 Cary Coutant <ccoutant@google.com>
++
++ * dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Add casts.
++ * resolve.cc (Symbol_table::resolve): Likewise.
++ * i386.cc (Target_i386::do_code_fill): Use char constants for nop
++ arrays.
++ * x86_64.cc (Target_x86_64::do_code_fill): Likewise.
++
++ 2011-10-31 Cary Coutant <ccoutant@google.com>
++
++ PR gold/13023
++ * expression.cc (Expression::eval_with_dot): Add
++ is_section_dot_assignment parameter.
++ (Expression::eval_maybe_dot): Likewise. Adjust value when rhs is
++ absolute and assigning to dot within a section.
++ * script-sections.cc
++ (Output_section_element_assignment::set_section_addresses): Pass
++ dot_section to set_if_absolute.
++ (Output_section_element_dot_assignment::finalize_symbols): Pass TRUE
++ as is_section_dot_assignment flag to eval_with_dot.
++ (Output_section_element_dot_assignment::set_section_addresses):
++ Likewise.
++ * script.cc (Symbol_assignment::set_if_absolute): Add dot_section
++ parameter. Also set value if relative to dot_section; set the
++ symbol's output_section.
++ * script.h (Expression::eval_with_dot): Add is_section_dot_assignment
++ parameter. Adjust all callers.
++ (Expression::eval_maybe_dot): Likewise.
++ (Symbol_assignment::set_if_absolute): Add dot_section parameter.
++ Adjust all callers.
++ * testsuite/script_test_2.t: Test assignment of an absolute value
++ to dot within an output section element.
++
++ 2011-10-31 Cary Coutant <ccoutant@google.com>
++
++ * options.h (class General_options): Add --[no-]gnu-unique options.
++ * symtab.cc (Symbol_table::sized_write_globals): Convert
++ STB_GNU_UNIQUE to STB_GLOBAL if --no-gnu-unique.
++
++ 2011-10-31 Cary Coutant <ccoutant@google.com>
++
++ PR gold/13359
++ * i386.cc (Target_i386::Relocate::relocate_tls): Remove
++ unnecessary assertion.
++ * x86_64.cc (Target_x86_64::Relocate::relocate_tls): Likewise.
++
++ 2011-10-31 Sriraman Tallam <tmsriram@google.com>
++
++ * symtab.h (Symbol_table::gc_mark_symbol_for_shlib): Rename to
++ gc_mark_symbol.
++ * symtab.cc (Symbol_table::gc_mark_symbol_for_shlib): Rename to
++ gc_mark_symbol.
++ Change to just keep the section associated with symbol.
++ (Symbol_table::add_from_relobj): Mark symbols as not garbage when
++ they are externally visible and --export-dynamic is turned on.
++ (Symbol_table::gc_mark_dyn_syms): Call gc_mark_symbol.
++
++ 2011-10-19 Ian Lance Taylor <iant@google.com>
++
++ PR gold/13163
++ * script-sections.cc
++ (Output_section_element_dot_assignment::needs_output_section): New
++ function.
++
++ 2011-10-19 Ian Lance Taylor <iant@google.com>
++
++ PR gold/13204
++ * layout.cc (Layout::segment_precedes): Don't assert failure if a
++ --section-start option was seen.
++ * options.h (General_options::any_section_start): New function.
++
++ 2011-10-18 Cary Coutant <ccoutant@google.com>
++
++ * output.cc (posix_fallocate): Return 0 on success, errno on failure.
++ (Output_file::map_no_anonymous): Check for non-zero
++ return code from posix_fallocate.
++
++ 2011-10-17 Cary Coutant <ccoutant@google.com>
++
++ PR gold/13245
++ * plugin.cc (is_visible_from_outside): Check for symbols
++ referenced from dynamic objects.
++ * resolve.cc (Symbol_table::resolve): Don't count references
++ from dynamic objects as references from real ELF files.
++ * testsuite/plugin_test_2.sh: Adjust expected result.
++
++ 2011-10-17 Cary Coutant <ccoutant@google.com>
++
++ * readsyms.cc (Read_symbols::run): Don't queue an unblocker
++ task for members of lib groups.
++
++ 2011-10-17 Cary Coutant <ccoutant@google.com>
++
++ PR gold/13288
++ * fileread.cc (File_read::find_view): Add assert.
++ (File_read::make_view): Move bounds check (replace with assert)...
++ (File_read::find_or_make_view): ... to here.
++
++ 2011-10-12 Cary Coutant <ccoutant@google.com>
++
++ * output.cc (Output_file::open_base_file): Handle case where
++ ::read returns less than requested size.
++
++ 2011-10-10 Cary Coutant <ccoutant@google.com>
++
++ * incremental.cc (Sized_relobj_incr::Sized_relobj_incr):
++ Initialize defined_count_.
++ (Sized_relobj_incr::do_add_symbols): Count defined symbols.
++ (Sized_relobj_incr::do_get_global_symbol_counts): Rewrite.
++ (Sized_incr_dynobj::Sized_incr_dynobj): Initialize defined_count_.
++ (Sized_incr_dynobj::do_add_symbols): Count defined symbols.
++ (Sized_incr_dynobj::do_get_global_symbol_counts): Rewrite.
++ * incremental.h (Sized_relobj_incr::defined_count_): New data
++ member.
++ (Sized_incr_dynobj::defined_count_): New data member.
++ * plugin.cc (Sized_pluginobj::do_get_global_symbol_counts):
++ Return zeroes instead of internal error.
++
++ 2011-10-10 Cary Coutant <ccoutant@google.com>
++
++ PR gold/13249
++ * output.cc (Output_reloc::Output_reloc): Add use_plt_offset flag.
++ (Output_reloc::symbol_value): Return PLT offset if flag is set.
++ * output.h (class Output_reloc): Add use_plt_offset flag.
++ (Output_reloc::type_): Adjust size of bit field.
++ (Output_reloc::use_plt_offset_): New bit field.
++ (class Output_data_reloc): Adjust all calls to Output_reloc_type.
++ (Output_data_reloc::add_local_relative): (RELA only) Add use_plt_offset
++ flag. Adjust all callers.
++ * x86_64.cc (Target_x86_64::Scan::local): Check for IFUNC when
++ creating RELATIVE relocations.
++
++ 2011-10-03 Diego Novillo <dnovillo@google.com>
++
++ * options.cc (parse_uint): Fix dereference of RETVAL.
++
++ 2011-09-29 Cary Coutant <ccoutant@google.com>
++
++ * incremental.cc (Sized_incremental_binary::do_process_got_plt):
++ Check for NULL.
++ * symtab.cc (Symbol_table::add_from_relobj): Ignore version
++ symbols during incremental update.
++ (Symbol_table::add_from_dynobj): Likewise.
++
++ 2011-09-26 Cary Coutant <ccoutant@google.com>
++
++ * gold.cc (queue_initial_tasks): Move option checks ...
++ * options.cc (General_options::finalize): ... to here. Disable
++ some options; make others fatal.
++
++ 2011-09-23 Simon Baldwin <simonb@google.com>
++
++ * configure.ac: Add new --with-gold-ldadd and --with-gold-ldflags
++ configuration options.
++ * configure: Regenerate.
++ * Makefile.am: Handle GOLD_LDADD and GOLD_LDFLAGS.
++ * Makefile.in: Regenerate.
++ * testsuite/Makefile.in: Regenerate.
++
+ 2011-11-11 Doug Kwan <dougkwan@google.com>
+
+ * arm.cc (Target_arm::do_make_elf_object): Allow executable also
+diff --git a/gold/arm.cc b/gold/arm.cc
+index 72c3670..a1e8e4c 100644
+--- a/gold/arm.cc
++++ b/gold/arm.cc
+@@ -8374,7 +8374,9 @@ Target_arm<big_endian>::Scan::global(Symbol_table* symtab,
+ Reloc_section* rel_dyn = target->rel_dyn_section(layout);
+ if (gsym->is_from_dynobj()
+ || gsym->is_undefined()
+- || gsym->is_preemptible())
++ || gsym->is_preemptible()
++ || (gsym->visibility() == elfcpp::STV_PROTECTED
++ && parameters->options().shared()))
+ got->add_global_with_rel(gsym, GOT_TYPE_STANDARD,
+ rel_dyn, elfcpp::R_ARM_GLOB_DAT);
+ else
+diff --git a/gold/dwarf_reader.cc b/gold/dwarf_reader.cc
+index 3dc33e4..2b47a28 100644
+--- a/gold/dwarf_reader.cc
++++ b/gold/dwarf_reader.cc
+@@ -1,6 +1,6 @@
+ // dwarf_reader.cc -- parse dwarf2/3 debug information
+
+-// Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
++// Copyright 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ // Written by Ian Lance Taylor <iant@google.com>.
+
+ // This file is part of gold.
+@@ -491,8 +491,10 @@ Sized_dwarf_line_info<size, big_endian>::read_lines(unsigned const char* lineptr
+ && (shndx == -1U || lsm.shndx == -1U || shndx == lsm.shndx))
+ {
+ Offset_to_lineno_entry entry
+- = { lsm.address, this->current_header_index_,
+- lsm.file_num, true, lsm.line_num };
++ = { static_cast<off_t>(lsm.address),
++ this->current_header_index_,
++ static_cast<unsigned int>(lsm.file_num),
++ true, lsm.line_num };
+ std::vector<Offset_to_lineno_entry>&
+ map(this->line_number_map_[lsm.shndx]);
+ // If we see two consecutive entries with the same
+diff --git a/gold/expression.cc b/gold/expression.cc
+index e527b5e..e31c151 100644
+--- a/gold/expression.cc
++++ b/gold/expression.cc
+@@ -1,6 +1,6 @@
+ // expression.cc -- expressions in linker scripts for gold
+
+-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
++// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ // Written by Ian Lance Taylor <iant@google.com>.
+
+ // This file is part of gold.
+@@ -77,7 +77,7 @@ Expression::eval(const Symbol_table* symtab, const Layout* layout,
+ bool check_assertions)
+ {
+ return this->eval_maybe_dot(symtab, layout, check_assertions,
+- false, 0, NULL, NULL, NULL);
++ false, 0, NULL, NULL, NULL, false);
+ }
+
+ // Evaluate an expression which may refer to the dot symbol.
+@@ -87,11 +87,13 @@ Expression::eval_with_dot(const Symbol_table* symtab, const Layout* layout,
+ bool check_assertions, uint64_t dot_value,
+ Output_section* dot_section,
+ Output_section** result_section_pointer,
+- uint64_t* result_alignment_pointer)
++ uint64_t* result_alignment_pointer,
++ bool is_section_dot_assignment)
+ {
+ return this->eval_maybe_dot(symtab, layout, check_assertions, true,
+ dot_value, dot_section, result_section_pointer,
+- result_alignment_pointer);
++ result_alignment_pointer,
++ is_section_dot_assignment);
+ }
+
+ // Evaluate an expression which may or may not refer to the dot
+@@ -102,7 +104,8 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout,
+ bool check_assertions, bool is_dot_available,
+ uint64_t dot_value, Output_section* dot_section,
+ Output_section** result_section_pointer,
+- uint64_t* result_alignment_pointer)
++ uint64_t* result_alignment_pointer,
++ bool is_section_dot_assignment)
+ {
+ Expression_eval_info eei;
+ eei.symtab = symtab;
+@@ -113,14 +116,24 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout,
+ eei.dot_section = dot_section;
+
+ // We assume the value is absolute, and only set this to a section
+- // if we find a section relative reference.
++ // if we find a section-relative reference.
+ if (result_section_pointer != NULL)
+ *result_section_pointer = NULL;
+ eei.result_section_pointer = result_section_pointer;
+
+ eei.result_alignment_pointer = result_alignment_pointer;
+
+- return this->value(&eei);
++ uint64_t val = this->value(&eei);
++
++ // If this is an assignment to dot within a section, and the value
++ // is absolute, treat it as a section-relative offset.
++ if (is_section_dot_assignment && *result_section_pointer == NULL)
++ {
++ gold_assert(dot_section != NULL);
++ val += dot_section->address();
++ *result_section_pointer = dot_section;
++ }
++ return val;
+ }
+
+ // A number.
+@@ -257,7 +270,8 @@ class Unary_expression : public Expression
+ eei->dot_value,
+ eei->dot_section,
+ arg_section_pointer,
+- eei->result_alignment_pointer);
++ eei->result_alignment_pointer,
++ false);
+ }
+
+ void
+@@ -336,7 +350,8 @@ class Binary_expression : public Expression
+ eei->dot_value,
+ eei->dot_section,
+ section_pointer,
+- alignment_pointer);
++ alignment_pointer,
++ false);
+ }
+
+ uint64_t
+@@ -350,7 +365,8 @@ class Binary_expression : public Expression
+ eei->dot_value,
+ eei->dot_section,
+ section_pointer,
+- alignment_pointer);
++ alignment_pointer,
++ false);
+ }
+
+ void
+@@ -500,7 +516,8 @@ class Trinary_expression : public Expression
+ eei->dot_value,
+ eei->dot_section,
+ section_pointer,
+- NULL);
++ NULL,
++ false);
+ }
+
+ uint64_t
+@@ -514,7 +531,8 @@ class Trinary_expression : public Expression
+ eei->dot_value,
+ eei->dot_section,
+ section_pointer,
+- alignment_pointer);
++ alignment_pointer,
++ false);
+ }
+
+ uint64_t
+@@ -528,7 +546,8 @@ class Trinary_expression : public Expression
+ eei->dot_value,
+ eei->dot_section,
+ section_pointer,
+- alignment_pointer);
++ alignment_pointer,
++ false);
+ }
+
+ void
+diff --git a/gold/fileread.cc b/gold/fileread.cc
+index 80ddfbc..c5dc320 100644
+--- a/gold/fileread.cc
++++ b/gold/fileread.cc
+@@ -329,6 +329,10 @@ inline File_read::View*
+ File_read::find_view(off_t start, section_size_type size,
+ unsigned int byteshift, File_read::View** vshifted) const
+ {
++ gold_assert(start <= this->size_
++ && (static_cast<unsigned long long>(size)
++ <= static_cast<unsigned long long>(this->size_ - start)));
++
+ if (vshifted != NULL)
+ *vshifted = NULL;
+
+@@ -456,16 +460,9 @@ File_read::make_view(off_t start, section_size_type size,
+ unsigned int byteshift, bool cache)
+ {
+ gold_assert(size > 0);
+-
+- // Check that start and end of the view are within the file.
+- if (start > this->size_
+- || (static_cast<unsigned long long>(size)
+- > static_cast<unsigned long long>(this->size_ - start)))
+- gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds "
+- "size of file; the file may be corrupt"),
+- this->filename().c_str(),
+- static_cast<long long>(size),
+- static_cast<long long>(start));
++ gold_assert(start <= this->size_
++ && (static_cast<unsigned long long>(size)
++ <= static_cast<unsigned long long>(this->size_ - start)));
+
+ off_t poff = File_read::page_offset(start);
+
+@@ -523,6 +520,16 @@ File_read::View*
+ File_read::find_or_make_view(off_t offset, off_t start,
+ section_size_type size, bool aligned, bool cache)
+ {
++ // Check that start and end of the view are within the file.
++ if (start > this->size_
++ || (static_cast<unsigned long long>(size)
++ > static_cast<unsigned long long>(this->size_ - start)))
++ gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds "
++ "size of file; the file may be corrupt"),
++ this->filename().c_str(),
++ static_cast<long long>(size),
++ static_cast<long long>(start));
++
+ unsigned int byteshift;
+ if (offset == 0)
+ byteshift = 0;
+diff --git a/gold/gold.cc b/gold/gold.cc
+index 12f25b7..693ff79 100644
+--- a/gold/gold.cc
++++ b/gold/gold.cc
+@@ -197,46 +197,29 @@ queue_initial_tasks(const General_options& options,
+ // For incremental links, the base output file.
+ Incremental_binary* ibase = NULL;
+
+- if (parameters->incremental())
+- {
+- if (options.relocatable())
+- gold_error(_("incremental linking is incompatible with -r"));
+- if (options.emit_relocs())
+- gold_error(_("incremental linking is incompatible with --emit-relocs"));
+- if (options.gc_sections())
+- gold_error(_("incremental linking is incompatible with --gc-sections"));
+- if (options.icf_enabled())
+- gold_error(_("incremental linking is incompatible with --icf"));
+- if (options.has_plugins())
+- gold_error(_("incremental linking is incompatible with --plugin"));
+- if (strcmp(options.compress_debug_sections(), "none") != 0)
+- gold_error(_("incremental linking is incompatible with "
+- "--compress-debug-sections"));
+-
+- if (parameters->incremental_update())
++ if (parameters->incremental_update())
++ {
++ Output_file* of = new Output_file(options.output_file_name());
++ if (of->open_base_file(options.incremental_base(), true))
+ {
+- Output_file* of = new Output_file(options.output_file_name());
+- if (of->open_base_file(options.incremental_base(), true))
+- {
+- ibase = open_incremental_binary(of);
+- if (ibase != NULL
+- && ibase->check_inputs(cmdline, layout->incremental_inputs()))
+- ibase->init_layout(layout);
+- else
+- {
+- delete ibase;
+- ibase = NULL;
+- of->close();
+- }
+- }
+- if (ibase == NULL)
++ ibase = open_incremental_binary(of);
++ if (ibase != NULL
++ && ibase->check_inputs(cmdline, layout->incremental_inputs()))
++ ibase->init_layout(layout);
++ else
+ {
+- if (set_parameters_incremental_full())
+- gold_info(_("linking with --incremental-full"));
+- else
+- gold_fallback(_("restart link with --incremental-full"));
++ delete ibase;
++ ibase = NULL;
++ of->close();
+ }
+ }
++ if (ibase == NULL)
++ {
++ if (set_parameters_incremental_full())
++ gold_info(_("linking with --incremental-full"));
++ else
++ gold_fallback(_("restart link with --incremental-full"));
++ }
+ }
+
+ // Read the input files. We have to add the symbols to the symbol
+diff --git a/gold/i386.cc b/gold/i386.cc
+index 445bc68..efb6248 100644
+--- a/gold/i386.cc
++++ b/gold/i386.cc
+@@ -2709,12 +2709,6 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo,
+ }
+ if (optimized_type == tls::TLSOPT_TO_IE)
+ {
+- if (tls_segment == NULL)
+- {
+- gold_assert(parameters->errors()->error_count() > 0
+- || issue_undefined_symbol_error(gsym));
+- return;
+- }
+ this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type,
+ got_offset, view, view_size);
+ break;
+@@ -3480,42 +3474,51 @@ Target_i386::do_code_fill(section_size_type length) const
+ }
+
+ // Nop sequences of various lengths.
+- const char nop1[1] = { 0x90 }; // nop
+- const char nop2[2] = { 0x66, 0x90 }; // xchg %ax %ax
+- const char nop3[3] = { 0x8d, 0x76, 0x00 }; // leal 0(%esi),%esi
+- const char nop4[4] = { 0x8d, 0x74, 0x26, 0x00}; // leal 0(%esi,1),%esi
+- const char nop5[5] = { 0x90, 0x8d, 0x74, 0x26, // nop
+- 0x00 }; // leal 0(%esi,1),%esi
+- const char nop6[6] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi
+- 0x00, 0x00 };
+- const char nop7[7] = { 0x8d, 0xb4, 0x26, 0x00, // leal 0L(%esi,1),%esi
+- 0x00, 0x00, 0x00 };
+- const char nop8[8] = { 0x90, 0x8d, 0xb4, 0x26, // nop
+- 0x00, 0x00, 0x00, 0x00 }; // leal 0L(%esi,1),%esi
+- const char nop9[9] = { 0x89, 0xf6, 0x8d, 0xbc, // movl %esi,%esi
+- 0x27, 0x00, 0x00, 0x00, // leal 0L(%edi,1),%edi
+- 0x00 };
+- const char nop10[10] = { 0x8d, 0x76, 0x00, 0x8d, // leal 0(%esi),%esi
+- 0xbc, 0x27, 0x00, 0x00, // leal 0L(%edi,1),%edi
+- 0x00, 0x00 };
+- const char nop11[11] = { 0x8d, 0x74, 0x26, 0x00, // leal 0(%esi,1),%esi
+- 0x8d, 0xbc, 0x27, 0x00, // leal 0L(%edi,1),%edi
+- 0x00, 0x00, 0x00 };
+- const char nop12[12] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi
+- 0x00, 0x00, 0x8d, 0xbf, // leal 0L(%edi),%edi
+- 0x00, 0x00, 0x00, 0x00 };
+- const char nop13[13] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi
+- 0x00, 0x00, 0x8d, 0xbc, // leal 0L(%edi,1),%edi
+- 0x27, 0x00, 0x00, 0x00,
+- 0x00 };
+- const char nop14[14] = { 0x8d, 0xb4, 0x26, 0x00, // leal 0L(%esi,1),%esi
+- 0x00, 0x00, 0x00, 0x8d, // leal 0L(%edi,1),%edi
+- 0xbc, 0x27, 0x00, 0x00,
+- 0x00, 0x00 };
+- const char nop15[15] = { 0xeb, 0x0d, 0x90, 0x90, // jmp .+15
+- 0x90, 0x90, 0x90, 0x90, // nop,nop,nop,...
+- 0x90, 0x90, 0x90, 0x90,
+- 0x90, 0x90, 0x90 };
++ const char nop1[1] = { '\x90' }; // nop
++ const char nop2[2] = { '\x66', '\x90' }; // xchg %ax %ax
++ const char nop3[3] = { '\x8d', '\x76', '\x00' }; // leal 0(%esi),%esi
++ const char nop4[4] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi
++ '\x00'};
++ const char nop5[5] = { '\x90', '\x8d', '\x74', // nop
++ '\x26', '\x00' }; // leal 0(%esi,1),%esi
++ const char nop6[6] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi
++ '\x00', '\x00', '\x00' };
++ const char nop7[7] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi
++ '\x00', '\x00', '\x00',
++ '\x00' };
++ const char nop8[8] = { '\x90', '\x8d', '\xb4', // nop
++ '\x26', '\x00', '\x00', // leal 0L(%esi,1),%esi
++ '\x00', '\x00' };
++ const char nop9[9] = { '\x89', '\xf6', '\x8d', // movl %esi,%esi
++ '\xbc', '\x27', '\x00', // leal 0L(%edi,1),%edi
++ '\x00', '\x00', '\x00' };
++ const char nop10[10] = { '\x8d', '\x76', '\x00', // leal 0(%esi),%esi
++ '\x8d', '\xbc', '\x27', // leal 0L(%edi,1),%edi
++ '\x00', '\x00', '\x00',
++ '\x00' };
++ const char nop11[11] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi
++ '\x00', '\x8d', '\xbc', // leal 0L(%edi,1),%edi
++ '\x27', '\x00', '\x00',
++ '\x00', '\x00' };
++ const char nop12[12] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi
++ '\x00', '\x00', '\x00', // leal 0L(%edi),%edi
++ '\x8d', '\xbf', '\x00',
++ '\x00', '\x00', '\x00' };
++ const char nop13[13] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi
++ '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi
++ '\x8d', '\xbc', '\x27',
++ '\x00', '\x00', '\x00',
++ '\x00' };
++ const char nop14[14] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi
++ '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi
++ '\x00', '\x8d', '\xbc',
++ '\x27', '\x00', '\x00',
++ '\x00', '\x00' };
++ const char nop15[15] = { '\xeb', '\x0d', '\x90', // jmp .+15
++ '\x90', '\x90', '\x90', // nop,nop,nop,...
++ '\x90', '\x90', '\x90',
++ '\x90', '\x90', '\x90',
++ '\x90', '\x90', '\x90' };
+
+ const char* nops[16] = {
+ NULL,
+diff --git a/gold/incremental.cc b/gold/incremental.cc
+index b422827..75e44c5 100644
+--- a/gold/incremental.cc
++++ b/gold/incremental.cc
+@@ -685,7 +685,7 @@ Sized_incremental_binary<size, big_endian>::do_process_got_plt(
+ gold_assert(plt_desc >= first_global && plt_desc < symtab_count);
+ Symbol* sym = this->global_symbol(plt_desc - first_global);
+ // Add the PLT entry only if the symbol is still referenced.
+- if (sym->in_reg())
++ if (sym != NULL && sym->in_reg())
+ {
+ gold_debug(DEBUG_INCREMENTAL,
+ "PLT entry %d: %s",
+@@ -1966,8 +1966,9 @@ Sized_relobj_incr<size, big_endian>::Sized_relobj_incr(
+ input_reader_(ibase->inputs_reader().input_file(input_file_index)),
+ local_symbol_count_(0), output_local_dynsym_count_(0),
+ local_symbol_index_(0), local_symbol_offset_(0), local_dynsym_offset_(0),
+- symbols_(), incr_reloc_offset_(-1U), incr_reloc_count_(0),
+- incr_reloc_output_index_(0), incr_relocs_(NULL), local_symbols_()
++ symbols_(), defined_count_(0), incr_reloc_offset_(-1U),
++ incr_reloc_count_(0), incr_reloc_output_index_(0), incr_relocs_(NULL),
++ local_symbols_()
+ {
+ if (this->input_reader_.is_in_system_directory())
+ this->set_is_in_system_directory();
+@@ -2120,6 +2121,9 @@ Sized_relobj_incr<size, big_endian>::do_add_symbols(
+
+ Symbol* res = symtab->add_from_incrobj(this, name, NULL, &sym);
+
++ if (shndx != elfcpp::SHN_UNDEF)
++ ++this->defined_count_;
++
+ // If this is a linker-defined symbol that hasn't yet been defined,
+ // define it now.
+ if (input_shndx == -1U && !res->is_defined())
+@@ -2283,9 +2287,21 @@ Sized_relobj_incr<size, big_endian>::do_initialize_xindex()
+ template<int size, bool big_endian>
+ void
+ Sized_relobj_incr<size, big_endian>::do_get_global_symbol_counts(
+- const Symbol_table*, size_t*, size_t*) const
+-{
+- gold_unreachable();
++ const Symbol_table*,
++ size_t* defined,
++ size_t* used) const
++{
++ *defined = this->defined_count_;
++ size_t count = 0;
++ for (typename Symbols::const_iterator p = this->symbols_.begin();
++ p != this->symbols_.end();
++ ++p)
++ if (*p != NULL
++ && (*p)->source() == Symbol::FROM_OBJECT
++ && (*p)->object() == this
++ && (*p)->is_defined())
++ ++count;
++ *used = count;
+ }
+
+ // Read the relocs.
+@@ -2579,7 +2595,7 @@ Sized_incr_dynobj<size, big_endian>::Sized_incr_dynobj(
+ : Dynobj(name, NULL), ibase_(ibase),
+ input_file_index_(input_file_index),
+ input_reader_(ibase->inputs_reader().input_file(input_file_index)),
+- symbols_()
++ symbols_(), defined_count_(0)
+ {
+ if (this->input_reader_.is_in_system_directory())
+ this->set_is_in_system_directory();
+@@ -2677,6 +2693,7 @@ Sized_incr_dynobj<size, big_endian>::do_add_symbols(
+ // is meaningless, as long as it's not SHN_UNDEF.
+ shndx = 1;
+ v = gsym.get_st_value();
++ ++this->defined_count_;
+ }
+
+ osym.put_st_name(0);
+@@ -2845,9 +2862,22 @@ Sized_incr_dynobj<size, big_endian>::do_initialize_xindex()
+ template<int size, bool big_endian>
+ void
+ Sized_incr_dynobj<size, big_endian>::do_get_global_symbol_counts(
+- const Symbol_table*, size_t*, size_t*) const
+-{
+- gold_unreachable();
++ const Symbol_table*,
++ size_t* defined,
++ size_t* used) const
++{
++ *defined = this->defined_count_;
++ size_t count = 0;
++ for (typename Symbols::const_iterator p = this->symbols_.begin();
++ p != this->symbols_.end();
++ ++p)
++ if (*p != NULL
++ && (*p)->source() == Symbol::FROM_OBJECT
++ && (*p)->object() == this
++ && (*p)->is_defined()
++ && (*p)->dynsym_index() != -1U)
++ ++count;
++ *used = count;
+ }
+
+ // Allocate an incremental object of the appropriate size and endianness.
+diff --git a/gold/incremental.h b/gold/incremental.h
+index e6732df..56fc52b 100644
+--- a/gold/incremental.h
++++ b/gold/incremental.h
+@@ -1996,6 +1996,8 @@ class Sized_relobj_incr : public Sized_relobj<size, big_endian>
+ unsigned int local_dynsym_offset_;
+ // The entries in the symbol table for the external symbols.
+ Symbols symbols_;
++ // Number of symbols defined in object file itself.
++ size_t defined_count_;
+ // The offset of the first incremental relocation for this object.
+ unsigned int incr_reloc_offset_;
+ // The number of incremental relocations for this object.
+@@ -2127,6 +2129,8 @@ class Sized_incr_dynobj : public Dynobj
+ Input_entry_reader input_reader_;
+ // The entries in the symbol table for the external symbols.
+ Symbols symbols_;
++ // Number of symbols defined in object file itself.
++ size_t defined_count_;
+ };
+
+ // Allocate an incremental object of the appropriate size and endianness.
+diff --git a/gold/layout.cc b/gold/layout.cc
+index 1c32bcf..9d8a43a 100644
+--- a/gold/layout.cc
++++ b/gold/layout.cc
+@@ -2975,8 +2975,9 @@ Layout::segment_precedes(const Output_segment* seg1,
+
+ // We shouldn't get here--we shouldn't create segments which we
+ // can't distinguish. Unless of course we are using a weird linker
+- // script.
+- gold_assert(this->script_options_->saw_phdrs_clause());
++ // script or overlapping --section-start options.
++ gold_assert(this->script_options_->saw_phdrs_clause()
++ || parameters->options().any_section_start());
+ return false;
+ }
+
+diff --git a/gold/options.cc b/gold/options.cc
+index be32645..dcf6ba7 100644
+--- a/gold/options.cc
++++ b/gold/options.cc
+@@ -198,7 +198,7 @@ parse_uint(const char* option_name, const char* arg, int* retval)
+ {
+ char* endptr;
+ *retval = strtol(arg, &endptr, 0);
+- if (*endptr != '\0' || retval < 0)
++ if (*endptr != '\0' || *retval < 0)
+ gold_fatal(_("%s: invalid option value (expected an integer): %s"),
+ option_name, arg);
+ }
+@@ -1224,6 +1224,37 @@ General_options::finalize()
+ gold_fatal(_("Options --incremental-changed, --incremental-unchanged, "
+ "--incremental-unknown require the use of --incremental"));
+
++ // Check for options that are not compatible with incremental linking.
++ // Where an option can be disabled without seriously changing the semantics
++ // of the link, we turn the option off; otherwise, we issue a fatal error.
++
++ if (this->incremental_mode_ != INCREMENTAL_OFF)
++ {
++ if (this->relocatable())
++ gold_fatal(_("incremental linking is not compatible with -r"));
++ if (this->emit_relocs())
++ gold_fatal(_("incremental linking is not compatible with "
++ "--emit-relocs"));
++ if (this->has_plugins())
++ gold_fatal(_("incremental linking is not compatible with --plugin"));
++ if (this->gc_sections())
++ {
++ gold_warning(_("ignoring --gc-sections for an incremental link"));
++ this->set_gc_sections(false);
++ }
++ if (this->icf_enabled())
++ {
++ gold_warning(_("ignoring --icf for an incremental link"));
++ this->set_icf_status(ICF_NONE);
++ }
++ if (strcmp(this->compress_debug_sections(), "none") != 0)
++ {
++ gold_warning(_("ignoring --compress-debug-sections for an "
++ "incremental link"));
++ this->set_compress_debug_sections("none");
++ }
++ }
++
+ // FIXME: we can/should be doing a lot more sanity checking here.
+ }
+
+diff --git a/gold/options.h b/gold/options.h
+index 768df9c..8876a1e 100644
+--- a/gold/options.h
++++ b/gold/options.h
+@@ -791,6 +791,10 @@ class General_options
+ DEFINE_bool(g, options::EXACTLY_ONE_DASH, '\0', false,
+ N_("Ignored"), NULL);
+
++ DEFINE_bool(gnu_unique, options::TWO_DASHES, '\0', true,
++ N_("Enable STB_GNU_UNIQUE symbol binding (default)"),
++ N_("Disable STB_GNU_UNIQUE symbol binding"));
++
+ DEFINE_string(soname, options::ONE_DASH, 'h', NULL,
+ N_("Set shared library name"), N_("FILENAME"));
+
+@@ -1385,6 +1389,11 @@ class General_options
+ bool
+ section_start(const char* secname, uint64_t* paddr) const;
+
++ // Return whether any --section-start option was used.
++ bool
++ any_section_start() const
++ { return !this->section_starts_.empty(); }
++
+ enum Fix_v4bx
+ {
+ // Leave original instruction.
+diff --git a/gold/output.cc b/gold/output.cc
+index 29d8e3d..a7e1e9a 100644
+--- a/gold/output.cc
++++ b/gold/output.cc
+@@ -119,7 +119,9 @@ extern "C" void *gold_mremap(void *, size_t, size_t, int);
+ static int
+ posix_fallocate(int o, off_t offset, off_t len)
+ {
+- return ftruncate(o, offset + len);
++ if (ftruncate(o, offset + len) < 0)
++ return errno;
++ return 0;
+ }
+ #endif // !defined(HAVE_POSIX_FALLOCATE)
+
+@@ -706,7 +708,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ bool is_symbolless)
+ : address_(address), local_sym_index_(GSYM_CODE), type_(type),
+ is_relative_(is_relative), is_symbolless_(is_symbolless),
+- is_section_symbol_(false), shndx_(INVALID_CODE)
++ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
+ {
+ // this->type_ is a bitfield; make sure TYPE fits.
+ gold_assert(this->type_ == type);
+@@ -727,7 +729,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ bool is_symbolless)
+ : address_(address), local_sym_index_(GSYM_CODE), type_(type),
+ is_relative_(is_relative), is_symbolless_(is_symbolless),
+- is_section_symbol_(false), shndx_(shndx)
++ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
+ {
+ gold_assert(shndx != INVALID_CODE);
+ // this->type_ is a bitfield; make sure TYPE fits.
+@@ -749,10 +751,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address,
+ bool is_relative,
+ bool is_symbolless,
+- bool is_section_symbol)
++ bool is_section_symbol,
++ bool use_plt_offset)
+ : address_(address), local_sym_index_(local_sym_index), type_(type),
+ is_relative_(is_relative), is_symbolless_(is_symbolless),
+- is_section_symbol_(is_section_symbol), shndx_(INVALID_CODE)
++ is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset),
++ shndx_(INVALID_CODE)
+ {
+ gold_assert(local_sym_index != GSYM_CODE
+ && local_sym_index != INVALID_CODE);
+@@ -773,10 +777,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address,
+ bool is_relative,
+ bool is_symbolless,
+- bool is_section_symbol)
++ bool is_section_symbol,
++ bool use_plt_offset)
+ : address_(address), local_sym_index_(local_sym_index), type_(type),
+ is_relative_(is_relative), is_symbolless_(is_symbolless),
+- is_section_symbol_(is_section_symbol), shndx_(shndx)
++ is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset),
++ shndx_(shndx)
+ {
+ gold_assert(local_sym_index != GSYM_CODE
+ && local_sym_index != INVALID_CODE);
+@@ -799,7 +805,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address)
+ : address_(address), local_sym_index_(SECTION_CODE), type_(type),
+ is_relative_(false), is_symbolless_(false),
+- is_section_symbol_(true), shndx_(INVALID_CODE)
++ is_section_symbol_(true), use_plt_offset_(false), shndx_(INVALID_CODE)
+ {
+ // this->type_ is a bitfield; make sure TYPE fits.
+ gold_assert(this->type_ == type);
+@@ -820,7 +826,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address)
+ : address_(address), local_sym_index_(SECTION_CODE), type_(type),
+ is_relative_(false), is_symbolless_(false),
+- is_section_symbol_(true), shndx_(shndx)
++ is_section_symbol_(true), use_plt_offset_(false), shndx_(shndx)
+ {
+ gold_assert(shndx != INVALID_CODE);
+ // this->type_ is a bitfield; make sure TYPE fits.
+@@ -842,7 +848,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address)
+ : address_(address), local_sym_index_(0), type_(type),
+ is_relative_(false), is_symbolless_(false),
+- is_section_symbol_(false), shndx_(INVALID_CODE)
++ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
+ {
+ // this->type_ is a bitfield; make sure TYPE fits.
+ gold_assert(this->type_ == type);
+@@ -858,7 +864,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address)
+ : address_(address), local_sym_index_(0), type_(type),
+ is_relative_(false), is_symbolless_(false),
+- is_section_symbol_(false), shndx_(shndx)
++ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
+ {
+ gold_assert(shndx != INVALID_CODE);
+ // this->type_ is a bitfield; make sure TYPE fits.
+@@ -877,7 +883,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address)
+ : address_(address), local_sym_index_(TARGET_CODE), type_(type),
+ is_relative_(false), is_symbolless_(false),
+- is_section_symbol_(false), shndx_(INVALID_CODE)
++ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE)
+ {
+ // this->type_ is a bitfield; make sure TYPE fits.
+ gold_assert(this->type_ == type);
+@@ -894,7 +900,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
+ Address address)
+ : address_(address), local_sym_index_(TARGET_CODE), type_(type),
+ is_relative_(false), is_symbolless_(false),
+- is_section_symbol_(false), shndx_(shndx)
++ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx)
+ {
+ gold_assert(shndx != INVALID_CODE);
+ // this->type_ is a bitfield; make sure TYPE fits.
+@@ -1121,6 +1127,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::symbol_value(
+ Sized_relobj_file<size, big_endian>* relobj =
+ this->u1_.relobj->sized_relobj();
+ gold_assert(relobj != NULL);
++ if (this->use_plt_offset_)
++ {
++ uint64_t plt_address =
++ parameters->target().plt_address_for_local(relobj, lsi);
++ return plt_address + relobj->local_plt_offset(lsi);
++ }
+ const Symbol_value<size>* symval = relobj->local_symbol(lsi);
+ return symval->value(relobj, addend);
+ }
+@@ -4880,17 +4892,27 @@ Output_file::open_base_file(const char* base_name, bool writable)
+ if (use_base_file)
+ {
+ this->open(s.st_size);
+- ssize_t len = ::read(o, this->base_, s.st_size);
+- if (len < 0)
+- {
+- gold_info(_("%s: read failed: %s"), base_name, strerror(errno));
+- return false;
+- }
+- if (len < s.st_size)
+- {
+- gold_info(_("%s: file too short"), base_name);
+- return false;
+- }
++ ssize_t bytes_to_read = s.st_size;
++ unsigned char* p = this->base_;
++ while (bytes_to_read > 0)
++ {
++ ssize_t len = ::read(o, p, bytes_to_read);
++ if (len < 0)
++ {
++ gold_info(_("%s: read failed: %s"), base_name, strerror(errno));
++ return false;
++ }
++ if (len == 0)
++ {
++ gold_info(_("%s: file too short: read only %lld of %lld bytes"),
++ base_name,
++ static_cast<long long>(s.st_size - bytes_to_read),
++ static_cast<long long>(s.st_size));
++ return false;
++ }
++ p += len;
++ bytes_to_read -= len;
++ }
+ ::close(o);
+ return true;
+ }
+@@ -5052,8 +5074,12 @@ Output_file::map_no_anonymous(bool writable)
+ // output file will wind up incomplete, but we will have already
+ // exited. The alternative to fallocate would be to use fdatasync,
+ // but that would be a more significant performance hit.
+- if (writable && ::posix_fallocate(o, 0, this->file_size_) < 0)
+- gold_fatal(_("%s: %s"), this->name_, strerror(errno));
++ if (writable)
++ {
++ int err = ::posix_fallocate(o, 0, this->file_size_);
++ if (err != 0)
++ gold_fatal(_("%s: %s"), this->name_, strerror(err));
++ }
+
+ // Map the file into memory.
+ int prot = PROT_READ;
+diff --git a/gold/output.h b/gold/output.h
+index 1bec2c0..e2d35e2 100644
+--- a/gold/output.h
++++ b/gold/output.h
+@@ -1033,12 +1033,14 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_reloc(Sized_relobj<size, big_endian>* relobj,
+ unsigned int local_sym_index, unsigned int type,
+ Output_data* od, Address address, bool is_relative,
+- bool is_symbolless, bool is_section_symbol);
++ bool is_symbolless, bool is_section_symbol,
++ bool use_plt_offset);
+
+ Output_reloc(Sized_relobj<size, big_endian>* relobj,
+ unsigned int local_sym_index, unsigned int type,
+ unsigned int shndx, Address address, bool is_relative,
+- bool is_symbolless, bool is_section_symbol);
++ bool is_symbolless, bool is_section_symbol,
++ bool use_plt_offset);
+
+ // A reloc against the STT_SECTION symbol of an output section.
+
+@@ -1216,7 +1218,7 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ // input file.
+ unsigned int local_sym_index_;
+ // The reloc type--a processor specific code.
+- unsigned int type_ : 29;
++ unsigned int type_ : 28;
+ // True if the relocation is a RELATIVE relocation.
+ bool is_relative_ : 1;
+ // True if the relocation is one which should not use
+@@ -1224,6 +1226,10 @@ class Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ bool is_symbolless_ : 1;
+ // True if the relocation is against a section symbol.
+ bool is_section_symbol_ : 1;
++ // True if the addend should be the PLT offset. This is used only
++ // for RELATIVE relocations to local symbols.
++ // (Used only for RELA, but stored here for space.)
++ bool use_plt_offset_ : 1;
+ // If the reloc address is an input section in an object, the
+ // section index. This is INVALID_CODE if the reloc address is
+ // specified in some other way.
+@@ -1268,9 +1274,10 @@ class Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ unsigned int local_sym_index, unsigned int type,
+ Output_data* od, Address address,
+ Addend addend, bool is_relative,
+- bool is_symbolless, bool is_section_symbol)
++ bool is_symbolless, bool is_section_symbol,
++ bool use_plt_offset)
+ : rel_(relobj, local_sym_index, type, od, address, is_relative,
+- is_symbolless, is_section_symbol),
++ is_symbolless, is_section_symbol, use_plt_offset),
+ addend_(addend)
+ { }
+
+@@ -1278,9 +1285,10 @@ class Output_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ unsigned int local_sym_index, unsigned int type,
+ unsigned int shndx, Address address,
+ Addend addend, bool is_relative,
+- bool is_symbolless, bool is_section_symbol)
++ bool is_symbolless, bool is_section_symbol,
++ bool use_plt_offset)
+ : rel_(relobj, local_sym_index, type, shndx, address, is_relative,
+- is_symbolless, is_section_symbol),
++ is_symbolless, is_section_symbol, use_plt_offset),
+ addend_(addend)
+ { }
+
+@@ -1571,7 +1579,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, od,
+- address, false, false, false));
++ address, false, false, false, false));
+ }
+
+ void
+@@ -1580,7 +1588,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, unsigned int shndx, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
+- address, false, false, false));
++ address, false, false, false, false));
+ }
+
+ // Add a RELATIVE reloc against a local symbol.
+@@ -1591,7 +1599,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, od,
+- address, true, true, false));
++ address, true, true, false, false));
+ }
+
+ void
+@@ -1600,7 +1608,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, unsigned int shndx, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
+- address, true, true, false));
++ address, true, true, false, false));
+ }
+
+ // Add a local relocation which does not use a symbol for the relocation,
+@@ -1612,7 +1620,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, od,
+- address, false, true, false));
++ address, false, true, false, false));
+ }
+
+ void
+@@ -1622,7 +1630,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
+- address, false, true, false));
++ address, false, true, false, false));
+ }
+
+ // Add a reloc against a local section symbol. This will be
+@@ -1635,7 +1643,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, input_shndx, type, od,
+- address, false, false, true));
++ address, false, false, true, false));
+ }
+
+ void
+@@ -1644,7 +1652,7 @@ class Output_data_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>
+ Output_data* od, unsigned int shndx, Address address)
+ {
+ this->add(od, Output_reloc_type(relobj, input_shndx, type, shndx,
+- address, false, false, true));
++ address, false, false, true, false));
+ }
+
+ // A reloc against the STT_SECTION symbol of an output section.
+@@ -1767,7 +1775,7 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ Output_data* od, Address address, Addend addend)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, od, address,
+- addend, false, false, false));
++ addend, false, false, false, false));
+ }
+
+ void
+@@ -1777,7 +1785,8 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ Addend addend)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
+- address, addend, false, false, false));
++ address, addend, false, false, false,
++ false));
+ }
+
+ // Add a RELATIVE reloc against a local symbol.
+@@ -1785,20 +1794,23 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ void
+ add_local_relative(Sized_relobj<size, big_endian>* relobj,
+ unsigned int local_sym_index, unsigned int type,
+- Output_data* od, Address address, Addend addend)
++ Output_data* od, Address address, Addend addend,
++ bool use_plt_offset)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, od, address,
+- addend, true, true, false));
++ addend, true, true, false,
++ use_plt_offset));
+ }
+
+ void
+ add_local_relative(Sized_relobj<size, big_endian>* relobj,
+ unsigned int local_sym_index, unsigned int type,
+ Output_data* od, unsigned int shndx, Address address,
+- Addend addend)
++ Addend addend, bool use_plt_offset)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
+- address, addend, true, true, false));
++ address, addend, true, true, false,
++ use_plt_offset));
+ }
+
+ // Add a local relocation which does not use a symbol for the relocation,
+@@ -1810,7 +1822,7 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ Output_data* od, Address address, Addend addend)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, od, address,
+- addend, false, true, false));
++ addend, false, true, false, false));
+ }
+
+ void
+@@ -1820,7 +1832,8 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ Address address, Addend addend)
+ {
+ this->add(od, Output_reloc_type(relobj, local_sym_index, type, shndx,
+- address, addend, false, true, false));
++ address, addend, false, true, false,
++ false));
+ }
+
+ // Add a reloc against a local section symbol. This will be
+@@ -1833,7 +1846,7 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ Output_data* od, Address address, Addend addend)
+ {
+ this->add(od, Output_reloc_type(relobj, input_shndx, type, od, address,
+- addend, false, false, true));
++ addend, false, false, true, false));
+ }
+
+ void
+@@ -1843,7 +1856,8 @@ class Output_data_reloc<elfcpp::SHT_RELA, dynamic, size, big_endian>
+ Addend addend)
+ {
+ this->add(od, Output_reloc_type(relobj, input_shndx, type, shndx,
+- address, addend, false, false, true));
++ address, addend, false, false, true,
++ false));
+ }
+
+ // A reloc against the STT_SECTION symbol of an output section.
+diff --git a/gold/plugin.cc b/gold/plugin.cc
+index 3ccd8d0..b4e68f8 100644
+--- a/gold/plugin.cc
++++ b/gold/plugin.cc
+@@ -818,7 +818,9 @@ Pluginobj::Pluginobj(const std::string& name, Input_file* input_file,
+ }
+
+ // Return TRUE if a defined symbol is referenced from outside the
+-// universe of claimed objects.
++// universe of claimed objects. Only references from relocatable,
++// non-IR (unclaimed) objects count as a reference. References from
++// dynamic objects count only as "visible".
+
+ static inline bool
+ is_referenced_from_outside(Symbol* lsym)
+@@ -838,6 +840,8 @@ is_referenced_from_outside(Symbol* lsym)
+ static inline bool
+ is_visible_from_outside(Symbol* lsym)
+ {
++ if (lsym->in_dyn())
++ return true;
+ if (parameters->options().export_dynamic() || parameters->options().shared())
+ return lsym->is_externally_visible();
+ return false;
+@@ -1244,14 +1248,18 @@ Sized_pluginobj<size, big_endian>::do_initialize_xindex()
+ return NULL;
+ }
+
+-// Get symbol counts. Not used for plugin objects.
++// Get symbol counts. Don't count plugin objects; the replacement
++// files will provide the counts.
+
+ template<int size, bool big_endian>
+ void
+-Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(const Symbol_table*,
+- size_t*, size_t*) const
++Sized_pluginobj<size, big_endian>::do_get_global_symbol_counts(
++ const Symbol_table*,
++ size_t* defined,
++ size_t* used) const
+ {
+- gold_unreachable();
++ *defined = 0;
++ *used = 0;
+ }
+
+ // Get symbols. Not used for plugin objects.
+diff --git a/gold/powerpc.cc b/gold/powerpc.cc
+index 45783c3..62a17ca 100644
+--- a/gold/powerpc.cc
++++ b/gold/powerpc.cc
+@@ -1329,7 +1329,7 @@ Target_powerpc<size, big_endian>::Scan::local(
+ rela_dyn->add_local_relative(object, r_sym, r_type,
+ output_section, data_shndx,
+ reloc.get_r_offset(),
+- reloc.get_r_addend());
++ reloc.get_r_addend(), false);
+ }
+ }
+ break;
+@@ -1372,7 +1372,7 @@ Target_powerpc<size, big_endian>::Scan::local(
+ object->set_local_got_offset(r_sym, GOT_TYPE_STANDARD, off);
+ rela_dyn->add_local_relative(object, r_sym,
+ elfcpp::R_POWERPC_RELATIVE,
+- got, off, 0);
++ got, off, 0, false);
+ }
+ }
+ else
+diff --git a/gold/readsyms.cc b/gold/readsyms.cc
+index 1e50942..9974722 100644
+--- a/gold/readsyms.cc
++++ b/gold/readsyms.cc
+@@ -161,8 +161,10 @@ void
+ Read_symbols::run(Workqueue* workqueue)
+ {
+ // If we didn't queue a new task, then we need to explicitly unblock
+- // the token.
+- if (!this->do_read_symbols(workqueue))
++ // the token. If the object is a member of a lib group, however,
++ // the token was already added to the list of locks for the task,
++ // and it will be unblocked automatically at the end of the task.
++ if (!this->do_read_symbols(workqueue) && this->member_ == NULL)
+ workqueue->queue_soon(new Unblock_token(this->this_blocker_,
+ this->next_blocker_));
+ }
+diff --git a/gold/resolve.cc b/gold/resolve.cc
+index 03288ec..780038a 100644
+--- a/gold/resolve.cc
++++ b/gold/resolve.cc
+@@ -296,7 +296,7 @@ Symbol_table::resolve(Sized_symbol<size>* to,
+
+ // Record if we've seen this symbol in a real ELF object (i.e., the
+ // symbol is referenced from outside the world known to the plugin).
+- if (object->pluginobj() == NULL)
++ if (object->pluginobj() == NULL && !object->is_dynamic())
+ to->set_in_real_elf();
+
+ // If we're processing replacement files, allow new symbols to override
+@@ -336,9 +336,9 @@ Symbol_table::resolve(Sized_symbol<size>* to,
+ && to->name()[0] == '_' && to->name()[1] == 'Z')
+ {
+ Symbol_location fromloc
+- = { object, orig_st_shndx, sym.get_st_value() };
++ = { object, orig_st_shndx, static_cast<off_t>(sym.get_st_value()) };
+ Symbol_location toloc = { to->object(), to->shndx(&to_is_ordinary),
+- to->value() };
++ static_cast<off_t>(to->value()) };
+ this->candidate_odr_violations_[to->name()].insert(fromloc);
+ this->candidate_odr_violations_[to->name()].insert(toloc);
+ }
+diff --git a/gold/script-sections.cc b/gold/script-sections.cc
+index 1fad88d..f90c0b3 100644
+--- a/gold/script-sections.cc
++++ b/gold/script-sections.cc
+@@ -680,7 +680,7 @@ class Sections_element_assignment : public Sections_element
+ set_section_addresses(Symbol_table* symtab, Layout* layout,
+ uint64_t* dot_value, uint64_t*, uint64_t*)
+ {
+- this->assignment_.set_if_absolute(symtab, layout, true, *dot_value);
++ this->assignment_.set_if_absolute(symtab, layout, true, *dot_value, NULL);
+ }
+
+ // Print for debugging.
+@@ -714,7 +714,7 @@ class Sections_element_dot_assignment : public Sections_element
+ // output section definition the dot symbol is always considered
+ // to be absolute.
+ *dot_value = this->val_->eval_with_dot(symtab, layout, true, *dot_value,
+- NULL, NULL, NULL);
++ NULL, NULL, NULL, false);
+ }
+
+ // Update the dot symbol while setting section addresses.
+@@ -724,7 +724,7 @@ class Sections_element_dot_assignment : public Sections_element
+ uint64_t* load_address)
+ {
+ *dot_value = this->val_->eval_with_dot(symtab, layout, false, *dot_value,
+- NULL, NULL, dot_alignment);
++ NULL, NULL, dot_alignment, false);
+ *load_address = *dot_value;
+ }
+
+@@ -866,9 +866,11 @@ class Output_section_element_assignment : public Output_section_element
+ void
+ set_section_addresses(Symbol_table* symtab, Layout* layout, Output_section*,
+ uint64_t, uint64_t* dot_value, uint64_t*,
+- Output_section**, std::string*, Input_section_list*)
++ Output_section** dot_section, std::string*,
++ Input_section_list*)
+ {
+- this->assignment_.set_if_absolute(symtab, layout, true, *dot_value);
++ this->assignment_.set_if_absolute(symtab, layout, true, *dot_value,
++ *dot_section);
+ }
+
+ // Print for debugging.
+@@ -892,20 +894,28 @@ class Output_section_element_dot_assignment : public Output_section_element
+ : val_(val)
+ { }
+
++ // An assignment to dot within an output section is enough to force
++ // the output section to exist.
++ bool
++ needs_output_section() const
++ { return true; }
++
+ // Finalize the symbol.
+ void
+ finalize_symbols(Symbol_table* symtab, const Layout* layout,
+ uint64_t* dot_value, Output_section** dot_section)
+ {
+ *dot_value = this->val_->eval_with_dot(symtab, layout, true, *dot_value,
+- *dot_section, dot_section, NULL);
++ *dot_section, dot_section, NULL,
++ true);
+ }
+
+ // Update the dot symbol while setting section addresses.
+ void
+ set_section_addresses(Symbol_table* symtab, Layout* layout, Output_section*,
+ uint64_t, uint64_t* dot_value, uint64_t*,
+- Output_section**, std::string*, Input_section_list*);
++ Output_section** dot_section, std::string*,
++ Input_section_list*);
+
+ // Print for debugging.
+ void
+@@ -936,7 +946,8 @@ Output_section_element_dot_assignment::set_section_addresses(
+ {
+ uint64_t next_dot = this->val_->eval_with_dot(symtab, layout, false,
+ *dot_value, *dot_section,
+- dot_section, dot_alignment);
++ dot_section, dot_alignment,
++ true);
+ if (next_dot < *dot_value)
+ gold_error(_("dot may not move backward"));
+ if (next_dot > *dot_value && output_section != NULL)
+@@ -1037,7 +1048,8 @@ Output_data_expression::do_write_to_buffer(unsigned char* buf)
+ {
+ uint64_t val = this->val_->eval_with_dot(this->symtab_, this->layout_,
+ true, this->dot_value_,
+- this->dot_section_, NULL, NULL);
++ this->dot_section_, NULL, NULL,
++ false);
+
+ if (parameters->target().is_big_endian())
+ this->endian_write_to_buffer<true>(val, buf);
+@@ -1187,7 +1199,7 @@ class Output_section_element_fill : public Output_section_element
+ Output_section* fill_section;
+ uint64_t fill_val = this->val_->eval_with_dot(symtab, layout, false,
+ *dot_value, *dot_section,
+- &fill_section, NULL);
++ &fill_section, NULL, false);
+ if (fill_section != NULL)
+ gold_warning(_("fill value is not absolute"));
+ // FIXME: The GNU linker supports fill values of arbitrary length.
+@@ -2108,13 +2120,13 @@ Output_section_definition::finalize_symbols(Symbol_table* symtab,
+ {
+ address = this->address_->eval_with_dot(symtab, layout, true,
+ *dot_value, NULL,
+- NULL, NULL);
++ NULL, NULL, false);
+ }
+ if (this->align_ != NULL)
+ {
+ uint64_t align = this->align_->eval_with_dot(symtab, layout, true,
+ *dot_value, NULL,
+- NULL, NULL);
++ NULL, NULL, false);
+ address = align_address(address, align);
+ }
+ *dot_value = address;
+@@ -2303,7 +2315,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
+ else
+ address = this->address_->eval_with_dot(symtab, layout, true,
+ *dot_value, NULL, NULL,
+- dot_alignment);
++ dot_alignment, false);
+ uint64_t align;
+ if (this->align_ == NULL)
+ {
+@@ -2316,7 +2328,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
+ {
+ Output_section* align_section;
+ align = this->align_->eval_with_dot(symtab, layout, true, *dot_value,
+- NULL, &align_section, NULL);
++ NULL, &align_section, NULL, false);
+ if (align_section != NULL)
+ gold_warning(_("alignment of section %s is not absolute"),
+ this->name_.c_str());
+@@ -2401,7 +2413,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
+ laddr = this->load_address_->eval_with_dot(symtab, layout, true,
+ *dot_value,
+ this->output_section_,
+- NULL, NULL);
++ NULL, NULL, false);
+ if (this->output_section_ != NULL)
+ this->output_section_->set_load_address(laddr);
+ }
+@@ -2416,7 +2428,8 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
+ Output_section* subalign_section;
+ subalign = this->subalign_->eval_with_dot(symtab, layout, true,
+ *dot_value, NULL,
+- &subalign_section, NULL);
++ &subalign_section, NULL,
++ false);
+ if (subalign_section != NULL)
+ gold_warning(_("subalign of section %s is not absolute"),
+ this->name_.c_str());
+@@ -2431,7 +2444,7 @@ Output_section_definition::set_section_addresses(Symbol_table* symtab,
+ uint64_t fill_val = this->fill_->eval_with_dot(symtab, layout, true,
+ *dot_value,
+ NULL, &fill_section,
+- NULL);
++ NULL, false);
+ if (fill_section != NULL)
+ gold_warning(_("fill of section %s is not absolute"),
+ this->name_.c_str());
+diff --git a/gold/script.cc b/gold/script.cc
+index 7df0c9e..b471cf9 100644
+--- a/gold/script.cc
++++ b/gold/script.cc
+@@ -983,18 +983,20 @@ Symbol_assignment::sized_finalize(Symbol_table* symtab, const Layout* layout,
+ uint64_t final_val = this->val_->eval_maybe_dot(symtab, layout, true,
+ is_dot_available,
+ dot_value, dot_section,
+- &section, NULL);
++ &section, NULL, false);
+ Sized_symbol<size>* ssym = symtab->get_sized_symbol<size>(this->sym_);
+ ssym->set_value(final_val);
+ if (section != NULL)
+ ssym->set_output_section(section);
+ }
+
+-// Set the symbol value if the expression yields an absolute value.
++// Set the symbol value if the expression yields an absolute value or
++// a value relative to DOT_SECTION.
+
+ void
+ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
+- bool is_dot_available, uint64_t dot_value)
++ bool is_dot_available, uint64_t dot_value,
++ Output_section* dot_section)
+ {
+ if (this->sym_ == NULL)
+ return;
+@@ -1002,8 +1004,9 @@ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
+ Output_section* val_section;
+ uint64_t val = this->val_->eval_maybe_dot(symtab, layout, false,
+ is_dot_available, dot_value,
+- NULL, &val_section, NULL);
+- if (val_section != NULL)
++ dot_section, &val_section, NULL,
++ false);
++ if (val_section != NULL && val_section != dot_section)
+ return;
+
+ if (parameters->target().get_size() == 32)
+@@ -1026,6 +1029,8 @@ Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
+ }
+ else
+ gold_unreachable();
++ if (val_section != NULL)
++ this->sym_->set_output_section(val_section);
+ }
+
+ // Print for debugging.
+@@ -1215,7 +1220,7 @@ Script_options::set_section_addresses(Symbol_table* symtab, Layout* layout)
+ for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
+ p != this->symbol_assignments_.end();
+ ++p)
+- (*p)->set_if_absolute(symtab, layout, false, 0);
++ (*p)->set_if_absolute(symtab, layout, false, 0, NULL);
+
+ return this->script_sections_.set_section_addresses(symtab, layout);
+ }
+diff --git a/gold/script.h b/gold/script.h
+index 73079a4..f41f438 100644
+--- a/gold/script.h
++++ b/gold/script.h
+@@ -90,20 +90,28 @@ class Expression
+ // the section address. If RESULT_ALIGNMENT is not NULL, this sets
+ // *RESULT_ALIGNMENT to the alignment of the value of that alignment
+ // is larger than *RESULT_ALIGNMENT; this will only be non-zero if
+- // this is an ALIGN expression.
++ // this is an ALIGN expression. If IS_SECTION_DOT_ASSIGMENT is true,
++ // we are evaluating an assignment to dot within an output section,
++ // and an absolute value should be interpreted as an offset within
++ // the section.
+ uint64_t
+ eval_with_dot(const Symbol_table*, const Layout*, bool check_assertions,
+ uint64_t dot_value, Output_section* dot_section,
+- Output_section** result_section, uint64_t* result_alignment);
++ Output_section** result_section, uint64_t* result_alignment,
++ bool is_section_dot_assignment);
+
+ // Return the value of an expression which may or may not be
+ // permitted to refer to the dot symbol, depending on
+- // is_dot_available.
++ // is_dot_available. If IS_SECTION_DOT_ASSIGMENT is true,
++ // we are evaluating an assignment to dot within an output section,
++ // and an absolute value should be interpreted as an offset within
++ // the section.
+ uint64_t
+ eval_maybe_dot(const Symbol_table*, const Layout*, bool check_assertions,
+ bool is_dot_available, uint64_t dot_value,
+ Output_section* dot_section,
+- Output_section** result_section, uint64_t* result_alignment);
++ Output_section** result_section, uint64_t* result_alignment,
++ bool is_section_dot_assignment);
+
+ // Print the expression to the FILE. This is for debugging.
+ virtual void
+@@ -339,12 +347,12 @@ class Symbol_assignment
+ finalize_with_dot(Symbol_table*, const Layout*, uint64_t dot_value,
+ Output_section* dot_section);
+
+- // Set the symbol value, but only if the value is absolute. This is
+- // used while processing a SECTIONS clause. We assume that dot is
+- // an absolute value here. We do not check assertions.
++ // Set the symbol value, but only if the value is absolute or relative to
++ // DOT_SECTION. This is used while processing a SECTIONS clause.
++ // We assume that dot is an absolute value here. We do not check assertions.
+ void
+ set_if_absolute(Symbol_table*, const Layout*, bool is_dot_available,
+- uint64_t dot_value);
++ uint64_t dot_value, Output_section* dot_section);
+
+ const std::string&
+ name() const
+diff --git a/gold/sparc.cc b/gold/sparc.cc
+index 5f67a4e..12e1dee 100644
+--- a/gold/sparc.cc
++++ b/gold/sparc.cc
+@@ -1855,7 +1855,7 @@ Target_sparc<size, big_endian>::Scan::local(
+ rela_dyn->add_local_relative(object, r_sym, elfcpp::R_SPARC_RELATIVE,
+ output_section, data_shndx,
+ reloc.get_r_offset(),
+- reloc.get_r_addend());
++ reloc.get_r_addend(), false);
+ }
+ break;
+
+@@ -1946,7 +1946,7 @@ Target_sparc<size, big_endian>::Scan::local(
+ object->set_local_got_offset(r_sym, GOT_TYPE_STANDARD, off);
+ rela_dyn->add_local_relative(object, r_sym,
+ elfcpp::R_SPARC_RELATIVE,
+- got, off, 0);
++ got, off, 0, false);
+ }
+ }
+ else
+diff --git a/gold/symtab.cc b/gold/symtab.cc
+index ff1b5ca..f0ba1d5 100644
+--- a/gold/symtab.cc
++++ b/gold/symtab.cc
+@@ -602,20 +602,16 @@ Symbol_table::gc_mark_undef_symbols(Layout* layout)
+ }
+
+ void
+-Symbol_table::gc_mark_symbol_for_shlib(Symbol* sym)
++Symbol_table::gc_mark_symbol(Symbol* sym)
+ {
+- if (!sym->is_from_dynobj()
+- && sym->is_externally_visible())
++ // Add the object and section to the work list.
++ Relobj* obj = static_cast<Relobj*>(sym->object());
++ bool is_ordinary;
++ unsigned int shndx = sym->shndx(&is_ordinary);
++ if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
+ {
+- //Add the object and section to the work list.
+- Relobj* obj = static_cast<Relobj*>(sym->object());
+- bool is_ordinary;
+- unsigned int shndx = sym->shndx(&is_ordinary);
+- if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
+- {
+- gold_assert(this->gc_!= NULL);
+- this->gc_->worklist().push(Section_id(obj, shndx));
+- }
++ gold_assert(this->gc_!= NULL);
++ this->gc_->worklist().push(Section_id(obj, shndx));
+ }
+ }
+
+@@ -626,16 +622,7 @@ Symbol_table::gc_mark_dyn_syms(Symbol* sym)
+ {
+ if (sym->in_dyn() && sym->source() == Symbol::FROM_OBJECT
+ && !sym->object()->is_dynamic())
+- {
+- Relobj* obj = static_cast<Relobj*>(sym->object());
+- bool is_ordinary;
+- unsigned int shndx = sym->shndx(&is_ordinary);
+- if (is_ordinary && shndx != elfcpp::SHN_UNDEF)
+- {
+- gold_assert(this->gc_ != NULL);
+- this->gc_->worklist().push(Section_id(obj, shndx));
+- }
+- }
++ this->gc_mark_symbol(sym);
+ }
+
+ // Make TO a symbol which forwards to FROM.
+@@ -1143,6 +1130,14 @@ Symbol_table::add_from_relobj(
+ bool is_default_version = false;
+ bool is_forced_local = false;
+
++ // FIXME: For incremental links, we don't store version information,
++ // so we need to ignore version symbols for now.
++ if (parameters->incremental_update() && ver != NULL)
++ {
++ namelen = ver - name;
++ ver = NULL;
++ }
++
+ if (ver != NULL)
+ {
+ // The symbol name is of the form foo@VERSION or foo@@VERSION
+@@ -1243,11 +1238,16 @@ Symbol_table::add_from_relobj(
+ if (is_forced_local)
+ this->force_local(res);
+
+- // If building a shared library using garbage collection, do not
+- // treat externally visible symbols as garbage.
+- if (parameters->options().gc_sections()
+- && parameters->options().shared())
+- this->gc_mark_symbol_for_shlib(res);
++ // Do not treat this symbol as garbage if this symbol will be
++ // exported to the dynamic symbol table. This is true when
++ // building a shared library or using --export-dynamic and
++ // the symbol is externally visible.
++ if (parameters->options().gc_sections()
++ && res->is_externally_visible()
++ && !res->is_from_dynobj()
++ && (parameters->options().shared()
++ || parameters->options().export_dynamic()))
++ this->gc_mark_symbol(res);
+
+ if (is_defined_in_discarded_section)
+ res->set_is_defined_in_discarded_section();
+@@ -1346,6 +1346,11 @@ Symbol_table::add_from_dynobj(
+ return;
+ }
+
++ // FIXME: For incremental links, we don't store version information,
++ // so we need to ignore version symbols for now.
++ if (parameters->incremental_update())
++ versym = NULL;
++
+ if (versym != NULL && versym_size / 2 < count)
+ {
+ dynobj->error(_("too few symbol versions"));
+@@ -2809,6 +2814,12 @@ Symbol_table::sized_write_globals(const Stringpool* sympool,
+ typename elfcpp::Elf_types<size>::Elf_Addr sym_value = sym->value();
+ typename elfcpp::Elf_types<size>::Elf_Addr dynsym_value = sym_value;
+ elfcpp::STB binding = sym->binding();
++
++ // If --no-gnu-unique is set, change STB_GNU_UNIQUE to STB_GLOBAL.
++ if (binding == elfcpp::STB_GNU_UNIQUE
++ && !parameters->options().gnu_unique())
++ binding = elfcpp::STB_GLOBAL;
++
+ switch (sym->source())
+ {
+ case Symbol::FROM_OBJECT:
+diff --git a/gold/symtab.h b/gold/symtab.h
+index b9b9e00..427f72f 100644
+--- a/gold/symtab.h
++++ b/gold/symtab.h
+@@ -1308,10 +1308,9 @@ class Symbol_table
+ void
+ gc_mark_undef_symbols(Layout*);
+
+- // During garbage collection, this ensures externally visible symbols
+- // are not treated as garbage while building shared objects.
++ // This tells garbage collection that this symbol is referenced.
+ void
+- gc_mark_symbol_for_shlib(Symbol* sym);
++ gc_mark_symbol(Symbol* sym);
+
+ // During garbage collection, this keeps sections that correspond to
+ // symbols seen in dynamic objects.
+diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
+index 9b8605b..97d6457 100644
+--- a/gold/testsuite/Makefile.am
++++ b/gold/testsuite/Makefile.am
+@@ -870,11 +870,16 @@ initpri3a_DEPENDENCIES = gcctestdir/ld
+ initpri3a_LDFLAGS = -Bgcctestdir/
+ initpri3a_LDADD =
+
+-check_PROGRAMS += initpri3b
+-initpri3b_SOURCES = initpri3.c
+-initpri3b_DEPENDENCIES = gcctestdir/ld
+-initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
+-initpri3b_LDADD =
++# This test fails on targets not using .ctors and .dtors sections (e.g. ARM
++# EABI). Given that gcc is moving towards using .init_array in all cases,
++# this test is commented out. A better fix would be checking whether gcc
++# uses .ctors or .init_array sections in configure.
++
++# check_PROGRAMS += initpri3b
++# initpri3b_SOURCES = initpri3.c
++# initpri3b_DEPENDENCIES = gcctestdir/ld
++# initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
++# initpri3b_LDADD =
+
+ # Test --detect-odr-violations
+ check_SCRIPTS += debug_msg.sh
+diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
+index 67149fb..518d32b 100644
+--- a/gold/testsuite/Makefile.in
++++ b/gold/testsuite/Makefile.in
+@@ -56,6 +56,17 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ @NATIVE_OR_CROSS_LINKER_TRUE@am__append_1 = object_unittest \
+ @NATIVE_OR_CROSS_LINKER_TRUE@ binary_unittest
+
++# This test fails on targets not using .ctors and .dtors sections (e.g. ARM
++# EABI). Given that gcc is moving towards using .init_array in all cases,
++# this test is commented out. A better fix would be checking whether gcc
++# uses .ctors or .init_array sections in configure.
++
++# check_PROGRAMS += initpri3b
++# initpri3b_SOURCES = initpri3.c
++# initpri3b_DEPENDENCIES = gcctestdir/ld
++# initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
++# initpri3b_LDADD =
++
+ # Test --detect-odr-violations
+
+ # Similar to --detect-odr-violations: check for undefined symbols in .so's
+@@ -189,7 +200,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ # Test -o when emitting to a special file (such as something in /dev).
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_24 = many_sections_test \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ many_sections_r_test initpri1 \
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri2 initpri3a initpri3b \
++@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri2 initpri3a \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile
+ @GCC_FALSE@many_sections_test_DEPENDENCIES =
+ @NATIVE_LINKER_FALSE@many_sections_test_DEPENDENCIES =
+@@ -204,8 +215,6 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
+ @NATIVE_LINKER_FALSE@initpri2_DEPENDENCIES =
+ @GCC_FALSE@initpri3a_DEPENDENCIES =
+ @NATIVE_LINKER_FALSE@initpri3a_DEPENDENCIES =
+-@GCC_FALSE@initpri3b_DEPENDENCIES =
+-@NATIVE_LINKER_FALSE@initpri3b_DEPENDENCIES =
+
+ # Check that --detect-odr-violations works with compressed debug sections.
+ @GCC_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_LINKER_TRUE@am__append_27 = debug_msg_cdebug.err
+@@ -712,7 +721,6 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS)
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri1$(EXEEXT) \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri2$(EXEEXT) \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri3a$(EXEEXT) \
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri3b$(EXEEXT) \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile$(EXEEXT)
+ @GCC_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_21 = flagstest_compress_debug_sections$(EXEEXT) \
+ @GCC_TRUE@@HAVE_ZLIB_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile_and_compress_debug_sections$(EXEEXT)
+@@ -1200,11 +1208,6 @@ initpri2_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(initpri2_LDFLAGS) \
+ initpri3a_OBJECTS = $(am_initpri3a_OBJECTS)
+ initpri3a_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(initpri3a_LDFLAGS) \
+ $(LDFLAGS) -o $@
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@am_initpri3b_OBJECTS = \
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@ initpri3.$(OBJEXT)
+-initpri3b_OBJECTS = $(am_initpri3b_OBJECTS)
+-initpri3b_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(initpri3b_LDFLAGS) \
+- $(LDFLAGS) -o $@
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@am_justsyms_OBJECTS = \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ justsyms_1.$(OBJEXT)
+ justsyms_OBJECTS = $(am_justsyms_OBJECTS)
+@@ -1698,7 +1701,7 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c basic_pie_test.c \
+ incremental_copy_test.c incremental_test_2.c \
+ incremental_test_3.c incremental_test_4.c incremental_test_5.c \
+ incremental_test_6.c $(initpri1_SOURCES) $(initpri2_SOURCES) \
+- $(initpri3a_SOURCES) $(initpri3b_SOURCES) $(justsyms_SOURCES) \
++ $(initpri3a_SOURCES) $(justsyms_SOURCES) \
+ $(justsyms_exec_SOURCES) $(large_SOURCES) local_labels_test.c \
+ many_sections_r_test.c $(many_sections_test_SOURCES) \
+ $(object_unittest_SOURCES) permission_test.c plugin_test_1.c \
+@@ -1844,6 +1847,8 @@ EGREP = @EGREP@
+ EXEEXT = @EXEEXT@
+ GENCAT = @GENCAT@
+ GMSGFMT = @GMSGFMT@
++GOLD_LDADD = @GOLD_LDADD@
++GOLD_LDFLAGS = @GOLD_LDFLAGS@
+ GREP = @GREP@
+ INCINTL = @INCINTL@
+ INSTALL = @INSTALL@
+@@ -2279,10 +2284,6 @@ LDADD = libgoldtest.a ../libgold.a ../../libiberty/libiberty.a $(LIBINTL) \
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3a_DEPENDENCIES = gcctestdir/ld
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3a_LDFLAGS = -Bgcctestdir/
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3a_LDADD =
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_SOURCES = initpri3.c
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_DEPENDENCIES = gcctestdir/ld
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_LDFLAGS = -Bgcctestdir/ -Wl,--no-ctors-in-init-array
+-@GCC_TRUE@@NATIVE_LINKER_TRUE@initpri3b_LDADD =
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_SOURCES = ver_test_main.cc
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_DEPENDENCIES = gcctestdir/ld ver_test_1.so ver_test_2.so ver_test_4.so
+ @GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
+@@ -2926,9 +2927,6 @@ initpri2$(EXEEXT): $(initpri2_OBJECTS) $(initpri2_DEPENDENCIES)
+ initpri3a$(EXEEXT): $(initpri3a_OBJECTS) $(initpri3a_DEPENDENCIES)
+ @rm -f initpri3a$(EXEEXT)
+ $(initpri3a_LINK) $(initpri3a_OBJECTS) $(initpri3a_LDADD) $(LIBS)
+-initpri3b$(EXEEXT): $(initpri3b_OBJECTS) $(initpri3b_DEPENDENCIES)
+- @rm -f initpri3b$(EXEEXT)
+- $(initpri3b_LINK) $(initpri3b_OBJECTS) $(initpri3b_LDADD) $(LIBS)
+ justsyms$(EXEEXT): $(justsyms_OBJECTS) $(justsyms_DEPENDENCIES)
+ @rm -f justsyms$(EXEEXT)
+ $(justsyms_LINK) $(justsyms_OBJECTS) $(justsyms_LDADD) $(LIBS)
+@@ -3867,8 +3865,6 @@ initpri2.log: initpri2$(EXEEXT)
+ @p='initpri2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+ initpri3a.log: initpri3a$(EXEEXT)
+ @p='initpri3a$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+-initpri3b.log: initpri3b$(EXEEXT)
+- @p='initpri3b$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+ flagstest_o_specialfile.log: flagstest_o_specialfile$(EXEEXT)
+ @p='flagstest_o_specialfile$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+ flagstest_compress_debug_sections.log: flagstest_compress_debug_sections$(EXEEXT)
+diff --git a/gold/testsuite/plugin_test_2.sh b/gold/testsuite/plugin_test_2.sh
+index a47d22a..293b1f0 100755
+--- a/gold/testsuite/plugin_test_2.sh
++++ b/gold/testsuite/plugin_test_2.sh
+@@ -45,7 +45,7 @@ check plugin_test_2.err "two_file_test_main.o: claim file hook called"
+ check plugin_test_2.err "two_file_test_1.syms: claim file hook called"
+ check plugin_test_2.err "two_file_test_1b.syms: claim file hook called"
+ check plugin_test_2.err "two_file_shared_2.so: claim file hook called"
+-check plugin_test_2.err "two_file_test_1.syms: _Z4f13iv: PREVAILING_DEF_REG"
++check plugin_test_2.err "two_file_test_1.syms: _Z4f13iv: PREVAILING_DEF_IRONLY_EXP"
+ check plugin_test_2.err "two_file_test_1.syms: _Z2t2v: PREVAILING_DEF_REG"
+ check plugin_test_2.err "two_file_test_1.syms: v2: RESOLVED_DYN"
+ check plugin_test_2.err "two_file_test_1.syms: t17data: RESOLVED_DYN"
+diff --git a/gold/testsuite/script_test_2.t b/gold/testsuite/script_test_2.t
+index 73d39df..6a0188f 100644
+--- a/gold/testsuite/script_test_2.t
++++ b/gold/testsuite/script_test_2.t
+@@ -49,7 +49,7 @@ SECTIONS
+ /* This should match the remaining sections. */
+ *(.gold_test)
+
+- . = . + 4;
++ . = 60;
+ start_data = .;
+ BYTE(1)
+ SHORT(2)
+diff --git a/gold/timer.cc b/gold/timer.cc
+index d9b8874..44e19f5 100644
+--- a/gold/timer.cc
++++ b/gold/timer.cc
+@@ -22,6 +22,8 @@
+
+ #include "gold.h"
+
++#include <unistd.h>
++
+ #ifdef HAVE_TIMES
+ #include <sys/times.h>
+ #endif
+diff --git a/gold/x86_64.cc b/gold/x86_64.cc
+index e6b0021..e7c981b 100644
+--- a/gold/x86_64.cc
++++ b/gold/x86_64.cc
+@@ -1549,7 +1549,7 @@ Target_x86_64::reserve_local_got_entry(
+ case GOT_TYPE_STANDARD:
+ if (parameters->options().output_is_position_independent())
+ rela_dyn->add_local_relative(obj, r_sym, elfcpp::R_X86_64_RELATIVE,
+- this->got_, got_offset, 0);
++ this->got_, got_offset, 0, false);
+ break;
+ case GOT_TYPE_TLS_OFFSET:
+ rela_dyn->add_local(obj, r_sym, elfcpp::R_X86_64_TPOFF64,
+@@ -1953,8 +1953,8 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
+ const elfcpp::Sym<64, false>& lsym)
+ {
+ // A local STT_GNU_IFUNC symbol may require a PLT entry.
+- if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC
+- && this->reloc_needs_plt_for_ifunc(object, r_type))
++ bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
++ if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type))
+ {
+ unsigned int r_sym = elfcpp::elf_r_sym<64>(reloc.get_r_info());
+ target->make_local_ifunc_plt_entry(symtab, layout, object, r_sym);
+@@ -1982,7 +1982,7 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
+ elfcpp::R_X86_64_RELATIVE,
+ output_section, data_shndx,
+ reloc.get_r_offset(),
+- reloc.get_r_addend());
++ reloc.get_r_addend(), is_ifunc);
+ }
+ break;
+
+@@ -2058,7 +2058,7 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
+ // lets function pointers compare correctly with shared
+ // libraries. Otherwise we would need an IRELATIVE reloc.
+ bool is_new;
+- if (lsym.get_st_type() == elfcpp::STT_GNU_IFUNC)
++ if (is_ifunc)
+ is_new = got->add_local_plt(object, r_sym, GOT_TYPE_STANDARD);
+ else
+ is_new = got->add_local(object, r_sym, GOT_TYPE_STANDARD);
+@@ -2076,7 +2076,7 @@ Target_x86_64::Scan::local(Symbol_table* symtab,
+ object->local_got_offset(r_sym, GOT_TYPE_STANDARD);
+ rela_dyn->add_local_relative(object, r_sym,
+ elfcpp::R_X86_64_RELATIVE,
+- got, got_offset, 0);
++ got, got_offset, 0, is_ifunc);
+ }
+ else
+ {
+@@ -3181,12 +3181,6 @@ Target_x86_64::Relocate::relocate_tls(const Relocate_info<64, false>* relinfo,
+ }
+ if (optimized_type == tls::TLSOPT_TO_IE)
+ {
+- if (tls_segment == NULL)
+- {
+- gold_assert(parameters->errors()->error_count() > 0
+- || issue_undefined_symbol_error(gsym));
+- return;
+- }
+ value = target->got_plt_section()->address() + got_offset;
+ this->tls_gd_to_ie(relinfo, relnum, tls_segment, rela, r_type,
+ value, view, address, view_size);
+@@ -3867,42 +3861,51 @@ Target_x86_64::do_code_fill(section_size_type length) const
+ }
+
+ // Nop sequences of various lengths.
+- const char nop1[1] = { 0x90 }; // nop
+- const char nop2[2] = { 0x66, 0x90 }; // xchg %ax %ax
+- const char nop3[3] = { 0x0f, 0x1f, 0x00 }; // nop (%rax)
+- const char nop4[4] = { 0x0f, 0x1f, 0x40, 0x00}; // nop 0(%rax)
+- const char nop5[5] = { 0x0f, 0x1f, 0x44, 0x00, // nop 0(%rax,%rax,1)
+- 0x00 };
+- const char nop6[6] = { 0x66, 0x0f, 0x1f, 0x44, // nopw 0(%rax,%rax,1)
+- 0x00, 0x00 };
+- const char nop7[7] = { 0x0f, 0x1f, 0x80, 0x00, // nopl 0L(%rax)
+- 0x00, 0x00, 0x00 };
+- const char nop8[8] = { 0x0f, 0x1f, 0x84, 0x00, // nopl 0L(%rax,%rax,1)
+- 0x00, 0x00, 0x00, 0x00 };
+- const char nop9[9] = { 0x66, 0x0f, 0x1f, 0x84, // nopw 0L(%rax,%rax,1)
+- 0x00, 0x00, 0x00, 0x00,
+- 0x00 };
+- const char nop10[10] = { 0x66, 0x2e, 0x0f, 0x1f, // nopw %cs:0L(%rax,%rax,1)
+- 0x84, 0x00, 0x00, 0x00,
+- 0x00, 0x00 };
+- const char nop11[11] = { 0x66, 0x66, 0x2e, 0x0f, // data16
+- 0x1f, 0x84, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
+- 0x00, 0x00, 0x00 };
+- const char nop12[12] = { 0x66, 0x66, 0x66, 0x2e, // data16; data16
+- 0x0f, 0x1f, 0x84, 0x00, // nopw %cs:0L(%rax,%rax,1)
+- 0x00, 0x00, 0x00, 0x00 };
+- const char nop13[13] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
+- 0x2e, 0x0f, 0x1f, 0x84, // nopw %cs:0L(%rax,%rax,1)
+- 0x00, 0x00, 0x00, 0x00,
+- 0x00 };
+- const char nop14[14] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
+- 0x66, 0x2e, 0x0f, 0x1f, // data16
+- 0x84, 0x00, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
+- 0x00, 0x00 };
+- const char nop15[15] = { 0x66, 0x66, 0x66, 0x66, // data16; data16; data16
+- 0x66, 0x66, 0x2e, 0x0f, // data16; data16
+- 0x1f, 0x84, 0x00, 0x00, // nopw %cs:0L(%rax,%rax,1)
+- 0x00, 0x00, 0x00 };
++ const char nop1[1] = { '\x90' }; // nop
++ const char nop2[2] = { '\x66', '\x90' }; // xchg %ax %ax
++ const char nop3[3] = { '\x0f', '\x1f', '\x00' }; // nop (%rax)
++ const char nop4[4] = { '\x0f', '\x1f', '\x40', // nop 0(%rax)
++ '\x00'};
++ const char nop5[5] = { '\x0f', '\x1f', '\x44', // nop 0(%rax,%rax,1)
++ '\x00', '\x00' };
++ const char nop6[6] = { '\x66', '\x0f', '\x1f', // nopw 0(%rax,%rax,1)
++ '\x44', '\x00', '\x00' };
++ const char nop7[7] = { '\x0f', '\x1f', '\x80', // nopl 0L(%rax)
++ '\x00', '\x00', '\x00',
++ '\x00' };
++ const char nop8[8] = { '\x0f', '\x1f', '\x84', // nopl 0L(%rax,%rax,1)
++ '\x00', '\x00', '\x00',
++ '\x00', '\x00' };
++ const char nop9[9] = { '\x66', '\x0f', '\x1f', // nopw 0L(%rax,%rax,1)
++ '\x84', '\x00', '\x00',
++ '\x00', '\x00', '\x00' };
++ const char nop10[10] = { '\x66', '\x2e', '\x0f', // nopw %cs:0L(%rax,%rax,1)
++ '\x1f', '\x84', '\x00',
++ '\x00', '\x00', '\x00',
++ '\x00' };
++ const char nop11[11] = { '\x66', '\x66', '\x2e', // data16
++ '\x0f', '\x1f', '\x84', // nopw %cs:0L(%rax,%rax,1)
++ '\x00', '\x00', '\x00',
++ '\x00', '\x00' };
++ const char nop12[12] = { '\x66', '\x66', '\x66', // data16; data16
++ '\x2e', '\x0f', '\x1f', // nopw %cs:0L(%rax,%rax,1)
++ '\x84', '\x00', '\x00',
++ '\x00', '\x00', '\x00' };
++ const char nop13[13] = { '\x66', '\x66', '\x66', // data16; data16; data16
++ '\x66', '\x2e', '\x0f', // nopw %cs:0L(%rax,%rax,1)
++ '\x1f', '\x84', '\x00',
++ '\x00', '\x00', '\x00',
++ '\x00' };
++ const char nop14[14] = { '\x66', '\x66', '\x66', // data16; data16; data16
++ '\x66', '\x66', '\x2e', // data16
++ '\x0f', '\x1f', '\x84', // nopw %cs:0L(%rax,%rax,1)
++ '\x00', '\x00', '\x00',
++ '\x00', '\x00' };
++ const char nop15[15] = { '\x66', '\x66', '\x66', // data16; data16; data16
++ '\x66', '\x66', '\x66', // data16; data16
++ '\x2e', '\x0f', '\x1f', // nopw %cs:0L(%rax,%rax,1)
++ '\x84', '\x00', '\x00',
++ '\x00', '\x00', '\x00' };
+
+ const char* nops[16] = {
+ NULL,
+diff --git a/include/ChangeLog b/include/ChangeLog
+index af96977..e32f0f9 100644
+--- a/include/ChangeLog
++++ b/include/ChangeLog
+@@ -1,3 +1,11 @@
++2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ Backport from mainline:
++
++ 2011-12-19 Chung-Lin Tang <cltang@codesourcery.com>
++
++ * elf/mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries.
++
+ 2011-10-25 Alan Modra <amodra@gmail.com>
+
+ Apply mainline patches.
+diff --git a/include/elf/mips.h b/include/elf/mips.h
+index db5fa54..c2c5922 100644
+--- a/include/elf/mips.h
++++ b/include/elf/mips.h
+@@ -98,7 +98,14 @@ START_RELOC_NUMBERS (elf_mips_reloc_type)
+ RELOC_NUMBER (R_MIPS16_CALL16, 103)
+ RELOC_NUMBER (R_MIPS16_HI16, 104)
+ RELOC_NUMBER (R_MIPS16_LO16, 105)
+- FAKE_RELOC (R_MIPS16_max, 106)
++ RELOC_NUMBER (R_MIPS16_TLS_GD, 106)
++ RELOC_NUMBER (R_MIPS16_TLS_LDM, 107)
++ RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108)
++ RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109)
++ RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110)
++ RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111)
++ RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112)
++ FAKE_RELOC (R_MIPS16_max, 113)
+ /* These relocations are specific to VxWorks. */
+ RELOC_NUMBER (R_MIPS_COPY, 126)
+ RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127)
+diff --git a/ld/ChangeLog b/ld/ChangeLog
+index f5fa6ff..98fd778 100644
+--- a/ld/ChangeLog
++++ b/ld/ChangeLog
+@@ -1,3 +1,23 @@
++2012-05-11 Ralf Corsépius <ralf.corsepius@rtems.org>
++
++ PR ld/13991
++ Backport from mainline:
++ 2012-04-24 Alan Modra <amodra@gmail.com>
++
++ * ld/ldlang.c (size_input_section): Use sec_info_type rather than
++ usrdata->flags.just_syms.
++ * ld/ldwrite.c (build_link_order): Likewise.
++ * ld/emultempl/hppaelf.em (build_section_lists): Likewise.
++ * ld/emultempl/ppc64elf.em (build_toc_list): Likewise.
++ * ld/emultempl/armelf.em (build_section_lists): Likewise.
++ (after_allocation): Update for renamed sec_info_type value.
++ * ld/emultempl/tic6xdsbt.em: Likewise.
++
++2011-12-20 Joseph Myers <joseph@codesourcery.com>
++
++ * emulparams/elf32bmip.sh (OTHER_SECTIONS): Put .mdebug.* and
++ .gcc_compiled_long* sections at address 0.
++
+ 2011-11-02 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ Backport from mainline:
+diff --git a/ld/emulparams/elf32bmip.sh b/ld/emulparams/elf32bmip.sh
+index 44a0b8a..f0fcd2c 100644
+--- a/ld/emulparams/elf32bmip.sh
++++ b/ld/emulparams/elf32bmip.sh
+@@ -64,14 +64,14 @@ OTHER_BSS_SYMBOLS='_fbss = .;'
+ OTHER_SECTIONS='
+ .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
+ .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
+- .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) }
+- .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) }
+- .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) }
+- .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) }
+- .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) }
+- .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) }
+- .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) }
+- .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) }
++ .mdebug.abi32 0 : { KEEP(*(.mdebug.abi32)) }
++ .mdebug.abiN32 0 : { KEEP(*(.mdebug.abiN32)) }
++ .mdebug.abi64 0 : { KEEP(*(.mdebug.abi64)) }
++ .mdebug.abiO64 0 : { KEEP(*(.mdebug.abiO64)) }
++ .mdebug.eabi32 0 : { KEEP(*(.mdebug.eabi32)) }
++ .mdebug.eabi64 0 : { KEEP(*(.mdebug.eabi64)) }
++ .gcc_compiled_long32 0 : { KEEP(*(.gcc_compiled_long32)) }
++ .gcc_compiled_long64 0 : { KEEP(*(.gcc_compiled_long64)) }
+ '
+ ARCH=mips
+ MACHINE=
+diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
+index d29da59..7631474 100644
+--- a/ld/emultempl/armelf.em
++++ b/ld/emultempl/armelf.em
+@@ -240,7 +240,7 @@ build_section_lists (lang_statement_union_type *statement)
+ {
+ asection *i = statement->input_section.section;
+
+- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
++ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && (i->flags & SEC_EXCLUDE) == 0
+ && i->output_section != NULL
+ && i->output_section->owner == link_info.output_bfd)
+@@ -299,7 +299,7 @@ gld${EMULATION_NAME}_after_allocation (void)
+ && elf_section_type (sec) == SHT_PROGBITS
+ && (elf_section_flags (sec) & SHF_EXECINSTR) != 0
+ && (sec->flags & SEC_EXCLUDE) == 0
+- && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS
++ && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && out_sec != bfd_abs_section_ptr)
+ {
+ if (sec_count == list_size)
+diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em
+index 1137ba2..6258bf4 100644
+--- a/ld/emultempl/hppaelf.em
++++ b/ld/emultempl/hppaelf.em
+@@ -229,7 +229,7 @@ build_section_lists (lang_statement_union_type *statement)
+ {
+ asection *i = statement->input_section.section;
+
+- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
++ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && (i->flags & SEC_EXCLUDE) == 0
+ && i->output_section != NULL
+ && i->output_section->owner == link_info.output_bfd)
+diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
+index 92a468f..52b9f05 100644
+--- a/ld/emultempl/ppc64elf.em
++++ b/ld/emultempl/ppc64elf.em
+@@ -428,7 +428,7 @@ build_toc_list (lang_statement_union_type *statement)
+ {
+ asection *i = statement->input_section.section;
+
+- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
++ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && (i->flags & SEC_EXCLUDE) == 0
+ && i->output_section == toc_section)
+ {
+@@ -446,7 +446,7 @@ build_section_lists (lang_statement_union_type *statement)
+ {
+ asection *i = statement->input_section.section;
+
+- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
++ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && (i->flags & SEC_EXCLUDE) == 0
+ && i->output_section != NULL
+ && i->output_section->owner == link_info.output_bfd)
+diff --git a/ld/emultempl/tic6xdsbt.em b/ld/emultempl/tic6xdsbt.em
+index e287005..fd7a12b 100644
+--- a/ld/emultempl/tic6xdsbt.em
++++ b/ld/emultempl/tic6xdsbt.em
+@@ -122,7 +122,7 @@ gld${EMULATION_NAME}_after_allocation (void)
+ && elf_section_type (sec) == SHT_PROGBITS
+ && (elf_section_flags (sec) & SHF_EXECINSTR) != 0
+ && (sec->flags & SEC_EXCLUDE) == 0
+- && sec->sec_info_type != ELF_INFO_TYPE_JUST_SYMS
++ && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && out_sec != bfd_abs_section_ptr)
+ {
+ if (sec_count == list_size)
+diff --git a/ld/ldlang.c b/ld/ldlang.c
+index 2c56b56..7ecbae2 100644
+--- a/ld/ldlang.c
++++ b/ld/ldlang.c
+@@ -4648,7 +4648,7 @@ size_input_section
+ lang_input_section_type *is = &((*this_ptr)->input_section);
+ asection *i = is->section;
+
+- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
++ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && (i->flags & SEC_EXCLUDE) == 0)
+ {
+ unsigned int alignment_needed;
+diff --git a/ld/ldwrite.c b/ld/ldwrite.c
+index b7a1469..2503d1f 100644
+--- a/ld/ldwrite.c
++++ b/ld/ldwrite.c
+@@ -1,6 +1,6 @@
+ /* ldwrite.c -- write out the linked file
+ Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002,
+- 2003, 2004, 2005, 2006, 2007, 2008, 2010
++ 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2012
+ Free Software Foundation, Inc.
+ Written by Steve Chamberlain sac@cygnus.com
+
+@@ -240,7 +240,7 @@ build_link_order (lang_statement_union_type *statement)
+ attached */
+ asection *i = statement->input_section.section;
+
+- if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
++ if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS
+ && (i->flags & SEC_EXCLUDE) == 0)
+ {
+ asection *output_section = i->output_section;
+diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
+index 233d962..6318c4f 100644
+--- a/ld/testsuite/ChangeLog
++++ b/ld/testsuite/ChangeLog
+@@ -1,3 +1,22 @@
++2012-01-10 H.J. Lu <hongjiu.lu@intel.com>
++
++ Backport from mainline:
++ PR ld/13581
++ * ld-x86-64/ilp32-4.s: New.
++ * ld-x86-64/ilp32-10.d: Likewise.
++ * ld-x86-64/ilp32-10.s: Likewise.
++
++ * ld-x86-64/ilp32-4.d: Adjusted.
++ * ld-x86-64/ilp32-5.d: Likewise.
++ * ld-x86-64/ilp32-5.s: Likewise.
++
++ * ld-x86-64/x86-64.exp: Run ilp32-10.
++
++2011-12-01 Hans-Peter Nilsson <hp@axis.com>
++
++ * ld-cris/pic-gc-72.d: Revert last change to adjust for reverted
++ cause for last change.
++
+ 2011-11-10 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+
+ Apply mainline patches.
+diff --git a/ld/testsuite/ld-cris/pic-gc-72.d b/ld/testsuite/ld-cris/pic-gc-72.d
+index 7e72752..7c30980 100644
+--- a/ld/testsuite/ld-cris/pic-gc-72.d
++++ b/ld/testsuite/ld-cris/pic-gc-72.d
+@@ -19,11 +19,10 @@ Contents of section .dynsym:
+ Contents of section .dynstr:
+ #...
+ Contents of section .text:
+- 016e 0f050f05 .*
++ 0188 0f050f05 .*
+ Contents of section .dynamic:
+- 2174 .*
+ #...
+ Contents of section .got:
+- 21cc 74210000 00000000 00000000 .*
++ 21e4 8c210000 00000000 00000000 .*
+ Contents of section .data:
+- 21d8 00000000 .*
++ 21f0 00000000 .*
+diff --git a/ld/testsuite/ld-x86-64/ilp32-10.d b/ld/testsuite/ld-x86-64/ilp32-10.d
+new file mode 100644
+index 0000000..43d9fbd
+--- /dev/null
++++ b/ld/testsuite/ld-x86-64/ilp32-10.d
+@@ -0,0 +1,3 @@
++#as: --x32
++#ld: -shared -melf32_x86_64
++#error: .*relocation R_X86_64_PC32 against undefined symbol `bar' can not be used when making a shared object; recompile with -fPIC
+diff --git a/ld/testsuite/ld-x86-64/ilp32-10.s b/ld/testsuite/ld-x86-64/ilp32-10.s
+new file mode 100644
+index 0000000..70e4a90
+--- /dev/null
++++ b/ld/testsuite/ld-x86-64/ilp32-10.s
+@@ -0,0 +1,3 @@
++ .globl foo
++foo:
++ mov bar(%rip), %rax
+diff --git a/ld/testsuite/ld-x86-64/ilp32-4.d b/ld/testsuite/ld-x86-64/ilp32-4.d
+index 84dc7b2..92d8a67 100644
+--- a/ld/testsuite/ld-x86-64/ilp32-4.d
++++ b/ld/testsuite/ld-x86-64/ilp32-4.d
+@@ -1,36 +1,30 @@
+-#source: start.s
+ #as: --x32
+ #ld: -m elf32_x86_64 -shared --no-ld-generated-unwind-info
+ #readelf: -d -S --wide
+
+-There are 10 section headers, starting at offset 0x22c:
++There are 9 section headers, starting at offset 0x1d8:
+
+ Section Headers:
+ \[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al
+ \[ 0\] NULL 00000000 000000 000000 00 0 0 0
+- \[ 1\] .hash HASH 00000094 000094 000030 04 A 2 0 4
+- \[ 2\] .dynsym DYNSYM 000000c4 0000c4 000070 10 A 3 2 4
+- \[ 3\] .dynstr STRTAB 00000134 000134 00001d 00 A 0 0 1
+- \[ 4\] .rela.dyn RELA 00000154 000154 00000c 0c A 2 0 4
+- \[ 5\] .text PROGBITS 00000160 000160 000005 00 AX 0 0 4
+- \[ 6\] .dynamic DYNAMIC 00200168 000168 000078 08 WA 3 0 4
+- \[ 7\] .shstrtab STRTAB 00000000 0001e0 00004a 00 0 0 1
+- \[ 8\] .symtab SYMTAB 00000000 0003bc 0000e0 10 9 9 4
+- \[ 9\] .strtab STRTAB 00000000 00049c 000043 00 0 0 1
++ \[ 1\] .hash HASH 00000094 000094 00002c 04 A 2 0 4
++ \[ 2\] .dynsym DYNSYM 000000c0 0000c0 000060 10 A 3 2 4
++ \[ 3\] .dynstr STRTAB 00000120 000120 000019 00 A 0 0 1
++ \[ 4\] .text PROGBITS 0000013c 00013c 000001 00 AX 0 0 4
++ \[ 5\] .dynamic DYNAMIC 00200140 000140 000058 08 WA 3 0 4
++ \[ 6\] .shstrtab STRTAB 00000000 000198 000040 00 0 0 1
++ \[ 7\] .symtab SYMTAB 00000000 000340 0000c0 10 8 8 4
++ \[ 8\] .strtab STRTAB 00000000 000400 00003f 00 0 0 1
+ Key to Flags:
+ W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), l \(large\)
+ I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
+ O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
+
+-Dynamic section at offset 0x168 contains 10 entries:
++Dynamic section at offset 0x140 contains 6 entries:
+ Tag Type Name/Value
+ 0x00000004 \(HASH\) 0x94
+- 0x00000005 \(STRTAB\) 0x134
+- 0x00000006 \(SYMTAB\) 0xc4
+- 0x0000000a \(STRSZ\) 29 \(bytes\)
++ 0x00000005 \(STRTAB\) 0x120
++ 0x00000006 \(SYMTAB\) 0xc0
++ 0x0000000a \(STRSZ\) 25 \(bytes\)
+ 0x0000000b \(SYMENT\) 16 \(bytes\)
+- 0x00000007 \(RELA\) 0x154
+- 0x00000008 \(RELASZ\) 12 \(bytes\)
+- 0x00000009 \(RELAENT\) 12 \(bytes\)
+- 0x00000016 \(TEXTREL\) 0x0
+ 0x00000000 \(NULL\) 0x0
+diff --git a/ld/testsuite/ld-x86-64/ilp32-4.s b/ld/testsuite/ld-x86-64/ilp32-4.s
+new file mode 100644
+index 0000000..5f270c7
+--- /dev/null
++++ b/ld/testsuite/ld-x86-64/ilp32-4.s
+@@ -0,0 +1,3 @@
++ .globl _start
++_start:
++ ret
+diff --git a/ld/testsuite/ld-x86-64/ilp32-5.d b/ld/testsuite/ld-x86-64/ilp32-5.d
+index e4673e5..4870c2b 100644
+--- a/ld/testsuite/ld-x86-64/ilp32-5.d
++++ b/ld/testsuite/ld-x86-64/ilp32-5.d
+@@ -4,5 +4,5 @@
+
+ #...
+ [0-9a-f]+ +[0-9a-f]+ +R_X86_64_RELATIVE +[0-9a-f]+
+-[0-9a-f]+ +[0-9a-f]+ +R_X86_64_PC32 +[0-9a-f]+ +foo - 4
++[0-9a-f]+ +[0-9a-f]+ +R_X86_64_GLOB_DAT +[0-9a-f]+ +foo \+ 0
+ [0-9a-f]+ +[0-9a-f]+ +R_X86_64_32 +[0-9a-f]+ +foo \+ 0
+diff --git a/ld/testsuite/ld-x86-64/ilp32-5.s b/ld/testsuite/ld-x86-64/ilp32-5.s
+index 0d97807..ef0c60e 100644
+--- a/ld/testsuite/ld-x86-64/ilp32-5.s
++++ b/ld/testsuite/ld-x86-64/ilp32-5.s
+@@ -1,6 +1,6 @@
+ .globl bar
+ bar:
+- mov foo(%rip), %rax
++ mov foo@GOTPCREL(%rip), %rax
+
+ .data
+ xxx:
+diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
+index 77b081b..44d3e07 100644
+--- a/ld/testsuite/ld-x86-64/x86-64.exp
++++ b/ld/testsuite/ld-x86-64/x86-64.exp
+@@ -207,6 +207,7 @@ run_dump_test "ilp32-6"
+ run_dump_test "ilp32-7"
+ run_dump_test "ilp32-8"
+ run_dump_test "ilp32-9"
++run_dump_test "ilp32-10"
+ run_dump_test "ia32-1"
+ run_dump_test "ia32-2"
+ run_dump_test "ia32-3"
+diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
+index a445030..26f759e 100644
+--- a/opcodes/ChangeLog
++++ b/opcodes/ChangeLog
+@@ -1,3 +1,8 @@
++2011-11-25 Pierre Muller <muller@ics.u-strasbg.fr>
++
++ * mips-dis.c (print_insn_micromips): Rename local variable iprintf
++ to infprintf to avoid shadow warning.
++
+ 2011-10-27 Peter Bergner <bergner@vnet.ibm.com>
+
+ * ppc-opc.c (powerpc_opcodes) <drrndq, drrndq., dtstexq, dctqpq,
+diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c
+index 4e18d8a..72285de 100644
+--- a/opcodes/mips-dis.c
++++ b/opcodes/mips-dis.c
+@@ -2260,7 +2260,7 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
+ static int
+ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ {
+- const fprintf_ftype iprintf = info->fprintf_func;
++ const fprintf_ftype infprintf = info->fprintf_func;
+ const struct mips_opcode *op, *opend;
+ unsigned int lsb, msbd, msb;
+ void *is = info->stream;
+@@ -2307,7 +2307,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
+ if (status != 0)
+ {
+- iprintf (is, "micromips 0x%x", higher);
++ infprintf (is, "micromips 0x%x", higher);
+ (*info->memory_error_func) (status, memaddr + 2, info);
+ return -1;
+ }
+@@ -2320,7 +2320,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ status = (*info->read_memory_func) (memaddr + 4, buffer, 2, info);
+ if (status != 0)
+ {
+- iprintf (is, "micromips 0x%x", higher);
++ infprintf (is, "micromips 0x%x", higher);
+ (*info->memory_error_func) (status, memaddr + 4, info);
+ return -1;
+ }
+@@ -2328,7 +2328,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ insn = bfd_getb16 (buffer);
+ else
+ insn = bfd_getl16 (buffer);
+- iprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
++ infprintf (is, "0x%x%04x (48-bit insn)", higher, insn);
+
+ info->insn_type = dis_noninsn;
+ return 6;
+@@ -2341,7 +2341,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
+ if (status != 0)
+ {
+- iprintf (is, "micromips 0x%x", higher);
++ infprintf (is, "micromips 0x%x", higher);
+ (*info->memory_error_func) (status, memaddr + 2, info);
+ return -1;
+ }
+@@ -2371,9 +2371,9 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ {
+ const char *s;
+
+- iprintf (is, "%s", op->name);
++ infprintf (is, "%s", op->name);
+ if (op->args[0] != '\0')
+- iprintf (is, "\t");
++ infprintf (is, "\t");
+
+ for (s = op->args; *s != '\0'; s++)
+ {
+@@ -2382,37 +2382,37 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ case ',':
+ case '(':
+ case ')':
+- iprintf (is, "%c", *s);
++ infprintf (is, "%c", *s);
+ break;
+
+ case '.':
+ delta = GET_OP (insn, OFFSET10);
+ if (delta & 0x200)
+ delta |= ~0x3ff;
+- iprintf (is, "%d", delta);
++ infprintf (is, "%d", delta);
+ break;
+
+ case '1':
+- iprintf (is, "0x%lx", GET_OP (insn, STYPE));
++ infprintf (is, "0x%lx", GET_OP (insn, STYPE));
+ break;
+
+ case '<':
+- iprintf (is, "0x%lx", GET_OP (insn, SHAMT));
++ infprintf (is, "0x%lx", GET_OP (insn, SHAMT));
+ break;
+
+ case '\\':
+- iprintf (is, "0x%lx", GET_OP (insn, 3BITPOS));
++ infprintf (is, "0x%lx", GET_OP (insn, 3BITPOS));
+ break;
+
+ case '|':
+- iprintf (is, "0x%lx", GET_OP (insn, TRAP));
++ infprintf (is, "0x%lx", GET_OP (insn, TRAP));
+ break;
+
+ case '~':
+ delta = GET_OP (insn, OFFSET12);
+ if (delta & 0x800)
+ delta |= ~0x7ff;
+- iprintf (is, "%d", delta);
++ infprintf (is, "%d", delta);
+ break;
+
+ case 'a':
+@@ -2433,34 +2433,34 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ case 'r':
+ case 's':
+ case 'v':
+- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]);
++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS)]);
+ break;
+
+ case 'c':
+- iprintf (is, "0x%lx", GET_OP (insn, CODE));
++ infprintf (is, "0x%lx", GET_OP (insn, CODE));
+ break;
+
+ case 'd':
+- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]);
++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RD)]);
+ break;
+
+ case 'h':
+- iprintf (is, "0x%lx", GET_OP (insn, PREFX));
++ infprintf (is, "0x%lx", GET_OP (insn, PREFX));
+ break;
+
+ case 'i':
+ case 'u':
+- iprintf (is, "0x%lx", GET_OP (insn, IMMEDIATE));
++ infprintf (is, "0x%lx", GET_OP (insn, IMMEDIATE));
+ break;
+
+ case 'j': /* Same as i, but sign-extended. */
+ case 'o':
+ delta = (GET_OP (insn, DELTA) ^ 0x8000) - 0x8000;
+- iprintf (is, "%d", delta);
++ infprintf (is, "%d", delta);
+ break;
+
+ case 'k':
+- iprintf (is, "0x%x", GET_OP (insn, CACHE));
++ infprintf (is, "0x%x", GET_OP (insn, CACHE));
+ break;
+
+ case 'n':
+@@ -2472,26 +2472,26 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ if (s_reg_encode != 0)
+ {
+ if (s_reg_encode == 1)
+- iprintf (is, "%s", mips_gpr_names[16]);
++ infprintf (is, "%s", mips_gpr_names[16]);
+ else if (s_reg_encode < 9)
+- iprintf (is, "%s-%s",
++ infprintf (is, "%s-%s",
+ mips_gpr_names[16],
+ mips_gpr_names[15 + s_reg_encode]);
+ else if (s_reg_encode == 9)
+- iprintf (is, "%s-%s,%s",
++ infprintf (is, "%s-%s,%s",
+ mips_gpr_names[16],
+ mips_gpr_names[23],
+ mips_gpr_names[30]);
+ else
+- iprintf (is, "UNKNOWN");
++ infprintf (is, "UNKNOWN");
+ }
+
+ if (immed & 0x10) /* For ra. */
+ {
+ if (s_reg_encode == 0)
+- iprintf (is, "%s", mips_gpr_names[31]);
++ infprintf (is, "%s", mips_gpr_names[31]);
+ else
+- iprintf (is, ",%s", mips_gpr_names[31]);
++ infprintf (is, ",%s", mips_gpr_names[31]);
+ }
+ break;
+ }
+@@ -2504,32 +2504,32 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ break;
+
+ case 'q':
+- iprintf (is, "0x%lx", GET_OP (insn, CODE2));
++ infprintf (is, "0x%lx", GET_OP (insn, CODE2));
+ break;
+
+ case 't':
+ case 'w':
+- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]);
++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RT)]);
+ break;
+
+ case 'y':
+- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]);
++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, RS3)]);
+ break;
+
+ case 'z':
+- iprintf (is, "%s", mips_gpr_names[0]);
++ infprintf (is, "%s", mips_gpr_names[0]);
+ break;
+
+ case 'B':
+- iprintf (is, "0x%lx", GET_OP (insn, CODE10));
++ infprintf (is, "0x%lx", GET_OP (insn, CODE10));
+ break;
+
+ case 'C':
+- iprintf (is, "0x%lx", GET_OP (insn, COPZ));
++ infprintf (is, "0x%lx", GET_OP (insn, COPZ));
+ break;
+
+ case 'D':
+- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]);
++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FD)]);
+ break;
+
+ case 'E':
+@@ -2540,7 +2540,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ 'T' format. Therefore, until we gain understanding of
+ cp2 register names, we can simply print the register
+ numbers. */
+- iprintf (is, "$%ld", GET_OP (insn, RT));
++ infprintf (is, "$%ld", GET_OP (insn, RT));
+ break;
+
+ case 'G':
+@@ -2559,44 +2559,44 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ case 0x000002fc: /* mtc0 */
+ case 0x580000fc: /* dmfc0 */
+ case 0x580002fc: /* dmtc0 */
+- iprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]);
++ infprintf (is, "%s", mips_cp0_names[GET_OP (insn, RS)]);
+ break;
+ default:
+- iprintf (is, "$%ld", GET_OP (insn, RS));
++ infprintf (is, "$%ld", GET_OP (insn, RS));
+ break;
+ }
+ break;
+
+ case 'H':
+- iprintf (is, "%ld", GET_OP (insn, SEL));
++ infprintf (is, "%ld", GET_OP (insn, SEL));
+ break;
+
+ case 'K':
+- iprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]);
++ infprintf (is, "%s", mips_hwr_names[GET_OP (insn, RS)]);
+ break;
+
+ case 'M':
+- iprintf (is, "$fcc%ld", GET_OP (insn, CCC));
++ infprintf (is, "$fcc%ld", GET_OP (insn, CCC));
+ break;
+
+ case 'N':
+- iprintf (is,
++ infprintf (is,
+ (op->pinfo & (FP_D | FP_S)) != 0
+ ? "$fcc%ld" : "$cc%ld",
+ GET_OP (insn, BCC));
+ break;
+
+ case 'R':
+- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]);
++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FR)]);
+ break;
+
+ case 'S':
+ case 'V':
+- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]);
++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FS)]);
+ break;
+
+ case 'T':
+- iprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]);
++ infprintf (is, "%s", mips_fpr_names[GET_OP (insn, FT)]);
+ break;
+
+ case '+':
+@@ -2606,18 +2606,18 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ {
+ case 'A':
+ lsb = GET_OP (insn, EXTLSB);
+- iprintf (is, "0x%x", lsb);
++ infprintf (is, "0x%x", lsb);
+ break;
+
+ case 'B':
+ msb = GET_OP (insn, INSMSB);
+- iprintf (is, "0x%x", msb - lsb + 1);
++ infprintf (is, "0x%x", msb - lsb + 1);
+ break;
+
+ case 'C':
+ case 'H':
+ msbd = GET_OP (insn, EXTMSBD);
+- iprintf (is, "0x%x", msbd + 1);
++ infprintf (is, "0x%x", msbd + 1);
+ break;
+
+ case 'D':
+@@ -2637,30 +2637,30 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ mips_cp0sel_names_len,
+ cp0reg, sel);
+ if (n != NULL)
+- iprintf (is, "%s", n->name);
++ infprintf (is, "%s", n->name);
+ else
+- iprintf (is, "$%d,%d", cp0reg, sel);
++ infprintf (is, "$%d,%d", cp0reg, sel);
+ break;
+ }
+
+ case 'E':
+ lsb = GET_OP (insn, EXTLSB) + 32;
+- iprintf (is, "0x%x", lsb);
++ infprintf (is, "0x%x", lsb);
+ break;
+
+ case 'F':
+ msb = GET_OP (insn, INSMSB) + 32;
+- iprintf (is, "0x%x", msb - lsb + 1);
++ infprintf (is, "0x%x", msb - lsb + 1);
+ break;
+
+ case 'G':
+ msbd = GET_OP (insn, EXTMSBD) + 32;
+- iprintf (is, "0x%x", msbd + 1);
++ infprintf (is, "0x%x", msbd + 1);
+ break;
+
+ default:
+ /* xgettext:c-format */
+- iprintf (is,
++ infprintf (is,
+ _("# internal disassembler error, "
+ "unrecognized modifier (+%c)"),
+ *s);
+@@ -2674,111 +2674,111 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ switch (*s)
+ {
+ case 'a': /* global pointer. */
+- iprintf (is, "%s", mips_gpr_names[28]);
++ infprintf (is, "%s", mips_gpr_names[28]);
+ break;
+
+ case 'b':
+ regno = micromips_to_32_reg_b_map[GET_OP (insn, MB)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'c':
+ regno = micromips_to_32_reg_c_map[GET_OP (insn, MC)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'd':
+ regno = micromips_to_32_reg_d_map[GET_OP (insn, MD)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'e':
+ regno = micromips_to_32_reg_e_map[GET_OP (insn, ME)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'f':
+ /* Save lastregno for "mt" to print out later. */
+ lastregno = micromips_to_32_reg_f_map[GET_OP (insn, MF)];
+- iprintf (is, "%s", mips_gpr_names[lastregno]);
++ infprintf (is, "%s", mips_gpr_names[lastregno]);
+ break;
+
+ case 'g':
+ regno = micromips_to_32_reg_g_map[GET_OP (insn, MG)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'h':
+ regno = micromips_to_32_reg_h_map[GET_OP (insn, MH)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'i':
+ regno = micromips_to_32_reg_i_map[GET_OP (insn, MI)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'j':
+- iprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]);
++ infprintf (is, "%s", mips_gpr_names[GET_OP (insn, MJ)]);
+ break;
+
+ case 'l':
+ regno = micromips_to_32_reg_l_map[GET_OP (insn, ML)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'm':
+ regno = micromips_to_32_reg_m_map[GET_OP (insn, MM)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'n':
+ regno = micromips_to_32_reg_n_map[GET_OP (insn, MN)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'p':
+ /* Save lastregno for "mt" to print out later. */
+ lastregno = GET_OP (insn, MP);
+- iprintf (is, "%s", mips_gpr_names[lastregno]);
++ infprintf (is, "%s", mips_gpr_names[lastregno]);
+ break;
+
+ case 'q':
+ regno = micromips_to_32_reg_q_map[GET_OP (insn, MQ)];
+- iprintf (is, "%s", mips_gpr_names[regno]);
++ infprintf (is, "%s", mips_gpr_names[regno]);
+ break;
+
+ case 'r': /* program counter. */
+- iprintf (is, "$pc");
++ infprintf (is, "$pc");
+ break;
+
+ case 's': /* stack pointer. */
+ lastregno = 29;
+- iprintf (is, "%s", mips_gpr_names[29]);
++ infprintf (is, "%s", mips_gpr_names[29]);
+ break;
+
+ case 't':
+- iprintf (is, "%s", mips_gpr_names[lastregno]);
++ infprintf (is, "%s", mips_gpr_names[lastregno]);
+ break;
+
+ case 'z': /* $0. */
+- iprintf (is, "%s", mips_gpr_names[0]);
++ infprintf (is, "%s", mips_gpr_names[0]);
+ break;
+
+ case 'A':
+ /* Sign-extend the immediate. */
+ immed = ((GET_OP (insn, IMMA) ^ 0x40) - 0x40) << 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'B':
+ immed = micromips_imm_b_map[GET_OP (insn, IMMB)];
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'C':
+ immed = micromips_imm_c_map[GET_OP (insn, IMMC)];
+- iprintf (is, "0x%lx", immed);
++ infprintf (is, "0x%lx", immed);
+ break;
+
+ case 'D':
+@@ -2797,50 +2797,50 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+
+ case 'F':
+ immed = GET_OP (insn, IMMF);
+- iprintf (is, "0x%x", immed);
++ infprintf (is, "0x%x", immed);
+ break;
+
+ case 'G':
+ immed = (insn >> MICROMIPSOP_SH_IMMG) + 1;
+ immed = (immed & MICROMIPSOP_MASK_IMMG) - 1;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'H':
+ immed = GET_OP (insn, IMMH) << 1;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'I':
+ immed = (insn >> MICROMIPSOP_SH_IMMI) + 1;
+ immed = (immed & MICROMIPSOP_MASK_IMMI) - 1;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'J':
+ immed = GET_OP (insn, IMMJ) << 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'L':
+ immed = GET_OP (insn, IMML);
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'M':
+ immed = (insn >> MICROMIPSOP_SH_IMMM) - 1;
+ immed = (immed & MICROMIPSOP_MASK_IMMM) + 1;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'N':
+ immed = GET_OP (insn, IMMN);
+ if (immed == 0)
+- iprintf (is, "%s,%s",
++ infprintf (is, "%s,%s",
+ mips_gpr_names[16],
+ mips_gpr_names[31]);
+ else
+- iprintf (is, "%s-%s,%s",
++ infprintf (is, "%s-%s,%s",
+ mips_gpr_names[16],
+ mips_gpr_names[16 + immed],
+ mips_gpr_names[31]);
+@@ -2848,35 +2848,35 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+
+ case 'O':
+ immed = GET_OP (insn, IMMO);
+- iprintf (is, "0x%x", immed);
++ infprintf (is, "0x%x", immed);
+ break;
+
+ case 'P':
+ immed = GET_OP (insn, IMMP) << 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'Q':
+ /* Sign-extend the immediate. */
+ immed = (GET_OP (insn, IMMQ) ^ 0x400000) - 0x400000;
+ immed <<= 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'U':
+ immed = GET_OP (insn, IMMU) << 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'W':
+ immed = GET_OP (insn, IMMW) << 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'X':
+ /* Sign-extend the immediate. */
+ immed = (GET_OP (insn, IMMX) ^ 0x8) - 0x8;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ case 'Y':
+@@ -2885,12 +2885,12 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ if (immed >= -2 && immed <= 1)
+ immed ^= 0x100;
+ immed = immed << 2;
+- iprintf (is, "%d", immed);
++ infprintf (is, "%d", immed);
+ break;
+
+ default:
+ /* xgettext:c-format */
+- iprintf (is,
++ infprintf (is,
+ _("# internal disassembler error, "
+ "unrecognized modifier (m%c)"),
+ *s);
+@@ -2900,7 +2900,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+
+ default:
+ /* xgettext:c-format */
+- iprintf (is,
++ infprintf (is,
+ _("# internal disassembler error, "
+ "unrecognized modifier (%c)"),
+ *s);
+@@ -2937,7 +2937,7 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+ }
+ #undef GET_OP
+
+- iprintf (is, "0x%x", insn);
++ infprintf (is, "0x%x", insn);
+ info->insn_type = dis_noninsn;
+
+ return length;
diff --git a/binutils/patches/branch-version.diff b/binutils/patches/branch-version.diff
new file mode 100644
index 0000000..7c01345
--- /dev/null
+++ b/binutils/patches/branch-version.diff
@@ -0,0 +1,52 @@
+diff --git a/bfd/Makefile.am b/bfd/Makefile.am
+index ea4fd28..8610d5e 100644
+--- a/bfd/Makefile.am
++++ b/bfd/Makefile.am
+@@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = 1.11 no-dist foreign
+ ACLOCAL_AMFLAGS = -I . -I .. -I ../config
+
+ # Uncomment the following line when doing a release.
+-RELEASE=y
++# RELEASE=y
+
+ INCDIR = $(srcdir)/../include
+ CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
+diff --git a/bfd/Makefile.in b/bfd/Makefile.in
+index 741809c..34196aa 100644
+--- a/bfd/Makefile.in
++++ b/bfd/Makefile.in
+@@ -320,7 +320,7 @@ AUTOMAKE_OPTIONS = 1.11 no-dist foreign
+ ACLOCAL_AMFLAGS = -I . -I .. -I ../config
+
+ # Uncomment the following line when doing a release.
+-RELEASE = y
++# RELEASE=y
+ INCDIR = $(srcdir)/../include
+ CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
+ SUBDIRS = doc po
+diff --git a/bfd/configure b/bfd/configure
+index bc242b9..d31f0d9 100755
+--- a/bfd/configure
++++ b/bfd/configure
+@@ -3988,7 +3988,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE=bfd
+- VERSION=2.22
++ VERSION=2.22.0
+
+
+ cat >>confdefs.h <<_ACEOF
+diff --git a/bfd/configure.in b/bfd/configure.in
+index 435aaaa..9ba3000 100644
+--- a/bfd/configure.in
++++ b/bfd/configure.in
+@@ -8,7 +8,7 @@ AC_CONFIG_SRCDIR([libbfd.c])
+ AC_CANONICAL_TARGET
+ AC_ISC_POSIX
+
+-AM_INIT_AUTOMAKE(bfd, 2.22)
++AM_INIT_AUTOMAKE(bfd, 2.22.0)
+
+ dnl These must be called before LT_INIT, because it may want
+ dnl to call AC_CHECK_PROG.
diff --git a/binutils/patches/dyson-biarch.patch b/binutils/patches/dyson-biarch.patch
new file mode 100644
index 0000000..41d55d1
--- /dev/null
+++ b/binutils/patches/dyson-biarch.patch
@@ -0,0 +1,18 @@
+Index: binutils/ld/emulparams/elf_i386_sol2.sh
+===================================================================
+--- binutils.orig/ld/emulparams/elf_i386_sol2.sh 2012-10-28 21:44:11.532380262 +0400
++++ binutils/ld/emulparams/elf_i386_sol2.sh 2012-10-28 22:16:29.024955547 +0400
+@@ -2,3 +2,13 @@
+ . ${srcdir}/emulparams/solaris2.sh
+ EXTRA_EM_FILE=solaris2
+ OUTPUT_FORMAT="elf32-i386-sol2"
++
++# Dyson modify the default library search path to first include
++# a 32-bit specific directory.
++case "$target" in
++ x86_64*-solaris* | i[3-7]86*-solaris*)
++ case "$EMULATION_NAME" in
++ *i386*) LIBPATH_SUFFIX=32 ;;
++ esac
++ ;;
++esac
diff --git a/binutils/patches/libiberty-md5.diff b/binutils/patches/libiberty-md5.diff
new file mode 100644
index 0000000..e0d912a
--- /dev/null
+++ b/binutils/patches/libiberty-md5.diff
@@ -0,0 +1,32 @@
+# DP: Fix alias warning building libiberty/md5.c
+
+--- a/include/md5.h
++++ a/include/md5.h
+@@ -86,7 +86,11 @@
+
+ md5_uint32 total[2];
+ md5_uint32 buflen;
+- char buffer[128] ATTRIBUTE_ALIGNED_ALIGNOF(md5_uint32);
++ union
++ {
++ char buffer[128];
++ md5_uint32 buffer32[32];
++ };
+ };
+
+ /*
+--- a/libiberty/md5.c
++++ b/libiberty/md5.c
+@@ -114,9 +114,9 @@
+ memcpy (&ctx->buffer[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+- *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
+- *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
+- (ctx->total[0] >> 29));
++ ctx->buffer32[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3);
++ ctx->buffer32[(bytes + pad + 4) / 4] = SWAP ((ctx->total[1] << 3) |
++ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
diff --git a/binutils/patches/pr12548-anonymous-version-tag.patch b/binutils/patches/pr12548-anonymous-version-tag.patch
new file mode 100644
index 0000000..81ee0fa
--- /dev/null
+++ b/binutils/patches/pr12548-anonymous-version-tag.patch
@@ -0,0 +1,19 @@
+Description: anonymous version tag mapped to base version
+Bug: http://sourceware.org/bugzilla/show_bug.cgi?id=12548
+Index: binutils/ld/ldlang.c
+===================================================================
+--- binutils.orig/ld/ldlang.c 2012-11-21 09:58:35.566841471 +0000
++++ binutils/ld/ldlang.c 2012-11-21 10:41:26.018566074 +0000
+@@ -7819,9 +7819,9 @@
+ if (link_info.version_info != NULL
+ && (name[0] == '\0' || link_info.version_info->name[0] == '\0'))
+ {
+- einfo (_("%X%P: anonymous version tag cannot be combined"
+- " with other version tags\n"));
+- free (version);
++ version->deps = NULL;
++ version->name = "";
++ version->vernum = 0;
+ return;
+ }
+
diff --git a/binutils/patches/pr13449.diff b/binutils/patches/pr13449.diff
new file mode 100644
index 0000000..e969b56
--- /dev/null
+++ b/binutils/patches/pr13449.diff
@@ -0,0 +1,20 @@
+2011-12-21 Nick Clifton <nickc@redhat.com>
+
+ PR gas/13449
+ * config/tc-arm.c (create_unwind_entry): Zero allocated table
+ entries.
+
+
+diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
+index 865f430..02a63a6 100644
+--- a/gas/config/tc-arm.c
++++ b/gas/config/tc-arm.c
+@@ -19944,6 +19944,8 @@ create_unwind_entry (int have_data)
+
+ /* Allocate the table entry. */
+ ptr = frag_more ((size << 2) + 4);
++ /* PR 13449: Zero the table entries in case some of them are not used. */
++ memset (ptr, 0, (size << 2) + 4);
+ where = frag_now_fix () - ((size << 2) + 4);
+
+ switch (unwind.personality_index)
diff --git a/binutils/patches/pr13534-01.diff b/binutils/patches/pr13534-01.diff
new file mode 100644
index 0000000..a9df84c
--- /dev/null
+++ b/binutils/patches/pr13534-01.diff
@@ -0,0 +1,118 @@
+commit 75bf1d978bc03a07ad59a3f983c806bb5899c28c
+Author: Francois Gouget <fgouget@codeweavers.com>
+Date: Tue Dec 20 18:37:16 2011 +0100
+
+ bfd: Fix writing the size of 2+GB elements in the archive.
+
+diff --git a/bfd/archive.c b/bfd/archive.c
+index 3e333c7..5c5b3d4 100644
+--- a/bfd/archive.c
++++ b/bfd/archive.c
+@@ -179,6 +179,22 @@ _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val)
+ memcpy (p, buf, n);
+ }
+
++void
++_bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
++{
++ static char buf[21];
++ size_t len;
++ snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size);
++ len = strlen (buf);
++ if (len < n)
++ {
++ memcpy (p, buf, len);
++ memset (p + len, ' ', n - len);
++ }
++ else
++ memcpy (p, buf, n);
++}
++
+ bfd_boolean
+ _bfd_generic_mkarchive (bfd *abfd)
+ {
+@@ -1770,7 +1786,7 @@ _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd)
+
+ BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size);
+
+- _bfd_ar_spacepad (hdr->ar_size, sizeof (hdr->ar_size), "%-10ld",
++ _bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
+ arch_eltdata (abfd)->parsed_size + padded_len);
+
+ if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
+@@ -1891,7 +1907,7 @@ bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
+ status.st_gid);
+ _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
+ status.st_mode);
+- _bfd_ar_spacepad (hdr->ar_size, sizeof (hdr->ar_size), "%-10ld",
++ _bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
+ status.st_size);
+ memcpy (hdr->ar_fmag, ARFMAG, 2);
+ ared->parsed_size = status.st_size;
+@@ -2132,7 +2148,7 @@ _bfd_write_archive_contents (bfd *arch)
+ memset (&hdr, ' ', sizeof (struct ar_hdr));
+ memcpy (hdr.ar_name, ename, strlen (ename));
+ /* Round size up to even number in archive header. */
+- _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld",
++ _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
+ (elength + 1) & ~(bfd_size_type) 1);
+ memcpy (hdr.ar_fmag, ARFMAG, 2);
+ if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
+@@ -2409,7 +2425,7 @@ bsd_write_armap (bfd *arch,
+ bfd_ardata (arch)->armap_timestamp);
+ _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
+ _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
+- _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize);
++ _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize);
+ memcpy (hdr.ar_fmag, ARFMAG, 2);
+ if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
+ != sizeof (struct ar_hdr))
+@@ -2564,8 +2580,7 @@ coff_write_armap (bfd *arch,
+
+ memset (&hdr, ' ', sizeof (struct ar_hdr));
+ hdr.ar_name[0] = '/';
+- _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld",
+- mapsize);
++ _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize);
+ _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
+ ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
+ ? time (NULL) : 0));
+diff --git a/bfd/archive64.c b/bfd/archive64.c
+index bbc4c3f..a906508 100644
+--- a/bfd/archive64.c
++++ b/bfd/archive64.c
+@@ -169,7 +169,7 @@ bfd_elf64_archive_write_armap (bfd *arch,
+
+ memset (&hdr, ' ', sizeof (struct ar_hdr));
+ memcpy (hdr.ar_name, "/SYM64/", strlen ("/SYM64/"));
+- _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld",
++ _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
+ mapsize);
+ _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
+ time (NULL));
+diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
+index 7db09e4..57197ac 100644
+--- a/bfd/libbfd-in.h
++++ b/bfd/libbfd-in.h
+@@ -203,6 +203,8 @@ extern void *_bfd_generic_read_ar_hdr
+ (bfd *);
+ extern void _bfd_ar_spacepad
+ (char *, size_t, const char *, long);
++extern void _bfd_ar_sizepad
++ (char *, size_t, bfd_size_type);
+
+ extern void *_bfd_generic_read_ar_hdr_mag
+ (bfd *, const char *);
+diff --git a/bfd/libbfd.h b/bfd/libbfd.h
+index 0beddb6..121e865 100644
+--- a/bfd/libbfd.h
++++ b/bfd/libbfd.h
+@@ -208,6 +208,8 @@ extern void *_bfd_generic_read_ar_hdr
+ (bfd *);
+ extern void _bfd_ar_spacepad
+ (char *, size_t, const char *, long);
++extern void _bfd_ar_sizepad
++ (char *, size_t, bfd_size_type);
+
+ extern void *_bfd_generic_read_ar_hdr_mag
+ (bfd *, const char *);
diff --git a/binutils/patches/pr13534-02.diff b/binutils/patches/pr13534-02.diff
new file mode 100644
index 0000000..78e1879
--- /dev/null
+++ b/binutils/patches/pr13534-02.diff
@@ -0,0 +1,136 @@
+commit 433cc73f9df08a1435b4d07a7bd3eed20f0c3dcd
+Author: Francois Gouget <fgouget@codeweavers.com>
+Date: Tue Dec 20 19:39:41 2011 +0100
+
+ bfd: Refuse to create an invalid archive when an archive element is too big.
+
+ The archive format stores element sizes as a 10 character string and thus cannot handle anything 10GB or more.
+
+diff --git a/bfd/archive.c b/bfd/archive.c
+index 5c5b3d4..05aba6c 100644
+--- a/bfd/archive.c
++++ b/bfd/archive.c
+@@ -179,13 +179,18 @@ _bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val)
+ memcpy (p, buf, n);
+ }
+
+-void
++int
+ _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
+ {
+ static char buf[21];
+ size_t len;
+ snprintf (buf, sizeof (buf), "%-10" BFD_VMA_FMT "u", size);
+ len = strlen (buf);
++ if (len > n)
++ {
++ bfd_set_error(bfd_error_file_too_big);
++ return 0;
++ }
+ if (len < n)
+ {
+ memcpy (p, buf, len);
+@@ -193,6 +198,7 @@ _bfd_ar_sizepad (char *p, size_t n, bfd_size_type size)
+ }
+ else
+ memcpy (p, buf, n);
++ return 1;
+ }
+
+ bfd_boolean
+@@ -1786,8 +1792,9 @@ _bfd_bsd44_write_ar_hdr (bfd *archive, bfd *abfd)
+
+ BFD_ASSERT (padded_len == arch_eltdata (abfd)->extra_size);
+
+- _bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
+- arch_eltdata (abfd)->parsed_size + padded_len);
++ if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
++ arch_eltdata (abfd)->parsed_size + padded_len))
++ return FALSE;
+
+ if (bfd_bwrite (hdr, sizeof (*hdr), archive) != sizeof (*hdr))
+ return FALSE;
+@@ -1907,8 +1914,8 @@ bfd_ar_hdr_from_filesystem (bfd *abfd, const char *filename, bfd *member)
+ status.st_gid);
+ _bfd_ar_spacepad (hdr->ar_mode, sizeof (hdr->ar_mode), "%-8lo",
+ status.st_mode);
+- _bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size),
+- status.st_size);
++ if (!_bfd_ar_sizepad (hdr->ar_size, sizeof (hdr->ar_size), status.st_size))
++ return NULL;
+ memcpy (hdr->ar_fmag, ARFMAG, 2);
+ ared->parsed_size = status.st_size;
+ ared->arch_header = (char *) hdr;
+@@ -2148,8 +2155,9 @@ _bfd_write_archive_contents (bfd *arch)
+ memset (&hdr, ' ', sizeof (struct ar_hdr));
+ memcpy (hdr.ar_name, ename, strlen (ename));
+ /* Round size up to even number in archive header. */
+- _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
+- (elength + 1) & ~(bfd_size_type) 1);
++ if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
++ (elength + 1) & ~(bfd_size_type) 1))
++ return FALSE;
+ memcpy (hdr.ar_fmag, ARFMAG, 2);
+ if ((bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
+ != sizeof (struct ar_hdr))
+@@ -2425,7 +2433,8 @@ bsd_write_armap (bfd *arch,
+ bfd_ardata (arch)->armap_timestamp);
+ _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", uid);
+ _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", gid);
+- _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize);
++ if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
++ return FALSE;
+ memcpy (hdr.ar_fmag, ARFMAG, 2);
+ if (bfd_bwrite (&hdr, sizeof (struct ar_hdr), arch)
+ != sizeof (struct ar_hdr))
+@@ -2580,7 +2589,8 @@ coff_write_armap (bfd *arch,
+
+ memset (&hdr, ' ', sizeof (struct ar_hdr));
+ hdr.ar_name[0] = '/';
+- _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize);
++ if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
++ return FALSE;
+ _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
+ ((arch->flags & BFD_DETERMINISTIC_OUTPUT) == 0
+ ? time (NULL) : 0));
+diff --git a/bfd/archive64.c b/bfd/archive64.c
+index a906508..bdbda0a 100644
+--- a/bfd/archive64.c
++++ b/bfd/archive64.c
+@@ -169,8 +169,8 @@ bfd_elf64_archive_write_armap (bfd *arch,
+
+ memset (&hdr, ' ', sizeof (struct ar_hdr));
+ memcpy (hdr.ar_name, "/SYM64/", strlen ("/SYM64/"));
+- _bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size),
+- mapsize);
++ if (!_bfd_ar_sizepad (hdr.ar_size, sizeof (hdr.ar_size), mapsize))
++ return FALSE;
+ _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
+ time (NULL));
+ /* This, at least, is what Intel coff sets the values to.: */
+diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
+index 57197ac..a4ba4b6 100644
+--- a/bfd/libbfd-in.h
++++ b/bfd/libbfd-in.h
+@@ -203,7 +203,7 @@ extern void *_bfd_generic_read_ar_hdr
+ (bfd *);
+ extern void _bfd_ar_spacepad
+ (char *, size_t, const char *, long);
+-extern void _bfd_ar_sizepad
++extern int _bfd_ar_sizepad
+ (char *, size_t, bfd_size_type);
+
+ extern void *_bfd_generic_read_ar_hdr_mag
+diff --git a/bfd/libbfd.h b/bfd/libbfd.h
+index 121e865..7f142d0 100644
+--- a/bfd/libbfd.h
++++ b/bfd/libbfd.h
+@@ -208,7 +208,7 @@ extern void *_bfd_generic_read_ar_hdr
+ (bfd *);
+ extern void _bfd_ar_spacepad
+ (char *, size_t, const char *, long);
+-extern void _bfd_ar_sizepad
++extern int _bfd_ar_sizepad
+ (char *, size_t, bfd_size_type);
+
+ extern void *_bfd_generic_read_ar_hdr_mag
diff --git a/binutils/patches/pr13534-03.diff b/binutils/patches/pr13534-03.diff
new file mode 100644
index 0000000..454ccae
--- /dev/null
+++ b/binutils/patches/pr13534-03.diff
@@ -0,0 +1,29 @@
+commit 23a979dc1779ac63cd799bfa2f6c2aed1f1bff66
+Author: Francois Gouget <fgouget@codeweavers.com>
+Date: Tue Dec 20 18:41:35 2011 +0100
+
+ bfd: Fix parsing the size of archive elements larger than 2GB.
+
+diff --git a/bfd/archive.c b/bfd/archive.c
+index 05aba6c..01acf98 100644
+--- a/bfd/archive.c
++++ b/bfd/archive.c
+@@ -446,7 +446,7 @@ _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
+ {
+ struct ar_hdr hdr;
+ char *hdrp = (char *) &hdr;
+- size_t parsed_size;
++ bfd_size_type parsed_size;
+ struct areltdata *ared;
+ char *filename = NULL;
+ bfd_size_type namelen = 0;
+@@ -470,8 +470,7 @@ _bfd_generic_read_ar_hdr_mag (bfd *abfd, const char *mag)
+ }
+
+ errno = 0;
+- parsed_size = strtol (hdr.ar_size, NULL, 10);
+- if (errno != 0)
++ if (sscanf(hdr.ar_size, "%" BFD_VMA_FMT "u", &parsed_size) != 1)
+ {
+ bfd_set_error (bfd_error_malformed_archive);
+ return NULL;
diff --git a/binutils/patches/pr13534-04.diff b/binutils/patches/pr13534-04.diff
new file mode 100644
index 0000000..e11cd8f
--- /dev/null
+++ b/binutils/patches/pr13534-04.diff
@@ -0,0 +1,82 @@
+commit 70ed6152e1e163b9ca240fe8b91aa3feb942ac84
+Author: Francois Gouget <fgouget@codeweavers.com>
+Date: Tue Dec 20 18:45:18 2011 +0100
+
+ bfd: Always use bfd_size_type to manipulate the size of an archive element.
+
+ Other types may not be able to deal with archive elements larger than 2GB.
+
+diff --git a/bfd/archive.c b/bfd/archive.c
+index 01acf98..c1438ef 100644
+--- a/bfd/archive.c
++++ b/bfd/archive.c
+@@ -748,7 +748,7 @@ bfd_generic_openr_next_archived_file (bfd *archive, bfd *last_file)
+ filestart = bfd_ardata (archive)->first_file_filepos;
+ else
+ {
+- unsigned int size = arelt_size (last_file);
++ bfd_size_type size = arelt_size (last_file);
+
+ filestart = last_file->proxy_origin;
+ if (! bfd_is_thin_archive (archive))
+@@ -946,7 +946,7 @@ do_slurp_coff_armap (bfd *abfd)
+ struct artdata *ardata = bfd_ardata (abfd);
+ char *stringbase;
+ bfd_size_type stringsize;
+- unsigned int parsed_size;
++ bfd_size_type parsed_size;
+ carsym *carsyms;
+ bfd_size_type nsymz; /* Number of symbols in armap. */
+ bfd_vma (*swap) (const void *);
+@@ -2174,7 +2174,7 @@ _bfd_write_archive_contents (bfd *arch)
+ current = current->archive_next)
+ {
+ char buffer[DEFAULT_BUFFERSIZE];
+- unsigned int remaining = arelt_size (current);
++ bfd_size_type remaining = arelt_size (current);
+
+ /* Write ar header. */
+ if (!_bfd_write_ar_hdr (arch, current))
+diff --git a/bfd/bfdio.c b/bfd/bfdio.c
+index 841c781..5bc8061 100644
+--- a/bfd/bfdio.c
++++ b/bfd/bfdio.c
+@@ -185,7 +185,7 @@ bfd_bread (void *ptr, bfd_size_type size, bfd *abfd)
+ this element. */
+ if (abfd->arelt_data != NULL)
+ {
+- size_t maxbytes = ((struct areltdata *) abfd->arelt_data)->parsed_size;
++ bfd_size_type maxbytes = arelt_size (abfd);
+ if (abfd->where + size > maxbytes)
+ {
+ if (abfd->where >= maxbytes)
+diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
+index a4ba4b6..683c1cc 100644
+--- a/bfd/libbfd-in.h
++++ b/bfd/libbfd-in.h
+@@ -90,8 +90,8 @@ struct artdata {
+ /* Goes in bfd's arelt_data slot */
+ struct areltdata {
+ char * arch_header; /* it's actually a string */
+- unsigned int parsed_size; /* octets of filesize not including ar_hdr */
+- unsigned int extra_size; /* BSD4.4: extra bytes after the header. */
++ bfd_size_type parsed_size; /* octets of filesize not including ar_hdr */
++ bfd_size_type extra_size; /* BSD4.4: extra bytes after the header. */
+ char *filename; /* null-terminated */
+ file_ptr origin; /* for element of a thin archive */
+ };
+diff --git a/bfd/libbfd.h b/bfd/libbfd.h
+index 7f142d0..6d27901 100644
+--- a/bfd/libbfd.h
++++ b/bfd/libbfd.h
+@@ -95,8 +95,8 @@ struct artdata {
+ /* Goes in bfd's arelt_data slot */
+ struct areltdata {
+ char * arch_header; /* it's actually a string */
+- unsigned int parsed_size; /* octets of filesize not including ar_hdr */
+- unsigned int extra_size; /* BSD4.4: extra bytes after the header. */
++ bfd_size_type parsed_size; /* octets of filesize not including ar_hdr */
++ bfd_size_type extra_size; /* BSD4.4: extra bytes after the header. */
+ char *filename; /* null-terminated */
+ file_ptr origin; /* for element of a thin archive */
+ };
diff --git a/binutils/patches/pr13534-05.diff b/binutils/patches/pr13534-05.diff
new file mode 100644
index 0000000..8427b34
--- /dev/null
+++ b/binutils/patches/pr13534-05.diff
@@ -0,0 +1,61 @@
+commit 1c9170065b107672a47e467abb6807bba8adf28e
+Author: Francois Gouget <fgouget@codeweavers.com>
+Date: Tue Dec 20 18:48:52 2011 +0100
+
+ ar: Fix handling of archive elements larger than 2GB.
+
+diff --git a/binutils/ar.c b/binutils/ar.c
+index 0310b6f..e47779f 100644
+--- a/binutils/ar.c
++++ b/binutils/ar.c
+@@ -927,10 +927,10 @@ open_inarch (const char *archive_filename, const char *file)
+ static void
+ print_contents (bfd *abfd)
+ {
+- size_t ncopied = 0;
++ bfd_size_type ncopied = 0;
+ char *cbuf = (char *) xmalloc (BUFSIZE);
+ struct stat buf;
+- size_t size;
++ bfd_size_type size;
+ if (bfd_stat_arch_elt (abfd, &buf) != 0)
+ /* xgettext:c-format */
+ fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
+@@ -944,12 +944,12 @@ print_contents (bfd *abfd)
+ while (ncopied < size)
+ {
+
+- size_t nread;
+- size_t tocopy = size - ncopied;
++ bfd_size_type nread;
++ bfd_size_type tocopy = size - ncopied;
+ if (tocopy > BUFSIZE)
+ tocopy = BUFSIZE;
+
+- nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
++ nread = bfd_bread (cbuf, tocopy, abfd);
+ if (nread != tocopy)
+ /* xgettext:c-format */
+ fatal (_("%s is not a valid archive"),
+@@ -980,9 +980,9 @@ extract_file (bfd *abfd)
+ {
+ FILE *ostream;
+ char *cbuf = (char *) xmalloc (BUFSIZE);
+- size_t nread, tocopy;
+- size_t ncopied = 0;
+- size_t size;
++ bfd_size_type nread, tocopy;
++ bfd_size_type ncopied = 0;
++ bfd_size_type size;
+ struct stat buf;
+
+ if (bfd_stat_arch_elt (abfd, &buf) != 0)
+@@ -1017,7 +1017,7 @@ extract_file (bfd *abfd)
+ if (tocopy > BUFSIZE)
+ tocopy = BUFSIZE;
+
+- nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
++ nread = bfd_bread (cbuf, tocopy, abfd);
+ if (nread != tocopy)
+ /* xgettext:c-format */
+ fatal (_("%s is not a valid archive"),
diff --git a/binutils/patches/pr14069.diff b/binutils/patches/pr14069.diff
new file mode 100644
index 0000000..f19ed46
--- /dev/null
+++ b/binutils/patches/pr14069.diff
@@ -0,0 +1,43 @@
+===================================================================
+RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
+retrieving revision 1.226
+retrieving revision 1.227
+diff -u -r1.226 -r1.227
+--- src/ld/emultempl/elf32.em 2012/05/14 19:45:28 1.226
++++ src/ld/emultempl/elf32.em 2012/05/16 10:43:41 1.227
+@@ -72,7 +72,7 @@
+
+ if [ "x${USE_LIBPATH}" = xyes ] ; then
+ case ${target} in
+- *-*-linux-* | *-*-k*bsd*-*)
++ *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
+ fragment <<EOF
+ #ifdef HAVE_GLOB
+ #include <glob.h>
+@@ -374,7 +374,7 @@
+
+ EOF
+ case ${target} in
+- *-*-linux-* | *-*-k*bsd*-*)
++ *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
+ fragment <<EOF
+ {
+ struct bfd_link_needed_list *l;
+@@ -620,7 +620,7 @@
+ # FreeBSD
+ ;;
+
+- *-*-linux-* | *-*-k*bsd*-*)
++ *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
+ fragment <<EOF
+ /* For a native linker, check the file /etc/ld.so.conf for directories
+ in which we may find shared libraries. /etc/ld.so.conf is really
+@@ -1310,7 +1310,7 @@
+ # FreeBSD
+ ;;
+
+- *-*-linux-* | *-*-k*bsd*-*)
++ *-*-linux-* | *-*-k*bsd*-* | *-*-gnu*)
+ # Linux
+ fragment <<EOF
+ if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force))
diff --git a/binutils/patches/pr14493-ignore-without-bfd.patch b/binutils/patches/pr14493-ignore-without-bfd.patch
new file mode 100644
index 0000000..9267006
--- /dev/null
+++ b/binutils/patches/pr14493-ignore-without-bfd.patch
@@ -0,0 +1,36 @@
+Description: ignore section symbols without a BFD section.
+Bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14493
+Index: binutils/bfd/elf.c
+===================================================================
+--- binutils.orig/bfd/elf.c 2012-10-28 16:32:57.498420933 +0400
++++ binutils/bfd/elf.c 2012-10-28 18:07:43.088367811 +0400
+@@ -3242,15 +3242,24 @@
+ }
+
+ /* Don't output section symbols for sections that are not going to be
+- output. */
++ output, that are duplicates or there is no BFD section. */
+
+ static bfd_boolean
+ ignore_section_sym (bfd *abfd, asymbol *sym)
+ {
+- return ((sym->flags & BSF_SECTION_SYM) != 0
+- && !(sym->section->owner == abfd
+- || (sym->section->output_section->owner == abfd
+- && sym->section->output_offset == 0)));
++ elf_symbol_type *type_ptr;
++
++ if ((sym->flags & BSF_SECTION_SYM) == 0)
++ return FALSE;
++
++ type_ptr = elf_symbol_from (abfd, sym);
++ return ((type_ptr != NULL
++ && type_ptr->internal_elf_sym.st_shndx != 0
++ && bfd_is_abs_section (sym->section))
++ || !(sym->section->owner == abfd
++ || (sym->section->output_section->owner == abfd
++ && sym->section->output_offset == 0)
++ || bfd_is_abs_section (sym->section)));
+ }
+
+ static bfd_boolean
diff --git a/binutils/patches/pr14493-readelf.patch b/binutils/patches/pr14493-readelf.patch
new file mode 100644
index 0000000..1bd9e3a
--- /dev/null
+++ b/binutils/patches/pr14493-readelf.patch
@@ -0,0 +1,15 @@
+Description: Check bad section index
+Bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14493
+Index: binutils/binutils/readelf.c
+===================================================================
+--- binutils.orig/binutils/readelf.c 2012-10-28 16:32:57.669492867 +0400
++++ binutils/binutils/readelf.c 2012-10-28 18:13:56.322847064 +0400
+@@ -8824,6 +8824,8 @@
+ sprintf (buff, "OS [0x%04x]", type & 0xffff);
+ else if (type >= SHN_LORESERVE)
+ sprintf (buff, "RSV[0x%04x]", type & 0xffff);
++ else if (type >= elf_header.e_shnum)
++ sprintf (buff, "bad section index[%3d]", type);
+ else
+ sprintf (buff, "%3d", type);
+ break;
diff --git a/binutils/patches/pr14493-sol2.patch b/binutils/patches/pr14493-sol2.patch
new file mode 100644
index 0000000..0ec20e2
--- /dev/null
+++ b/binutils/patches/pr14493-sol2.patch
@@ -0,0 +1,394 @@
+Description: fix .SUNW_ldynsym section processing
+Bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14493
+Index: binutils/bfd/ChangeLog.pr14493
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ binutils/bfd/ChangeLog.pr14493 2012-10-28 20:13:51.320735655 +0400
+@@ -0,0 +1,27 @@
++2012-08-24 H.J. Lu <hongjiu.lu@intel.com>
++
++ PR binutils/14493
++ * Makefile.am (BFD32_BACKENDS): Add elf-sol2.lo.
++ (BFD64_BACKENDS): Likewise.
++ (BFD32_BACKENDS_CFILES): Add elf-sol2.c.
++ (BFD64_BACKENDS_CFILES): Likewise.
++
++ * configure.in: Add elf-sol2.lo to ELF x86 vectors.
++
++ * elf-sol2.c: New file.
++ * elf-sol2.h: Likewise.
++
++ * elf32-i386.c: Include "elf-sol2.h".
++ (elf_backend_section_processing): Defined to
++ _bfd_solaris_section_processing for Solaris.
++ (bfd_elf32_bfd_copy_private_section_data): Defined to
++ _bfd_solaris_copy_private_section_data for Solaris.
++
++ * elf64-x86-64.c: Include "elf-sol2.h".
++ (elf_backend_section_processing): Defined to
++ _bfd_solaris_section_processing for Solaris.
++ (bfd_elf64_bfd_copy_private_section_data): Defined to
++ _bfd_solaris_copy_private_section_data for Solaris.
++
++ * Makefile.in: Regenerated.
++ * configure: Likewise.
+Index: binutils/bfd/elf-sol2.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ binutils/bfd/elf-sol2.c 2012-10-28 20:13:51.322057305 +0400
+@@ -0,0 +1,66 @@
++/* Solaris support for ELF
++ Copyright 2012 Free Software Foundation, Inc.
++
++ This file is part of BFD, the Binary File Descriptor library.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
++ MA 02111-1307, USA. */
++
++#include "sysdep.h"
++#include "elf-sol2.h"
++
++bfd_boolean
++_bfd_solaris_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
++{
++ asection *sec;
++
++ switch (hdr->sh_type)
++ {
++ case SHT_SUNW_symsort:
++ sec = bfd_get_section_by_name (abfd, ".SUNW_ldynsym");
++ if (sec != NULL)
++ hdr->sh_link = elf_section_data (sec)->this_idx;
++ break;
++
++ case SHT_SUNW_LDYNSYM:
++ sec = bfd_get_section_by_name (abfd, ".dynstr");
++ if (sec != NULL)
++ hdr->sh_link = elf_section_data (sec)->this_idx;
++ break;
++ }
++
++ return TRUE;
++}
++
++bfd_boolean
++_bfd_solaris_copy_private_section_data (bfd *ibfd,
++ asection *isec,
++ bfd *obfd,
++ asection *osec)
++{
++ Elf_Internal_Shdr *ihdr, *ohdr;
++
++ if (ibfd->xvec->flavour != bfd_target_elf_flavour
++ || obfd->xvec->flavour != bfd_target_elf_flavour)
++ return TRUE;
++
++ ihdr = &elf_section_data (isec)->this_hdr;
++ ohdr = &elf_section_data (osec)->this_hdr;
++
++ if (ihdr->sh_type == SHT_SUNW_LDYNSYM)
++ ohdr->sh_info = ihdr->sh_info;
++
++ return _bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec);
++}
+Index: binutils/bfd/elf-sol2.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ binutils/bfd/elf-sol2.h 2012-10-28 20:13:51.323184009 +0400
+@@ -0,0 +1,31 @@
++/* Solaris support for ELF
++ Copyright 2012 Free Software Foundation, Inc.
++
++ This file is part of BFD, the Binary File Descriptor library.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
++ MA 02111-1307, USA. */
++
++#include "bfd.h"
++#include "elf-bfd.h"
++#include "elf/common.h"
++#include "elf/internal.h"
++
++extern bfd_boolean _bfd_solaris_section_processing
++ (bfd *, Elf_Internal_Shdr *);
++extern bfd_boolean _bfd_solaris_copy_private_section_data (bfd *,
++ asection *,
++ bfd *,
++ asection *);
+Index: binutils/bfd/elf32-i386.c
+===================================================================
+--- binutils.orig/bfd/elf32-i386.c 2012-10-28 20:13:50.054150282 +0400
++++ binutils/bfd/elf32-i386.c 2012-10-28 20:13:51.330923786 +0400
+@@ -25,6 +25,7 @@
+ #include "bfdlink.h"
+ #include "libbfd.h"
+ #include "elf-bfd.h"
++#include "elf-sol2.h"
+ #include "elf-vxworks.h"
+ #include "bfd_stdint.h"
+ #include "objalloc.h"
+@@ -5045,8 +5046,17 @@
+ #undef elf_backend_want_plt_sym
+ #define elf_backend_want_plt_sym 1
+
++#undef elf_backend_section_processing
++#define elf_backend_section_processing _bfd_solaris_section_processing
++#undef bfd_elf32_bfd_copy_private_section_data
++#define bfd_elf32_bfd_copy_private_section_data \
++ _bfd_solaris_copy_private_section_data
++
+ #include "elf32-target.h"
+
++#undef elf_backend_section_processing
++#undef bfd_elf32_bfd_copy_private_section_data
++
+ /* Native Client support. */
+
+ #undef TARGET_LITTLE_SYM
+Index: binutils/include/elf/ChangeLog.pr14493
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ binutils/include/elf/ChangeLog.pr14493 2012-10-28 20:13:51.332684185 +0400
+@@ -0,0 +1,5 @@
++2012-08-24 H.J. Lu <hongjiu.lu@intel.com>
++
++ PR binutils/14493
++ * common.h (SHT_SUNW_symsort): New.
++ (SHT_SUNW_LDYNSYM): Likewise.
+Index: binutils/include/elf/common.h
+===================================================================
+--- binutils.orig/include/elf/common.h 2012-10-28 20:12:10.686352145 +0400
++++ binutils/include/elf/common.h 2012-10-28 20:13:51.334384518 +0400
+@@ -486,6 +486,10 @@
+ /* #define SHT_HIUSER 0x8FFFFFFF *//* Application-specific semantics */
+ #define SHT_HIUSER 0xFFFFFFFF /* New value, defined in Oct 4, 1999 Draft */
+
++/* Solaris section types. */
++#define SHT_SUNW_symsort 0x6ffffff1
++#define SHT_SUNW_LDYNSYM 0x6ffffff3
++
+ /* Values for section header, sh_flags field. */
+
+ #define SHF_WRITE (1 << 0) /* Writable data during execution */
+Index: binutils/bfd/Makefile.am
+===================================================================
+--- binutils.orig/bfd/Makefile.am 2012-10-28 20:12:44.159380882 +0400
++++ binutils/bfd/Makefile.am 2012-10-28 20:13:51.336254354 +0400
+@@ -271,6 +271,7 @@
+ elf-ifunc.lo \
+ elf-m10200.lo \
+ elf-m10300.lo \
++ elf-sol2.lo \
+ elf-strtab.lo \
+ elf-vxworks.lo \
+ elf.lo \
+@@ -455,6 +456,7 @@
+ elf-ifunc.c \
+ elf-m10200.c \
+ elf-m10300.c \
++ elf-sol2.c \
+ elf-strtab.c \
+ elf-vxworks.c \
+ elf.c \
+@@ -601,6 +603,7 @@
+ coff-x86_64.lo \
+ coff64-rs6000.lo \
+ demo64.lo \
++ elf-sol2.lo \
+ elf32-ia64.lo \
+ elf32-score.lo \
+ elf32-score7.lo \
+@@ -637,6 +640,7 @@
+ coff-x86_64.c \
+ coff64-rs6000.c \
+ demo64.c \
++ elf-sol2.c \
+ elf32-score.c \
+ elf32-score7.c \
+ elf64-alpha.c \
+Index: binutils/bfd/elf64-x86-64.c
+===================================================================
+--- binutils.orig/bfd/elf64-x86-64.c 2012-10-28 20:13:50.058845562 +0400
++++ binutils/bfd/elf64-x86-64.c 2012-10-28 20:13:51.340757929 +0400
+@@ -26,6 +26,7 @@
+ #include "bfdlink.h"
+ #include "libbfd.h"
+ #include "elf-bfd.h"
++#include "elf-sol2.h"
+ #include "bfd_stdint.h"
+ #include "objalloc.h"
+ #include "hashtab.h"
+@@ -5024,8 +5025,17 @@
+ #undef elf_backend_want_plt_sym
+ #define elf_backend_want_plt_sym 1
+
++#undef elf_backend_section_processing
++#define elf_backend_section_processing _bfd_solaris_section_processing
++#undef bfd_elf64_bfd_copy_private_section_data
++#define bfd_elf64_bfd_copy_private_section_data \
++ _bfd_solaris_copy_private_section_data
++
+ #include "elf64-target.h"
+
++#undef elf_backend_section_processing
++#undef bfd_elf64_bfd_copy_private_section_data
++
+ /* Intel L1OM support. */
+
+ static bfd_boolean
+Index: binutils/bfd/configure.in
+===================================================================
+--- binutils.orig/bfd/configure.in 2012-10-28 20:12:10.686298088 +0400
++++ binutils/bfd/configure.in 2012-10-28 20:13:51.342860305 +0400
+@@ -707,11 +707,11 @@
+ bfd_elf32_hppa_nbsd_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
+ bfd_elf32_hppa_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
+ bfd_elf32_i370_vec) tb="$tb elf32-i370.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_nacl_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_nacl_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
+ bfd_elf32_i860_little_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;;
+ bfd_elf32_i860_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;;
+ bfd_elf32_i960_vec) tb="$tb elf32-i960.lo elf32.lo $elf" ;;
+@@ -841,14 +841,14 @@
+ tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf64_tradlittlemips_vec | bfd_elf64_tradlittlemips_freebsd_vec)
+ tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+- bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf32_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo elf32.lo $elf"; target_size=64 ;;
+- bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_k1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_k1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf32_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo elf32.lo $elf"; target_size=64 ;;
++ bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_k1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_k1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
+ bfd_mmo_vec) tb="$tb mmo.lo" target_size=64 ;;
+ bfd_powerpc_pe_vec) tb="$tb pe-ppc.lo peigen.lo cofflink.lo" ;;
+ bfd_powerpc_pei_vec) tb="$tb pei-ppc.lo peigen.lo cofflink.lo" ;;
+Index: binutils/bfd/Makefile.in
+===================================================================
+--- binutils.orig/bfd/Makefile.in 2012-10-28 20:12:44.162885392 +0400
++++ binutils/bfd/Makefile.in 2012-10-28 20:17:03.409478912 +0400
+@@ -571,6 +571,7 @@
+ elf-ifunc.lo \
+ elf-m10200.lo \
+ elf-m10300.lo \
++ elf-sol2.lo \
+ elf-strtab.lo \
+ elf-vxworks.lo \
+ elf.lo \
+@@ -755,6 +756,7 @@
+ elf-ifunc.c \
+ elf-m10200.c \
+ elf-m10300.c \
++ elf-sol2.c \
+ elf-strtab.c \
+ elf-vxworks.c \
+ elf.c \
+@@ -902,6 +904,7 @@
+ coff-x86_64.lo \
+ coff64-rs6000.lo \
+ demo64.lo \
++ elf-sol2.lo \
+ elf32-ia64.lo \
+ elf32-score.lo \
+ elf32-score7.lo \
+@@ -938,6 +941,7 @@
+ coff-x86_64.c \
+ coff64-rs6000.c \
+ demo64.c \
++ elf-sol2.c \
+ elf32-score.c \
+ elf32-score7.c \
+ elf64-alpha.c \
+@@ -1331,6 +1335,7 @@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-ifunc.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-m10200.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-m10300.Plo@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-sol2.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-strtab.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-vxworks.Plo@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf.Plo@am__quote@
+Index: binutils/bfd/configure
+===================================================================
+--- binutils.orig/bfd/configure 2012-10-28 20:12:10.686210455 +0400
++++ binutils/bfd/configure 2012-10-28 20:13:51.356488706 +0400
+@@ -15208,11 +15208,11 @@
+ bfd_elf32_hppa_nbsd_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
+ bfd_elf32_hppa_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
+ bfd_elf32_i370_vec) tb="$tb elf32-i370.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_nacl_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
+- bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_sol2_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_freebsd_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_nacl_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_vxworks_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
++ bfd_elf32_i386_vec) tb="$tb elf32-i386.lo elf-ifunc.lo elf-sol2.lo elf-vxworks.lo elf32.lo $elf" ;;
+ bfd_elf32_i860_little_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;;
+ bfd_elf32_i860_vec) tb="$tb elf32-i860.lo elf32.lo $elf" ;;
+ bfd_elf32_i960_vec) tb="$tb elf32-i960.lo elf32.lo $elf" ;;
+@@ -15342,14 +15342,14 @@
+ tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+ bfd_elf64_tradlittlemips_vec | bfd_elf64_tradlittlemips_freebsd_vec)
+ tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
+- bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf32_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo elf32.lo $elf"; target_size=64 ;;
+- bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_k1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+- bfd_elf64_k1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_x86_64_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_x86_64_sol2_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf32_x86_64_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo elf32.lo $elf"; target_size=64 ;;
++ bfd_elf64_l1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_l1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_k1om_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
++ bfd_elf64_k1om_freebsd_vec) tb="$tb elf64-x86-64.lo elf-ifunc.lo elf-sol2.lo elf64.lo $elf"; target_size=64 ;;
+ bfd_mmo_vec) tb="$tb mmo.lo" target_size=64 ;;
+ bfd_powerpc_pe_vec) tb="$tb pe-ppc.lo peigen.lo cofflink.lo" ;;
+ bfd_powerpc_pei_vec) tb="$tb pei-ppc.lo peigen.lo cofflink.lo" ;;
diff --git a/binutils/patches/pr14493-strip.patch b/binutils/patches/pr14493-strip.patch
new file mode 100644
index 0000000..3fa3546
--- /dev/null
+++ b/binutils/patches/pr14493-strip.patch
@@ -0,0 +1,56 @@
+Description: Properly set the output maxpagesize
+ when rewriting program header.
+
+ PR binutils/14493
+ * elf.c (copy_elf_program_header): When rewriting program
+ header, set the output maxpagesize to the maximum alignment
+ of input PT_LOAD segments.
+
+From: H. J. Lu <hongjiu.lu@intel.com>
+Bug: http://sourceware.org/bugzilla/show_bug.cgi?id=14493
+
+Index: binutils/bfd/elf.c
+===================================================================
+--- binutils.orig/bfd/elf.c 2012-11-09 21:15:06.155929071 +0000
++++ binutils/bfd/elf.c 2012-11-21 08:53:00.311430441 +0000
+@@ -6179,6 +6179,8 @@
+ static bfd_boolean
+ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
+ {
++ bfd_vma maxpagesize = 0;
++
+ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+ || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+ return TRUE;
+@@ -6207,10 +6209,18 @@
+ section = section->next)
+ section->segment_mark = FALSE;
+
++ /* Find the maximum alignment of input PT_LOAD segments. */
+ num_segments = elf_elfheader (ibfd)->e_phnum;
+ for (i = 0, segment = elf_tdata (ibfd)->phdr;
+ i < num_segments;
+ i++, segment++)
++ if (segment->p_type == PT_LOAD
++ && maxpagesize < segment->p_align)
++ maxpagesize = segment->p_align;
++
++ for (i = 0, segment = elf_tdata (ibfd)->phdr;
++ i < num_segments;
++ i++, segment++)
+ {
+ /* PR binutils/3535. The Solaris linker always sets the p_paddr
+ and p_memsz fields of special segments (DYNAMIC, INTERP) to 0
+@@ -6263,6 +6273,12 @@
+ }
+
+ rewrite:
++ /* When rewriting program header, set the output maxpagesize to the
++ maximum alignment of input PT_LOAD segments. */
++ if (maxpagesize &&
++ maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
++ bfd_emul_set_maxpagesize (obfd->xvec->name, maxpagesize);
++
+ return rewrite_elf_program_header (ibfd, obfd);
+ }
+
diff --git a/binutils/patches/series b/binutils/patches/series
new file mode 100644
index 0000000..44386a8
--- /dev/null
+++ b/binutils/patches/series
@@ -0,0 +1,43 @@
+branch-updates.diff
+#branch-version.diff
+001_ld_makefile_patch.patch
+002_gprof_profile_arcs.patch
+003_gprof_see_also_monitor.patch
+006_better_file_error.patch
+012_check_ldrunpath_length.patch
+013_bash_in_ld_testsuite.patch
+#014_hash_style-both.patch
+127_x86_64_i386_biarch.patch
+128_ppc64_powerpc_biarch.patch
+128_build_id.patch
+129_ld_mulitarch_dirs.patch
+130_gold_disable_testsuite_build.patch
+131_ld_bootstrap_testsuite.patch
+134_gold_no_spu.patch
+135_bfd_version.patch
+140_pr10340.patch
+156_pr10144.patch
+157_ar_scripts_with_tilde.patch
+158_ld_system_root.patch
+160_gas_pr12698.diff
+162_fpic_s390x.diff
+161_gold_dummy_zoption.diff
+163_multiarch_search_path.patch
+167_pr13302.diff
+210-gold-time_cc-unistd_h_for_sysconf.patch
+300_ld_altexec.patch
+pr13534-01.diff
+pr13534-02.diff
+pr13534-03.diff
+pr13534-04.diff
+pr13534-05.diff
+168_readelf_go.patch
+pr13449.diff
+pr14069.diff
+libiberty-md5.diff
+pr14493-sol2.patch
+pr14493-ignore-without-bfd.patch
+pr14493-readelf.patch
+dyson-biarch.patch
+pr14493-strip.patch
+pr12548-anonymous-version-tag.patch