Fix segmentation fault in bfd/elf32-hppa.c

Message ID ZXiWmK19GVwZBsIX@mx3210.localdomain
State Accepted
Headers
Series Fix segmentation fault in bfd/elf32-hppa.c |

Checks

Context Check Description
snail/binutils-gdb-check success Github commit url

Commit Message

John David Anglin Dec. 12, 2023, 5:21 p.m. UTC
  Tested on hppa-unknown-linux-gnu with no regressions.

Okay?

Dave
---

Fix segmentation fault in bfd/elf32-hppa.c

2023-12-12  John David Anglin  <danglin@gcc.gnu.org>

	PR ld/31148

bfd/ChangeLog:

	* elf32-hppa.c (elf32_hppa_finish_dynamic_symbol): Don't output
	relative reloc if eh->root.type is bfd_link_hash_undefined.
  

Comments

Alan Modra Dec. 13, 2023, 12:01 a.m. UTC | #1
On Tue, Dec 12, 2023 at 05:21:28PM +0000, John David Anglin wrote:
> diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
> index 44129c80138..131f6806aa7 100644
> --- a/bfd/elf32-hppa.c
> +++ b/bfd/elf32-hppa.c
> @@ -4216,7 +4216,7 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
>  	     file, we just want to emit a RELATIVE reloc.  The entry
>  	     in the global offset table will already have been
>  	     initialized in the relocate_section function.  */
> -	  if (!is_dyn)
> +	  if (!is_dyn && eh->root.type != bfd_link_hash_undefined)
>  	    {
>  	      rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
>  	      rela.r_addend = (eh->root.u.def.value

Since the code uses u.def here, it is better IMO to test explicitly
for either bfd_link_hash_defined or bfd_link_hash_defweak.  I'm left
wondering whether there isn't some case where we get here with an
undefweak (or common, or new, or..) symbol.
  
John David Anglin Dec. 15, 2023, 9:13 p.m. UTC | #2
After retesting, I committed the following change.  Hopefully, there aren't
other types that need handling.

Dave
---

Fix segmentation fault in bfd/elf32-hppa.c

2023-12-15  John David Anglin  <danglin@gcc.gnu.org>

     PR ld/31148

bfd/ChangeLog:

     * elf32-hppa.c (elf32_hppa_finish_dynamic_symbol): Output
     relative reloc only when eh->root.type is bfd_link_hash_defined
     or bfd_link_hash_defweak.

diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 44129c80138..d64ca7528a0 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -4216,7 +4216,9 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
           file, we just want to emit a RELATIVE reloc.  The entry
           in the global offset table will already have been
           initialized in the relocate_section function.  */
-      if (!is_dyn)
+      if (!is_dyn
+          && (eh->root.type == bfd_link_hash_defined
+          || eh->root.type == bfd_link_hash_defweak))
          {
            rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
            rela.r_addend = (eh->root.u.def.value
  

Patch

diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 44129c80138..131f6806aa7 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -4216,7 +4216,7 @@  elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
 	     file, we just want to emit a RELATIVE reloc.  The entry
 	     in the global offset table will already have been
 	     initialized in the relocate_section function.  */
-	  if (!is_dyn)
+	  if (!is_dyn && eh->root.type != bfd_link_hash_undefined)
 	    {
 	      rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
 	      rela.r_addend = (eh->root.u.def.value