Date: Wed, 21 Jan 2009 15:25:00 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org Subject: svn commit: r187533 - stable/6/gnu/usr.bin/gdb/kgdb Message-ID: <200901211525.n0LFP0jn081608@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhb Date: Wed Jan 21 15:25:00 2009 New Revision: 187533 URL: http://svn.freebsd.org/changeset/base/187533 Log: MFC: Use existing GDB routines for parsing the section table of klds in the 'add-kld' command. Modified: stable/6/gnu/usr.bin/gdb/kgdb/ (props changed) stable/6/gnu/usr.bin/gdb/kgdb/kld.c Modified: stable/6/gnu/usr.bin/gdb/kgdb/kld.c ============================================================================== --- stable/6/gnu/usr.bin/gdb/kgdb/kld.c Wed Jan 21 15:19:38 2009 (r187532) +++ stable/6/gnu/usr.bin/gdb/kgdb/kld.c Wed Jan 21 15:25:00 2009 (r187533) @@ -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 * 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 = NULL, *sections_end = NULL, *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_add 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, §ions, §ions_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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901211525.n0LFP0jn081608>