Commit 83804118 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Debugging option to put data symbols in kallsyms

From: Rusty Russell <rusty@rustcorp.com.au>

kallsyms contains only function names, but some debuggers (eg.  xmon on
PPC/PPC64) use it to lookup symbols: it'd be much nicer if it included data
symbols too.
parent c83cd783
...@@ -567,7 +567,7 @@ ifdef CONFIG_KALLSYMS ...@@ -567,7 +567,7 @@ ifdef CONFIG_KALLSYMS
kallsyms.o := .tmp_kallsyms2.o kallsyms.o := .tmp_kallsyms2.o
quiet_cmd_kallsyms = KSYM $@ quiet_cmd_kallsyms = KSYM $@
cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) > $@ cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) $(foreach x,$(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
.tmp_kallsyms1.o .tmp_kallsyms2.o: %.o: %.S scripts FORCE .tmp_kallsyms1.o .tmp_kallsyms2.o: %.o: %.S scripts FORCE
$(call if_changed_dep,as_o_S) $(call if_changed_dep,as_o_S)
......
...@@ -235,6 +235,17 @@ config KALLSYMS ...@@ -235,6 +235,17 @@ config KALLSYMS
symbolic stack backtraces. This increases the size of the kernel symbolic stack backtraces. This increases the size of the kernel
somewhat, as all symbols have to be loaded into the kernel image. somewhat, as all symbols have to be loaded into the kernel image.
config KALLSYMS_ALL
bool "Include all symbols in kallsyms"
depends on DEBUG_KERNEL && KALLSYMS
help
Normally kallsyms only contains the symbols of functions, for nicer
OOPS messages. Some debuggers can use kallsyms for other
symbols too: say Y here to include all symbols, and you
don't care about adding 300k to the size of your kernel.
Say N.
config FUTEX config FUTEX
bool "Enable futex support" if EMBEDDED bool "Enable futex support" if EMBEDDED
default y default y
......
...@@ -190,7 +190,10 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter) ...@@ -190,7 +190,10 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter)
off += strlen(kallsyms_names + off) + 1; off += strlen(kallsyms_names + off) + 1;
iter->owner = NULL; iter->owner = NULL;
iter->value = kallsyms_addresses[iter->pos]; iter->value = kallsyms_addresses[iter->pos];
if (is_kernel_text(iter->value) || is_kernel_inittext(iter->value))
iter->type = 't'; iter->type = 't';
else
iter->type = 'd';
upcase_if_global(iter); upcase_if_global(iter);
return off - iter->nameoff; return off - iter->nameoff;
......
...@@ -5,12 +5,13 @@ ...@@ -5,12 +5,13 @@
* This software may be used and distributed according to the terms * This software may be used and distributed according to the terms
* of the GNU General Public License, incorporated herein by reference. * of the GNU General Public License, incorporated herein by reference.
* *
* Usage: nm -n vmlinux | scripts/kallsyms > symbols.S * Usage: nm -n vmlinux | scripts/kallsyms [--all-symbols] > symbols.S
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <ctype.h>
struct sym_entry { struct sym_entry {
unsigned long long addr; unsigned long long addr;
...@@ -22,11 +23,12 @@ struct sym_entry { ...@@ -22,11 +23,12 @@ struct sym_entry {
static struct sym_entry *table; static struct sym_entry *table;
static int size, cnt; static int size, cnt;
static unsigned long long _stext, _etext, _sinittext, _einittext; static unsigned long long _stext, _etext, _sinittext, _einittext;
static int all_symbols = 0;
static void static void
usage(void) usage(void)
{ {
fprintf(stderr, "Usage: kallsyms < in.map > out.S\n"); fprintf(stderr, "Usage: kallsyms [--all-symbols] < in.map > out.S\n");
exit(1); exit(1);
} }
...@@ -44,6 +46,19 @@ read_symbol(FILE *in, struct sym_entry *s) ...@@ -44,6 +46,19 @@ read_symbol(FILE *in, struct sym_entry *s)
} }
return -1; return -1;
} }
/* Ignore most absolute/undefined (?) symbols. */
if (strcmp(str, "_stext") == 0)
_stext = s->addr;
else if (strcmp(str, "_etext") == 0)
_etext = s->addr;
else if (strcmp(str, "_sinittext") == 0)
_sinittext = s->addr;
else if (strcmp(str, "_einittext") == 0)
_einittext = s->addr;
else if (toupper(s->type) == 'A' || toupper(s->type) == 'U')
return -1;
s->sym = strdup(str); s->sym = strdup(str);
return 0; return 0;
} }
...@@ -51,9 +66,11 @@ read_symbol(FILE *in, struct sym_entry *s) ...@@ -51,9 +66,11 @@ read_symbol(FILE *in, struct sym_entry *s)
static int static int
symbol_valid(struct sym_entry *s) symbol_valid(struct sym_entry *s)
{ {
if (!all_symbols) {
if ((s->addr < _stext || s->addr > _etext) if ((s->addr < _stext || s->addr > _etext)
&& (s->addr < _sinittext || s->addr > _einittext)) && (s->addr < _sinittext || s->addr > _einittext))
return 0; return 0;
}
if (strstr(s->sym, "_compiled.")) if (strstr(s->sym, "_compiled."))
return 0; return 0;
...@@ -64,8 +81,6 @@ symbol_valid(struct sym_entry *s) ...@@ -64,8 +81,6 @@ symbol_valid(struct sym_entry *s)
static void static void
read_map(FILE *in) read_map(FILE *in)
{ {
int i;
while (!feof(in)) { while (!feof(in)) {
if (cnt >= size) { if (cnt >= size) {
size += 10000; size += 10000;
...@@ -78,16 +93,6 @@ read_map(FILE *in) ...@@ -78,16 +93,6 @@ read_map(FILE *in)
if (read_symbol(in, &table[cnt]) == 0) if (read_symbol(in, &table[cnt]) == 0)
cnt++; cnt++;
} }
for (i = 0; i < cnt; i++) {
if (strcmp(table[i].sym, "_stext") == 0)
_stext = table[i].addr;
if (strcmp(table[i].sym, "_etext") == 0)
_etext = table[i].addr;
if (strcmp(table[i].sym, "_sinittext") == 0)
_sinittext = table[i].addr;
if (strcmp(table[i].sym, "_einittext") == 0)
_einittext = table[i].addr;
}
} }
static void static void
...@@ -147,7 +152,9 @@ write_src(void) ...@@ -147,7 +152,9 @@ write_src(void)
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
if (argc != 1) if (argc == 2 && strcmp(argv[1], "--all-symbols") == 0)
all_symbols = 1;
else if (argc != 1)
usage(); usage();
read_map(stdin); read_map(stdin);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment