Messages in this thread | | | Subject | Re: [PATCH/RFC] powerpc/module_64: allow .init_array constructors to run | From | Christophe Leroy <> | Date | Tue, 17 Aug 2021 15:22:38 +0200 |
| |
Le 17/08/2021 à 15:02, Jan Stancek a écrit : > gcov and kasan rely on compiler generated constructor code. > For modules, gcc-8 with gcov enabled generates .init_array section, > but on ppc64le it doesn't get executed. find_module_sections() never > finds .init_array section, because module_frob_arch_sections() renames > it to _init_array. > > Avoid renaming .init_array section, so do_mod_ctors() can use it. > > Cc: Michael Ellerman <mpe@ellerman.id.au> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Christophe Leroy <christophe.leroy@csgroup.eu> > Signed-off-by: Jan Stancek <jstancek@redhat.com> > --- > I wasn't able to trace the comment: > "We don't handle .init for the moment: rename to _init"
Original patch there: https://github.com/mpe/linux-fullhistory/commit/d6ad6690aa72
> to original patch (it pre-dates .git). I'm not sure if it > still applies today, so I limited patch to .init_array. This > fixes gcov for modules for me on ppc64le 5.14.0-rc6. > > Renaming issue is also mentioned in kasan patches here: > https://patchwork.ozlabs.org/project/linuxppc-dev/cover/20210319144058.772525-1-dja@axtens > > arch/powerpc/kernel/module_64.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c > index 6baa676e7cb6..c604b13ea6bf 100644 > --- a/arch/powerpc/kernel/module_64.c > +++ b/arch/powerpc/kernel/module_64.c > @@ -299,8 +299,16 @@ int module_frob_arch_sections(Elf64_Ehdr *hdr, > sechdrs[i].sh_size); > > /* We don't handle .init for the moment: rename to _init */ > - while ((p = strstr(secstrings + sechdrs[i].sh_name, ".init"))) > + while ((p = strstr(secstrings + sechdrs[i].sh_name, ".init"))) { > +#ifdef CONFIG_CONSTRUCTORS
Please avoid #ifdefery as much as possible.
I think here you can do:
if (IS_ENABLED(CONFIG_CONSTRUCTORS) && strstr(secstrings + sechdrs[i].sh_name, ".init_array"))
> + /* find_module_sections() needs .init_array intact */ > + if (strstr(secstrings + sechdrs[i].sh_name, > + ".init_array")) {
No { } for single statements (See https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces)
> + break; > + } > +#endif > p[0] = '_'; > + } > > if (sechdrs[i].sh_type == SHT_SYMTAB) > dedotify((void *)hdr + sechdrs[i].sh_offset, >
| |