include/linux/kallsyms.h | 10 ++++++++++ kernel/kallsyms.c | 21 ++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 1cebcbc..3bb4136 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -7,6 +7,8 @@ #define KSYM_NAME_LEN 127 +#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN + \ + 2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1) #ifdef CONFIG_KALLSYMS /* Lookup the address for a symbol. Returns 0 if not found. */ @@ -22,6 +24,9 @@ const char *kallsyms_lookup(unsigned long addr, unsigned long *offset, char **modname, char *namebuf); +/* Look up a kernel symbol and return it in a text buffer. */ +extern void sprint_symbol(unsigned long addr, char *buffer); + /* Replace "%s" in format with address, if found */ extern void __print_symbol(const char *fmt, unsigned long address); @@ -47,6 +52,11 @@ static inline const char *kallsyms_lookup(unsigned long addr, return NULL; } +static inline void sprint_symbol(unsigned long addr, char *buffer) +{ + return; +} + /* Stupid that this does nothing, but I didn't create this mess. */ #define __print_symbol(fmt, addr) #endif /*CONFIG_KALLSYMS*/ diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 6f294ff..775d5e4 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -267,20 +267,17 @@ const char *kallsyms_lookup(unsigned long addr, return NULL; } -/* Replace "%s" in format with address, or returns -errno. */ -void __print_symbol(const char *fmt, unsigned long address) +/* Look up a kernel symbol and return it in a text buffer. */ +void sprint_symbol(unsigned long addr, char *buffer) { char *modname; const char *name; unsigned long offset, size; char namebuf[KSYM_NAME_LEN+1]; - char buffer[sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN + - 2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1]; - - name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); + name = kallsyms_lookup(addr, &size, &offset, &modname, namebuf); if (!name) - sprintf(buffer, "0x%lx", address); + sprintf(buffer, "0x%lx", addr); else { if (modname) sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, @@ -288,6 +285,15 @@ void __print_symbol(const char *fmt, unsigned long address) else sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); } +} + +/* Replace "%s" in format with address, or returns -errno. */ +void __print_symbol(const char *fmt, unsigned long address) +{ + char buffer[KSYM_SYMBOL_LEN]; + + sprint_symbol(address, buffer); + printk(fmt, buffer); } @@ -452,3 +458,4 @@ static int __init kallsyms_init(void) __initcall(kallsyms_init); EXPORT_SYMBOL(__print_symbol); +EXPORT_SYMBOL_GPL(sprint_symbol);