From 2b2848e211ef08d32b8427839b95b472d8fde337 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Tue, 16 Jul 2013 20:41:55 +0000 Subject: [PATCH] * target.h (struct target_section): Delete member bfd. All users updated to use the_bfd_section->owner instead. * exec.c (add_to_section_table): Assert bfd is expected value. Remove initialization of target_section.bfd. (remove_target_sections): Update. (section_table_available_memory): Update. (section_table_xfer_memory_partial): Update. (print_section_info): Update. (exec_set_section_address): Update. * record-full.c (record_full_core_xfer_partial): Update. * solib-svr4.c (svr4_relocate_section_addresses): Update. * solib-target.c (solib_target_relocate_section_addresses): Update. * symfile.c (build_section_addr_info_from_section_table): Update. * target.c (memory_xfer_live_readonly_partial): Update. (memory_xfer_partial_1): Update. --- gdb/ChangeLog | 18 +++++++++++++++++ gdb/exec.c | 48 +++++++++++++++++++++++++++------------------- gdb/record-full.c | 7 ++++--- gdb/solib-svr4.c | 8 ++++---- gdb/solib-target.c | 5 +++-- gdb/symfile.c | 12 ++++++------ gdb/target.c | 6 ++++-- gdb/target.h | 2 -- 8 files changed, 67 insertions(+), 39 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6b8c4557d0..9bc9a33cf0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2013-07-16 Doug Evans + + * target.h (struct target_section): Delete member bfd. + All users updated to use the_bfd_section->owner instead. + * exec.c (add_to_section_table): Assert bfd is expected value. + Remove initialization of target_section.bfd. + (remove_target_sections): Update. + (section_table_available_memory): Update. + (section_table_xfer_memory_partial): Update. + (print_section_info): Update. + (exec_set_section_address): Update. + * record-full.c (record_full_core_xfer_partial): Update. + * solib-svr4.c (svr4_relocate_section_addresses): Update. + * solib-target.c (solib_target_relocate_section_addresses): Update. + * symfile.c (build_section_addr_info_from_section_table): Update. + * target.c (memory_xfer_live_readonly_partial): Update. + (memory_xfer_partial_1): Update. + 2013-07-15 Edjunior Barbosa Machado * ppc-linux-nat.c: Since the new PowerPC specific ptrace interface is diff --git a/gdb/exec.c b/gdb/exec.c index e8605b961c..5b256ef01f 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -328,6 +328,8 @@ add_to_section_table (bfd *abfd, struct bfd_section *asect, struct target_section **table_pp = (struct target_section **) table_pp_char; flagword aflag; + gdb_assert (abfd == asect->owner); + /* Check the section flags, but do not discard zero-length sections, since some symbols may still be attached to this section. For instance, we encountered on sparc-solaris 2.10 a shared library with an empty .bss @@ -338,7 +340,6 @@ add_to_section_table (bfd *abfd, struct bfd_section *asect, return; (*table_pp)->key = NULL; - (*table_pp)->bfd = abfd; (*table_pp)->the_bfd_section = asect; (*table_pp)->addr = bfd_section_vma (abfd, asect); (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect); @@ -436,7 +437,7 @@ remove_target_sections (void *key, bfd *abfd) dest = table->sections; for (src = table->sections; src < table->sections_end; src++) - if (src->key != key || src->bfd != abfd) + if (src->key != key || src->the_bfd_section->owner != abfd) { /* Keep this section. */ if (dest < src) @@ -479,7 +480,8 @@ section_table_available_memory (VEC(mem_range_s) *memory, for (p = sections; p < sections_end; p++) { - if ((bfd_get_section_flags (p->bfd, p->the_bfd_section) + if ((bfd_get_section_flags (p->the_bfd_section->owner, + p->the_bfd_section) & SEC_READONLY) == 0) continue; @@ -523,7 +525,10 @@ section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf, for (p = sections; p < sections_end; p++) { - if (section_name && strcmp (section_name, p->the_bfd_section->name) != 0) + struct bfd_section *asect = p->the_bfd_section; + bfd *abfd = asect->owner; + + if (section_name && strcmp (section_name, asect->name) != 0) continue; /* not the section we need. */ if (memaddr >= p->addr) { @@ -531,11 +536,11 @@ section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf, { /* Entire transfer is within this section. */ if (writebuf) - res = bfd_set_section_contents (p->bfd, p->the_bfd_section, + res = bfd_set_section_contents (abfd, asect, writebuf, memaddr - p->addr, len); else - res = bfd_get_section_contents (p->bfd, p->the_bfd_section, + res = bfd_get_section_contents (abfd, asect, readbuf, memaddr - p->addr, len); return (res != 0) ? len : 0; @@ -550,11 +555,11 @@ section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf, /* This section overlaps the transfer. Just do half. */ len = p->endaddr - memaddr; if (writebuf) - res = bfd_set_section_contents (p->bfd, p->the_bfd_section, + res = bfd_set_section_contents (abfd, asect, writebuf, memaddr - p->addr, len); else - res = bfd_get_section_contents (p->bfd, p->the_bfd_section, + res = bfd_get_section_contents (abfd, asect, readbuf, memaddr - p->addr, len); return (res != 0) ? len : 0; @@ -610,17 +615,18 @@ print_section_info (struct target_section_table *t, bfd *abfd) for (p = t->sections; p < t->sections_end; p++) { - asection *asect = p->the_bfd_section; + struct bfd_section *psect = p->the_bfd_section; + bfd *pbfd = psect->owner; - if ((bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD)) + if ((bfd_get_section_flags (pbfd, psect) & (SEC_ALLOC | SEC_LOAD)) != (SEC_ALLOC | SEC_LOAD)) continue; - if (bfd_get_section_vma (abfd, asect) <= abfd->start_address - && abfd->start_address < (bfd_get_section_vma (abfd, asect) - + bfd_get_section_size (asect))) + if (bfd_get_section_vma (pbfd, psect) <= abfd->start_address + && abfd->start_address < (bfd_get_section_vma (pbfd, psect) + + bfd_get_section_size (psect))) { - displacement = p->addr - bfd_get_section_vma (abfd, asect); + displacement = p->addr - bfd_get_section_vma (pbfd, psect); break; } } @@ -636,6 +642,9 @@ print_section_info (struct target_section_table *t, bfd *abfd) } for (p = t->sections; p < t->sections_end; p++) { + struct bfd_section *psect = p->the_bfd_section; + bfd *pbfd = psect->owner; + printf_filtered ("\t%s", hex_string_custom (p->addr, wid)); printf_filtered (" - %s", hex_string_custom (p->endaddr, wid)); @@ -647,11 +656,10 @@ print_section_info (struct target_section_table *t, bfd *abfd) /* FIXME: i18n: Need to rewrite this sentence. */ if (info_verbose) printf_filtered (" @ %s", - hex_string_custom (p->the_bfd_section->filepos, 8)); - printf_filtered (" is %s", bfd_section_name (p->bfd, - p->the_bfd_section)); - if (p->bfd != abfd) - printf_filtered (" in %s", bfd_get_filename (p->bfd)); + hex_string_custom (psect->filepos, 8)); + printf_filtered (" is %s", bfd_section_name (pbfd, psect)); + if (pbfd != abfd) + printf_filtered (" in %s", bfd_get_filename (pbfd)); printf_filtered ("\n"); } } @@ -720,7 +728,7 @@ exec_set_section_address (const char *filename, int index, CORE_ADDR address) table = current_target_sections; for (p = table->sections; p < table->sections_end; p++) { - if (filename_cmp (filename, p->bfd->filename) == 0 + if (filename_cmp (filename, p->the_bfd_section->owner->filename) == 0 && index == p->the_bfd_section->index) { p->endaddr += address - p->addr; diff --git a/gdb/record-full.c b/gdb/record-full.c index 3a8d32637d..1c4e68bcd2 100644 --- a/gdb/record-full.c +++ b/gdb/record-full.c @@ -2219,9 +2219,10 @@ record_full_core_xfer_partial (struct target_ops *ops, xmalloc (sizeof (struct record_full_core_buf_entry)); entry->p = p; - if (!bfd_malloc_and_get_section (p->bfd, - p->the_bfd_section, - &entry->buf)) + if (!bfd_malloc_and_get_section + (p->the_bfd_section->owner, + p->the_bfd_section, + &entry->buf)) { xfree (entry); return 0; diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 6f8d0efa85..ccfd158a94 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -2907,10 +2907,10 @@ static void svr4_relocate_section_addresses (struct so_list *so, struct target_section *sec) { - sec->addr = svr4_truncate_ptr (sec->addr + lm_addr_check (so, - sec->bfd)); - sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so, - sec->bfd)); + bfd *abfd = sec->the_bfd_section->owner; + + sec->addr = svr4_truncate_ptr (sec->addr + lm_addr_check (so, abfd)); + sec->endaddr = svr4_truncate_ptr (sec->endaddr + lm_addr_check (so, abfd)); } diff --git a/gdb/solib-target.c b/gdb/solib-target.c index 570827687f..0b6b2d2ae8 100644 --- a/gdb/solib-target.c +++ b/gdb/solib-target.c @@ -456,8 +456,9 @@ Could not relocate shared library \"%s\": bad offsets"), so->so_name); } } - offset = so->lm_info->offsets->offsets[gdb_bfd_section_index (sec->bfd, - sec->the_bfd_section)]; + offset = so->lm_info->offsets->offsets[gdb_bfd_section_index + (sec->the_bfd_section->owner, + sec->the_bfd_section)]; sec->addr += offset; sec->endaddr += offset; } diff --git a/gdb/symfile.c b/gdb/symfile.c index c22f19b007..51291054a7 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -229,15 +229,15 @@ build_section_addr_info_from_section_table (const struct target_section *start, for (stp = start, oidx = 0; stp != end; stp++) { - if (bfd_get_section_flags (stp->bfd, - stp->the_bfd_section) & (SEC_ALLOC | SEC_LOAD) + struct bfd_section *asect = stp->the_bfd_section; + bfd *abfd = asect->owner; + + if (bfd_get_section_flags (abfd, asect) & (SEC_ALLOC | SEC_LOAD) && oidx < end - start) { sap->other[oidx].addr = stp->addr; - sap->other[oidx].name - = xstrdup (bfd_section_name (stp->bfd, stp->the_bfd_section)); - sap->other[oidx].sectindex - = gdb_bfd_section_index (stp->bfd, stp->the_bfd_section); + sap->other[oidx].name = xstrdup (bfd_section_name (abfd, asect)); + sap->other[oidx].sectindex = gdb_bfd_section_index (abfd, asect); oidx++; } } diff --git a/gdb/target.c b/gdb/target.c index 920f916053..3acd6c45fa 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -1396,7 +1396,8 @@ memory_xfer_live_readonly_partial (struct target_ops *ops, secp = target_section_by_addr (ops, memaddr); if (secp != NULL - && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section) + && (bfd_get_section_flags (secp->the_bfd_section->owner, + secp->the_bfd_section) & SEC_READONLY)) { struct target_section *p; @@ -1475,7 +1476,8 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, secp = target_section_by_addr (ops, memaddr); if (secp != NULL - && (bfd_get_section_flags (secp->bfd, secp->the_bfd_section) + && (bfd_get_section_flags (secp->the_bfd_section->owner, + secp->the_bfd_section) & SEC_READONLY)) { table = target_get_section_table (ops); diff --git a/gdb/target.h b/gdb/target.h index 1bf716e5d5..2ba85d9f70 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1898,8 +1898,6 @@ struct target_section just some convenient pointer that can be used to differentiate the BFDs. These are managed only by convention. */ void *key; - - bfd *bfd; /* BFD file pointer */ }; /* Holds an array of target sections. Defined by [SECTIONS..SECTIONS_END[. */ -- 2.34.1