aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2014-05-15 18:37:43 +0930
committerAlan Modra <amodra@gmail.com>2014-05-15 18:37:43 +0930
commit5fe7ffdc98b769de3ea67e6f38bc5de57be7b265 (patch)
tree3dcc4e843b84a1fb9749dfab2fab4eead4505387 /gold
parent57b287416bcd3dd29202dff55d89dc7a68196cc8 (diff)
downloadfsf-binutils-gdb-5fe7ffdc98b769de3ea67e6f38bc5de57be7b265.zip
fsf-binutils-gdb-5fe7ffdc98b769de3ea67e6f38bc5de57be7b265.tar.gz
fsf-binutils-gdb-5fe7ffdc98b769de3ea67e6f38bc5de57be7b265.tar.bz2
Fix "overflow in PLT unwind data" warning
When linking statically, it's possible to hit this warning with IFUNC or very large executables, due to .glink being unused. * powerpc.cc (do_plt_fde_location): Handle zero length .glink. Compare FDE contents with DW_CFA_nop rather than 0.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog67
-rw-r--r--gold/powerpc.cc18
2 files changed, 52 insertions, 33 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 6d1c14b..f0ee1f7 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,8 @@
+2014-05-15 Alan Modra <amodra@gmail.com>
+
+ * powerpc.cc (do_plt_fde_location): Handle zero length .glink.
+ Compare FDE contents with DW_CFA_nop rather than 0.
+
2014-05-13 Sriraman Tallam <tmsriram@google.com>
* symtab.h (may_need_copy_reloc): Remove check for position independent
@@ -15,7 +20,7 @@
* testsuite/pie_copyrelocs_test.cc: New file.
* testsuite/pie_copyrelocs_shared_test.cc: New file.
* Makefile.am (pie_copyrelocs_test): New test.
- * Makefile.in: Regenerate.
+ * Makefile.in: Regenerate.
2014-05-08 Martin Liška <mliska@suse.cz>
@@ -45,37 +50,37 @@
class.
2014-05-05 Cary Coutant <ccoutant@google.com>
-
+
* gdb-index.cc (Gdb_index_info_reader): Don't complain about language
if we have pubnames/pubtypes.
2014-05-02 Cary Coutant <ccoutant@google.com>
- * defstd.cc (in_segment): Define __ehdr_start here...
- * layout.cc (Layout::finalize): ...Instead of here. Set the
- output segment when known.
- * resolve.cc (Symbol::override_base_with_special): Remember
- the original binding.
- * symtab.cc (Symbol::set_output_segment): New function.
- (Symbol::set_undefined): New function.
- * symtab.h (Symbol::is_weak_undefined): Check original undef
- binding.
- (Symbol::is_strong_undefined): New function.
- (Symbol::set_output_segment): New function.
- (Symbol::set_undefined): New function.
- * target-reloc.h (is_strong_undefined): Remove.
- (issue_undefined_symbol_error): Call Symbol::is_weak_undefined.
- Check for hidden undefs.
- (relocate_section): Call Symbol::is_strong_undefined.
-
- * testsuite/Makefile.am (ehdr_start_test_1)
- (ehdr_start_test_2, ehdr_start_test_3)
- (ehdr_start_test_4, ehdr_start_test_5): New test cases.
- * testsuite/Makefile.in: Regenerate.
- * testsuite/ehdr_start_def.cc: New source file.
- * testsuite/ehdr_start_test.cc: New source file.
- * testsuite/ehdr_start_test.t: New linker script.
- * testsuite/ehdr_start_test_4.sh: New shell script.
+ * defstd.cc (in_segment): Define __ehdr_start here...
+ * layout.cc (Layout::finalize): ...Instead of here. Set the
+ output segment when known.
+ * resolve.cc (Symbol::override_base_with_special): Remember
+ the original binding.
+ * symtab.cc (Symbol::set_output_segment): New function.
+ (Symbol::set_undefined): New function.
+ * symtab.h (Symbol::is_weak_undefined): Check original undef
+ binding.
+ (Symbol::is_strong_undefined): New function.
+ (Symbol::set_output_segment): New function.
+ (Symbol::set_undefined): New function.
+ * target-reloc.h (is_strong_undefined): Remove.
+ (issue_undefined_symbol_error): Call Symbol::is_weak_undefined.
+ Check for hidden undefs.
+ (relocate_section): Call Symbol::is_strong_undefined.
+
+ * testsuite/Makefile.am (ehdr_start_test_1)
+ (ehdr_start_test_2, ehdr_start_test_3)
+ (ehdr_start_test_4, ehdr_start_test_5): New test cases.
+ * testsuite/Makefile.in: Regenerate.
+ * testsuite/ehdr_start_def.cc: New source file.
+ * testsuite/ehdr_start_test.cc: New source file.
+ * testsuite/ehdr_start_test.t: New linker script.
+ * testsuite/ehdr_start_test_4.sh: New shell script.
2014-04-23 Cary Coutant <ccoutant@google.com>
@@ -135,7 +140,7 @@
(Target::do_adjust_dyn_symbol): New function.
2014-03-10 Sasa Stankovic <Sasa.Stankovic@imgtec.com>
-
+
* output.cc (Output_data_dynamic::Dynamic_entry::write):
Get the value of DYNAMIC_CUSTOM dynamic entry.
* output.h (Output_data_dynamic::add_custom): New function.
@@ -208,7 +213,7 @@
Check for is_strong_undefined.
2014-02-05 Cary Coutant <ccoutant@google.com>
-
+
Fix problems with the --dynamic-list option.
PR gold/13577
@@ -221,11 +226,11 @@
(General_options::have_dynamic_list_): New data member.
* symtab.h (Symbol::is_preemptible): Handle --dynamic-list
correctly.
-
+
PR gold/16530
* symtab.cc (Symbol_table::add_from_relobj): If symbol is named
in --dynamic-list, mark it.
-
+
* testsuite/Makefile.am (gc_dynamic_list_test.sh): New test case.
(dynamic_list_2): New test case.
* testsuite/Makefile.in: Regenerate.
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index b9ee86e..e59c319 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -2851,7 +2851,21 @@ Target_powerpc<size, big_endian>::do_plt_fde_location(const Output_data* plt,
if (plt == this->glink_)
{
// See Output_data_glink::do_write() for glink contents.
- if (size == 64)
+ if (len == 0)
+ {
+ gold_assert(parameters->doing_static_link());
+ // Static linking may need stubs, to support ifunc and long
+ // branches. We need to create an output section for
+ // .eh_frame early in the link process, to have a place to
+ // attach stub .eh_frame info. We also need to have
+ // registered a CIE that matches the stub CIE. Both of
+ // these requirements are satisfied by creating an FDE and
+ // CIE for .glink, even though static linking will leave
+ // .glink zero length.
+ // ??? Hopefully generating an FDE with a zero address range
+ // won't confuse anything that consumes .eh_frame info.
+ }
+ else if (size == 64)
{
// There is one word before __glink_PLTresolve
address += 8;
@@ -2863,7 +2877,7 @@ Target_powerpc<size, big_endian>::do_plt_fde_location(const Output_data* plt,
// The first covers the branch table, the second
// __glink_PLTresolve at the end of glink.
off_t resolve_size = this->glink_->pltresolve_size;
- if (oview[9] == 0)
+ if (oview[9] == elfcpp::DW_CFA_nop)
len -= resolve_size;
else
{