Re: arch/sh/boot/compressed/misc.c:118:6: warning: no previous prototype for 'arch_ftrace_ops_list_func'

From: John Paul Adrian Glaubitz
Date: Thu Nov 02 2023 - 16:32:31 EST


Hi Steven!

On Thu, 2023-11-02 at 16:28 -0400, Steven Rostedt wrote:
>
> I'm not sure it really needs to be fixed. But I won't complain if you do.
>
> Anyway, the issue is that arch/sh/boot/compressed/misc.c is not part of the
> kernel. It's the code that decompresses the vmlinuz (or whatever sh calls
> it). That is, the build will build the kernel (vmlinux) then compress it
> and add a program to decompress it (vmlinuz). At least this is what is done
> on x86, and I'm assuming it's the same for sh.
>
> The vmlinuz is stored on disk, the boot loader loads it into memory and
> executes it. The vmlinuz has the code to decompress the attached vmlinux
> into memory and jump to that when its done.
>
> Thus, you have two executables. The kernel and this wrapper program that
> decompresses the kernel at start up (and is freed right afterward). This
> wrapper code exists in arch/sh/boot (and in arch/x86/boot for x86).
>
> As this code needs to be built just like the kernel, it uses the same
> linker script as the kernel (vmlinux.lds.h), which has some references to
> vmlinux code. Those include (from the warnings in this "bug"):
>
> arch/sh/boot/compressed/misc.c:115:6: warning: no previous prototype for 'ftrace_stub' [-Wmissing-prototypes]
> 115 | void ftrace_stub(void)
> | ^~~~~~~~~~~
> > > arch/sh/boot/compressed/misc.c:118:6: warning: no previous prototype for 'arch_ftrace_ops_list_func' [-Wmissing-prototypes]
> 118 | void arch_ftrace_ops_list_func(void)
> | ^~~~~~~~~~~~~~~~~~~~~~~~~
>
> Which are referenced by include/asm-generic/vmlinux.lds.h, and if you do
> not include them, then linking will fail as these will be undefined
> references.
>
> Note, that bug also has:
>
> arch/sh/boot/compressed/misc.c:109:6: warning: no previous prototype for '__stack_chk_fail' [-Wmissing-prototypes]
> 109 | void __stack_chk_fail(void)
> | ^~~~~~~~~~~~~~~~
>
> Which has a reference added by the compiler for stack protection options.
>
> arch/sh/boot/compressed/misc.c:128:6: warning: no previous prototype for 'decompress_kernel' [-Wmissing-prototypes]
> 128 | void decompress_kernel(void)
>
> Which is called by arch/sh/boot/compressed/head_*.S, which is assembly.
>
> None of these really need prototypes, as there's nothing that would use the
> prototypes. The two ftrace function stubs do not even add parameters to
> match the vmlinux prototype, because they are never called. The other two
> functions are either for gcc internal usage or called from assembly, both
> which do not care about seeing a prototype either.
>
> If you want to quiet gcc, you can add in arch/sh/boot/compressed, a header
> file called "stubs.h" that just has:
>
> #ifndef _STUBS_H
> #define _STUBS_H
>
> /* Quiet gcc complaining about these prototypes */
>
> void __stack_chk_fail(void);
> void decompress_kernel(void);
> void ftrace_stub(void);
> void arch_ftrace_ops_list_func(void);
>
> #endif
>
> and include that header.

Thank you for the very detailed explanation. I will look into fixing this for v6.7.

Adrian

--
.''`. John Paul Adrian Glaubitz
: :' : Debian Developer
`. `' Physicist
`- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913