diff options
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-cris.c | 8 | ||||
-rw-r--r-- | ld/ChangeLog | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-cris/weakhiddso.d | 18 |
4 files changed, 28 insertions, 11 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 diff --git a/ld/ChangeLog b/ld/ChangeLog index 47cc5a8..6e7e58d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2017-10-14 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/22269 + * testsuite/ld-cris/weakhiddso.d: Update and remove R_CRIS_NONE. + 2017-10-13 Alan Modra <amodra@gmail.com> PR ld/22263 diff --git a/ld/testsuite/ld-cris/weakhiddso.d b/ld/testsuite/ld-cris/weakhiddso.d index 71a4bdb..c9c793e 100644 --- a/ld/testsuite/ld-cris/weakhiddso.d +++ b/ld/testsuite/ld-cris/weakhiddso.d @@ -4,28 +4,26 @@ #objdump: -s -R -T # Check that .weak and .weak .hidden object references are handled -# correctly when generating a DSO. For now, we have to live with the -# R_CRIS_NONE entry. +# correctly when generating a DSO. .*: file format elf32-cris DYNAMIC SYMBOL TABLE: -0+2214 l d \.data 0+ \.data -0+2214 g DO \.data 0+c x +0+2208 l d \.data 0+ \.data +0+2208 g DO \.data 0+c x 0+ D \*UND\* 0+ xregobj -0+2220 g D \.data 0+ __bss_start +0+2214 g D \.data 0+ __bss_start 0+ w D \*UND\* 0+ xweakobj -0+2220 g D \.data 0+ _edata +0+2214 g D \.data 0+ _edata 0+2220 g D \.data 0+ _end DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE -0+ R_CRIS_NONE \*ABS\* -0+2218 R_CRIS_32 xweakobj -0+221c R_CRIS_32 xregobj +0+220c R_CRIS_32 xweakobj +0+2210 R_CRIS_32 xregobj Contents of section \.hash: #... Contents of section \.data: - 2214 00000000 00000000 00000000 .* + 2208 00000000 00000000 00000000 .* |