Re: [PATCH] ARM: Emit __gnu_mcount_nc when using Clang 10.0.0 or newer
From: Stefan Agner <stefan@agner.ch>
Date: 2019-08-29 20:21:30
Also in:
lkml
On 2019-08-29 21:34, Nathan Chancellor wrote:
On Thu, Aug 29, 2019 at 10:55:28AM -0700, Nick Desaulniers wrote:quoted
On Wed, Aug 28, 2019 at 11:27 PM Nathan Chancellor [off-list ref] wrote:quoted
Currently, multi_v7_defconfig + CONFIG_FUNCTION_TRACER fails to build with clang: arm-linux-gnueabi-ld: kernel/softirq.o: in function `_local_bh_enable': softirq.c:(.text+0x504): undefined reference to `mcount' arm-linux-gnueabi-ld: kernel/softirq.o: in function `__local_bh_enable_ip': softirq.c:(.text+0x58c): undefined reference to `mcount' arm-linux-gnueabi-ld: kernel/softirq.o: in function `do_softirq': softirq.c:(.text+0x6c8): undefined reference to `mcount' arm-linux-gnueabi-ld: kernel/softirq.o: in function `irq_enter': softirq.c:(.text+0x75c): undefined reference to `mcount' arm-linux-gnueabi-ld: kernel/softirq.o: in function `irq_exit': softirq.c:(.text+0x840): undefined reference to `mcount' arm-linux-gnueabi-ld: kernel/softirq.o:softirq.c:(.text+0xa50): more undefined references to `mcount' follow clang can emit a working mcount symbol, __gnu_mcount_nc, when '-meabi gnu' is passed to it. Until r369147 in LLVM, this was broken and caused the kernel not to boot because the calling convention was not correct. Now that it is fixed, add this to the command line when clang is 10.0.0 or newer so everything works properly. Link: https://github.com/ClangBuiltLinux/linux/issues/35 Link: https://bugs.llvm.org/show_bug.cgi?id=33845 Link: https://github.com/llvm/llvm-project/commit/16fa8b09702378bacfa3d07081afe6b353b99e60 Signed-off-by: Nathan Chancellor <redacted> --- arch/arm/Makefile | 6 ++++++ 1 file changed, 6 insertions(+)diff --git a/arch/arm/Makefile b/arch/arm/Makefile index c3624ca6c0bc..7b5a26a866fc 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile@@ -112,6 +112,12 @@ ifeq ($(CONFIG_ARM_UNWIND),y) CFLAGS_ABI +=-funwind-tables endif +ifeq ($(CONFIG_CC_IS_CLANG),y) +ifeq ($(shell test $(CONFIG_CLANG_VERSION) -ge 100000; echo $$?),0) +CFLAGS_ABI +=-meabi gnu +endif +endif +Thanks for the patch! I think this is one of the final issues w/ 32b ARM configs when building w/ Clang. I'm not super enthused about the version check. The flag is indeed not recognized by GCC, but I think it would actually be more concise with $(cc-option) and no compiler or version check. Further, I think that the working __gnu_mcount_nc in Clang would better be represented as marking the arch/arm/KConfig option for CONFIG_FUNCTION_TRACER for dependent on a version of Clang greater than or equal to Clang 10, not conditionally adding this flag. (We should always add the flag when supported, IMO. __gnu_mcount_nc's calling convention being broken is orthogonal to the choice of __gnu_mcount_nc vs mcount, and it's the former's that should be checked, not the latter as in this patch.I will test with or without CONFIG_AEABI like Matthias asked and I will implement your Kconfig suggestion if it passes all of my tests. The reason that I did it this way is because I didn't want a user to end up with a non-booting kernel since -meabi gnu works with older versions of clang at build time, the issue happens at boot time but the Kconfig suggestion + cc-option should fix that.
I agree with Nathan here, I'd rather prefer the build system to fail building rather than runtime error. If we decide we want to have it building despite it not building a functional kernel, we should at least add a #warning... -- Stefan
I should have a v2 out this evening. Cheers, Nathan
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel