initramfs: fix clang build failure
PATCH 1/2 initramfs: fix clang build failure
From: Arnd Bergmann <[email protected]>
There is only one function in init/initramfs.c that is in the .text section, and it is marked __weak. When building with clang-12 and the integrated assembler, this leads to a bug with recordmcount:
./scripts/recordmcount "init/initramfs.o"
Cannot find symbol for section 2: .text.init/initramfs.o: failed
I'm not quite sure what exactly goes wrong, but I notice that this function is only ever called from an __init function, and normally inlined. Marking it __init as well is clearly correct and it leads to recordmcount no longer complaining.
--- init/initramfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
init/initramfs.c +1 -1
@@ -535,7 +535,7 @@ extern unsigned long __initramfs_size;#include <linux/initrd.h> #include <linux/kexec.h> -void __weak free_initrd_mem (unsigned long start,unsigned long end) +void __weak __init free_initrd_mem (unsigned long start,unsigned long end) {#ifdef CONFIG_ARCH_KEEP_MEMBLOCK unsigned long aligned_start =ALIGN_DOWN (start,PAGE_SIZE );
Signature · 1 line
2.27.0
PATCH 2/2 elfcore: fix building with clang
From: Arnd Bergmann <[email protected]>
kernel/elfcore.c only contains weak symbols, which triggers a bug with clang in combination with recordmcount:
Cannot find symbol for section 2: .text.kernel/elfcore.o: failed
Move the empty stubs into linux/elfcore.h as inline functions. As only two architectures use these, just use the architecture specific Kconfig symbols to key off the declaration.
--- include/linux/elfcore.h | 22 ++++++++++++++++++++++ kernel/Makefile | 1 - kernel/elfcore.c | 26 -------------------------- 3 files changed, 22 insertions(+), 27 deletions(-) delete mode 100644 kernel/elfcore.c
include/linux/elfcore.h +22 -0
@@ -104,6 +104,7 @@ static inline int elf_core_copy_task_fpregs(struct task_struct *t, struct pt_reg#endif } +#if defined(CONFIG_UM ) || defined(CONFIG_IA64 )/* * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out * extra segments containing the gate DSO contents. Dumping its
@@ -118,5 +119,26 @@ elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset);extern int elf_core_write_extra_data (struct coredump_params *cprm);extern size_t elf_core_extra_data_size (void ); +#else +static inline Elf_Half elf_core_extra_phdrs (void ) +{ +return 0 ; +} + +static inline int elf_core_write_extra_phdrs (struct coredump_params *cprm,loff_t offset) +{ +return 1 ; +} + +static inline int elf_core_write_extra_data (struct coredump_params *cprm) +{ +return 1 ; +} + +static inline size_t elf_core_extra_data_size (void ) +{ +return 0 ; +} +#endif #endif /* _LINUX_ELFCORE_H */
kernel/Makefile +0 -1
@@ -97,7 +97,6 @@ obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o obj-$(CONFIG_TRACEPOINTS) += tracepoint.o obj-$(CONFIG_LATENCYTOP) += latencytop.o -obj-$(CONFIG_ELFCORE) += elfcore.o obj-$(CONFIG_FUNCTION_TRACER) += trace/ obj-$(CONFIG_TRACING) += trace/ obj-$(CONFIG_TRACE_CLOCK) += trace/
kernel/elfcore.c deleted +0 -26
@@ -1,26 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include <linux/elf.h> -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/binfmts.h> -#include <linux/elfcore.h> - -Elf_Half __weak elf_core_extra_phdrs (void ) -{ -return 0 ; -} - -int __weak elf_core_write_extra_phdrs (struct coredump_params *cprm,loff_t offset) -{ -return 1 ; -} - -int __weak elf_core_write_extra_data (struct coredump_params *cprm) -{ -return 1 ; -} - -size_t __weak elf_core_extra_data_size (void ) -{ -return 0 ; -}
Signature · 1 line
2.27.0
Quoted 7 lines · On Fri, 4 Dec 2020 17:57:33 +0100 Arnd Bergmann <[email protected]> wrote:
There is only one function in
init/initramfs.cthat is in the .text section, and it is marked__weak. When building with clang-12 and the integrated assembler, this leads to a bug with recordmcount:
./scripts/recordmcount"init/initramfs.o"
Cannot find symbol for section 2: .text.init/initramfs.o: failed
That looks like recordmcount is being silly?
Quoted 4 lines
I'm not quite sure what exactly goes wrong, but I notice that this function is only ever called from an
__initfunction, and normally inlined. Marking it__initas well is clearly correct and it leads to recordmcount no longer complaining.
That works, too.