svn commit: r211588 - stable/7/gnu/usr.bin/gdb/kgdb
Andriy Gapon
avg at FreeBSD.org
Sat Aug 21 18:55:29 UTC 2010
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, §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;
- }
+ 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
More information about the svn-src-stable-7
mailing list