This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[patch 1/2] [BUG]kallsyms_lookup_name should return the text addres
- From: Anil S Keshavamurthy <anil dot s dot keshavamurthy at intel dot com>
- To: Linux Kernel <linux-kernel at vger dot kernel dot org>, akpm at osdl dot org
- Cc: tony dot luck at intel dot com, "Systemtap" <systemtap at sources dot redhat dot com>, "Jim Keniston" <jkenisto at us dot ibm dot com>, "Keith Owens" <kaos at sgi dot com>
- Date: Tue, 10 Jan 2006 12:39:13 -0800
- Subject: [patch 1/2] [BUG]kallsyms_lookup_name should return the text addres
- References: <20060110203912.007577046@csdlinux-2.jf.intel.com>
[PATCH][BUG]kallsyms_lookup_name should return the text addres
On architectures like IA64, kallsyms_lookup_name(name) returns
the actual text address corresponding to the "name" and sometimes
returns address of the function descriptor, the behavior is
not consistent.
The bug is kallsyms_lookup_name() -> module_kallsyms_lookup_name(mod, name)
search the name in the given module and returns the address when
name is matched. This address very well could be the address of 'U' type
which is different address than 't' type.
Example:
Here is the output of cat /proc/kallsyms when we have test1.ko using the
my_test_reentrant_export_function.
-----------------------------------------------------------------
a00000020008c090 U my_test_reentrant_export_function [test1]
a00000020008c0a0 r __ksymtab_my_test_reentrant_export_function [mon_dummy]
a00000020008c0b0 r __kstrtab_my_test_reentrant_export_function [mon_dummy]
a00000020008c0d8 r __kcrctab_my_test_reentrant_export_function [mon_dummy]
00000000a356bab8 a __crc_my_test_reentrant_export_function [mon_dummy]
a00000020008c000 T my_test_reentrant_export_function [mon_dummy]
---------------------------------------------------------------
When we have test1.ko loaded,
kallsyms_lookup_name(my_test_reentrant_export_function)
returns 0xa00000020008c090 which is a function descriptor address and
when test1.ko is removed
kallsyms_lookup_name(my_test_reentrant_export_function)
returns 0xa00000020008c000 which is the actual text address
The current patch check for 't' type(text type) and always returns
text address.
With this below fix, kallsyms_lookup_name(name) always
returns consistent text address.
Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
-------------------------------------------------------------------
kernel/module.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
Index: linux-2.6.15-mm1/kernel/module.c
===================================================================
--- linux-2.6.15-mm1.orig/kernel/module.c
+++ linux-2.6.15-mm1/kernel/module.c
@@ -2085,13 +2085,14 @@ struct module *module_get_kallsym(unsign
up(&module_mutex);
return NULL;
}
-
+/* Return the text address corresponding to this name */
static unsigned long mod_find_symname(struct module *mod, const char *name)
{
unsigned int i;
for (i = 0; i < mod->num_symtab; i++)
- if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0)
+ if ((strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0) &&
+ (mod->symtab[i].st_info == 't'))
return mod->symtab[i].st_value;
return 0;
}
--