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

From: Steven Rostedt
Date: Thu Nov 02 2023 - 16:28:43 EST


On Thu, 02 Nov 2023 21:05:29 +0100
John Paul Adrian Glaubitz <glaubitz@xxxxxxxxxxxxxxxxxxx> wrote:

> > > All warnings (new ones prefixed by >>):
> > >
> > > arch/sh/boot/compressed/misc.c:109:6: warning: no previous prototype for '__stack_chk_fail' [-Wmissing-prototypes]
> > > 109 | void __stack_chk_fail(void)
> > > | ^~~~~~~~~~~~~~~~
> > > 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)
> > > | ^~~~~~~~~~~~~~~~~~~~~~~~~
> >
> > As the comment states, this is needed only because the linker script
> > vmlinux.lds.h references them, and it will not build without it.
> >
> > If someone really cares, they could simply add a header to quiet these
> > warnings, but seriously, these functions are just stubs to allow the sh
> > boot portion use the vmlinux.lds.h linker script. These stubs are only for
> > satisfying linker references and are not used. I'm not going to be the one
> > to bother "fixing" it.
>
> I have to admit that I don't fully understand what the problem is.
>
> Is this just a cosmetic issue? I would be willing to fix it in any case.

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.

-- Steve