Date: Sat, 21 Aug 2010 18:55:29 +0000 (UTC) From: Andriy Gapon <avg@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r211588 - stable/7/gnu/usr.bin/gdb/kgdb Message-ID: <201008211855.o7LItTco078266@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008211855.o7LItTco078266>