aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-10-14 11:09:29 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-10-14 11:09:44 -0700
commite01c16a83893b03433c8edf4ccae536d9b9f4831 (patch)
treed48c22fe5df5159d0f43418b970aa94df38db7a5 /bfd
parent6ee6e05af482b356f9be4b0db877802fb47b2a12 (diff)
downloadgdb-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/ChangeLog8
-rw-r--r--bfd/elf32-cris.c8
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