Author: avg
Date: Sat Aug 21 18:55:28 2010
New Revision: 211588
URL: http://svn.freebsd.org/changeset/base/211588

Log:
  MFC r210424: kgdb: correctly map sections to addresses in elf object
  modules (amd64)

Modified:
  stable/7/gnu/usr.bin/gdb/kgdb/kld.c
Directory Properties:
  stable/7/gnu/usr.bin/gdb/kgdb/   (props changed)

Modified: stable/7/gnu/usr.bin/gdb/kgdb/kld.c
==============================================================================
--- stable/7/gnu/usr.bin/gdb/kgdb/kld.c Sat Aug 21 18:54:13 2010        
(r211587)
+++ stable/7/gnu/usr.bin/gdb/kgdb/kld.c Sat Aug 21 18:55:28 2010        
(r211588)
@@ -198,12 +198,32 @@ find_kld_address (char *arg, CORE_ADDR *
 }
 
 static void
+adjust_section_address (struct section_table *sec, CORE_ADDR *curr_base)
+{
+       struct bfd_section *asect = sec->the_bfd_section;
+       bfd *abfd = sec->bfd;
+
+       if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0) {
+               sec->addr += *curr_base;
+               sec->endaddr += *curr_base;
+               return;
+       }
+
+       *curr_base = align_power(*curr_base,
+           bfd_get_section_alignment(abfd, asect));
+       sec->addr = *curr_base;
+       sec->endaddr = sec->addr + bfd_section_size(abfd, asect);
+       *curr_base = sec->endaddr;
+}
+
+static void
 load_kld (char *path, CORE_ADDR base_addr, int from_tty)
 {
        struct section_addr_info *sap;
        struct section_table *sections = NULL, *sections_end = NULL, *s;
        struct cleanup *cleanup;
        bfd *bfd;
+       CORE_ADDR curr_addr;
        int i;
 
        /* Open the kld. */
@@ -224,10 +244,9 @@ load_kld (char *path, CORE_ADDR base_add
        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;
-       }
+       curr_addr = base_addr;
+       for (s = sections; s < sections_end; s++)
+               adjust_section_address(s, &curr_addr);
 
        /* Build a section addr info to pass to symbol_file_add(). */
        sap = build_section_addr_info_from_section_table (sections,
@@ -284,9 +303,12 @@ kgdb_add_kld_cmd (char *arg, int from_tt
 static void
 kld_relocate_section_addresses (struct so_list *so, struct section_table *sec)
 {
+       static CORE_ADDR curr_addr;
+
+       if (sec == so->sections)
+               curr_addr = so->lm_info->base_address;
 
-       sec->addr += so->lm_info->base_address;
-       sec->endaddr += so->lm_info->base_address;
+       adjust_section_address(sec, &curr_addr);
 }
 
 static void
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to