This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 00/12] Check UNDEFWEAK_NO_DYNAMIC_RELOC for weak undefined symbol


On 10/12/17, Hans-Peter Nilsson <hp@bitrange.com> wrote:
> On Thu, 12 Oct 2017, H.J. Lu wrote:
>> Don't generate dynamic relocation against weak undefined symbol if it
>> is resolved to zero.
>>
>> H.J. Lu (12):
>>   Move UNDEFWEAK_NO_DYNAMIC_RELOC to elf-bfd.h
>>   aarch64: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   tile: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   arm: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   mips: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   ia64: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   hppa: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   m68k: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   microblaze: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   nios2: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   s390: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>>   sh: Check UNDEFWEAK_NO_DYNAMIC_RELOC
>
> Looks like this would be the cure for the new FAILs
> FAIL: PR ld/22269
> FAIL: PR ld/22269 (-z dynamic-undefined-weak)
>
> that I see for cris-linux with that test-case you added.
> Could you please do the same for elf32-cris.c?
> Thanks.

Here it is.


-- 
H.J.
From 7374397a960bb212fdd09b8ba2fa33d251d6a221 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 12 Oct 2017 16:52:01 -0700
Subject: [PATCH] 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.
---
 bfd/elf32-cris.c                  |  8 +++++++-
 ld/testsuite/ld-cris/weakhiddso.d | 18 ++++++++----------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
index a4dc86fc9c..4c80d002cc 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/testsuite/ld-cris/weakhiddso.d b/ld/testsuite/ld-cris/weakhiddso.d
index 71a4bdb7b4..c9c793e860 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           .*
-- 
2.13.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]