Compiling kernel-3.4.xxx with gcc-9.x. Need some help.
Hi I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi) I am currently using buildroot-2016 and gcc-5.5 for building the kernel and every other package needed. Now the requirement is to move to the latest version of gcc-9.x, so that we can have glibc++ provided by the gcc-9.1 toolchain. Main problem for moving to later versions of buildroot is the kernel 3.4 which we couldn't to work with gcc-6 a few years ago _but_ now the gcc-9.1 requirement is mandatory so now have to look into compiling linux-3.4 with gcc-9.1 or above. Now I need some help. -- Is it realistic to expect 3.4 kernel compiling and boot successfully with gcc-9.1? -- Secondly, till now I am able to compile until the point when its going to generate the vmlinuz image, it failed with error at LD stage: arm-none-linux-gnueabihf-ld: no machine record defined Last few lines from compile log: ------------------------------------------------------------------------------- include/linux/init.h:267:24: note: in expansion of macro ‘__initcall’ 267 | #define module_init(x) __initcall(x); | ^~~~~~~~~~ net/sunrpc/auth_gss/auth_gss.c:1721:1: note: in expansion of macro ‘module_init’ 1721 | module_init(init_rpcsec_gss) | ^~~~~~~~~~~ In file included from include/linux/kernel.h:20, from include/linux/spinlock.h:55, from include/linux/mmzone.h:7, from include/linux/gfp.h:4, from include/linux/slab.h:12, from net/sunrpc/auth_gss/svcauth_gss.c:40: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD net/sunrpc/auth_gss/auth_rpcgss.o LD net/sunrpc/auth_gss/built-in.o LD net/sunrpc/built-in.o LD net/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 arm-none-linux-gnueabihf-ld: no machine record defined Makefile:875: recipe for target '.tmp_vmlinux1' failed make: *** [.tmp_vmlinux1] Error 1 ------------------------------------------------------------------------------- After some investigation I found that the MACHINE_START macro from arch/arm/include/asm/mach/arch.h is optimised by compiler and removed from the object file during compilation of "arch/arm/plat-sunxi/core.c" due to the error here: --------------------------------------------------------------- flateef@flateef-XPS-13-9360:~/src/tmp/linux-custom-venus-gc-9.2$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- EXTRAVERSION=-custom1 uImage LOADADDR="0x40008000" -j4 CHK include/linux/version.h CHK include/generated/utsrelease.h make[1]: 'include/generated/mach-types.h' is up to date. CALL scripts/checksyscalls.sh CHK include/generated/compile.h CC arch/arm/plat-sunxi/core.o In file included from include/linux/kernel.h:20, from arch/arm/plat-sunxi/core.c:20: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ In file included from include/linux/scatterlist.h:10, from include/linux/dma-mapping.h:9, from arch/arm/plat-sunxi/core.c:24: arch/arm/plat-sunxi/core.c: In function ‘sw_irq_unmask’: arch/arm/plat-sunxi/core.c:287:14: warning: left shift count >= width of type [-Wshift-count-overflow] 287 | writel((1 << SW_INT_IRQNO_ENMI), SW_INT_IRQ_PENDING_REG0); | ^~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/io.h:52:88: note: in definition of macro ‘__raw_writel’ 52 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v)) | ^ include/linux/byteorder/generic.h:87:21: note: in expansion of macro ‘__cpu_to_le32’ 87 | #define cpu_to_le32 __cpu_to_le32 | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/io.h:244:36: note: in expansion of macro ‘writel_relaxed’ 244 | #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); }) | ^~~~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:287:4: note: in expansion of macro ‘writel’ 287 | writel((1 << SW_INT_IRQNO_ENMI), SW_INT_IRQ_PENDING_REG0); | ^~~~~~ In file included from arch/arm/plat-sunxi/core.c:53: At top level: /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN7I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:424:1: note: in expansion of macro ‘MACHINE_START’ 424 | MACHINE_START(SUN7I, "sun7i") | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN5I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:410:1: note: in expansion of macro ‘MACHINE_START’ 410 | MACHINE_START(SUN5I, "sun5i") | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN4I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:396:1: note: in expansion of macro ‘MACHINE_START’ 396 | MACHINE_START(SUN4I, "sun4i") | ^~~~~~~~~~~~~ LD arch/arm/plat-sunxi/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 arm-none-linux-gnueabihf-ld: no machine record defined Makefile:875: recipe for target '.tmp_vmlinux1' failed make: *** [.tmp_vmlinux1] Error 1 --------------------------------------------------------------- I modified the MACHINE_START macro in arch/arm/include/asm/mach/arch.h and added "__attribute__((used))" so it became: static const struct machine_desc __mach_desc_##_type __attribute__((used)) \ And I managed to get the vmlinux image. ------------------------------------------------------------- arch/arm/mm/mmu.c:919:1: note: in expansion of macro ‘early_param’ 919 | early_param("vmalloc", early_vmalloc); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_noalign_setup’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:247:2: note: in expansion of macro ‘__setup_param’ 247 | __setup_param(str, fn, fn, 0) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:175:1: note: in expansion of macro ‘__setup’ 175 | __setup("noalign", noalign_setup); | ^~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_ecc’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:165:1: note: in expansion of macro ‘early_param’ 165 | early_param("ecc", early_ecc); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_nowrite’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:154:1: note: in expansion of macro ‘early_param’ 154 | early_param("nowb", early_nowrite); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_nocache’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:145:1: note: in expansion of macro ‘early_param’ 145 | early_param("nocache", early_nocache); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_cachepolicy’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:136:1: note: in expansion of macro ‘early_param’ 136 | early_param("cachepolicy", early_cachepolicy); | ^~~~~~~~~~~ AS arch/arm/kernel/head.o LD arch/arm/kernel/built-in.o AS arch/arm/mm/cache-v7.o AS arch/arm/mm/tlb-v7.o AS arch/arm/mm/proc-v7.o LD arch/arm/mm/built-in.o AS arch/arm/lib/copy_page.o AS arch/arm/lib/csumpartialcopyuser.o AR arch/arm/lib/lib.a LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 KSYM .tmp_kallsyms1.S AS .tmp_kallsyms1.o LD .tmp_vmlinux2 KSYM .tmp_kallsyms2.S AS .tmp_kallsyms2.o LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o XZKERN arch/arm/boot/compressed/piggy.xzkern CC arch/arm/boot/compressed/misc.o CC arch/arm/boot/compressed/decompress.o CC arch/arm/boot/compressed/string.o In file included from include/linux/kernel.h:20, from arch/arm/boot/compressed/../../../../lib/xz/xz_private.h:15, from arch/arm/boot/compressed/../../../../lib/decompress_unxz.c:145, from arch/arm/boot/compressed/decompress.c:50: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ SHIPPED arch/arm/boot/compressed/lib1funcs.S SHIPPED arch/arm/boot/compressed/ashldi3.S AS arch/arm/boot/compressed/lib1funcs.o AS arch/arm/boot/compressed/ashldi3.o AS arch/arm/boot/compressed/piggy.xzkern.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage Image Name: Linux-3.4.113-custom1 Created: Sun Mar 28 20:27:03 2021 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1869496 Bytes = 1825.68 KiB = 1.78 MiB Load Address: 40008000 Entry Point: 40008000 Image arch/arm/boot/uImage is ready ----------------------------------------------------------------------------- -- I still can't boot the kernel on the platform. I believe its because there were lots of warning like above (unused const variables etc) and might have removed some other code/functions OR macros? So please suggest what I can do for compiling working kernel-3.4 with gcc-9. Thanks in advance, -- Fawad Lateef
On Sunday, March 28, 2021, Fawad Lateef <fawadlateef@gmail.com> wrote:
Hi
I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi)
I am currently using buildroot-2016 and gcc-5.5 for building the kernel and every other package needed.
Now the requirement is to move to the latest version of gcc-9.x, so that we can have glibc++ provided by the gcc-9.1 toolchain.
Main problem for moving to later versions of buildroot is the kernel 3.4 which we couldn't to work with gcc-6 a few years ago _but_ now the gcc-9.1 requirement is mandatory so now have to look into compiling linux-3.4 with gcc-9.1 or above.
Now I need some help.
-- Is it realistic to expect 3.4 kernel compiling and boot successfully with gcc-9.1?
Pretty much, but i’m not sure the patches will be acceptable by upstream / stable.
-- Secondly, till now I am able to compile until the point when its going to generate the vmlinuz image, it failed with error at LD stage: arm-none-linux-gnueabihf-ld: no machine record defined
Last few lines from compile log:
------------------------------------------------------------ ------------------- include/linux/init.h:267:24: note: in expansion of macro ‘__initcall’ 267 | #define module_init(x) __initcall(x); | ^~~~~~~~~~ net/sunrpc/auth_gss/auth_gss.c:1721:1: note: in expansion of macro ‘module_init’ 1721 | module_init(init_rpcsec_gss) | ^~~~~~~~~~~ In file included from include/linux/kernel.h:20, from include/linux/spinlock.h:55, from include/linux/mmzone.h:7, from include/linux/gfp.h:4, from include/linux/slab.h:12, from net/sunrpc/auth_gss/svcauth_gss.c:40: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD net/sunrpc/auth_gss/auth_rpcgss.o LD net/sunrpc/auth_gss/built-in.o LD net/sunrpc/built-in.o LD net/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 arm-none-linux-gnueabihf-ld: no machine record defined Makefile:875: recipe for target '.tmp_vmlinux1' failed make: *** [.tmp_vmlinux1] Error 1 ------------------------------------------------------------ -------------------
After some investigation I found that the MACHINE_START macro from arch/arm/include/asm/mach/arch.h is optimised by compiler and removed from the object file during compilation of "arch/arm/plat-sunxi/core.c" due to the error here:
---------------------------------------------------------------
flateef@flateef-XPS-13-9360:~/src/tmp/linux-custom-venus-gc-9.2$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- EXTRAVERSION=-custom1 uImage LOADADDR="0x40008000" -j4 CHK include/linux/version.h CHK include/generated/utsrelease.h make[1]: 'include/generated/mach-types.h' is up to date. CALL scripts/checksyscalls.sh CHK include/generated/compile.h CC arch/arm/plat-sunxi/core.o In file included from include/linux/kernel.h:20, from arch/arm/plat-sunxi/core.c:20: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ In file included from include/linux/scatterlist.h:10, from include/linux/dma-mapping.h:9, from arch/arm/plat-sunxi/core.c:24: arch/arm/plat-sunxi/core.c: In function ‘sw_irq_unmask’: arch/arm/plat-sunxi/core.c:287:14: warning: left shift count >= width of type [-Wshift-count-overflow] 287 | writel((1 << SW_INT_IRQNO_ENMI), SW_INT_IRQ_PENDING_REG0); | ^~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/ include/asm/io.h:52:88: note: in definition of macro ‘__raw_writel’ 52 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v)) | ^ include/linux/byteorder/generic.h:87:21: note: in expansion of macro ‘__cpu_to_le32’ 87 | #define cpu_to_le32 __cpu_to_le32 | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/ include/asm/io.h:244:36: note: in expansion of macro ‘writel_relaxed’ 244 | #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); }) | ^~~~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:287:4: note: in expansion of macro ‘writel’ 287 | writel((1 << SW_INT_IRQNO_ENMI), SW_INT_IRQ_PENDING_REG0); | ^~~~~~ In file included from arch/arm/plat-sunxi/core.c:53: At top level: /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/ include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN7I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:424:1: note: in expansion of macro ‘MACHINE_START’ 424 | MACHINE_START(SUN7I, "sun7i") | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/ include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN5I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:410:1: note: in expansion of macro ‘MACHINE_START’ 410 | MACHINE_START(SUN5I, "sun5i") | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/ include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN4I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:396:1: note: in expansion of macro ‘MACHINE_START’ 396 | MACHINE_START(SUN4I, "sun4i") | ^~~~~~~~~~~~~ LD arch/arm/plat-sunxi/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 arm-none-linux-gnueabihf-ld: no machine record defined Makefile:875: recipe for target '.tmp_vmlinux1' failed make: *** [.tmp_vmlinux1] Error 1
---------------------------------------------------------------
I modified the MACHINE_START macro in arch/arm/include/asm/mach/arch.h and added "__attribute__((used))" so it became:
static const struct machine_desc __mach_desc_##_type __attribute__((used)) \
And I managed to get the vmlinux image.
-------------------------------------------------------------
arch/arm/mm/mmu.c:919:1: note: in expansion of macro ‘early_param’ 919 | early_param("vmalloc", early_vmalloc); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_noalign_setup’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:247:2: note: in expansion of macro ‘__setup_param’ 247 | __setup_param(str, fn, fn, 0) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:175:1: note: in expansion of macro ‘__setup’ 175 | __setup("noalign", noalign_setup); | ^~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_ecc’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:165:1: note: in expansion of macro ‘early_param’ 165 | early_param("ecc", early_ecc); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_nowrite’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:154:1: note: in expansion of macro ‘early_param’ 154 | early_param("nowb", early_nowrite); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_nocache’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:145:1: note: in expansion of macro ‘early_param’ 145 | early_param("nocache", early_nocache); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_cachepolicy’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:136:1: note: in expansion of macro ‘early_param’ 136 | early_param("cachepolicy", early_cachepolicy); | ^~~~~~~~~~~ AS arch/arm/kernel/head.o LD arch/arm/kernel/built-in.o AS arch/arm/mm/cache-v7.o AS arch/arm/mm/tlb-v7.o AS arch/arm/mm/proc-v7.o LD arch/arm/mm/built-in.o AS arch/arm/lib/copy_page.o AS arch/arm/lib/csumpartialcopyuser.o AR arch/arm/lib/lib.a LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 KSYM .tmp_kallsyms1.S AS .tmp_kallsyms1.o LD .tmp_vmlinux2 KSYM .tmp_kallsyms2.S AS .tmp_kallsyms2.o LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o XZKERN arch/arm/boot/compressed/piggy.xzkern CC arch/arm/boot/compressed/misc.o CC arch/arm/boot/compressed/decompress.o CC arch/arm/boot/compressed/string.o In file included from include/linux/kernel.h:20, from arch/arm/boot/compressed/../../../../lib/xz/xz_private.h:15, from arch/arm/boot/compressed/../../../../lib/decompress_unxz.c:145, from arch/arm/boot/compressed/decompress.c:50: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ SHIPPED arch/arm/boot/compressed/lib1funcs.S SHIPPED arch/arm/boot/compressed/ashldi3.S AS arch/arm/boot/compressed/lib1funcs.o AS arch/arm/boot/compressed/ashldi3.o AS arch/arm/boot/compressed/piggy.xzkern.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage Image Name: Linux-3.4.113-custom1 Created: Sun Mar 28 20:27:03 2021 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1869496 Bytes = 1825.68 KiB = 1.78 MiB Load Address: 40008000 Entry Point: 40008000 Image arch/arm/boot/uImage is ready
------------------------------------------------------------ -----------------
-- I still can't boot the kernel on the platform. I believe its because there were lots of warning like above (unused const variables etc) and might have removed some other code/functions OR macros?
So please suggest what I can do for compiling working kernel-3.4 with gcc-9.
Is it possible to switch to new kernel, like v4.4 or even newer?
Thanks in advance,
-- Fawad Lateef
-- With Best Regards, Andy Shevchenko
On Sun, 28 Mar 2021 at 22:49, Andy Shevchenko <andy.shevchenko@gmail.com> wrote:
On Sunday, March 28, 2021, Fawad Lateef <fawadlateef@gmail.com> wrote:
Hi
I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi)
I am currently using buildroot-2016 and gcc-5.5 for building the kernel and every other package needed.
Now the requirement is to move to the latest version of gcc-9.x, so that we can have glibc++ provided by the gcc-9.1 toolchain.
Main problem for moving to later versions of buildroot is the kernel 3.4 which we couldn't to work with gcc-6 a few years ago _but_ now the gcc-9.1 requirement is mandatory so now have to look into compiling linux-3.4 with gcc-9.1 or above.
Now I need some help.
-- Is it realistic to expect 3.4 kernel compiling and boot successfully with gcc-9.1?
Pretty much, but i’m not sure the patches will be acceptable by upstream / stable.
Upstream patch is not really a concern as we are already running a non-upstream kernel from sunxi.
-- Secondly, till now I am able to compile until the point when its going to generate the vmlinuz image, it failed with error at LD stage: arm-none-linux-gnueabihf-ld: no machine record defined
Last few lines from compile log:
------------------------------------------------------------------------------- include/linux/init.h:267:24: note: in expansion of macro ‘__initcall’ 267 | #define module_init(x) __initcall(x); | ^~~~~~~~~~ net/sunrpc/auth_gss/auth_gss.c:1721:1: note: in expansion of macro ‘module_init’ 1721 | module_init(init_rpcsec_gss) | ^~~~~~~~~~~ In file included from include/linux/kernel.h:20, from include/linux/spinlock.h:55, from include/linux/mmzone.h:7, from include/linux/gfp.h:4, from include/linux/slab.h:12, from net/sunrpc/auth_gss/svcauth_gss.c:40: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD net/sunrpc/auth_gss/auth_rpcgss.o LD net/sunrpc/auth_gss/built-in.o LD net/sunrpc/built-in.o LD net/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 arm-none-linux-gnueabihf-ld: no machine record defined Makefile:875: recipe for target '.tmp_vmlinux1' failed make: *** [.tmp_vmlinux1] Error 1 -------------------------------------------------------------------------------
After some investigation I found that the MACHINE_START macro from arch/arm/include/asm/mach/arch.h is optimised by compiler and removed from the object file during compilation of "arch/arm/plat-sunxi/core.c" due to the error here:
---------------------------------------------------------------
flateef@flateef-XPS-13-9360:~/src/tmp/linux-custom-venus-gc-9.2$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- EXTRAVERSION=-custom1 uImage LOADADDR="0x40008000" -j4 CHK include/linux/version.h CHK include/generated/utsrelease.h make[1]: 'include/generated/mach-types.h' is up to date. CALL scripts/checksyscalls.sh CHK include/generated/compile.h CC arch/arm/plat-sunxi/core.o In file included from include/linux/kernel.h:20, from arch/arm/plat-sunxi/core.c:20: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ In file included from include/linux/scatterlist.h:10, from include/linux/dma-mapping.h:9, from arch/arm/plat-sunxi/core.c:24: arch/arm/plat-sunxi/core.c: In function ‘sw_irq_unmask’: arch/arm/plat-sunxi/core.c:287:14: warning: left shift count >= width of type [-Wshift-count-overflow] 287 | writel((1 << SW_INT_IRQNO_ENMI), SW_INT_IRQ_PENDING_REG0); | ^~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/io.h:52:88: note: in definition of macro ‘__raw_writel’ 52 | #define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v)) | ^ include/linux/byteorder/generic.h:87:21: note: in expansion of macro ‘__cpu_to_le32’ 87 | #define cpu_to_le32 __cpu_to_le32 | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/io.h:244:36: note: in expansion of macro ‘writel_relaxed’ 244 | #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); }) | ^~~~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:287:4: note: in expansion of macro ‘writel’ 287 | writel((1 << SW_INT_IRQNO_ENMI), SW_INT_IRQ_PENDING_REG0); | ^~~~~~ In file included from arch/arm/plat-sunxi/core.c:53: At top level: /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN7I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:424:1: note: in expansion of macro ‘MACHINE_START’ 424 | MACHINE_START(SUN7I, "sun7i") | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN5I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:410:1: note: in expansion of macro ‘MACHINE_START’ 410 | MACHINE_START(SUN5I, "sun5i") | ^~~~~~~~~~~~~ /home/flateef/src/tmp/linux-custom-venus-gc-9.2/arch/arm/include/asm/mach/arch.h:69:34: warning: ‘__mach_desc_SUN4I’ defined but not used [-Wunused-const-variable=] 69 | static const struct machine_desc __mach_desc_##_type \ | ^~~~~~~~~~~~ arch/arm/plat-sunxi/core.c:396:1: note: in expansion of macro ‘MACHINE_START’ 396 | MACHINE_START(SUN4I, "sun4i") | ^~~~~~~~~~~~~ LD arch/arm/plat-sunxi/built-in.o LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 arm-none-linux-gnueabihf-ld: no machine record defined Makefile:875: recipe for target '.tmp_vmlinux1' failed make: *** [.tmp_vmlinux1] Error 1
---------------------------------------------------------------
I modified the MACHINE_START macro in arch/arm/include/asm/mach/arch.h and added "__attribute__((used))" so it became:
static const struct machine_desc __mach_desc_##_type __attribute__((used)) \
And I managed to get the vmlinux image.
-------------------------------------------------------------
arch/arm/mm/mmu.c:919:1: note: in expansion of macro ‘early_param’ 919 | early_param("vmalloc", early_vmalloc); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_noalign_setup’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:247:2: note: in expansion of macro ‘__setup_param’ 247 | __setup_param(str, fn, fn, 0) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:175:1: note: in expansion of macro ‘__setup’ 175 | __setup("noalign", noalign_setup); | ^~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_ecc’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:165:1: note: in expansion of macro ‘early_param’ 165 | early_param("ecc", early_ecc); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_nowrite’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:154:1: note: in expansion of macro ‘early_param’ 154 | early_param("nowb", early_nowrite); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_nocache’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:145:1: note: in expansion of macro ‘early_param’ 145 | early_param("nocache", early_nocache); | ^~~~~~~~~~~ include/linux/init.h:241:33: warning: ‘__setup_early_cachepolicy’ defined but not used [-Wunused-variable] 241 | static struct obs_kernel_param __setup_##unique_id \ | ^~~~~~~~ include/linux/init.h:252:2: note: in expansion of macro ‘__setup_param’ 252 | __setup_param(str, fn, fn, 1) | ^~~~~~~~~~~~~ arch/arm/mm/mmu.c:136:1: note: in expansion of macro ‘early_param’ 136 | early_param("cachepolicy", early_cachepolicy); | ^~~~~~~~~~~ AS arch/arm/kernel/head.o LD arch/arm/kernel/built-in.o AS arch/arm/mm/cache-v7.o AS arch/arm/mm/tlb-v7.o AS arch/arm/mm/proc-v7.o LD arch/arm/mm/built-in.o AS arch/arm/lib/copy_page.o AS arch/arm/lib/csumpartialcopyuser.o AR arch/arm/lib/lib.a LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o In file included from include/linux/kernel.h:20, from include/linux/cache.h:4, from include/linux/time.h:7, from include/linux/stat.h:60, from include/linux/module.h:10, from init/version.c:10: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ LD init/built-in.o LD .tmp_vmlinux1 KSYM .tmp_kallsyms1.S AS .tmp_kallsyms1.o LD .tmp_vmlinux2 KSYM .tmp_kallsyms2.S AS .tmp_kallsyms2.o LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o XZKERN arch/arm/boot/compressed/piggy.xzkern CC arch/arm/boot/compressed/misc.o CC arch/arm/boot/compressed/decompress.o CC arch/arm/boot/compressed/string.o In file included from include/linux/kernel.h:20, from arch/arm/boot/compressed/../../../../lib/xz/xz_private.h:15, from arch/arm/boot/compressed/../../../../lib/decompress_unxz.c:145, from arch/arm/boot/compressed/decompress.c:50: include/linux/log2.h:22:1: warning: ignoring attribute ‘noreturn’ because it conflicts with attribute ‘const’ [-Wattributes] 22 | int ____ilog2_NaN(void); | ^~~ SHIPPED arch/arm/boot/compressed/lib1funcs.S SHIPPED arch/arm/boot/compressed/ashldi3.S AS arch/arm/boot/compressed/lib1funcs.o AS arch/arm/boot/compressed/ashldi3.o AS arch/arm/boot/compressed/piggy.xzkern.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage Image Name: Linux-3.4.113-custom1 Created: Sun Mar 28 20:27:03 2021 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1869496 Bytes = 1825.68 KiB = 1.78 MiB Load Address: 40008000 Entry Point: 40008000 Image arch/arm/boot/uImage is ready
-----------------------------------------------------------------------------
-- I still can't boot the kernel on the platform. I believe its because there were lots of warning like above (unused const variables etc) and might have removed some other code/functions OR macros?
So please suggest what I can do for compiling working kernel-3.4 with gcc-9.
Is it possible to switch to new kernel, like v4.4 or even newer?
As mentioned above, not possible. The mainline kernel doesn't support the NAND chip/driver due to some binary blobs. So pretty much only option for us is to stick with SUNXI provided 3.4.xxx kernel version. (Mainline kernel supports Sunxi-A20 SOM from Olimex but only the eMMC version _not_ NAND).
Thanks in advance,
-- Fawad Lateef
-- With Best Regards, Andy Shevchenko
On Sun, Mar 28, 2021 at 10:20:50PM +0200, Fawad Lateef wrote:
Hi
I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi)
Please work with the vendor that is forcing you to use this obsolete and insecure kernel version. You are paying for that support, and they are the only ones that can support you.
I am currently using buildroot-2016 and gcc-5.5 for building the kernel and every other package needed.
Now the requirement is to move to the latest version of gcc-9.x, so that we can have glibc++ provided by the gcc-9.1 toolchain.
Main problem for moving to later versions of buildroot is the kernel 3.4 which we couldn't to work with gcc-6 a few years ago _but_ now the gcc-9.1 requirement is mandatory so now have to look into compiling linux-3.4 with gcc-9.1 or above.
Now I need some help.
-- Is it realistic to expect 3.4 kernel compiling and boot successfully with gcc-9.1?
No. It took a lot of work and effort just to get the 4.4.y kernel to work with that gcc version. Again, please work with the company that you are already paying for support from, they can do this for you. good luck! greg k-h
Hi Greg, On Mon, 29 Mar 2021 at 06:57, Greg KH <greg@kroah.com> wrote:
On Sun, Mar 28, 2021 at 10:20:50PM +0200, Fawad Lateef wrote:
Hi
I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi)
Please work with the vendor that is forcing you to use this obsolete and insecure kernel version. You are paying for that support, and they are the only ones that can support you.
The problem is vendor Olimex now have eMMC based SOM which is supported by mainline kernel _but_ they still selling NAND SOM and only supporting 3.4 kernel (as this is the only latest version from sunxi with NAND support, after that sunxi is now moved away from NAND too).
I am currently using buildroot-2016 and gcc-5.5 for building the kernel and every other package needed.
Now the requirement is to move to the latest version of gcc-9.x, so that we can have glibc++ provided by the gcc-9.1 toolchain.
Main problem for moving to later versions of buildroot is the kernel 3.4 which we couldn't to work with gcc-6 a few years ago _but_ now the gcc-9.1 requirement is mandatory so now have to look into compiling linux-3.4 with gcc-9.1 or above.
Now I need some help.
-- Is it realistic to expect 3.4 kernel compiling and boot successfully with gcc-9.1?
No. It took a lot of work and effort just to get the 4.4.y kernel to work with that gcc version.
Ok, thanks for the information. Any pointers on what to look at if I had to go this route for 3.4 kernel?
Again, please work with the company that you are already paying for support from, they can do this for you.
From Olimex they say it's an open hardware platform, so I really can't expect them to do anything for it. (https://www.olimex.com/Products/SOM/A20/A20-SOM/ NAND version)
Thanks and regards, Fawad Lateef
good luck!
greg k-h
On Mon, Mar 29, 2021 at 09:20:32PM +0200, Fawad Lateef wrote:
Hi Greg,
On Mon, 29 Mar 2021 at 06:57, Greg KH <greg@kroah.com> wrote:
On Sun, Mar 28, 2021 at 10:20:50PM +0200, Fawad Lateef wrote:
Hi
I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi)
Please work with the vendor that is forcing you to use this obsolete and insecure kernel version. You are paying for that support, and they are the only ones that can support you.
The problem is vendor Olimex now have eMMC based SOM which is supported by mainline kernel _but_ they still selling NAND SOM and only supporting 3.4 kernel (as this is the only latest version from sunxi with NAND support, after that sunxi is now moved away from NAND too).
If they are forcing you to use a binary kernel module, then they are the only ones that can give you support, sorry. That should be included in the price you paid for the hardware. If not, you need to go complain to your purchasing department :) Good luck! greg k-h
On Mon, Mar 29, 2021 at 9:23 PM Fawad Lateef <fawadlateef@gmail.com> wrote:
On Mon, 29 Mar 2021 at 06:57, Greg KH <greg@kroah.com> wrote:
On Sun, Mar 28, 2021 at 10:20:50PM +0200, Fawad Lateef wrote:
Hi
I am using an Olimex A20 SOM with NAND and due to some binary blob for NAND driver, I am stuck with the sunxi kernel 3.4.xxx version. (Repo here: https://github.com/linux-sunxi/linux-sunxi)
Please work with the vendor that is forcing you to use this obsolete and insecure kernel version. You are paying for that support, and they are the only ones that can support you.
The problem is vendor Olimex now have eMMC based SOM which is supported by mainline kernel _but_ they still selling NAND SOM and only supporting 3.4 kernel (as this is the only latest version from sunxi with NAND support, after that sunxi is now moved away from NAND too).
From a very quick look at the git history, I can tell that A20 NAND driver support was added in linux-4.8. Have you actually tried a modern kernel?
There is also a howto document at https://linux-sunxi.org/Mainline_NAND_Howto The olimex board specific dts files seem to be missing the entry for the nand controller. If you have trouble figuring out how to enable that from the howto above, Olimex should be able to prove a small patch for it.
I am currently using buildroot-2016 and gcc-5.5 for building the kernel and every other package needed.
Now the requirement is to move to the latest version of gcc-9.x, so that we can have glibc++ provided by the gcc-9.1 toolchain.
Main problem for moving to later versions of buildroot is the kernel 3.4 which we couldn't to work with gcc-6 a few years ago _but_ now the gcc-9.1 requirement is mandatory so now have to look into compiling linux-3.4 with gcc-9.1 or above.
There is no need to compile user space and kernel with the same compiler. Arnd
participants (4)
-
Andy Shevchenko -
Arnd Bergmann -
Fawad Lateef -
Greg KH