Skip to content
This repository has been archived by the owner on Apr 3, 2020. It is now read-only.

Commit

Permalink
[Backport] Update third_party/binutils to 2.26, add ICF fix
Browse files Browse the repository at this point in the history
This is needed to order for the build to work on Ubuntu 16.04 with
Chromium's clang and binutils.

Original commit message:
> The new binutils 2.26 release incorporates two out of the three
> fixes that we were applying to the 2.25 version.  There is also
> an upstream fix, that's not in 2.26, for a bug that made the
> linker crash when using --icf for x86-32, which we now apply
> locally so it should become safe to use gold with --icf for x86.
>
> BUG=610908
> [email protected]
>
> Review-Url: https://codereview.chromium.org/1950343004
  • Loading branch information
frobtech authored and Raphael Kubo da Costa committed Jul 1, 2016
1 parent d3001c4 commit 7015049
Show file tree
Hide file tree
Showing 9 changed files with 254 additions and 284 deletions.
2 changes: 1 addition & 1 deletion third_party/binutils/Linux_ia32/binutils.tar.bz2.sha1
Original file line number Diff line number Diff line change
@@ -1 +1 @@
db44850c15da5bb295f44c295d8e5c4c97c9edec
24f937cfdad77bdcd6ad8cacc542d806f3eb4b0f
2 changes: 1 addition & 1 deletion third_party/binutils/Linux_x64/binutils.tar.bz2.sha1
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4b448a2afa4b65ffd968db57a3b233532effc88d
d9064388bed0e7225b1366d80b59289b1509d7c2
24 changes: 9 additions & 15 deletions third_party/binutils/README.chromium
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Name: binutils
URL: http://www.gnu.org/software/binutils/
Version: 2.25
Version: 2.26
License: GPL v2
License File: NOT_SHIPPED
Security Critical: no
Expand All @@ -9,29 +9,24 @@ Description:
This directory contains i386 and amd64 binaries of the binutils tools
(including gold linker).

They were built from binutils-2.25 using the "build-all.sh" script on a Ubuntu
Precise.
They were built from binutils-2.26 using the "build-all.sh" script on a
Ubuntu Trusty.

The script creates chroots for 32bit and 64bit Ubuntu Precise and then builds
binutils inside the roots. It also builds tcmalloc and links binutils with it
to improve the speed of LTO.

Version 2.25 was released on Wed, 24 Dec 2014
Version 2.26 was released on Mon, 25 Jan 2016

Local patches:
* unlock-thin.patch for http://crbug.com/453195 from upstream change
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=2cfbf2fece582c29df348104b28677c38a8301f4
(Landed upstream Wed, 4 Feb 2015 - should be in 2.26)

* plugin-dso-fix.patch for http://crbug.com/453195 from upstream change
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=3c537f7fdb11f02f7082749f3f21dfdd2c2025e8
(Landed upstream Thu, 5 Feb 2015 - should be in 2.26)

* long-plt.patch for http://crbug.com/554017 from upstream change
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=ce3e49806d505721e0875e704de0b6fcba7660ed
(Landed upstream Thu, 17 Dec 2015 - should be in 2.27)
The local patch has been backported to 2.25. The patch in the upstream
repository currently applies cleanly to the 2.26 branch.
* icf-rel.patch for https://sourceware.org/bugzilla/show_bug.cgi?id=19047
from upstream change
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=d114b830426300f80302ca03ff4322942f63c615
(Landed upstream on 2.26 branch Thu, 5 May 2016,
and on trunk Fri, 5 Feb 2016 - will be in 2.27)

* (build-all.sh|build-one.sh|upload.sh) scripts for building the binutils
binaries and uploading them to Google storage.
Expand All @@ -53,4 +48,3 @@ To upgrade binutils, use the following steps:
* Commit the change

See https://codereview.chromium.org/1368233002/ for an example upgrade.

21 changes: 7 additions & 14 deletions third_party/binutils/build-all.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ if [ ! -d "$OUTPUTDIR" ]; then
fi

# Download the source
VERSION=2.25
VERSION=2.26
wget -c http://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.bz2

# Verify the signature
Expand All @@ -46,19 +46,14 @@ tar jxf binutils-$VERSION.tar.bz2
# Patch the source
(
cd binutils-$VERSION
echo "unlock-thin.patch"
echo "=================================="
patch -p1 < ../unlock-thin.patch
echo "----------------------------------"
echo
echo "plugin-dso-fix.patch"
echo "long-plt.patch"
echo "=================================="
patch -p1 < ../plugin-dso-fix.patch
patch -p1 < ../long-plt.patch
echo "----------------------------------"
echo
echo "long-plt.patch"
echo "icf-rel.patch"
echo "=================================="
patch -p1 < ../long-plt.patch
patch -p1 < ../icf-rel.patch
echo "----------------------------------"
echo
)
Expand Down Expand Up @@ -102,7 +97,7 @@ for ARCH in i386 amd64; do
;;
amd64)
PREFIX="setarch linux64"
ARCHNAME=x86_64-unknown-linux-gnu
ARCHNAME=x86_64-pc-linux-gnu
;;
esac
echo ""
Expand All @@ -117,9 +112,7 @@ for ARCH in i386 amd64; do
sudo chown -R $(whoami) "$BUILDDIR/output/"

# Strip the output binaries
for i in "$BUILDDIR/output/$ARCHNAME/bin/*"; do
strip $i
done
strip "$BUILDDIR/output/$ARCHNAME/bin/"*

# Copy them out of the chroot
cp -a "$BUILDDIR/output/$ARCHNAME" "$OUTPUTDIR"
Expand Down
181 changes: 181 additions & 0 deletions third_party/binutils/icf-rel.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
commit d114b830426300f80302ca03ff4322942f63c615
Author: Roland McGrath <[email protected]>
Date: Thu May 5 13:12:40 2016 -0700

