void build_target_sections_from_bfd (struct target_ops *targ, struct bfd *abfd) { unsigned count; struct section_table *start; struct section_closure cl; count = bfd_count_sections (abfd); target_resize_to_sections (targ, count); start = targ->to_sections; cl.end = targ->to_sections; bfd_map_over_sections (abfd, add_to_section_table, &cl); gdb_assert (cl.end - start <= count); }
void xcoff_relocate_core (struct target_ops *target) { struct bfd_section *ldinfo_sec; int offset = 0; LdInfo *ldi; struct vmap *vp; int arch64 = ARCH64 (); /* Size of a struct ld_info except for the variable-length filename. */ int nonfilesz = (int)LDI_FILENAME ((LdInfo *)0, arch64); /* Allocated size of buffer. */ int buffer_size = nonfilesz; char *buffer = xmalloc (buffer_size); struct cleanup *old = make_cleanup (free_current_contents, &buffer); ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo"); if (ldinfo_sec == NULL) { bfd_err: fprintf_filtered (gdb_stderr, "Couldn't get ldinfo from core file: %s\n", bfd_errmsg (bfd_get_error ())); do_cleanups (old); return; } do { int i; int names_found = 0; /* Read in everything but the name. */ if (bfd_get_section_contents (core_bfd, ldinfo_sec, buffer, offset, nonfilesz) == 0) goto bfd_err; /* Now the name. */ i = nonfilesz; do { if (i == buffer_size) { buffer_size *= 2; buffer = xrealloc (buffer, buffer_size); } if (bfd_get_section_contents (core_bfd, ldinfo_sec, &buffer[i], offset + i, 1) == 0) goto bfd_err; if (buffer[i++] == '\0') ++names_found; } while (names_found < 2); ldi = (LdInfo *) buffer; /* Can't use a file descriptor from the core file; need to open it. */ if (arch64) ldi->l64.ldinfo_fd = -1; else ldi->l32.ldinfo_fd = -1; /* The first ldinfo is for the exec file, allocated elsewhere. */ if (offset == 0 && vmap != NULL) vp = vmap; else vp = add_vmap (ldi); /* Process next shared library upon error. */ offset += LDI_NEXT (ldi, arch64); if (vp == NULL) continue; vmap_secs (vp, ldi, arch64); /* Unless this is the exec file, add our sections to the section table for the core target. */ if (vp != vmap) { struct section_table *stp; target_resize_to_sections (target, 2); stp = target->to_sections_end - 2; stp->bfd = vp->bfd; stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".text"); stp->addr = vp->tstart; stp->endaddr = vp->tend; stp++; stp->bfd = vp->bfd; stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".data"); stp->addr = vp->dstart; stp->endaddr = vp->dend; } vmap_symtab (vp); if (deprecated_target_new_objfile_hook && vp != vmap && vp->objfile) deprecated_target_new_objfile_hook (vp->objfile); } while (LDI_NEXT (ldi, arch64) != 0); vmap_exec (); breakpoint_re_set (); do_cleanups (old); }