X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/050d45c5ea27ab282efb06551dff0f29b41a16cd..526637b56c188c96488ef73a529e40215665d22a:/gdb/xcoffexec.c diff --git a/gdb/xcoffexec.c b/gdb/xcoffexec.c index 302b53985f..2d57f92820 100644 --- a/gdb/xcoffexec.c +++ b/gdb/xcoffexec.c @@ -29,7 +29,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include -#include #include "frame.h" #include "inferior.h" @@ -39,7 +38,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "symfile.h" #include "objfiles.h" -#include "libbfd.h" /* BFD internals (sigh!) FIXME */ +#include "bfd.h" #include "xcoffsolib.h" /* Prototypes for local functions */ @@ -50,9 +49,10 @@ file_command PARAMS ((char *, int)); static void exec_close PARAMS ((int)); -struct section_table *exec_sections, *exec_sections_end; +struct vmap * +map_vmap PARAMS ((bfd *, bfd *)); -#define eq(s0, s1) !strcmp(s0, s1) +struct section_table *exec_sections, *exec_sections_end; /* Whether to open exec and core files read-only or read-write. */ @@ -66,44 +66,11 @@ extern char *getenv(); extern void add_syms_addr_command (); extern void symbol_file_command (); static void exec_files_info(); -extern struct objfile *lookup_objfile_bfd (); - -#if 0 -/* - * the vmap struct is used to describe the virtual address space of - * the target we are manipulating. The first entry is always the "exec" - * file. Subsequent entries correspond to other objects that are - * mapped into the address space of a process created from the "exec" file. - * These are either in response to exec()ing the file, in which case all - * shared libraries are loaded, or a "load" system call, followed by the - * user's issuance of a "load" command. - */ -struct vmap { - struct vmap *nxt; /* ^ to next in chain */ - bfd *bfd; /* BFD for mappable object library */ - char *name; /* ^ to object file name */ - char *member; /* ^ to member name */ - CORE_ADDR tstart; /* virtual addr where member is mapped */ - CORE_ADDR tend; /* virtual upper bound of member */ - CORE_ADDR tadj; /* heuristically derived adjustment */ - CORE_ADDR dstart; /* virtual address of data start */ - CORE_ADDR dend; /* vitrual address of data end */ -}; - - -struct vmap_and_bfd { - bfd *pbfd; - struct vmap *pvmap; -}; - -static struct vmap *vmap; /* current vmap */ -#endif /* 0 */ struct vmap *vmap; /* current vmap */ extern struct target_ops exec_ops; - /* exec_close - done with exec file, clean up all resources. */ static void @@ -111,6 +78,7 @@ exec_close(quitting) { register struct vmap *vp, *nxt; struct objfile *obj; + int need_symtab_cleanup = 0; for (nxt = vmap; vp = nxt; ) { @@ -119,34 +87,43 @@ exec_close(quitting) /* if there is an objfile associated with this bfd, free_objfile() will do proper cleanup of objfile *and* bfd. */ - if (obj = lookup_objfile_bfd (vp->bfd)) - free_objfile (obj); + if (vp->objfile) + { + free_objfile (vp->objfile); + need_symtab_cleanup = 1; + } else bfd_close(vp->bfd); - + + /* FIXME: This routine is #if 0'd in symfile.c. What should we + be doing here? Should we just free everything in + vp->objfile->symtabs? Should free_objfile do that? */ free_named_symtabs(vp->name); free(vp); } vmap = 0; - if (exec_bfd) { - bfd_close (exec_bfd); - exec_bfd = NULL; - } + /* exec_bfd was already closed (the exec file has a vmap entry). */ + exec_bfd = NULL; + if (exec_ops.to_sections) { free (exec_ops.to_sections); exec_ops.to_sections = NULL; exec_ops.to_sections_end = NULL; } + + if (need_symtab_cleanup) + clear_symtab_users (); } /* * exec_file_command - handle the "exec" command, &c. */ void -exec_file_command(filename, from_tty) -char *filename; +exec_file_command (filename, from_tty) + char *filename; + int from_tty; { target_preopen(from_tty); @@ -155,58 +132,59 @@ char *filename; /* Now open and digest the file the user requested, if any. */ - if (filename) { - char *scratch_pathname; - int scratch_chan; + if (filename) + { + char *scratch_pathname; + int scratch_chan; - filename = tilde_expand(filename); - make_cleanup (free, filename); + filename = tilde_expand(filename); + make_cleanup (free, filename); - scratch_chan = openp(getenv("PATH"), 1, filename, - write_files? O_RDWR: O_RDONLY, 0, - &scratch_pathname); - if (scratch_chan < 0) - perror_with_name(filename); - - exec_bfd = bfd_fdopenr(scratch_pathname, NULL, scratch_chan); - if (!exec_bfd) - error("Could not open `%s' as an executable file: %s" - , scratch_pathname, bfd_errmsg(bfd_error)); + scratch_chan = openp(getenv("PATH"), 1, filename, + write_files? O_RDWR: O_RDONLY, 0, + &scratch_pathname); + if (scratch_chan < 0) + perror_with_name(filename); - /* make sure we have an object file */ + exec_bfd = bfd_fdopenr(scratch_pathname, gnutarget, scratch_chan); + if (!exec_bfd) + error("Could not open `%s' as an executable file: %s", + scratch_pathname, bfd_errmsg(bfd_get_error ())); - if (!bfd_check_format(exec_bfd, bfd_object)) - error("\"%s\": not in executable format: %s.", - scratch_pathname, bfd_errmsg(bfd_error)); + /* make sure we have an object file */ + if (!bfd_check_format(exec_bfd, bfd_object)) + error("\"%s\": not in executable format: %s.", scratch_pathname, + bfd_errmsg(bfd_get_error ())); - /* setup initial vmap */ + /* setup initial vmap */ - map_vmap (exec_bfd, 0); - if (!vmap) - error("Can't find the file sections in `%s': %s", - exec_bfd->filename, bfd_errmsg(bfd_error)); + map_vmap (exec_bfd, 0); + if (!vmap) + error("Can't find the file sections in `%s': %s", exec_bfd->filename, + bfd_errmsg(bfd_get_error ())); - if (build_section_table (exec_bfd, &exec_ops.to_sections, - &exec_ops.to_sections_end)) - error ("Can't find the file sections in `%s': %s", - exec_bfd->filename, bfd_errmsg (bfd_error)); + if (build_section_table (exec_bfd, &exec_ops.to_sections, + &exec_ops.to_sections_end)) + error ("Can't find the file sections in `%s': %s", exec_bfd->filename, + bfd_errmsg (bfd_get_error ())); - /* make sure core, if present, matches */ - validate_files(); + /* make sure core, if present, matches */ + validate_files(); - push_target(&exec_ops); + push_target(&exec_ops); - /* Tell display code(if any) about the changed file name. */ + /* Tell display code(if any) about the changed file name. */ - if (exec_file_display_hook) - (*exec_file_display_hook)(filename); - } - else { - exec_close(0); /* just in case */ - if (from_tty) - printf("No exec file now.\n"); - } + if (exec_file_display_hook) + (*exec_file_display_hook)(filename); + } + else + { + exec_close(0); /* just in case */ + if (from_tty) + printf_unfiltered("No exec file now.\n"); + } } /* Set both the exec file and the symbol file, in one command. What a @@ -241,7 +219,7 @@ add_to_section_table (abfd, asect, table_pp_char) if (0 == bfd_section_size (abfd, asect)) return; (*table_pp)->bfd = abfd; - (*table_pp)->sec_ptr = asect; + (*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); (*table_pp)++; @@ -256,75 +234,68 @@ build_section_table (some_bfd, start, end) count = bfd_count_sections (some_bfd); if (count == 0) - abort(); /* return 1? */ + fatal ("aborting"); /* return 1? */ if (*start) free (*start); *start = (struct section_table *) xmalloc (count * sizeof (**start)); *end = *start; bfd_map_over_sections (some_bfd, add_to_section_table, (char *)end); if (*end > *start + count) - abort(); + fatal ("aborting"); /* We could realloc the table, but it probably loses for most files. */ return 0; } - -/* - * lookup_symtab_bfd - find if we currently have any symbol tables from bfd - */ -struct objfile * -lookup_objfile_bfd(bfd *bfd) { - register struct objfile *s; - - for (s = object_files; s; s = s->next) - if (s->obfd == bfd) - return s; - return 0; -} - - -void -sex_to_vmap(bfd *bf, sec_ptr sex, struct vmap_and_bfd *vmap_bfd) + +static void +bfdsec_to_vmap(bf, sect, arg3) + bfd *bf; + sec_ptr sect; + PTR arg3; { + struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *)arg3; register struct vmap *vp, **vpp; register struct symtab *syms; bfd *arch = vmap_bfd->pbfd; vp = vmap_bfd->pvmap; - if ((bfd_get_section_flags(bf, sex) & SEC_LOAD) == 0) + if ((bfd_get_section_flags(bf, sect) & SEC_LOAD) == 0) return; - if (!strcmp(bfd_section_name(bf, sex), ".text")) { - vp->tstart = 0; - vp->tend = vp->tstart + bfd_section_size(bf, sex); - - /* When it comes to this adjustment value, in contrast to our previous - belief shared objects should behave the same as the main load segment. - This is the offset from the beginning of text section to the first - real instruction. */ + if (STREQ(bfd_section_name(bf, sect), ".text")) + { + vp->tstart = 0; + vp->tend = vp->tstart + bfd_section_size(bf, sect); - vp->tadj = sex->filepos - bfd_section_vma(bf, sex); - } + /* When it comes to this adjustment value, in contrast to our previous + belief shared objects should behave the same as the main load segment. + This is the offset from the beginning of text section to the first + real instruction. */ - else if (!strcmp(bfd_section_name(bf, sex), ".data")) { - vp->dstart = 0; - vp->dend = vp->dstart + bfd_section_size(bf, sex); - } - - else if (!strcmp(bfd_section_name(bf, sex), ".bss")) /* FIXMEmgo */ - printf ("bss section in exec! Don't know what the heck to do!\n"); + vp->tadj = sect->filepos - bfd_section_vma(bf, sect); + } + else if (STREQ(bfd_section_name(bf, sect), ".data")) + { + vp->dstart = 0; + vp->dend = vp->dstart + bfd_section_size(bf, sect); + } + else if (STREQ(bfd_section_name(bf, sect), ".bss")) /* FIXMEmgo */ + printf_unfiltered ("bss section in exec! Don't know what the heck to do!\n"); } /* Make a vmap for the BFD "bf", which might be a member of the archive - BFD "arch". If we have not yet read in symbols for this file, do so. */ + BFD "arch". Return the new vmap. */ -map_vmap (bfd *bf, bfd *arch) +struct vmap * +map_vmap (bf, arch) + bfd *bf; + bfd *arch; { struct vmap_and_bfd vmap_bfd; struct vmap *vp, **vpp; struct objfile *obj; vp = (void*) xmalloc (sizeof (*vp)); - bzero (vp, sizeof (*vp)); + memset (vp, '\0', sizeof (*vp)); vp->nxt = 0; vp->bfd = bf; vp->name = bfd_get_filename(arch ? arch : bf); @@ -332,441 +303,14 @@ map_vmap (bfd *bf, bfd *arch) vmap_bfd.pbfd = arch; vmap_bfd.pvmap = vp; - bfd_map_over_sections (bf, sex_to_vmap, &vmap_bfd); - - obj = lookup_objfile_bfd (bf); - if (exec_bfd && !obj) { - obj = allocate_objfile (bf, 0); - -#if 0 - /* This is only needed if we want to load shared libraries no matter what. - Since we provide the choice of incremental loading of shared objects - now, we do not have to load them as default anymore. */ - - syms_from_objfile (obj, 0, 0, 0); - new_symfile_objfile (obj, 0, 0); -#endif - } + bfd_map_over_sections (bf, bfdsec_to_vmap, &vmap_bfd); /* find the end of the list, and append. */ for (vpp = &vmap; *vpp; vpp = &(*vpp)->nxt) ; *vpp = vp; -} - -/* true, if symbol table and minimal symbol table are relocated. */ - -int symtab_relocated = 0; - - -/* vmap_symtab - handle symbol translation on vmapping */ - -vmap_symtab(vp, old_start, vip) -register struct vmap *vp; -CORE_ADDR old_start; -struct stat *vip; -{ - register struct symtab *s; - register struct objfile *objfile; - register struct minimal_symbol *msymbol; - - /* - * for each symbol table generated from the vp->bfd - */ - ALL_OBJFILES (objfile) - { - for (s = objfile -> symtabs; s != NULL; s = s -> next) { - - /* skip over if this is not relocatable and doesn't have a line table */ - if (s->nonreloc && !LINETABLE (s)) - continue; - - /* matching the symbol table's BFD and the *vp's BFD is hairy. - exec_file creates a seperate BFD for possibly the - same file as symbol_file.FIXME ALL THIS MUST BE RECTIFIED. */ - - if (objfile->obfd == vp->bfd) { - /* if they match, we luck out. */ - ; - } else if (vp->member[0]) { - /* no match, and member present, not this one. */ - continue; - } else { - struct stat si; - FILE *io; - - /* - * no match, and no member. need to be sure. - */ - io = bfd_cache_lookup(objfile->obfd); - if (!io) - fatal("cannot find BFD's iostream for sym"); - /* - * see if we are referring to the same file - */ - if (fstat(fileno(io), &si) < 0) - fatal("cannot fstat BFD for sym"); - - if (vip && (si.st_dev != vip->st_dev - || si.st_ino != vip->st_ino)) - continue; - } - - if (vp->tstart != old_start) { - - /* Once we find a relocation base address for one of the symtabs - in this objfile, it will be the same for all symtabs in this - objfile. Clean this algorithm. FIXME. */ - - for (; s; s = s->next) - if (!s->nonreloc || LINETABLE(s)) - vmap_symtab_1(s, vp, old_start); - -#if 0 - Himm.., recently we nullified trampoline entry names in order not - to confuse them with real symbols. Appearently this turned into a - problem, and msymbol vector did not get relocated properly. If - msymbols have to have non-null names, then we should name - trampoline entries with empty strings. - - ALL_MSYMBOLS (objfile, msymbol) -#else - for (msymbol = objfile->msymbols; - msymbol->name || msymbol->address; (msymbol)++) -#endif - if (msymbol->address < TEXT_SEGMENT_BASE) - msymbol -> address += vp->tstart - old_start; - - break; - } - } - } - - if (vp->tstart != old_start) { - /* breakpoints need to be relocated as well. */ - fixup_breakpoints (0, TEXT_SEGMENT_BASE, vp->tstart - old_start); - } - - symtab_relocated = 1; -} - - -vmap_symtab_1(s, vp, old_start) -register struct symtab *s; -register struct vmap *vp; -CORE_ADDR old_start; -{ - register int i, j; - int len, blen; - register struct linetable *l; - struct blockvector *bv; - register struct block *b; - int depth; - register ulong reloc, dreloc; - - if ((reloc = vp->tstart - old_start) == 0) - return; - - dreloc = vp->dstart; /* data relocation */ - - /* - * The line table must be relocated. This is only present for - * .text sections, so only vp->text type maps need be considered. - */ - l = LINETABLE (s); - if (l) { - len = l->nitems; - for (i = 0; i < len; i++) - l->item[i].pc += reloc; - } - - /* if this symbol table is not relocatable, only line table should - be relocated and the rest ignored. */ - if (s->nonreloc) - return; - - bv = BLOCKVECTOR(s); - len = BLOCKVECTOR_NBLOCKS(bv); - - for (i = 0; i < len; i++) { - b = BLOCKVECTOR_BLOCK(bv, i); - - BLOCK_START(b) += reloc; - BLOCK_END(b) += reloc; - - blen = BLOCK_NSYMS(b); - for (j = 0; j < blen; j++) { - register struct symbol *sym; - - sym = BLOCK_SYM(b, j); - switch (SYMBOL_NAMESPACE(sym)) { - case STRUCT_NAMESPACE: - case UNDEF_NAMESPACE: - continue; - - case LABEL_NAMESPACE: - case VAR_NAMESPACE: - break; - } - - switch (SYMBOL_CLASS(sym)) { - case LOC_CONST: - case LOC_CONST_BYTES: - case LOC_LOCAL: - case LOC_REGISTER: - case LOC_ARG: - case LOC_LOCAL_ARG: - case LOC_REF_ARG: - case LOC_REGPARM: - case LOC_TYPEDEF: - continue; - -#ifdef FIXME - case LOC_EXTERNAL: -#endif - case LOC_LABEL: - SYMBOL_VALUE_ADDRESS(sym) += reloc; - break; - - case LOC_STATIC: - SYMBOL_VALUE_ADDRESS(sym) += dreloc; - break; - - case LOC_BLOCK: - break; - - default: - fatal("botched symbol class %x" - , SYMBOL_CLASS(sym)); - break; - } - } - } -} - -/* - * add_vmap - add a new vmap entry based on ldinfo() information - */ -add_vmap(ldi) -register struct ld_info *ldi; { - bfd *bfd, *last; - register char *mem, *objname; - - /* This ldi structure was allocated using alloca() in - xcoff_relocate_symtab(). Now we need to have persistent object - and member names, so we should save them. */ - - mem = ldi->ldinfo_filename + strlen(ldi->ldinfo_filename) + 1; - mem = savestring (mem, strlen (mem)); - objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename)); - - bfd = bfd_fdopenr(objname, NULL, ldi->ldinfo_fd); - if (!bfd) - error("Could not open `%s' as an executable file: %s", - objname, bfd_errmsg(bfd_error)); - - - /* make sure we have an object file */ - - if (bfd_check_format(bfd, bfd_object)) - map_vmap (bfd, 0); - - else if (bfd_check_format(bfd, bfd_archive)) { - last = 0; - /* - * FIXME??? am I tossing BFDs? bfd? - */ - while (last = bfd_openr_next_archived_file(bfd, last)) - if (eq(mem, last->filename)) - break; - - if (!last) { - bfd_close(bfd); - /* FIXME -- should be error */ - warning("\"%s\": member \"%s\" missing.", bfd->filename, mem); - return; - } - - if (!bfd_check_format(last, bfd_object)) { - bfd_close(last); /* XXX??? */ - goto obj_err; - } - - map_vmap (last, bfd); - } - else { - obj_err: - bfd_close(bfd); -/* FIXME -- should be error */ - warning("\"%s\": not in executable format: %s." - , objname, bfd_errmsg(bfd_error)); - return; - } -} - - -/* As well as symbol tables, exec_sections need relocation. After - the inferior process' termination, there will be a relocated symbol - table exist with no corresponding inferior process. At that time, we - need to use `exec' bfd, rather than the inferior process's memory space - to look up symbols. - - `exec_sections' need to be relocated only once, as long as the exec - file remains unchanged. -*/ -vmap_exec () -{ - static bfd *execbfd; - int i; - - if (execbfd == exec_bfd) - return; - - execbfd = exec_bfd; - - if (!vmap || !exec_ops.to_sections) - error ("vmap_exec: vmap or exec_ops.to_sections == 0\n"); - - for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++) - { - if (strcmp(".text", exec_ops.to_sections[i].sec_ptr->name) == 0) - { - exec_ops.to_sections[i].addr += vmap->tstart; - exec_ops.to_sections[i].endaddr += vmap->tstart; - } - else if (strcmp(".data", exec_ops.to_sections[i].sec_ptr->name) == 0) - { - exec_ops.to_sections[i].addr += vmap->dstart; - exec_ops.to_sections[i].endaddr += vmap->dstart; - } - } -} - - -int -text_adjustment (abfd) -bfd *abfd; -{ - static bfd *execbfd; - static int adjustment; - sec_ptr sect; - - if (exec_bfd == execbfd) - return adjustment; - - sect = bfd_get_section_by_name (abfd, ".text"); - if (sect) - adjustment = sect->filepos - sect->vma; - else - adjustment = 0x200; /* just a wild assumption */ - - return adjustment; -} - - -/* - * vmap_ldinfo - update VMAP info with ldinfo() information - * - * Input: - * ldi - ^ to ldinfo() results. - */ -vmap_ldinfo(ldi) -register struct ld_info *ldi; -{ - struct stat ii, vi; - register struct vmap *vp; - register got_one, retried; - CORE_ADDR ostart; - - /* - * for each *ldi, see if we have a corresponding *vp - * if so, update the mapping, and symbol table. - * if not, add an entry and symbol table. - */ - do { - char *name = ldi->ldinfo_filename; - char *memb = name + strlen(name) + 1; - - retried = 0; - - if (fstat(ldi->ldinfo_fd, &ii) < 0) - fatal("cannot fstat(%d) on %s" - , ldi->ldinfo_fd - , name); -retry: - for (got_one = 0, vp = vmap; vp; vp = vp->nxt) { - FILE *io; - - /* First try to find a `vp', which is the same as in ldinfo. - If not the same, just continue and grep the next `vp'. If same, - relocate its tstart, tend, dstart, dend values. If no such `vp' - found, get out of this for loop, add this ldi entry as a new vmap - (add_vmap) and come back, fins its `vp' and so on... */ - - /* The filenames are not always sufficient to match on. */ - - if ((name[0] == "/" && !eq(name, vp->name)) - || (memb[0] && !eq(memb, vp->member))) - continue; - - io = bfd_cache_lookup(vp->bfd); /* totally opaque! */ - if (!io) - fatal("cannot find BFD's iostream for %s", vp->name); - - /* see if we are referring to the same file */ - - if (fstat(fileno(io), &vi) < 0) - fatal("cannot fstat BFD for %s", vp->name); - - if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino) - continue; - - if (!retried) - close(ldi->ldinfo_fd); - - ++got_one; - - /* found a corresponding VMAP. remap! */ - ostart = vp->tstart; - - vp->tstart = ldi->ldinfo_textorg; - vp->tend = vp->tstart + ldi->ldinfo_textsize; - vp->dstart = ldi->ldinfo_dataorg; - vp->dend = vp->dstart + ldi->ldinfo_datasize; - - if (vp->tadj) { - vp->tstart += vp->tadj; - vp->tend += vp->tadj; - } - - /* relocate symbol table(s). */ - vmap_symtab(vp, ostart, &vi); - - /* there may be more, so we don't break out of the loop. */ - } - - /* if there was no matching *vp, we must perforce create the sucker(s) */ - if (!got_one && !retried) { - add_vmap(ldi); - ++retried; - goto retry; - } - } while (ldi->ldinfo_next - && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi))); - -} - -/* - * vmap_inferior - print VMAP info for inferior - */ -vmap_inferior() { - - if (inferior_pid == 0) - return 0; /* normal processing */ - - exec_files_info(); - return 1; + return vp; } /* Read or write the exec file. @@ -801,7 +345,7 @@ xfer_memory (memaddr, myaddr, len, write, target) boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type)); if (len <= 0) - abort(); + fatal ("aborting"); memend = memaddr + len; xfer_fn = write? bfd_set_section_contents: bfd_get_section_contents; @@ -813,8 +357,8 @@ xfer_memory (memaddr, myaddr, len, write, target) if (p->endaddr >= memend) { /* Entire transfer is within this section. */ - res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len); - return (res != false)? len: 0; + res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, memaddr - p->addr, len); + return (res != 0) ? len : 0; } else if (p->endaddr <= memaddr) { @@ -825,8 +369,8 @@ xfer_memory (memaddr, myaddr, len, write, target) { /* This section overlaps the transfer. Just do half. */ len = p->endaddr - memaddr; - res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len); - return (res != false)? len: 0; + res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, memaddr - p->addr, len); + return (res != 0) ? len : 0; } else if (p->addr < nextsectaddr) nextsectaddr = p->addr; @@ -845,17 +389,20 @@ print_section_info (t, abfd) { struct section_table *p; + /* FIXME-32x64: Need a version of print_address_numeric with field width. */ printf_filtered ("\t`%s', ", bfd_get_filename(abfd)); wrap_here (" "); printf_filtered ("file type %s.\n", bfd_get_target(abfd)); for (p = t->to_sections; p < t->to_sections_end; p++) { - printf_filtered ("\t%s", local_hex_string_custom (p->addr, "08")); - printf_filtered (" - %s", local_hex_string_custom (p->endaddr, "08")); + printf_filtered ("\t%s", + local_hex_string_custom ((unsigned long) p->addr, "08l")); + printf_filtered (" - %s", + local_hex_string_custom ((unsigned long) p->endaddr, "08l")); if (info_verbose) printf_filtered (" @ %s", - local_hex_string_custom (p->sec_ptr->filepos, "08")); - printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr)); + local_hex_string_custom ((unsigned long) p->the_bfd_section->filepos, "08l")); + 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)); } @@ -875,13 +422,13 @@ exec_files_info (t) if (!vp) return; - printf("\tMapping info for file `%s'.\n", vp->name); + printf_unfiltered("\tMapping info for file `%s'.\n", vp->name); - printf("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n", + printf_unfiltered("\t %8.8s %8.8s %8.8s %8.8s %8.8s %s\n", "tstart", "tend", "dstart", "dend", "section", "file(member)"); for (; vp; vp = vp->nxt) - printf("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n", + printf_unfiltered("\t0x%8.8x 0x%8.8x 0x%8.8x 0x%8.8x %s%s%s%s\n", vp->tstart, vp->tend, vp->dstart, @@ -964,8 +511,8 @@ set_section_command (args, from_tty) secaddr = parse_and_eval_address (args); for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) { - if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen) - && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') { + if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen) + && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') { offset = secaddr - p->addr; p->addr += offset; p->endaddr += offset; @@ -999,13 +546,13 @@ Specify the filename of the executable file.", find_default_create_inferior, 0, /* mourn_inferior */ 0, /* can_run */ + 0, /* notice_signals */ file_stratum, 0, /* next */ 0, 1, 0, 0, 0, /* all mem, mem, stack, regs, exec */ 0, 0, /* section pointers */ OPS_MAGIC, /* Always the last thing */ }; - void _initialize_exec() {