diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/printcmd.c | 4 | ||||
-rw-r--r-- | gdb/solib.c | 26 | ||||
-rw-r--r-- | gdb/solib.h | 4 |
4 files changed, 30 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a0cace5..a69ef7f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2009-03-09 Paul Pluzhnikov <ppluzhnikov@google.com> + + * solib.c (solib_contains_address_p): New function. + (solib_name_from_address): Use it. + * printcmd.c (display_uses_solib_p): Use it. + * solib.h (solib_contains_address_p): Declare it. + 2009-03-09 Jan Kratochvil <jan.kratochvil@redhat.com> * varobj.c (free_variable): Call value_free. diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 8a746e4..23a2230 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1767,7 +1767,7 @@ display_uses_solib_p (const struct display *d, struct expression *const exp = d->exp; if (d->block != NULL - && solib_name_from_address (d->block->startaddr) == solib->so_name) + && solib_contains_address_p (solib, d->block->startaddr)) return 1; for (i = 0; i < exp->nelts; ) @@ -1783,7 +1783,7 @@ display_uses_solib_p (const struct display *d, SYMBOL_OBJ_SECTION (symbol); if (block != NULL - && solib_name_from_address (block->startaddr) == solib->so_name) + && solib_contains_address_p (solib, block->startaddr)) return 1; if (section && section->objfile == solib->objfile) diff --git a/gdb/solib.c b/gdb/solib.c index 0bd767e..0eae200 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -834,6 +834,21 @@ info_sharedlibrary_command (char *ignore, int from_tty) } } +/* Return 1 if ADDRESS lies within SOLIB. */ + +int +solib_contains_address_p (const struct so_list *const solib, + CORE_ADDR address) +{ + struct section_table *p; + + for (p = solib->sections; p < solib->sections_end; p++) + if (p->addr <= address && address < p->endaddr) + return 1; + + return 0; +} + /* GLOBAL FUNCTION @@ -862,15 +877,8 @@ solib_name_from_address (CORE_ADDR address) struct so_list *so = 0; /* link map state variable */ for (so = so_list_head; so; so = so->next) - { - struct section_table *p; - - for (p = so->sections; p < so->sections_end; p++) - { - if (p->addr <= address && address < p->endaddr) - return (so->so_name); - } - } + if (solib_contains_address_p (so, address)) + return (so->so_name); return (0); } diff --git a/gdb/solib.h b/gdb/solib.h index e84ba0f..b4b770e 100644 --- a/gdb/solib.h +++ b/gdb/solib.h @@ -47,6 +47,10 @@ extern void solib_create_inferior_hook (void); extern char *solib_name_from_address (CORE_ADDR); +/* Return 1 if ADDR lies within SOLIB. */ + +extern int solib_contains_address_p (const struct so_list *, CORE_ADDR); + /* Return 1 if PC lies in the dynamic symbol resolution code of the run time loader. */ |