* [PATCH v2] module: keep percpu symbols in module's symtab
@ 2015-11-25 13:33 Miroslav Benes
2015-11-26 2:49 ` Rusty Russell
0 siblings, 1 reply; 2+ messages in thread
From: Miroslav Benes @ 2015-11-25 13:33 UTC (permalink / raw)
To: rusty; +Cc: linux-kernel, Miroslav Benes
Currently, percpu symbols from .data..percpu ELF section of a module are
not copied over and stored in final symtab array of struct module.
Consequently such symbol cannot be returned via kallsyms API (for
example kallsyms_lookup_name). This can be especially confusing when the
percpu symbol is exported. Only its __ksymtab et al. are present in its
symtab.
The culprit is in layout_and_allocate() function where SHF_ALLOC flag is
dropped for .data..percpu section. There is in fact no need to copy the
section to final struct module, because kernel module loader allocates
extra percpu section by itself. Unfortunately only symbols from
SHF_ALLOC sections are copied due to a check in is_core_symbol().
The patch changes is_core_symbol() function to copy over also percpu
symbols (their st_shndx points to .data..percpu ELF section). We do it
only if CONFIG_KALLSYMS_ALL is set to be consistent with the rest of the
function (ELF section is SHF_ALLOC but !SHF_EXECINSTR). Finally
elf_type() returns type 'a' for a percpu symbol because its address is
absolute.
Signed-off-by: Miroslav Benes <mbenes@suse.cz>
---
kernel/module.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/kernel/module.c b/kernel/module.c
index 8f051a106676..7aab5b52c43e 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -2401,7 +2401,7 @@ static char elf_type(const Elf_Sym *sym, const struct load_info *info)
}
if (sym->st_shndx == SHN_UNDEF)
return 'U';
- if (sym->st_shndx == SHN_ABS)
+ if (sym->st_shndx == SHN_ABS || sym->st_shndx == info->index.pcpu)
return 'a';
if (sym->st_shndx >= SHN_LORESERVE)
return '?';
@@ -2430,7 +2430,7 @@ static char elf_type(const Elf_Sym *sym, const struct load_info *info)
}
static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
- unsigned int shnum)
+ unsigned int shnum, unsigned int pcpundx)
{
const Elf_Shdr *sec;
@@ -2439,6 +2439,11 @@ static bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs,
|| !src->st_name)
return false;
+#ifdef CONFIG_KALLSYMS_ALL
+ if (src->st_shndx == pcpundx)
+ return true;
+#endif
+
sec = sechdrs + src->st_shndx;
if (!(sec->sh_flags & SHF_ALLOC)
#ifndef CONFIG_KALLSYMS_ALL
@@ -2476,7 +2481,8 @@ static void layout_symtab(struct module *mod, struct load_info *info)
/* Compute total space required for the core symbols' strtab. */
for (ndst = i = 0; i < nsrc; i++) {
if (i == 0 ||
- is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum)) {
+ is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
+ info->index.pcpu)) {
strtab_size += strlen(&info->strtab[src[i].st_name])+1;
ndst++;
}
@@ -2518,7 +2524,8 @@ static void add_kallsyms(struct module *mod, const struct load_info *info)
src = mod->symtab;
for (ndst = i = 0; i < mod->num_symtab; i++) {
if (i == 0 ||
- is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum)) {
+ is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum,
+ info->index.pcpu)) {
dst[ndst] = src[i];
dst[ndst++].st_name = s - mod->core_strtab;
s += strlcpy(s, &mod->strtab[src[i].st_name],
--
2.1.4
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH v2] module: keep percpu symbols in module's symtab
2015-11-25 13:33 [PATCH v2] module: keep percpu symbols in module's symtab Miroslav Benes
@ 2015-11-26 2:49 ` Rusty Russell
0 siblings, 0 replies; 2+ messages in thread
From: Rusty Russell @ 2015-11-26 2:49 UTC (permalink / raw)
To: Miroslav Benes; +Cc: linux-kernel, Miroslav Benes
Miroslav Benes <mbenes@suse.cz> writes:
> Currently, percpu symbols from .data..percpu ELF section of a module are
> not copied over and stored in final symtab array of struct module.
> Consequently such symbol cannot be returned via kallsyms API (for
> example kallsyms_lookup_name). This can be especially confusing when the
> percpu symbol is exported. Only its __ksymtab et al. are present in its
> symtab.
>
> The culprit is in layout_and_allocate() function where SHF_ALLOC flag is
> dropped for .data..percpu section. There is in fact no need to copy the
> section to final struct module, because kernel module loader allocates
> extra percpu section by itself. Unfortunately only symbols from
> SHF_ALLOC sections are copied due to a check in is_core_symbol().
>
> The patch changes is_core_symbol() function to copy over also percpu
> symbols (their st_shndx points to .data..percpu ELF section). We do it
> only if CONFIG_KALLSYMS_ALL is set to be consistent with the rest of the
> function (ELF section is SHF_ALLOC but !SHF_EXECINSTR). Finally
> elf_type() returns type 'a' for a percpu symbol because its address is
> absolute.
>
> Signed-off-by: Miroslav Benes <mbenes@suse.cz>
Thanks, applied!
Cheers,
Rusty.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-11-26 3:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-25 13:33 [PATCH v2] module: keep percpu symbols in module's symtab Miroslav Benes
2015-11-26 2:49 ` Rusty Russell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox