[PATCH] arm: Handle undefweak with ST_BRANCH_UNKNOWN

Christophe Lyon christophe.lyon@linaro.org
Fri Sep 6 17:21:02 GMT 2024


A previous patch made ld fail early on Thumb-only where branch_type is
ST_BRANCH_UNKNOWN.

However, this fails erroneously when the target is undefweak: in that
case the branch should be replaced by a branch to the next instruction
(or nop.w on thumb2).  This patch accepts this case and restores the
previous behaviour in such cases.

This was reported by failures in the GCC testsuite, where we fail to
link executables because __deregister_frame_info is undefweak:

(__deregister_frame_info): Unknown destination type (ARM/Thumb) in ...crtbegin.o
crtbegin.o: in function `__do_global_dtors_aux':
crtstuff.c:(.text+0x52): dangerous relocation: unsupported relocation
---
 bfd/elf32-arm.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 7441ee2cc38..17df8b30eb6 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -10512,7 +10512,12 @@ elf32_arm_final_link_relocate (reloc_howto_type *	    howto,
   if (using_thumb_only (globals)
       && (r_type == R_ARM_THM_CALL
 	  || r_type == R_ARM_THM_JUMP24)
-      && branch_type == ST_BRANCH_UNKNOWN)
+      && branch_type == ST_BRANCH_UNKNOWN
+      /* Exception to the rule above: a branch to an undefined weak
+	 symbol is turned into a jump to the next instruction unless a
+	 PLT entry will be created (see below).  */
+      && !(h && h->root.type == bfd_link_hash_undefweak
+	   && plt_offset == (bfd_vma) -1))
     {
       if (sym_sec != NULL
 	  && sym_sec->owner != NULL)
-- 
2.34.1



More information about the Binutils mailing list