Improved symbol lookup, since symbols are spread over the entire

address space.  Return the symbol that fits best instead of the first hit.
This commit is contained in:
Joey Schulze 2007-05-31 15:23:42 +00:00
parent 017e328032
commit 640b1ba8e0
2 changed files with 52 additions and 13 deletions

40
ksym.c
View File

@ -118,6 +118,11 @@
* *
* Mon May 28 08:27:51 CEST 2007: Martin Schulze <joey@infodrom.org> * Mon May 28 08:27:51 CEST 2007: Martin Schulze <joey@infodrom.org>
* Added back /usr/src/linux/System.map as fall-back location. * Added back /usr/src/linux/System.map as fall-back location.
*
* Thu May 31 16:56:26 CEST 2007: Martin Schulze <joey@infodrom.org>
* Improved symbol lookup, since symbols are spread over the entire
* address space. Return the symbol that fits best instead of
* the first hit.
*/ */
@ -654,13 +659,16 @@ char * LookupSymbol(value, sym)
auto int lp; auto int lp;
auto char *last; auto char *last;
auto char *name;
struct symbol ksym, msym;
if (!sym_array) if (!sym_array)
return((char *) 0); return((char *) 0);
last = sym_array[0].name; last = sym_array[0].name;
sym->offset = 0; ksym.offset = 0;
sym->size = 0; ksym.size = 0;
if ( value < sym_array[0].value ) if ( value < sym_array[0].value )
return((char *) 0); return((char *) 0);
@ -668,16 +676,34 @@ char * LookupSymbol(value, sym)
{ {
if ( sym_array[lp].value > value ) if ( sym_array[lp].value > value )
{ {
sym->offset = value - sym_array[lp-1].value; ksym.offset = value - sym_array[lp-1].value;
sym->size = sym_array[lp].value - \ ksym.size = sym_array[lp].value - \
sym_array[lp-1].value; sym_array[lp-1].value;
return(last); break;
} }
last = sym_array[lp].name; last = sym_array[lp].name;
} }
if ( (last = LookupModuleSymbol(value, sym)) != (char *) 0 ) name = LookupModuleSymbol(value, &msym);
if ( ksym.offset == 0 && msym.offset == 0 )
{
return((char *) 0);
}
if ( ksym.size < msym.size )
{
sym->offset = ksym.offset;
sym->size = ksym.size;
return(last); return(last);
}
else
{
sym->offset = msym.offset;
sym->size = msym.size;
return(name);
}
return((char *) 0); return((char *) 0);
} }
@ -750,6 +776,8 @@ extern char * ExpandKadds(line, el)
auto struct symbol sym; auto struct symbol sym;
sym.offset = 0;
sym.size = 0;
/* /*
* This is as handy a place to put this as anyplace. * This is as handy a place to put this as anyplace.

View File

@ -96,6 +96,11 @@
* Thu May 31 12:12:23 CEST 2007: Martin Schulze <joey@infodrom.org> * Thu May 31 12:12:23 CEST 2007: Martin Schulze <joey@infodrom.org>
* Only read kernel symbols from /proc/kallsyms if no System.map * Only read kernel symbols from /proc/kallsyms if no System.map
* has been read as it may contain more symbols. * has been read as it may contain more symbols.
*
* Thu May 31 16:56:26 CEST 2007: Martin Schulze <joey@infodrom.org>
* Improved symbol lookup, since symbols are spread over the entire
* address space. Return the symbol that fits best instead of
* the first hit.
*/ */
@ -508,29 +513,35 @@ extern char * LookupModuleSymbol(value, sym)
* Run through the list of symbols in this module and * Run through the list of symbols in this module and
* see if the address can be resolved. * see if the address can be resolved.
*/ */
for(nsym= 1, last = &mp->sym_array[0]; for(nsym = 1, last = &mp->sym_array[0];
nsym < mp->num_syms; nsym < mp->num_syms;
++nsym) ++nsym)
{ {
if ( mp->sym_array[nsym].value > value ) if ( mp->sym_array[nsym].value > value )
{
if ( sym->size == 0 ||
(mp->sym_array[nsym].value-last->value) < sym->size )
{ {
sym->offset = value - last->value; sym->offset = value - last->value;
sym->size = mp->sym_array[nsym].value - \ sym->size = mp->sym_array[nsym].value - \
last->value; last->value;
if ( mp->name == NULL )
return(last->name);
else
{
ret[sizeof(ret)-1] = '\0'; ret[sizeof(ret)-1] = '\0';
if ( mp->name == NULL )
snprintf(ret, sizeof(ret)-1,
"%s", last->name);
else
snprintf(ret, sizeof(ret)-1, snprintf(ret, sizeof(ret)-1,
"%s:%s", mp->name, last->name); "%s:%s", mp->name, last->name);
return(ret);
} }
break;
} }
last = &mp->sym_array[nsym]; last = &mp->sym_array[nsym];
} }
} }
if ( sym->size > 0 )
return(ret);
/* It has been a hopeless exercise. */ /* It has been a hopeless exercise. */
return((char *) 0); return((char *) 0);
} }