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.
This commit is contained in:
H.J. Lu 2017-10-14 11:09:29 -07:00
parent 6ee6e05af4
commit e01c16a838
4 changed files with 28 additions and 11 deletions

View File

@ -1,3 +1,11 @@
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

View File

@ -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

View File

@ -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

View File

@ -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 .*