mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-23 13:21:43 +08:00
* 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.
This commit is contained in:
parent
02b1871e58
commit
a2d7bf59d6
@ -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
|
||||
|
@ -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))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user