diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-10-14 11:09:29 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-10-14 11:09:44 -0700 |
commit | e01c16a83893b03433c8edf4ccae536d9b9f4831 (patch) | |
tree | d48c22fe5df5159d0f43418b970aa94df38db7a5 /bfd | |
parent | 6ee6e05af482b356f9be4b0db877802fb47b2a12 (diff) | |
download | gdb-e01c16a83893b03433c8edf4ccae536d9b9f4831.zip gdb-e01c16a83893b03433c8edf4ccae536d9b9f4831.tar.gz gdb-e01c16a83893b03433c8edf4ccae536d9b9f4831.tar.bz2 |
cris: Check UNDEFWEAK_NO_DYNAMIC_RELOC
Don't generate dynamic relocation against weak undefined symbol if it
is resolved to zero. FIXME: UNDEFWEAK_NO_DYNAMIC_RELOC may need to be
checked in more places.
bfd/
PR ld/22269
* elf32-cris.c (cris_elf_relocate_section): Don't generate
dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
(cris_elf_check_relocs): Don't allocate dynamic relocation
if UNDEFWEAK_NO_DYNAMIC_RELOC is true.
ld/
PR ld/22269
* testsuite/ld-cris/weakhiddso.d: Update and remove R_CRIS_NONE.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-cris.c | 8 |
2 files changed, 15 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fc1d0f5..9a124bd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,14 @@ 2017-10-14 H.J. Lu <hongjiu.lu@intel.com> PR ld/22269 + * elf32-cris.c (cris_elf_relocate_section): Don't generate + dynamic relocation if UNDEFWEAK_NO_DYNAMIC_RELOC is true. + (cris_elf_check_relocs): Don't allocate dynamic relocation + if UNDEFWEAK_NO_DYNAMIC_RELOC is true. + +2017-10-14 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/22269 * elf32-sh.c (allocate_dynrelocs): Discard dynamic relocations if UNDEFWEAK_NO_DYNAMIC_RELOC is true. (sh_elf_relocate_section): Don't generate dynamic relocation if diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index a4dc86f..4c80d00 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -1018,6 +1018,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, bfd_reloc_status_type r; const char *symname = NULL; enum elf_cris_reloc_type r_type; + bfd_boolean resolved_to_zero; r_type = ELF32_R_TYPE (rel->r_info); @@ -1130,6 +1131,9 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, if (bfd_link_relocatable (info)) continue; + resolved_to_zero = (h != NULL + && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); + switch (r_type) { case R_CRIS_16_GOTPLT: @@ -1432,6 +1436,7 @@ cris_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, case R_CRIS_16: case R_CRIS_32: if (bfd_link_pic (info) + && !resolved_to_zero && r_symndx != STN_UNDEF && (input_section->flags & SEC_ALLOC) != 0 && ((r_type != R_CRIS_8_PCREL @@ -3540,7 +3545,8 @@ cris_elf_check_relocs (bfd *abfd, render the symbol local. */ /* No need to do anything if we're not creating a shared object. */ - if (! bfd_link_pic (info)) + if (! bfd_link_pic (info) + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) break; /* We may need to create a reloc section in the dynobj and made room |