[build fail] v6.11-rc2 from "ARM: 9404/1: arm32: enable HAVE_LD_DEAD_CODE_DATA_ELIMINATION"
liuyuntao (F)
liuyuntao12 at huawei.com
Thu Aug 8 01:43:44 PDT 2024
On 2024/8/7 23:48, Harith George wrote:
>
>
> On 07-08-2024 21:11, Arnd Bergmann wrote:
>> On Wed, Aug 7, 2024, at 17:36, Harith George wrote:
>>> On 07-08-2024 20:52, liuyuntao (F) wrote:
>>>> Thanks, I reproduce the link error with toolchain
>>>> gcc version 9.3.0
>>>> GNU ld (GNU Binutils) 2.33.1
>>>>
>>>> with same gcc version, just upgrading ld version to 2.36.1, it does not
>>>> segfault and build completes. there should be bugs in low version of
>>>> ld,
>>>> and the ".reloc .text, R_ARM_NONE, ." triggers that.
>>>>
>>> Thanks for confirming.
>>>
>>> I guess we need to add something like
>>> #if !CONFIG_CC_IS_GCC || CONFIG_LD_VERSION >= 23600
>>> around the entry-armv.S changes and maybe select
>>> HAVE_LD_DEAD_CODE_DATA_ELIMINATION in arch/arm/Kconfig only if the same
>>> conditions are met ??
>>
>> I think it makes most sense to have a minimum LD
>> version as a dependency for HAVE_LD_DEAD_CODE_DATA_ELIMINATION.
>> Are you sure that 2.36 is the first one that works, and it's
>> not just 2.33 specifically that is broken?
>>
>> If so, we could use
>>
>> --- a/arch/arm/Kconfig
>> +++ b/arch/arm/Kconfig
>> @@ -117,7 +117,7 @@ config ARM
>> select HAVE_KERNEL_XZ
>> select HAVE_KPROBES if !XIP_KERNEL && !CPU_ENDIAN_BE32 &&
>> !CPU_V7M && !CPU_32v3
>> select HAVE_KRETPROBES if HAVE_KPROBES
>> - select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
>> + select HAVE_LD_DEAD_CODE_DATA_ELIMINATION if (LD_VERSION >=
>> 23600 || LD_IS_LLD)
>> select HAVE_MOD_ARCH_SPECIFIC
>> select HAVE_NMI
>> select HAVE_OPTPROBES if !THUMB2_KERNEL
>>
> The select alone may not be enough. Wont the changes in
> arch/arm/kernel/entry-armv.S still result in LD Segfaults even if the
> HAVE_LD_DEAD_CODE_DATA_ELIMINATION flag is not set in .config for older
> toolchains?
>
Yes, that is it.
apply this patch, it should sovle the build issue with older version GUN ld.
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 54b2bb817a7f..173159e93c99 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -117,7 +117,7 @@ config ARM
select HAVE_KERNEL_XZ
select HAVE_KPROBES if !XIP_KERNEL && !CPU_ENDIAN_BE32 && !CPU_V7M
select HAVE_KRETPROBES if HAVE_KPROBES
- select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
+ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION if (LD_VERSION >= 23600 ||
LD_IS_LLD)
select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI
select HAVE_OPTPROBES if !THUMB2_KERNEL
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
index f01d23a220e6..cd443faf8645 100644
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -29,6 +29,12 @@
#include "entry-header.S"
#include <asm/probes.h>
+#ifdef CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION
+#define RELOC_TEXT_NONE (.reloc .text, R_ARM_NONE, .)
+#else
+#define RELOC_TEXT_NONE
+#endif
+
/*
* Interrupt handling.
*/
@@ -1065,7 +1071,7 @@ vector_addrexcptn:
.globl vector_fiq
.section .vectors, "ax", %progbits
- .reloc .text, R_ARM_NONE, .
+ RELOC_TEXT_NONE
W(b) vector_rst
W(b) vector_und
ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_swi )
@@ -1079,7 +1085,7 @@ THUMB( .reloc ., R_ARM_THM_PC12, .L__vector_swi )
#ifdef CONFIG_HARDEN_BRANCH_HISTORY
.section .vectors.bhb.loop8, "ax", %progbits
- .reloc .text, R_ARM_NONE, .
+ RELOC_TEXT_NONE
W(b) vector_rst
W(b) vector_bhb_loop8_und
ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_bhb_loop8_swi )
@@ -1092,7 +1098,7 @@ THUMB( .reloc ., R_ARM_THM_PC12,
.L__vector_bhb_loop8_swi )
W(b) vector_bhb_loop8_fiq
.section .vectors.bhb.bpiall, "ax", %progbits
- .reloc .text, R_ARM_NONE, .
+ RELOC_TEXT_NONE
W(b) vector_rst
W(b) vector_bhb_bpiall_und
ARM( .reloc ., R_ARM_LDR_PC_G0, .L__vector_bhb_bpiall_swi )
> Thanks,
> Warm Regards,
> Harith
>>
>> binutils only takes a few seconds to build from source, so
>> you could just try all version from 2.25 (the oldest supported)
>> to 2.36) to see which ones work.
>>
>> Arnd
>
More information about the linux-arm-kernel
mailing list