summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Buettner <kevinb@redhat.com>2000-10-30 23:31:17 +0000
committerKevin Buettner <kevinb@redhat.com>2000-10-30 23:31:17 +0000
commit48ba7a0b0c737e5b9a0d4d3b5b3f9119ec8c1a9d (patch)
tree08bd7ffd29b0aabbbee9c74f08967afbb537b767
parentfbdffe36109abeaca2439c2edaad021268b305e2 (diff)
downloadgdb-48ba7a0b0c737e5b9a0d4d3b5b3f9119ec8c1a9d.tar.gz
solib.c relocation improvements
-rw-r--r--gdb/ChangeLog26
-rw-r--r--gdb/solib-svr4.c10
-rw-r--r--gdb/solib.c62
-rw-r--r--gdb/solist.h24
4 files changed, 75 insertions, 47 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 667a3be8cbc..3109ba83c8a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,29 @@
+2000-10-30 Kevin Buettner <kevinb@redhat.com>
+
+ Changes based on analysis from Peter Schauer:
+ * solist.h (struct so_list): Remove field lmend.
+ (struct target_so_ops): Remove field lm_addr. Add field
+ relocate_section_addresses. Add comments for all fields
+ in this structure
+ (TARGET_SO_LM_ADDR): Remove.
+ (TARGET_SO_RELOCATE_SECTION_ADDRESSES): New macro.
+ * solib-svr4.c (svr4_relocate_section_addresses): New function.
+ (_initialize_svr4_solib): Remove lm_addr initialization. Add
+ initialization for relocate_section_addresses.
+ * solib.c (solib_map_sections): Invoke
+ TARGET_SO_RELOCATE_SECTION_ADDRESSES instead of using now
+ defunct TARGET_SO_LM_ADDR to relocate the section addresses.
+ Also, eliminate assignment to the lmend field since this
+ field no longer exists.
+ (symbol_add_stub): Remove machinery for determining the lowest
+ section.
+ (info_sharedlibrary_command): Print the text section starting
+ and ending addresses.
+ (solib_address): Don't use TARGET_SO_LM_ADDR, nor so->lmend to
+ determine if an address is in a shared object. Instead, scan
+ the section table and test against the starting and ending
+ addresses for each section.
+
2000-10-30 Michael Snyder <msnyder@cleaver.cygnus.com>
* config/m68k/linux.mh: Remove solib.c, solib-svr4.c from NATDEPFILES.
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 13fea47e52d..b5a0725480d 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1567,12 +1567,20 @@ svr4_free_so (struct so_list *so)
free (so->lm_info);
}
+static void
+svr4_relocate_section_addresses (struct so_list *so,
+ struct section_table *sec)
+{
+ sec->addr += LM_ADDR (so);
+ sec->endaddr += LM_ADDR (so);
+}
+
static struct target_so_ops svr4_so_ops;
void
_initialize_svr4_solib (void)
{
- svr4_so_ops.lm_addr = LM_ADDR;
+ svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses;
svr4_so_ops.free_so = svr4_free_so;
svr4_so_ops.clear_solib = svr4_clear_solib;
svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
diff --git a/gdb/solib.c b/gdb/solib.c
index 7efc56eb8e6..7da15b93702 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -180,9 +180,7 @@ solib_map_sections (PTR arg)
/* Relocate the section binding addresses as recorded in the shared
object's file by the base address to which the object was actually
mapped. */
- p->addr += TARGET_SO_LM_ADDR (so);
- p->endaddr += TARGET_SO_LM_ADDR (so);
- so->lmend = max (p->endaddr, so->lmend);
+ TARGET_SO_RELOCATE_SECTION_ADDRESSES (so, p);
if (STREQ (p->the_bfd_section->name, ".text"))
{
so->textsection = p;
@@ -248,9 +246,6 @@ symbol_add_stub (PTR arg)
{
register struct so_list *so = (struct so_list *) arg; /* catch_errs bogon */
struct section_addr_info *sap;
- CORE_ADDR lowest_addr = 0;
- int lowest_index;
- asection *lowest_sect = NULL;
/* Have we already loaded this shared object? */
ALL_OBJFILES (so->objfile)
@@ -259,35 +254,9 @@ symbol_add_stub (PTR arg)
return 1;
}
- /* Find the shared object's text segment. */
- if (so->textsection)
- {
- lowest_addr = so->textsection->addr;
- lowest_sect = bfd_get_section_by_name (so->abfd, ".text");
- lowest_index = lowest_sect->index;
- }
- else if (so->abfd != NULL)
- {
- /* If we didn't find a mapped non zero sized .text section, set
- up lowest_addr so that the relocation in symbol_file_add does
- no harm. */
- lowest_sect = bfd_get_section_by_name (so->abfd, ".text");
- if (lowest_sect == NULL)
- bfd_map_over_sections (so->abfd, find_lowest_section,
- (PTR) &lowest_sect);
- if (lowest_sect)
- {
- lowest_addr = bfd_section_vma (so->abfd, lowest_sect)
- + TARGET_SO_LM_ADDR (so);
- lowest_index = lowest_sect->index;
- }
- }
-
sap = build_section_addr_info_from_section_table (so->sections,
so->sections_end);
- sap->other[lowest_index].addr = lowest_addr;
-
so->objfile = symbol_file_add (so->so_name, so->from_tty,
sap, 0, OBJF_SHARED);
free_section_addr_info (sap);
@@ -610,12 +579,17 @@ info_sharedlibrary_command (char *ignore, int from_tty)
}
printf_unfiltered ("%-*s", addr_width,
- local_hex_string_custom (
- (unsigned long) TARGET_SO_LM_ADDR (so),
- addr_fmt));
+ so->textsection != NULL
+ ? local_hex_string_custom (
+ (unsigned long) so->textsection->addr,
+ addr_fmt)
+ : "");
printf_unfiltered ("%-*s", addr_width,
- local_hex_string_custom ((unsigned long) so->lmend,
- addr_fmt));
+ so->textsection != NULL
+ ? local_hex_string_custom (
+ (unsigned long) so->textsection->endaddr,
+ addr_fmt)
+ : "");
printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
printf_unfiltered ("%s\n", so->so_name);
}
@@ -640,10 +614,7 @@ info_sharedlibrary_command (char *ignore, int from_tty)
Provides a hook for other gdb routines to discover whether or
not a particular address is within the mapped address space of
- a shared library. Any address between the base mapping address
- and the first address beyond the end of the last mapping, is
- considered to be within the shared library address space, for
- our purposes.
+ a shared library.
For example, this routine is called at one point to disable
breakpoints which are in shared libraries that are not currently
@@ -657,8 +628,13 @@ solib_address (CORE_ADDR address)
for (so = so_list_head; so; so = so->next)
{
- if (TARGET_SO_LM_ADDR (so) <= address && address < so->lmend)
- return (so->so_name);
+ struct section_table *p;
+
+ for (p = so->sections; p < so->sections_end; p++)
+ {
+ if (p->addr <= address && address < p->endaddr)
+ return (so->so_name);
+ }
}
return (0);
diff --git a/gdb/solist.h b/gdb/solist.h
index 784ea1bed05..e55190dc8ac 100644
--- a/gdb/solist.h
+++ b/gdb/solist.h
@@ -54,7 +54,6 @@ struct so_list
are initialized when we actually add it to our symbol tables. */
bfd *abfd;
- CORE_ADDR lmend; /* upper addr bound of mapped object */
char symbols_loaded; /* flag: symbols read in yet? */
char from_tty; /* flag: print msgs? */
struct objfile *objfile; /* objfile for loaded lib */
@@ -65,12 +64,30 @@ struct so_list
struct target_so_ops
{
- CORE_ADDR (*lm_addr) (struct so_list *so);
+ /* Adjust the section binding addresses by the base address at
+ which the object was actually mapped. */
+ void (*relocate_section_addresses) (struct so_list *so,
+ struct section_table *);
+
+ /* Free the the link map info and any other private data
+ structures associated with a so_list entry. */
void (*free_so) (struct so_list *so);
+
+ /* Reset or free private data structures not associated with
+ so_list entries. */
void (*clear_solib) (void);
+
+ /* Target dependent code to run after child process fork. */
void (*solib_create_inferior_hook) (void);
+
+ /* Do additional symbol handling, lookup, etc. after symbols
+ for a shared object have been loaded. */
void (*special_symbol_handling) (void);
+
+ /* Construct a list of the currently loaded shared objects. */
struct so_list *(*current_sos) (void);
+
+ /* Find, open, and read the symbols for the main executable. */
int (*open_symbol_file_object) (void *from_ttyp);
};
@@ -79,7 +96,8 @@ void free_so (struct so_list *so);
/* FIXME: gdbarch needs to control this variable */
extern struct target_so_ops *current_target_so_ops;
-#define TARGET_SO_LM_ADDR (current_target_so_ops->lm_addr)
+#define TARGET_SO_RELOCATE_SECTION_ADDRESSES \
+ (current_target_so_ops->relocate_section_addresses)
#define TARGET_SO_FREE_SO (current_target_so_ops->free_so)
#define TARGET_SO_CLEAR_SOLIB (current_target_so_ops->clear_solib)
#define TARGET_SO_SOLIB_CREATE_INFERIOR_HOOK \