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, &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


More information about the svn-src-stable-7 mailing list