diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-09-01 14:51:58 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-09-01 14:51:58 -0700 |
commit | 4f501a245f67d0b43f245b09515c87bfeec983ec (patch) | |
tree | 640bd84069dbeddffb62a05436d26692808c0774 /bfd/elfxx-x86.c | |
parent | eeb2f20a764bee3a6a1edb9872467d044aaad848 (diff) | |
download | gdb-4f501a245f67d0b43f245b09515c87bfeec983ec.zip gdb-4f501a245f67d0b43f245b09515c87bfeec983ec.tar.gz gdb-4f501a245f67d0b43f245b09515c87bfeec983ec.tar.bz2 |
x86: Add _bfd_x86_elf_gc_mark_hook
Since R_X86_64_GNU_VTINHERIT == R_386_GNU_VTINHERIT and
R_X86_64_GNU_VTENTRY == R_386_GNU_VTENTRY, we can share
_bfd_x86_elf_gc_mark_hook in elf32-i386.c and elf64-x86-64.c.
* elf32-i386.c (elf_i386_gc_mark_hook): Removed.
(elf_backend_gc_mark_hook): Likewise.
* elf64-x86-64.c (elf_x86_64_gc_mark_hook): Likewise.
(elf_backend_gc_mark_hook): Likewise.
* elfxx-x86.c (_bfd_x86_elf_gc_mark_hook): New function.
* elfxx-x86.h (_bfd_x86_elf_gc_mark_hook): New.
(elf_backend_gc_mark_hook): Likewise.
Diffstat (limited to 'bfd/elfxx-x86.c')
-rw-r--r-- | bfd/elfxx-x86.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index cb5f614..50d945e 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -744,6 +744,34 @@ _bfd_x86_elf_adjust_dynamic_symbol (struct bfd_link_info *info, return _bfd_elf_adjust_dynamic_copy (info, h, s); } +/* Return the section that should be marked against GC for a given + relocation. */ + +asection * +_bfd_x86_elf_gc_mark_hook (asection *sec, + struct bfd_link_info *info, + Elf_Internal_Rela *rel, + struct elf_link_hash_entry *h, + Elf_Internal_Sym *sym) +{ + /* Compiler should optimize this out. */ + if (((unsigned int) R_X86_64_GNU_VTINHERIT + != (unsigned int) R_386_GNU_VTINHERIT) + || ((unsigned int) R_X86_64_GNU_VTENTRY + != (unsigned int) R_386_GNU_VTENTRY)) + abort (); + + if (h != NULL) + switch (ELF32_R_TYPE (rel->r_info)) + { + case R_X86_64_GNU_VTINHERIT: + case R_X86_64_GNU_VTENTRY: + return NULL; + } + + return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); +} + static bfd_vma elf_i386_get_plt_got_vma (struct elf_x86_plt *plt_p ATTRIBUTE_UNUSED, bfd_vma off, |