| From: Stephen Brennan <stephen.s.brennan@oracle.com> |
| Subject: kallsyms: move declarations to internal header |
| Date: Mon, 16 May 2022 17:05:07 -0700 |
| |
| Patch series "Expose kallsyms data in vmcoreinfo note". |
| |
| The kernel can be configured to contain a lot of introspection or |
| debugging information built-in, such as ORC for unwinding stack traces, |
| BTF for type information, and of course kallsyms. Debuggers could use |
| this information to navigate a core dump or live system, but they need to |
| be able to find it. |
| |
| This patch series adds the necessary symbols into vmcoreinfo, which would |
| allow a debugger to find and interpret the kallsyms table. Using the |
| kallsyms data, the debugger can then lookup any symbol, allowing it to |
| find ORC, BTF, or any other useful data. |
| |
| This would allow a live kernel, or core dump, to be debugged without any |
| DWARF debuginfo. This is useful for many cases: the debuginfo may not |
| have been generated, or you may not want to deploy the large files |
| everywhere you need them. |
| |
| I've demonstrated a proof of concept for this at LSF/MM+BPF during a |
| lighting talk. Using a work-in-progress branch of the drgn debugger, and |
| an extended set of BTF generated by a patched version of dwarves, I've |
| been able to open a core dump without any DWARF info and do basic tasks |
| such as enumerating slab caches, block devices, tasks, and doing |
| backtraces. I hope this series can be a first step toward a new |
| possibility of "DWARFless debugging". |
| |
| Related discussion around the BTF side of this: |
| https://lore.kernel.org/bpf/586a6288-704a-f7a7-b256-e18a675927df@oracle.com/T/#u |
| |
| Some work-in-progress branches using this feature: |
| https://github.com/brenns10/dwarves/tree/remove_percpu_restriction_1 |
| https://github.com/brenns10/drgn/tree/kallsyms_plus_btf |
| |
| |
| This patch (of 2): |
| |
| To include kallsyms data in the vmcoreinfo note, we must make the symbol |
| declarations visible outside of kallsyms.c. Move these to a new internal |
| header file. |
| |
| Link: https://lkml.kernel.org/r/20220517000508.777145-1-stephen.s.brennan@oracle.com |
| Link: https://lkml.kernel.org/r/20220517000508.777145-2-stephen.s.brennan@oracle.com |
| Signed-off-by: Stephen Brennan <stephen.s.brennan@oracle.com> |
| Acked-by: Baoquan He <bhe@redhat.com> |
| Cc: Nick Desaulniers <ndesaulniers@google.com> |
| Cc: Dave Young <dyoung@redhat.com> |
| Cc: Kees Cook <keescook@chromium.org> |
| Cc: Jiri Olsa <jolsa@kernel.org> |
| Cc: Stephen Boyd <swboyd@chromium.org> |
| Cc: Bixuan Cui <cuibixuan@huawei.com> |
| Cc: David Vernet <void@manifault.com> |
| Cc: Vivek Goyal <vgoyal@redhat.com> |
| Cc: Sami Tolvanen <samitolvanen@google.com> |
| Cc: "Eric W. Biederman" <ebiederm@xmission.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| kernel/kallsyms.c | 23 +---------------------- |
| kernel/kallsyms_internal.h | 30 ++++++++++++++++++++++++++++++ |
| 2 files changed, 31 insertions(+), 22 deletions(-) |
| |
| --- a/kernel/kallsyms.c~kallsyms-move-declarations-to-internal-header |
| +++ a/kernel/kallsyms.c |
| @@ -31,28 +31,7 @@ |
| #include <linux/kernel.h> |
| #include <linux/bsearch.h> |
| |
| -/* |
| - * These will be re-linked against their real values |
| - * during the second link stage. |
| - */ |
| -extern const unsigned long kallsyms_addresses[] __weak; |
| -extern const int kallsyms_offsets[] __weak; |
| -extern const u8 kallsyms_names[] __weak; |
| - |
| -/* |
| - * Tell the compiler that the count isn't in the small data section if the arch |
| - * has one (eg: FRV). |
| - */ |
| -extern const unsigned int kallsyms_num_syms |
| -__section(".rodata") __attribute__((weak)); |
| - |
| -extern const unsigned long kallsyms_relative_base |
| -__section(".rodata") __attribute__((weak)); |
| - |
| -extern const char kallsyms_token_table[] __weak; |
| -extern const u16 kallsyms_token_index[] __weak; |
| - |
| -extern const unsigned int kallsyms_markers[] __weak; |
| +#include "kallsyms_internal.h" |
| |
| /* |
| * Expand a compressed symbol data into the resulting uncompressed string, |
| --- /dev/null |
| +++ a/kernel/kallsyms_internal.h |
| @@ -0,0 +1,30 @@ |
| +/* SPDX-License-Identifier: GPL-2.0-only */ |
| +#ifndef LINUX_KALLSYMS_INTERNAL_H_ |
| +#define LINUX_KALLSYMS_INTERNAL_H_ |
| + |
| +#include <linux/types.h> |
| + |
| +/* |
| + * These will be re-linked against their real values |
| + * during the second link stage. |
| + */ |
| +extern const unsigned long kallsyms_addresses[] __weak; |
| +extern const int kallsyms_offsets[] __weak; |
| +extern const u8 kallsyms_names[] __weak; |
| + |
| +/* |
| + * Tell the compiler that the count isn't in the small data section if the arch |
| + * has one (eg: FRV). |
| + */ |
| +extern const unsigned int kallsyms_num_syms |
| +__section(".rodata") __attribute__((weak)); |
| + |
| +extern const unsigned long kallsyms_relative_base |
| +__section(".rodata") __attribute__((weak)); |
| + |
| +extern const char kallsyms_token_table[] __weak; |
| +extern const u16 kallsyms_token_index[] __weak; |
| + |
| +extern const unsigned int kallsyms_markers[] __weak; |
| + |
| +#endif // LINUX_KALLSYMS_INTERNAL_H_ |
| _ |