summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kallsyms.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
index bb880ba4e776..b2d21f78e229 100644
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
@@ -4,6 +4,7 @@
* Rewritten and vastly simplified by Rusty Russell for in-kernel
* module loader:
* Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation
+ * Stem compression by Andi Kleen.
*/
#include <linux/kallsyms.h>
#include <linux/module.h>
@@ -22,7 +23,7 @@ extern char _stext[], _etext[];
const char *kallsyms_lookup(unsigned long addr,
unsigned long *symbolsize,
unsigned long *offset,
- char **modname)
+ char **modname, char *namebuf)
{
unsigned long i, best = 0;
@@ -30,6 +31,8 @@ const char *kallsyms_lookup(unsigned long addr,
if ((void *)kallsyms_addresses == &kallsyms_dummy)
BUG();
+ namebuf[127] = 0;
+
if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) {
unsigned long symbol_end;
char *name = kallsyms_names;
@@ -42,8 +45,11 @@ const char *kallsyms_lookup(unsigned long addr,
}
/* Grab name */
- for (i = 0; i < best; i++)
+ for (i = 0; i < best; i++) {
+ ++name;
+ strncpy(namebuf + name[-1], name, 127);
name += strlen(name)+1;
+ }
/* Base symbol size on next symbol. */
if (best + 1 < kallsyms_num_syms)
@@ -54,7 +60,7 @@ const char *kallsyms_lookup(unsigned long addr,
*symbolsize = symbol_end - kallsyms_addresses[best];
*modname = NULL;
*offset = addr - kallsyms_addresses[best];
- return name;
+ return namebuf;
}
return module_address_lookup(addr, symbolsize, offset, modname);
@@ -66,8 +72,9 @@ void __print_symbol(const char *fmt, unsigned long address)
char *modname;
const char *name;
unsigned long offset, size;
+ char namebuf[128];
- name = kallsyms_lookup(address, &size, &offset, &modname);
+ name = kallsyms_lookup(address, &size, &offset, &modname, namebuf);
if (!name) {
char addrstr[sizeof("0x%lx") + (BITS_PER_LONG*3/10)];