summaryrefslogtreecommitdiff
path: root/gold/x86_64.cc
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2012-09-12 22:43:54 +0000
committerAlan Modra <amodra@gmail.com>2012-09-12 22:43:54 +0000
commitbfdfa4cd8da8b878613e3ee98c8268f8aa72983c (patch)
tree2ee2b0b7b57dafee8585b56c562cef597f3b8266 /gold/x86_64.cc
parent7c0e90d28c56dd5e0003c921d15aded77c9a639d (diff)
downloadbinutils-gdb-bfdfa4cd8da8b878613e3ee98c8268f8aa72983c.tar.gz
* 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.
Diffstat (limited to 'gold/x86_64.cc')
-rw-r--r--gold/x86_64.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 1712beb2177..5914160b2ad 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -676,7 +676,8 @@ class Target_x86_64 : public Sized_target<size, false>
unsigned int data_shndx,
Output_section* output_section,
const elfcpp::Rela<size, false>& reloc, unsigned int r_type,
- const elfcpp::Sym<size, false>& lsym);
+ const elfcpp::Sym<size, false>& lsym,
+ bool is_discarded);
inline void
global(Symbol_table* symtab, Layout* layout, Target_x86_64* target,
@@ -2270,8 +2271,12 @@ Target_x86_64<size>::Scan::local(Symbol_table* symtab,
Output_section* output_section,
const elfcpp::Rela<size, false>& reloc,
unsigned int r_type,
- const elfcpp::Sym<size, false>& lsym)
+ const elfcpp::Sym<size, false>& lsym,
+ bool is_discarded)
{
+ if (is_discarded)
+ return;
+
// A local STT_GNU_IFUNC symbol may require a PLT entry.
bool is_ifunc = lsym.get_st_type() == elfcpp::STT_GNU_IFUNC;
if (is_ifunc && this->reloc_needs_plt_for_ifunc(object, r_type))