* powerpc.cc (Target_powerpc::symval_for_branch): Don't assert
authorAlan Modra <amodra@gmail.com>
Thu, 27 Jun 2013 03:11:22 +0000 (03:11 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 27 Jun 2013 03:11:22 +0000 (03:11 +0000)
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.

gold/ChangeLog
gold/powerpc.cc

index 07fe276..874a20a 100644 (file)
@@ -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
index ca4aaa2..747c7b4 100644 (file)
@@ -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))
     {