summaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2013-06-27 03:11:21 +0000
committerAlan Modra <amodra@bigpond.net.au>2013-06-27 03:11:21 +0000
commitf4bbdca046b8b1fb24b900858fa146dabae85dcb (patch)
tree165677ec3877c0b6a1fc06873d55bc39bec6a3b3 /gold
parentd2cf65f61fad8ee0c9d3822d660e2b994fe80777 (diff)
downloadbinutils-redhat-f4bbdca046b8b1fb24b900858fa146dabae85dcb.tar.gz
* powerpc.cc (Target_powerpc::symval_for_branch): Don't assert
on garbage collected .opd section. * powerpc.cc (Target_powerpc::do_gc_add_reference): Test dst_shndx is non-zero. (Target_powerpc::do_gc_mark_symbols): Likewise for sym->shndx(). (Target_powerpc::do_function_location): Likewise for loc->shndx.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog12
-rw-r--r--gold/powerpc.cc9
2 files changed, 17 insertions, 4 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 07fe2765fd..874a20af00 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,15 @@
+2013-06-27 Cary Coutant <ccoutant@google.com>
+
+ * powerpc.cc (Target_powerpc::symval_for_branch): Don't assert
+ on garbage collected .opd section.
+
+2013-06-27 Alan Modra <amodra@gmail.com>
+
+ * powerpc.cc (Target_powerpc::do_gc_add_reference): Test dst_shndx
+ is non-zero.
+ (Target_powerpc::do_gc_mark_symbols): Likewise for sym->shndx().
+ (Target_powerpc::do_function_location): Likewise for loc->shndx.
+
2013-06-14 Cary Coutant <ccoutant@google.com>
* resolve.cc (Symbol::override_base): Don't override st_type
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index ca4aaa2a78..747c7b4c02 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -5827,7 +5827,7 @@ Target_powerpc<size, big_endian>::do_gc_add_reference(
Powerpc_relobj<size, big_endian>* ppc_object
= static_cast<Powerpc_relobj<size, big_endian>*>(dst_obj);
- if (dst_shndx == ppc_object->opd_shndx())
+ if (dst_shndx != 0 && dst_shndx == ppc_object->opd_shndx())
{
if (ppc_object->opd_valid())
{
@@ -5859,7 +5859,7 @@ Target_powerpc<size, big_endian>::do_gc_mark_symbol(
= static_cast<Powerpc_relobj<size, big_endian>*>(sym->object());
bool is_ordinary;
unsigned int shndx = sym->shndx(&is_ordinary);
- if (is_ordinary && shndx == ppc_object->opd_shndx())
+ if (is_ordinary && shndx != 0 && shndx == ppc_object->opd_shndx())
{
Sized_symbol<size>* gsym = symtab->get_sized_symbol<size>(sym);
Address dst_off = gsym->value();
@@ -5882,7 +5882,7 @@ void
Target_powerpc<size, big_endian>::do_function_location(
Symbol_location* loc) const
{
- if (size == 64)
+ if (size == 64 && loc->shndx != 0)
{
if (loc->object->is_dynamic())
{
@@ -6183,7 +6183,8 @@ Target_powerpc<size, big_endian>::symval_for_branch(
if (shndx == 0)
return value;
Address opd_addr = symobj->get_output_section_offset(shndx);
- gold_assert(opd_addr != invalid_address);
+ if (opd_addr == invalid_address)
+ return value;
opd_addr += symobj->output_section(shndx)->address();
if (value >= opd_addr && value < opd_addr + symobj->section_size(shndx))
{