2016-02-05 Sriraman Tallam <[email protected]>

PR gold/19047
* icf.cc (get_rel_addend): New function.
(get_section_contents): Move merge section addend computation to a
new function. Ignore negative values for SHT_REL and SHT_RELA addends.
Fix bug to not read past the length of the section.

Fix bug related to addend computation for MERGE sections.

(cherry picked from commit 84d543b7ed93bf6511cdf45791f4f0b717dfb718)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 92b26ba..ec8dacb 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,11 @@
+2016-02-05 Sriraman Tallam <[email protected]>
+
+ PR gold/19047
+ * icf.cc (get_rel_addend): New function.
+ (get_section_contents): Move merge section addend computation to a
+ new function. Ignore negative values for SHT_REL and SHT_RELA addends.
+ Fix bug to not read past the length of the section.
+
2015-12-17 Peter Collingbourne <[email protected]>

PR gold/18780
diff --git a/gold/icf.cc b/gold/icf.cc
index 96b7f2d..663d579 100644
--- a/gold/icf.cc
+++ b/gold/icf.cc
@@ -213,6 +213,45 @@ preprocess_for_unique_sections(const std::vector<Section_id>& id_section,
}
}

+// For SHF_MERGE sections that use REL relocations, the addend is stored in
+// the text section at the relocation offset. Read the addend value given
+// the pointer to the addend in the text section and the addend size.
+// Update the addend value if a valid addend is found.
+// Parameters:
+// RELOC_ADDEND_PTR : Pointer to the addend in the text section.
+// ADDEND_SIZE : The size of the addend.
+// RELOC_ADDEND_VALUE : Pointer to the addend that is updated.
+
+inline void
+get_rel_addend(const unsigned char* reloc_addend_ptr,
+ const unsigned int addend_size,
+ uint64_t* reloc_addend_value)
+{
+ switch (addend_size)
+ {
+ case 0:
+ break;
+ case 1:
+ *reloc_addend_value =
+ read_from_pointer<8>(reloc_addend_ptr);
+ break;
+ case 2:
+ *reloc_addend_value =
+ read_from_pointer<16>(reloc_addend_ptr);
+ break;
+ case 4:
+ *reloc_addend_value =
+ read_from_pointer<32>(reloc_addend_ptr);
+ break;
+ case 8:
+ *reloc_addend_value =
+ read_from_pointer<64>(reloc_addend_ptr);
+ break;
+ default:
+ gold_unreachable();
+ }
+}
+
// This returns the buffer containing the section's contents, both
// text and relocs. Relocs are differentiated as those pointing to
// sections that could be folded and those that cannot. Only relocs
@@ -397,58 +436,36 @@ get_section_contents(bool first_iteration,
uint64_t entsize =
(it_v->first)->section_entsize(it_v->second);
long long offset = it_a->first;
-
- unsigned long long addend = it_a->second;
- // Ignoring the addend when it is a negative value. See the
- // comments in Merged_symbol_value::Value in object.h.
- if (addend < 0xffffff00)
- offset = offset + addend;
-
- // For SHT_REL relocation sections, the addend is stored in the
- // text section at the relocation offset.
- uint64_t reloc_addend_value = 0;
+ // Handle SHT_RELA and SHT_REL addends, only one of these
+ // addends exists.
+ // Get the SHT_RELA addend. For RELA relocations, we have
+ // the addend from the relocation.
+ uint64_t reloc_addend_value = it_a->second;
+
+ // Handle SHT_REL addends.
+ // For REL relocations, we need to fetch the addend from the
+ // section contents.
const unsigned char* reloc_addend_ptr =
contents + static_cast<unsigned long long>(*it_o);
- switch(*it_addend_size)
- {
- case 0:
- {
- break;
- }
- case 1:
- {
- reloc_addend_value =
- read_from_pointer<8>(reloc_addend_ptr);
- break;
- }
- case 2:
- {
- reloc_addend_value =
- read_from_pointer<16>(reloc_addend_ptr);
- break;
- }
- case 4:
- {
- reloc_addend_value =
- read_from_pointer<32>(reloc_addend_ptr);
- break;
- }
- case 8:
- {
- reloc_addend_value =
- read_from_pointer<64>(reloc_addend_ptr);
- break;
- }
- default:
- gold_unreachable();
- }
- offset = offset + reloc_addend_value;
+
+ // Update the addend value with the SHT_REL addend if
+ // available.
+ get_rel_addend(reloc_addend_ptr, *it_addend_size,
+ &reloc_addend_value);
+
+ // Ignore the addend when it is a negative value. See the
+ // comments in Merged_symbol_value::value in object.h.
+ if (reloc_addend_value < 0xffffff00)
+ offset = offset + reloc_addend_value;

section_size_type secn_len;
+
const unsigned char* str_contents =
(it_v->first)->section_contents(it_v->second,
&secn_len,
false) + offset;
+ gold_assert (offset < (long long) secn_len);
+
if ((secn_flags & elfcpp::SHF_STRINGS) != 0)
{
// String merge section.
@@ -489,10 +506,14 @@ get_section_contents(bool first_iteration,
}
else
{
- // Use the entsize to determine the length.
- buffer.append(reinterpret_cast<const
+ // Use the entsize to determine the length to copy.
+ uint64_t bufsize = entsize;
+ // If entsize is too big, copy all the remaining bytes.
+ if ((offset + entsize) > secn_len)
+ bufsize = secn_len - offset;
+ buffer.append(reinterpret_cast<const
char*>(str_contents),
- entsize);
+ bufsize);
}
buffer.append("@");
}
Loading

0 comments on commit 7015049

Please sign in to comment.