[PATCH v2] LoongArch: Fix the infinite loop caused by calling undefweak symbol
mengqinggang
mengqinggang@loongson.cn
Wed Nov 20 02:22:41 GMT 2024
在 2024/11/20 上午9:53, Xi Ruoyao 写道:
> On Wed, 2024-11-20 at 09:28 +0800, Lulu Cai wrote:
>> The undefweak symbol value of non-default visibility is 0 and does
>> not use plt entry, and will not be relocated in the relocate_secion
>> function. As a result, an infinite loop is generated because
>> bl %plt(sym) => bl 0.
>>
>> Fix this by converting the bl/call36 instructions to nop or removing
>> them.
> IMO it's better to convert it to "jirl $ra, $zero, 0". Semantically an
> undefined weak symbol should be resolved to address 0 so we should make
> a call to address 0, instead of silently ignore the call.
>
> Also "b %plt(sym)" should be turned to "jirl $zero, $zero, 0" as well
> when sym is non-default visibility and weak undefined.
AArch64 optimizes calls to undefined weak symbols to a NOP. It maybe a
better choice.
In bfd/elfnn-aarch64.c:
6046 /* A call to an undefined weak symbol is converted to a
jump to
6047 the next instruction unless a PLT entry will be created.
6048 The jump to the next instruction is optimized as a NOP.
6049 Do the same for local undefined symbols. */
6050 if (weak_undef_p && ! via_plt_p)
6051 {
6052 bfd_putl32 (INSN_NOP, hit_data);
6053 return bfd_reloc_ok;
6054 }
More information about the Binutils
mailing list