* target-reloc.h (scan_relocs): Call scan.local for relocs
against symbols in discarded sections. Pass is_discarded param. * arm.cc, * i386.cc, * sparc.cc, * x86_64.cc (Target_*::Scan::local): Add is_discarded param. * powerpc (Target_powerpc::Scan::local): Likewise. Use is_discarded to flag opd entry as discarded. Don't emit dyn relocs on such entries. (Target_powerpc::Scan::global): Similarly detect and handle such opd entries. (Powerpc_relobj): Replace opd_ent_shndx_ and opd_ent_off_ with opd_ent_. Update all uses. (Powerpc_relobj::get_opd_discard, set_opd_discard): New functions. (Target_powerpc::relocate_section): Zero out discarded opd entry relocs.
This commit is contained in:
parent
7c0e90d28c
commit
bfdfa4cd8d
7 changed files with 209 additions and 78 deletions
|
@ -237,7 +237,8 @@ class Target_sparc : public Sized_target<size, big_endian>
|
|||
unsigned int data_shndx,
|
||||
Output_section* output_section,
|
||||
const elfcpp::Rela<size, big_endian>& reloc, unsigned int r_type,
|
||||
const elfcpp::Sym<size, big_endian>& lsym);
|
||||
const elfcpp::Sym<size, big_endian>& lsym,
|
||||
bool is_discarded);
|
||||
|
||||
inline void
|
||||
global(Symbol_table* symtab, Layout* layout, Target_sparc* target,
|
||||
|
@ -2240,8 +2241,12 @@ Target_sparc<size, big_endian>::Scan::local(
|
|||
Output_section* output_section,
|
||||
const elfcpp::Rela<size, big_endian>& reloc,
|
||||
unsigned int r_type,
|
||||
const elfcpp::Sym<size, big_endian>& lsym)
|
||||
const elfcpp::Sym<size, big_endian>& lsym,
|
||||
bool is_discarded)
|
||||
{
|
||||
if (is_discarded)
|
||||
return;
|
||||
|
||||
bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
|
||||
unsigned int orig_r_type = r_type;
|
||||
r_type &= 0xff;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue