summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2008-09-25 19:32:03 +0000
committerjhb <jhb@FreeBSD.org>2008-09-25 19:32:03 +0000
commitb0ece4017cb072dbde84dc14a09b61258fcaca6e (patch)
tree1f658caf7aa40f50580bd7a382a3cb878620bc00 /gnu
parentc534a9e1e582bf57dbc941cf1a1540246ef42b56 (diff)
downloadFreeBSD-src-b0ece4017cb072dbde84dc14a09b61258fcaca6e.zip
FreeBSD-src-b0ece4017cb072dbde84dc14a09b61258fcaca6e.tar.gz
Use existing GDB routines for parsing the section table of klds in
the 'add-kld' command instead of doing it more by hand. MFC after: 1 week
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/gdb/kgdb/kld.c59
1 files changed, 23 insertions, 36 deletions
diff --git a/gnu/usr.bin/gdb/kgdb/kld.c b/gnu/usr.bin/gdb/kgdb/kld.c
index 76541cd..2ce3808 100644
--- a/gnu/usr.bin/gdb/kgdb/kld.c
+++ b/gnu/usr.bin/gdb/kgdb/kld.c
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <command.h>
#include <completer.h>
#include <environ.h>
+#include <exec.h>
#include <frame-unwind.h>
#include <inferior.h>
#include <objfiles.h>
@@ -196,39 +197,14 @@ find_kld_address (char *arg, CORE_ADDR *address)
return (0);
}
-struct add_section_info {
- struct section_addr_info *section_addrs;
- int sect_index;
- CORE_ADDR base_addr;
-};
-
-static void
-add_section (bfd *bfd, asection *sect, void *arg)
-{
- struct add_section_info *asi = arg;
- CORE_ADDR address;
- char *name;
-
- /* Ignore non-resident sections. */
- if ((bfd_get_section_flags(bfd, sect) & (SEC_ALLOC | SEC_LOAD)) == 0)
- return;
-
- name = xstrdup(bfd_get_section_name(bfd, sect));
- make_cleanup(xfree, name);
- address = asi->base_addr + bfd_get_section_vma(bfd, sect);
- asi->section_addrs->other[asi->sect_index].name = name;
- asi->section_addrs->other[asi->sect_index].addr = address;
- asi->section_addrs->other[asi->sect_index].sectindex = sect->index;
- printf_unfiltered("\t%s_addr = %s\n", name, local_hex_string(address));
- asi->sect_index++;
-}
-
static void
load_kld (char *path, CORE_ADDR base_addr, int from_tty)
{
- struct add_section_info asi;
+ struct section_addr_info *sap;
+ struct section_table *sections, *sections_end, *s;
struct cleanup *cleanup;
bfd *bfd;
+ int i;
/* Open the kld. */
bfd = bfd_openr(path, gnutarget);
@@ -244,19 +220,30 @@ load_kld (char *path, CORE_ADDR base_addr, int from_tty)
if (bfd_get_section_by_name (bfd, ".text") == NULL)
error("\"%s\": can't find text section", path);
- printf_unfiltered("add symbol table from file \"%s\" at\n", path);
+ /* Build a section table from the bfd and relocate the sections. */
+ if (build_section_table (bfd, &sections, &sections_end))
+ error("\"%s\": can't find file sections", path);
+ cleanup = make_cleanup(xfree, sections);
+ for (s = sections; s < sections_end; s++) {
+ s->addr += base_addr;
+ s->endaddr += base_addr;
+ }
+
+ /* Build a section addr info to pass to symbol_file_add(). */
+ sap = build_section_addr_info_from_section_table (sections,
+ sections_end);
+ cleanup = make_cleanup((make_cleanup_ftype *)free_section_addr_info,
+ sap);
- /* Build a section table for symbol_file_add() from the bfd sections. */
- asi.section_addrs = alloc_section_addr_info(bfd_count_sections(bfd));
- cleanup = make_cleanup(xfree, asi.section_addrs);
- asi.sect_index = 0;
- asi.base_addr = base_addr;
- bfd_map_over_sections(bfd, add_section, &asi);
+ printf_unfiltered("add symbol table from file \"%s\" at\n", path);
+ for (i = 0; i < sap->num_sections; i++)
+ printf_unfiltered("\t%s_addr = %s\n", sap->other[i].name,
+ local_hex_string(sap->other[i].addr));
if (from_tty && (!query("%s", "")))
error("Not confirmed.");
- symbol_file_add(path, from_tty, asi.section_addrs, 0, OBJF_USERLOADED);
+ symbol_file_add(path, from_tty, sap, 0, OBJF_USERLOADED);
do_cleanups(cleanup);
}
OpenPOWER on IntegriCloud