From: Jan Stancek <jstancek@redhat.com> Date: 2021-08-17 13:03:16
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 <redacted>
Cc: Christophe Leroy <redacted>
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"
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(-)
@@ -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+/* find_module_sections() needs .init_array intact */+if(strstr(secstrings+sechdrs[i].sh_name,+".init_array")){+break;+}+#endifp[0]='_';+}if(sechdrs[i].sh_type==SHT_SYMTAB)dedotify((void*)hdr+sechdrs[i].sh_offset,
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 <redacted>
Cc: Christophe Leroy <redacted>
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"
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(-)
@@ -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"))
From: Daniel Axtens <hidden> Date: 2021-08-18 03:32:50
Jan Stancek [off-list ref] writes:
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.
This (the existing renaming) breaks a KASAN test too, so I'd love to see
this fixed.
However, I don't know that renaming the section is a complete fix: from
memory it is still be possible to get relocations that are too far away
and require separate trampolines. But I wasn't able to construct a
module that exhibited this behaviour and test a fix before I got pulled
away to other things.
Kind regards,
Daniel
quoted hunk
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <redacted>
Cc: Christophe Leroy <redacted>
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"
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(-)
@@ -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+/* find_module_sections() needs .init_array intact */+if(strstr(secstrings+sechdrs[i].sh_name,+".init_array")){+break;+}+#endifp[0]='_';+}if(sechdrs[i].sh_type==SHT_SYMTAB)dedotify((void*)hdr+sechdrs[i].sh_offset,
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 <redacted>
Cc: Christophe Leroy <redacted>
Signed-off-by: Jan Stancek <jstancek@redhat.com>
Does commit d4be60fe66b7 ("powerpc/module_64: use module_init_section
instead of patching names") fixes your issue ?
If not, please rebase and resubmit.
Thanks
Christophe
quoted hunk
---
I wasn't able to trace the comment:
"We don't handle .init for the moment: rename to _init"
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(-)
@@ -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+/* find_module_sections() needs .init_array intact */+if(strstr(secstrings+sechdrs[i].sh_name,+".init_array")){+break;+}+#endifp[0]='_';+}if(sechdrs[i].sh_type==SHT_SYMTAB)dedotify((void*)hdr+sechdrs[i].sh_offset,
From: Jan Stancek <jstancek@redhat.com> Date: 2022-07-07 12:15:09
On Thu, Jul 7, 2022 at 1:20 PM Christophe Leroy
[off-list ref] wrote:
Le 17/08/2021 à 15:02, Jan Stancek a écrit :
quoted
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 <redacted>
Cc: Christophe Leroy <redacted>
Signed-off-by: Jan Stancek <jstancek@redhat.com>
Does commit d4be60fe66b7 ("powerpc/module_64: use module_init_section
instead of patching names") fixes your issue ?
Yes, it does gcov for me. Thanks
If not, please rebase and resubmit.
Thanks
Christophe
quoted
---
I wasn't able to trace the comment:
"We don't handle .init for the moment: rename to _init"
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(-)
@@ -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+/* find_module_sections() needs .init_array intact */+if(strstr(secstrings+sechdrs[i].sh_name,+".init_array")){+break;+}+#endifp[0]='_';+}if(sechdrs[i].sh_type==SHT_SYMTAB)dedotify((void*)hdr+sechdrs[i].sh_offset,