2017-06-20 Eric Christopher <echristo@gmail.com>
* aarch64.cc (scan_reloc_for_stub): Use plt_address_for_global to calculate the symbol value. (scan_reloc_section_for_stubs): Allow stubs to be created for section symbols. (maybe_apply_stub): Handle creating stubs for weak symbols to match the code in scan_reloc_for_stub.
This commit is contained in:
parent
a206891ad1
commit
69431babfb
2 changed files with 18 additions and 12 deletions
|
@ -1,3 +1,12 @@
|
|||
2017-06-20 Eric Christopher <echristo@gmail.com>
|
||||
|
||||
* aarch64.cc (scan_reloc_for_stub): Use plt_address_for_global to
|
||||
calculate the symbol value.
|
||||
(scan_reloc_section_for_stubs): Allow stubs to be created for
|
||||
section symbols.
|
||||
(maybe_apply_stub): Handle creating stubs for weak symbols to
|
||||
match the code in scan_reloc_for_stub.
|
||||
|
||||
2017-06-20 James Clarke <jrtc27@jrtc27.com>
|
||||
|
||||
* powerpc.cc (Stub_table::define_stub_syms): Always include object's
|
||||
|
|
|
@ -3768,8 +3768,7 @@ Target_aarch64<size, big_endian>::scan_reloc_for_stub(
|
|||
if (gsym->use_plt_offset(arp->reference_flags()))
|
||||
{
|
||||
// This uses a PLT, change the symbol value.
|
||||
symval.set_output_value(this->plt_section()->address()
|
||||
+ gsym->plt_offset());
|
||||
symval.set_output_value(this->plt_address_for_global(gsym));
|
||||
psymval = &symval;
|
||||
}
|
||||
else if (gsym->is_undefined())
|
||||
|
@ -4002,11 +4001,6 @@ Target_aarch64<size, big_endian>::scan_reloc_section_for_stubs(
|
|||
psymval = &symval2;
|
||||
}
|
||||
|
||||
// If symbol is a section symbol, we don't know the actual type of
|
||||
// destination. Give up.
|
||||
if (psymval->is_section_symbol())
|
||||
continue;
|
||||
|
||||
this->scan_reloc_for_stub(relinfo, r_type, sym, r_sym, psymval,
|
||||
addend, view_address + offset);
|
||||
} // End of iterating relocs in a section
|
||||
|
@ -5438,8 +5432,14 @@ maybe_apply_stub(unsigned int r_type,
|
|||
|
||||
const The_aarch64_relobj* aarch64_relobj =
|
||||
static_cast<const The_aarch64_relobj*>(object);
|
||||
// We don't create stubs for undefined symbols so don't look for one.
|
||||
if (gsym && gsym->is_undefined())
|
||||
const AArch64_reloc_property* arp =
|
||||
aarch64_reloc_property_table->get_reloc_property(r_type);
|
||||
gold_assert(arp != NULL);
|
||||
|
||||
// We don't create stubs for undefined symbols, but do for weak.
|
||||
if (gsym
|
||||
&& !gsym->use_plt_offset(arp->reference_flags())
|
||||
&& gsym->is_undefined())
|
||||
{
|
||||
gold_debug(DEBUG_TARGET,
|
||||
"stub: looking for a stub for undefined symbol %s in file %s",
|
||||
|
@ -5458,9 +5458,6 @@ maybe_apply_stub(unsigned int r_type,
|
|||
Address new_branch_target = stub_table->address() + stub->offset();
|
||||
typename elfcpp::Swap<size, big_endian>::Valtype branch_offset =
|
||||
new_branch_target - address;
|
||||
const AArch64_reloc_property* arp =
|
||||
aarch64_reloc_property_table->get_reloc_property(r_type);
|
||||
gold_assert(arp != NULL);
|
||||
typename This::Status status = This::template
|
||||
rela_general<32>(view, branch_offset, 0, arp);
|
||||
if (status != This::STATUS_OKAY)
|
||||
|
|
Loading…
Add table
Reference in a new issue