[PATCH] arm: Handle undefweak with ST_BRANCH_UNKNOWN

Richard Earnshaw (lists) Richard.Earnshaw@arm.com
Tue Sep 10 12:49:08 GMT 2024


On 06/09/2024 18:21, Christophe Lyon wrote:
> 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)

Did you look at the other case in elf32_arm_get_plt_info where we handle (I think) i-realtive relocs?  It might be that these must never be weak, but this is not really my area of expertise.  It might be worth a comment here if they don't need to be covered.  CCing Richard Sandiford as he did the original i-relative support for Arm (though some time ago now).

A testcase would also be useful, so that we don't need to run GCC to find validate this.

R.


More information about the Binutils mailing list