aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2014-12-20 06:23:23 -0800
committerH.J. Lu <hjl.tools@gmail.com>2014-12-20 06:23:23 -0800
commitedd040225dd6d2ea003276931a73d5ba1117c5a1 (patch)
treec7e7b0815f2c2cc6103b9b039434be5bcfbd2176
parent88749b30be67c568d4a7ecd81326354b76406d4d (diff)
downloadgdb-edd040225dd6d2ea003276931a73d5ba1117c5a1.zip
gdb-edd040225dd6d2ea003276931a73d5ba1117c5a1.tar.gz
gdb-edd040225dd6d2ea003276931a73d5ba1117c5a1.tar.bz2
Apply binutils-pr14675.patch
-rw-r--r--patches/README1
-rw-r--r--patches/binutils-pr14675.patch197
2 files changed, 198 insertions, 0 deletions
diff --git a/patches/README b/patches/README
index b09258f..8bd659e 100644
--- a/patches/README
+++ b/patches/README
@@ -21,6 +21,7 @@ patches="
binutils-pr12639.patch
binutils-secondary.patch
binutils-pr17729.patch
+ binutils-pr14675.patch
"
for p in $patches
diff --git a/patches/binutils-pr14675.patch b/patches/binutils-pr14675.patch
new file mode 100644
index 0000000..6875a5c
--- /dev/null
+++ b/patches/binutils-pr14675.patch
@@ -0,0 +1,197 @@
+From 4a5d5d94ca76cbf730d7f0379601e75f9469670e Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools@gmail.com>
+Date: Sat, 20 Dec 2014 05:45:51 -0800
+Subject: [PATCH] Treat .eh_frame section before crtbegin as normal input
+
+Force the exception frame section from input files before the crtbegin
+file to be handled as an ordinary input section if we aren't creating
+the exception frame header. If we don't do this, we won't correctly
+handle the special marker symbol in the exception frame section in the
+crtbegin file.
+
+ PR gold/14675
+ * ehframe.cc (Eh_frame::add_ehframe_input_section): Force the
+ exception frame section from input files before the crtbegin
+ file to be handled as an ordinary input section if we aren't
+ creating the exception frame header.
+ (Eh_frame::add_ehframe_input_section<32, false>): Updated.
+ (Eh_frame::add_ehframe_input_section<32, true>): Likewise.
+ (Eh_frame::add_ehframe_input_section<64, false>): Likewise.
+ (Eh_frame::add_ehframe_input_section<64, true>): Likewise.
+ * ehframe.h (Eh_frame::add_ehframe_input_section): Add a
+ bool parameter to indicate if the crtbegin file has been
+ processed.
+ * layout.cc (Layout::Layout): Initialize seen_crtbegin_.
+ (Layout::layout_eh_frame): Pass this->seen_crtbegin_ to
+ Eh_frame::add_ehframe_input_section.
+ (Layout::make_eh_frame_section): Set this->seen_crtbegin_ to
+ true when processing the crtbegin file.
+ * layout.h (Layout): Add a seen_crtbegin_ field.
+---
+ gold/ChangeLog | 21 +++++++++++++++++++++
+ gold/ehframe.cc | 34 ++++++++++++++++++++++++----------
+ gold/ehframe.h | 6 ++++--
+ gold/layout.cc | 10 +++++++++-
+ gold/layout.h | 3 +++
+ 5 files changed, 61 insertions(+), 13 deletions(-)
+
+diff --git a/gold/ehframe.cc b/gold/ehframe.cc
+index c711bac..dde90df 100644
+--- a/gold/ehframe.cc
++++ b/gold/ehframe.cc
+@@ -576,7 +576,8 @@ Eh_frame::add_ehframe_input_section(
+ section_size_type symbol_names_size,
+ unsigned int shndx,
+ unsigned int reloc_shndx,
+- unsigned int reloc_type)
++ unsigned int reloc_type,
++ bool crtbegin_seen)
+ {
+ // Get the section contents.
+ section_size_type contents_len;
+@@ -595,15 +596,24 @@ Eh_frame::add_ehframe_input_section(
+ return false;
+
+ New_cies new_cies;
+- if (!this->do_add_ehframe_input_section(object, symbols, symbols_size,
++ bool recognized_eh_frame_section
++ = this->do_add_ehframe_input_section(object, symbols, symbols_size,
+ symbol_names, symbol_names_size,
+ shndx, reloc_shndx,
+ reloc_type, pcontents,
+- contents_len, &new_cies))
++ contents_len, &new_cies);
++ if (!recognized_eh_frame_section && this->eh_frame_hdr_ != NULL)
++ this->eh_frame_hdr_->found_unrecognized_eh_frame_section();
++
++ // If we don't unrecognize the exception frame section or we haven't
++ // seen the crtbegin file and we aren't creating the exception frame
++ // header, then return false to force it to be handled as an ordinary
++ // input section. If we don't do this, we won't correctly handle the
++ // special marker symbol in the exception frame section in the crtbegin
++ // file.
++ if (!recognized_eh_frame_section
++ || (this->eh_frame_hdr_ == NULL && !crtbegin_seen))
+ {
+- if (this->eh_frame_hdr_ != NULL)
+- this->eh_frame_hdr_->found_unrecognized_eh_frame_section();
+-
+ for (New_cies::iterator p = new_cies.begin();
+ p != new_cies.end();
+ ++p)
+@@ -1224,7 +1234,8 @@ Eh_frame::add_ehframe_input_section<32, false>(
+ section_size_type symbol_names_size,
+ unsigned int shndx,
+ unsigned int reloc_shndx,
+- unsigned int reloc_type);
++ unsigned int reloc_type,
++ bool crtbegin_seen);
+ #endif
+
+ #ifdef HAVE_TARGET_32_BIG
+@@ -1238,7 +1249,8 @@ Eh_frame::add_ehframe_input_section<32, true>(
+ section_size_type symbol_names_size,
+ unsigned int shndx,
+ unsigned int reloc_shndx,
+- unsigned int reloc_type);
++ unsigned int reloc_type,
++ bool crtbegin_seen);
+ #endif
+
+ #ifdef HAVE_TARGET_64_LITTLE
+@@ -1252,7 +1264,8 @@ Eh_frame::add_ehframe_input_section<64, false>(
+ section_size_type symbol_names_size,
+ unsigned int shndx,
+ unsigned int reloc_shndx,
+- unsigned int reloc_type);
++ unsigned int reloc_type,
++ bool crtbegin_seen);
+ #endif
+
+ #ifdef HAVE_TARGET_64_BIG
+@@ -1266,7 +1279,8 @@ Eh_frame::add_ehframe_input_section<64, true>(
+ section_size_type symbol_names_size,
+ unsigned int shndx,
+ unsigned int reloc_shndx,
+- unsigned int reloc_type);
++ unsigned int reloc_type,
++ bool crtbegin_seen);
+ #endif
+
+ } // End namespace gold.
+diff --git a/gold/ehframe.h b/gold/ehframe.h
+index 2ae12e0..b0effa0 100644
+--- a/gold/ehframe.h
++++ b/gold/ehframe.h
+@@ -371,7 +371,8 @@ class Eh_frame : public Output_section_data
+ // is the relocation section if any (0 for none, -1U for multiple).
+ // RELOC_TYPE is the type of the relocation section if any. This
+ // returns whether the section was incorporated into the .eh_frame
+- // data.
++ // data. CRTBEGIN_SEEN is true if the crtbegin file has been
++ // processed.
+ template<int size, bool big_endian>
+ bool
+ add_ehframe_input_section(Sized_relobj_file<size, big_endian>* object,
+@@ -380,7 +381,8 @@ class Eh_frame : public Output_section_data
+ const unsigned char* symbol_names,
+ section_size_type symbol_names_size,
+ unsigned int shndx, unsigned int reloc_shndx,
+- unsigned int reloc_type);
++ unsigned int reloc_type,
++ bool crtbegin_seen);
+
+ // Add a CIE and an FDE for a PLT section, to permit unwinding
+ // through a PLT. The FDE data should start with 8 bytes of zero,
+diff --git a/gold/layout.cc b/gold/layout.cc
+index 0a71a2a..6649f9f 100644
+--- a/gold/layout.cc
++++ b/gold/layout.cc
+@@ -469,6 +469,7 @@ Layout::Layout(int number_of_input_files, Script_options* script_options)
+ unique_segment_for_sections_specified_(false),
+ incremental_inputs_(NULL),
+ record_output_section_data_from_script_(false),
++ seen_crtbegin_(false),
+ script_output_section_data_list_(),
+ segment_states_(NULL),
+ relaxation_debug_check_(NULL),
+@@ -1428,7 +1429,8 @@ Layout::layout_eh_frame(Sized_relobj_file<size, big_endian>* object,
+ symbol_names_size,
+ shndx,
+ reloc_shndx,
+- reloc_type))
++ reloc_type,
++ this->seen_crtbegin_))
+ {
+ os->update_flags_for_input_section(shdr.get_sh_flags());
+
+@@ -1485,6 +1487,12 @@ Layout::make_eh_frame_section(const Relobj* object)
+ if (os == NULL)
+ return NULL;
+
++ if (object != NULL && Layout::match_file_name(object, "crtbegin"))
++ {
++ gold_assert(!this->seen_crtbegin_);
++ this->seen_crtbegin_ = true;
++ }
++
+ if (this->eh_frame_section_ == NULL)
+ {
+ this->eh_frame_section_ = os;
+diff --git a/gold/layout.h b/gold/layout.h
+index 032f5f3..74e5ec1 100644
+--- a/gold/layout.h
++++ b/gold/layout.h
+@@ -1420,6 +1420,9 @@ class Layout
+ Incremental_inputs* incremental_inputs_;
+ // Whether we record output section data created in script
+ bool record_output_section_data_from_script_;
++ // Whether we have seen the crtbegin file when processing the exception
++ // frame sections.
++ bool seen_crtbegin_;
+ // List of output data that needs to be removed at relaxation clean up.
+ Output_section_data_list script_output_section_data_list_;
+ // Structure to save segment states before entering the relaxation loop.
+--
+1.9.3
+