From aa0a709adce23fe48ebd09ad64d8f622e5789ce3 Mon Sep 17 00:00:00 2001 From: Steve Chamberlain Date: Wed, 10 Jun 1992 14:57:25 +0000 Subject: [PATCH] Wed Jun 10 07:53:24 1992 Steve Chamberlain (sac@thepub.cygnus.com) * objdump.c(display_info), patches from mohring@informatik.tu-muenchen.de to print the table much more nicely. --- binutils/ChangeLog | 11 + binutils/objdump.c | 1106 ++++++++++++++++++++++++-------------------- 2 files changed, 611 insertions(+), 506 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index da122d49ed5..fe27f965b3a 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,14 @@ +Wed Jun 10 07:53:24 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * objdump.c(display_info), patches from + mohring@informatik.tu-muenchen.de to print the table much more + nicely. + +Thu May 28 13:36:16 1992 Per Bothner (bothner@rtl.cygnus.com) + + * objdump.c: Add another enum->int cast, for the sake of + old compilers (such as PCC). + Wed May 27 13:01:44 1992 Per Bothner (bothner@rtl.cygnus.com) * arlex.l: Don't include (unneeded conflicts). diff --git a/binutils/objdump.c b/binutils/objdump.c index a8e7cae3260..95449b43126 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -17,9 +17,6 @@ You should have received a copy of the GNU General Public License along with BFD; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* - $Id$ -*/ /* * Until there is other documentation, refer to the manual page dump(1) in * the system 5 program's reference manual @@ -33,7 +30,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -char *xmalloc(); +char *xmalloc (); char *default_target = NULL; /* default at runtime */ @@ -45,26 +42,26 @@ boolean dump_file_header; /* -f */ int dump_symtab; /* -t */ int dump_reloc_info; /* -r */ int dump_ar_hdrs; /* -a */ -int with_line_numbers; /* -l */ -boolean disassemble; /* -d */ -boolean info; /* -i */ +int with_line_numbers; /* -l */ +boolean disassemble; /* -d */ +boolean info; /* -i */ char *only; PROTO (void, display_file, (char *filename, char *target)); -PROTO (void, dump_data, (bfd *abfd)); -PROTO (void, dump_relocs, (bfd *abfd)); -PROTO (void, dump_symbols, (bfd *abfd)); -PROTO (void, print_arelt_descr, (FILE *,bfd *abfd, boolean verbose)); +PROTO (void, dump_data, (bfd * abfd)); +PROTO (void, dump_relocs, (bfd * abfd)); +PROTO (void, dump_symbols, (bfd * abfd)); +PROTO (void, print_arelt_descr, (FILE *, bfd * abfd, boolean verbose)); + - -char *machine = (char *)NULL; - asymbol **syms; - asymbol **syms2; +char *machine = (char *) NULL; +asymbol **syms; +asymbol **syms2; unsigned int storage; @@ -75,110 +72,120 @@ void usage () { fprintf (stderr, - "usage: %s [-ahifdrtxsl] [-m machine] [-j section_name] obj ...\n", + "usage: %s [-ahifdrtxsl] [-m machine] [-j section_name] obj ...\n", program_name); exit (1); } -static struct option long_options[] = - {{"syms", no_argument, &dump_symtab, 1}, - {"reloc", no_argument, &dump_reloc_info, 1}, - {"header", no_argument, &dump_section_headers, 1}, - {0, no_argument, 0, 0}}; +static struct option long_options[]= +{ + {"syms", no_argument, &dump_symtab, 1}, + {"reloc", no_argument, &dump_reloc_info, 1}, + {"header", no_argument, &dump_section_headers, 1}, + {0, no_argument, 0, 0}}; static void -dump_headers(abfd) -bfd *abfd; +dump_headers (abfd) + bfd *abfd; { asection *section; + for (section = abfd->sections; section != (asection *) NULL; - section = section->next) - { - char *comma = ""; + section = section->next) + { + char *comma = ""; + #define PF(x,y) \ if (section->flags & x) { printf("%s%s",comma,y); comma = ", "; } - printf("SECTION %d [%s]\t: size %08x", - section->index, - section->name, - (unsigned) bfd_get_section_size_before_reloc(section)); - printf(" vma "); - printf_vma(section->vma); - printf(" align 2**%u\n ", - section->alignment_power); - PF(SEC_ALLOC,"ALLOC"); - PF(SEC_CONSTRUCTOR,"CONSTRUCTOR"); - PF(SEC_CONSTRUCTOR_TEXT,"CONSTRUCTOR TEXT"); - PF(SEC_CONSTRUCTOR_DATA,"CONSTRUCTOR DATA"); - PF(SEC_CONSTRUCTOR_BSS,"CONSTRUCTOR BSS"); - PF(SEC_LOAD,"LOAD"); - PF(SEC_RELOC,"RELOC"); - PF(SEC_BALIGN,"BALIGN"); - PF(SEC_READONLY,"READONLY"); - PF(SEC_CODE,"CODE"); - PF(SEC_DATA,"DATA"); - PF(SEC_ROM,"ROM"); - printf("\n"); + printf ("SECTION %d [%s]\t: size %08x", + section->index, + section->name, + (unsigned) bfd_get_section_size_before_reloc (section)); + printf (" vma "); + printf_vma (section->vma); + printf (" align 2**%u\n ", + section->alignment_power); + PF (SEC_ALLOC, "ALLOC"); + PF (SEC_CONSTRUCTOR, "CONSTRUCTOR"); + PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT"); + PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA"); + PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS"); + PF (SEC_LOAD, "LOAD"); + PF (SEC_RELOC, "RELOC"); + PF (SEC_BALIGN, "BALIGN"); + PF (SEC_READONLY, "READONLY"); + PF (SEC_CODE, "CODE"); + PF (SEC_DATA, "DATA"); + PF (SEC_ROM, "ROM"); + printf ("\n"); #undef PF - } + } } static asymbol ** -DEFUN(slurp_symtab,(abfd), - bfd *abfd) +DEFUN (slurp_symtab, (abfd), + bfd * abfd) { - asymbol **sy = (asymbol **)NULL; - - if (!(bfd_get_file_flags (abfd) & HAS_SYMS)) { - (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd)); - return(NULL); - } + asymbol **sy = (asymbol **) NULL; - storage = get_symtab_upper_bound (abfd); - if (storage) { - sy = (asymbol **) malloc (storage); - if (sy == NULL) { - fprintf (stderr, "%s: out of memory.\n", program_name); - exit (1); - } + if (!(bfd_get_file_flags (abfd) & HAS_SYMS)) + { + (void) printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd)); + return (NULL); + } + + storage = get_symtab_upper_bound (abfd); + if (storage) + { + sy = (asymbol **) malloc (storage); + if (sy == NULL) + { + fprintf (stderr, "%s: out of memory.\n", program_name); + exit (1); } - symcount = bfd_canonicalize_symtab (abfd, sy); - return sy; + } + symcount = bfd_canonicalize_symtab (abfd, sy); + return sy; } + /* Sort symbols into value order */ -static int comp(ap,bp) -asymbol **ap; -asymbol **bp; +static int +comp (ap, bp) + asymbol **ap; + asymbol **bp; { asymbol *a = *ap; asymbol *b = *bp; int diff; - if ( a->name== (char *)NULL || (a->flags &( BSF_DEBUGGING) )) + if (a->name == (char *) NULL || (a->flags & (BSF_DEBUGGING))) a->the_bfd = 0; - if ( b->name== (char *)NULL || (b->flags &( BSF_DEBUGGING))) - b->the_bfd =0; + if (b->name == (char *) NULL || (b->flags & (BSF_DEBUGGING))) + b->the_bfd = 0; diff = a->the_bfd - b->the_bfd; - if (diff) { - return -diff; - } + if (diff) + { + return -diff; + } diff = a->value - b->value; - if (diff) { - return diff; - } - return a->section - b->section; + if (diff) + { + return diff; + } + return a->section - b->section; } /* Print the supplied address symbolically if possible */ void -print_address(vma, stream) -bfd_vma vma; -FILE *stream; +print_address (vma, stream) + bfd_vma vma; + FILE *stream; { /* Perform a binary search looking for the closest symbol to the required value */ @@ -187,225 +194,250 @@ FILE *stream; unsigned int max = symcount; unsigned int thisplace = 1; - unsigned int oldthisplace ; + unsigned int oldthisplace; int vardiff; - if (symcount == 0) { - fprintf_vma(stream, vma); - } - else { - while (true) { - oldthisplace = thisplace; - thisplace = (max + min )/2 ; - if (thisplace == oldthisplace) break; - vardiff = syms[thisplace]->value - vma; - - if (vardiff) { - if (vardiff > 0) { - max = thisplace; - } - else { - min = thisplace; - } - } - else { - /* Totally awesome! the exact right symbol */ - CONST char *match_name = syms[thisplace]->name; - int sym_len = strlen(match_name); - /* Avoid "filename.o" as a match */ - if (sym_len > 2 - && match_name[sym_len - 2] == '.' - && match_name[sym_len - 1] == 'o' - && thisplace + 1 < symcount - && syms[thisplace+1]->value == vma) - match_name = syms[thisplace+1]->name; - /* Totally awesome! the exact right symbol */ - fprintf_vma(stream, vma); - fprintf(stream," (%s+)0000", syms[thisplace]->name); - return; - } - } - /* We've run out of places to look, print the symbol before this one - see if this or the symbol before describes this location the best */ - - if (thisplace != 0) { - if (syms[thisplace-1]->value - vma > - syms[thisplace]->value-vma) { - /* Previous symbol is in correct section and is closer */ - thisplace --; - } - } - - fprintf_vma(stream, vma); - if (syms[thisplace]->value > vma) { - fprintf(stream," (%s-)", syms[thisplace]->name); - fprintf(stream,"%04x", syms[thisplace]->value - vma); + if (symcount == 0) + { + fprintf_vma (stream, vma); } - else { - fprintf(stream," (%s+)", syms[thisplace]->name); - fprintf(stream, "%04x", vma - syms[thisplace]->value); + else + { + while (true) + { + oldthisplace = thisplace; + thisplace = (max + min) / 2; + if (thisplace == oldthisplace) + break; + vardiff = syms[thisplace]->value - vma; + + if (vardiff) + { + if (vardiff > 0) + { + max = thisplace; + } + else + { + min = thisplace; + } + } + else + { + /* Totally awesome! the exact right symbol */ + CONST char *match_name = syms[thisplace]->name; + int sym_len = strlen (match_name); + + /* Avoid "filename.o" as a match */ + if (sym_len > 2 + && match_name[sym_len - 2] == '.' + && match_name[sym_len - 1] == 'o' + && thisplace + 1 < symcount + && syms[thisplace + 1]->value == vma) + match_name = syms[thisplace + 1]->name; + /* Totally awesome! the exact right symbol */ + fprintf_vma (stream, vma); + fprintf (stream, " (%s+)0000", syms[thisplace]->name); + return; + } + } + /* We've run out of places to look, print the symbol before this one + see if this or the symbol before describes this location the best */ + if (thisplace != 0) + { + if (syms[thisplace - 1]->value - vma > + syms[thisplace]->value - vma) + { + /* Previous symbol is in correct section and is closer */ + thisplace--; + } + } + fprintf_vma (stream, vma); + if (syms[thisplace]->value > vma) + { + fprintf (stream, " (%s-)", syms[thisplace]->name); + fprintf (stream, "%04x", syms[thisplace]->value - vma); + } + else + { + fprintf (stream, " (%s+)", syms[thisplace]->name); + fprintf (stream, "%04x", vma - syms[thisplace]->value); + } } - } } void -disassemble_data(abfd) -bfd *abfd; +disassemble_data (abfd) + bfd *abfd; { bfd_byte *data = NULL; - bfd_arch_info_type *info ; + bfd_arch_info_type *info; bfd_size_type datasize = 0; bfd_size_type i; - unsigned int (*print)() =0; - unsigned int print_insn_m68k(); - unsigned int print_insn_a29k(); - unsigned int print_insn_i960(); - unsigned int print_insn_sparc(); - unsigned int print_insn_i386(); - unsigned int print_insn_h8300(); + unsigned int (*print) ()= 0; + unsigned int print_insn_m68k (); + unsigned int print_insn_a29k (); + unsigned int print_insn_i960 (); + unsigned int print_insn_sparc (); + unsigned int print_insn_i386 (); + unsigned int print_insn_h8300 (); enum bfd_architecture a; asection *section; + /* Replace symbol section relative values with abs values */ boolean done_dot = false; - - for (i = 0; i < symcount; i++) { + + for (i = 0; i < symcount; i++) + { syms[i]->value += syms[i]->section->vma; - } + } /* We keep a copy of the symbols in the original order */ - syms2 = slurp_symtab(abfd); + syms2 = slurp_symtab (abfd); /* Sort the symbols into section and symbol order */ - (void) qsort(syms, symcount, sizeof(asymbol *), comp); + (void) qsort (syms, symcount, sizeof (asymbol *), comp); /* Find the first useless symbol */ - { unsigned int i; - for (i =0; i < symcount; i++) { - if (syms[i]->the_bfd == 0) { - symcount =i; - break; - } - } - } - + { + unsigned int i; + for (i = 0; i < symcount; i++) + { + if (syms[i]->the_bfd == 0) + { + symcount = i; + break; + } + } + } - if (machine!= (char *)NULL) { - info = bfd_scan_arch(machine); - if (info == 0) { - fprintf(stderr,"%s: Can't use supplied machine %s\n", - program_name, - machine); - exit(1); + if (machine != (char *) NULL) + { + info = bfd_scan_arch (machine); + if (info == 0) + { + fprintf (stderr, "%s: Can't use supplied machine %s\n", + program_name, + machine); + exit (1); + } + abfd->arch_info = info; } - abfd->arch_info = info; - } /* See if we can disassemble using bfd */ - if(abfd->arch_info->disassemble) { - print = abfd->arch_info->disassemble; - } - else { - a = bfd_get_arch(abfd); - switch (a) { - case bfd_arch_sparc: - print = print_insn_sparc; - break; - case bfd_arch_i386: - print = print_insn_i386; - break; - case bfd_arch_m68k: - print = print_insn_m68k; - break; - case bfd_arch_a29k: - print = print_insn_a29k; - break; - case bfd_arch_i960: - print = print_insn_i960; - break; - default: - fprintf(stderr,"%s: Can't disassemble for architecture %s\n", - program_name, - bfd_printable_arch_mach(bfd_get_arch(abfd),0)); - exit(1); + if (abfd->arch_info->disassemble) + { + print = abfd->arch_info->disassemble; } + else + { + a = bfd_get_arch (abfd); + switch (a) + { + case bfd_arch_sparc: + print = print_insn_sparc; + break; + case bfd_arch_i386: + print = print_insn_i386; + break; + case bfd_arch_m68k: + print = print_insn_m68k; + break; + case bfd_arch_a29k: + print = print_insn_a29k; + break; + case bfd_arch_i960: + print = print_insn_i960; + break; + default: + fprintf (stderr, "%s: Can't disassemble for architecture %s\n", + program_name, + bfd_printable_arch_mach (bfd_get_arch (abfd), 0)); + exit (1); + } - } + } for (section = abfd->sections; - section != (asection *)NULL; - section = section->next) - { - - if ((section->flags & SEC_LOAD) - &&(only == (char *)NULL ||strcmp(only,section->name) == 0)) + section != (asection *) NULL; + section = section->next) { - printf("Disassembly of section %s:\n", section->name); - if (bfd_get_section_size_before_reloc(section) == 0) continue; + if ((section->flags & SEC_LOAD) + && (only == (char *) NULL || strcmp (only, section->name) == 0)) + { + printf ("Disassembly of section %s:\n", section->name); - data = (bfd_byte *)malloc(bfd_get_section_size_before_reloc(section)); + if (bfd_get_section_size_before_reloc (section) == 0) + continue; - if (data == (bfd_byte *)NULL) { - fprintf (stderr, "%s: memory exhausted.\n", program_name); - exit (1); - } - datasize = bfd_get_section_size_before_reloc(section); + data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section)); + if (data == (bfd_byte *) NULL) + { + fprintf (stderr, "%s: memory exhausted.\n", program_name); + exit (1); + } + datasize = bfd_get_section_size_before_reloc (section); - bfd_get_section_contents (abfd, section, data, 0, bfd_get_section_size_before_reloc(section)); + bfd_get_section_contents (abfd, section, data, 0, bfd_get_section_size_before_reloc (section)); - i = 0; - while (i vma + i, - &filename, - &functionname, - &line); - - if (filename && functionname && line && line != prevline) { - printf("%s:%u\n", filename, line); - prevline = line; + i = 0; + while (i < bfd_get_section_size_before_reloc (section)) + { + if (data[i] == 0 && data[i + 1] == 0 && data[i + 2] == 0 && + data[i + 3] == 0) + { + if (done_dot == false) + { + printf ("...\n"); + done_dot = true; } + i += 4; } - print_address(section->vma + i, stdout); - printf(" "); + else + { + done_dot = false; + if (with_line_numbers) + { + static prevline; + CONST char *filename; + CONST char *functionname; + unsigned int line; + + bfd_find_nearest_line (abfd, + section, + syms, + section->vma + i, + &filename, + &functionname, + &line); + + if (filename && functionname && line && line != prevline) + { + printf ("%s:%u\n", filename, line); + prevline = line; + } + } + print_address (section->vma + i, stdout); + printf (" "); - i += print(section->vma + i, - data + i, - stdout); - putchar ('\n') ; + i += print (section->vma + i, + data + i, + stdout); + putchar ('\n'); + } } + free (data); } - - - - free(data); } - } } void @@ -413,46 +445,54 @@ display_bfd (abfd) bfd *abfd; { - if (!bfd_check_format (abfd, bfd_object)) { - fprintf (stderr,"%s: %s not an object file\n", program_name, - abfd->filename); - return; - } + if (!bfd_check_format (abfd, bfd_object)) + { + fprintf (stderr, "%s: %s not an object file\n", program_name, + abfd->filename); + return; + } printf ("\n%s: file format %s\n", abfd->filename, abfd->xvec->name); - if (dump_ar_hdrs) print_arelt_descr (stdout, abfd, true); + if (dump_ar_hdrs) + print_arelt_descr (stdout, abfd, true); - if (dump_file_header) { - char *comma = ""; + if (dump_file_header) + { + char *comma = ""; + + printf ("architecture: %s, ", + bfd_printable_arch_mach (bfd_get_arch (abfd), + bfd_get_mach (abfd))); + printf ("flags 0x%08x:\n", abfd->flags); - printf("architecture: %s, ", - bfd_printable_arch_mach (bfd_get_arch (abfd), - bfd_get_mach (abfd))); - printf("flags 0x%08x:\n", abfd->flags); - #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";} - PF(HAS_RELOC, "HAS_RELOC"); - PF(EXEC_P, "EXEC_P"); - PF(HAS_LINENO, "HAS_LINENO"); - PF(HAS_DEBUG, "HAS_DEBUG"); - PF(HAS_SYMS, "HAS_SYMS"); - PF(HAS_LOCALS, "HAS_LOCALS"); - PF(DYNAMIC, "DYNAMIC"); - PF(WP_TEXT, "WP_TEXT"); - PF(D_PAGED, "D_PAGED"); - printf("\nstart address 0x"); - printf_vma(abfd->start_address); - } - printf("\n"); + PF (HAS_RELOC, "HAS_RELOC"); + PF (EXEC_P, "EXEC_P"); + PF (HAS_LINENO, "HAS_LINENO"); + PF (HAS_DEBUG, "HAS_DEBUG"); + PF (HAS_SYMS, "HAS_SYMS"); + PF (HAS_LOCALS, "HAS_LOCALS"); + PF (DYNAMIC, "DYNAMIC"); + PF (WP_TEXT, "WP_TEXT"); + PF (D_PAGED, "D_PAGED"); + printf ("\nstart address 0x"); + printf_vma (abfd->start_address); + } + printf ("\n"); if (dump_section_headers) - dump_headers(abfd); - if (dump_symtab || dump_reloc_info || disassemble) { - syms = slurp_symtab(abfd); - } - if (dump_symtab) dump_symbols (abfd); - if (dump_reloc_info) dump_relocs(abfd); - if (dump_section_contents) dump_data (abfd); - if (disassemble) disassemble_data(abfd); + dump_headers (abfd); + if (dump_symtab || dump_reloc_info || disassemble) + { + syms = slurp_symtab (abfd); + } + if (dump_symtab) + dump_symbols (abfd); + if (dump_reloc_info) + dump_relocs (abfd); + if (dump_section_contents) + dump_data (abfd); + if (disassemble) + disassemble_data (abfd); } void @@ -463,105 +503,104 @@ display_file (filename, target) bfd *file, *arfile = (bfd *) NULL; file = bfd_openr (filename, target); - if (file == NULL) { - bfd_perror (filename); - return; - } - - if (bfd_check_format (file, bfd_archive) == true) { - printf ("In archive %s:\n", bfd_get_filename (file)); - for(;;) { - bfd_error = no_error; + if (file == NULL) + { + bfd_perror (filename); + return; + } - arfile = bfd_openr_next_archived_file (file, arfile); - if (arfile == NULL) { - if (bfd_error != no_more_archived_files) - bfd_perror (bfd_get_filename(file)); - return; - } + if (bfd_check_format (file, bfd_archive) == true) + { + printf ("In archive %s:\n", bfd_get_filename (file)); + for (;;) + { + bfd_error = no_error; + + arfile = bfd_openr_next_archived_file (file, arfile); + if (arfile == NULL) + { + if (bfd_error != no_more_archived_files) + bfd_perror (bfd_get_filename (file)); + return; + } - display_bfd (arfile); - /* Don't close the archive elements; we need them for next_archive */ + display_bfd (arfile); + /* Don't close the archive elements; we need them for next_archive */ + } } - } else - display_bfd(file); + display_bfd (file); - bfd_close(file); + bfd_close (file); } /* Actually display the various requested regions */ - - - - - - - - - void dump_data (abfd) bfd *abfd; { asection *section; - bfd_byte *data = 0; + bfd_byte *data = 0; bfd_size_type datasize = 0; bfd_size_type i; for (section = abfd->sections; section != NULL; section = - section->next) { - int onaline = 16; - - if (only == (char *)NULL || - strcmp(only,section->name) == 0){ - + section->next) + { + int onaline = 16; - if (section->flags & SEC_HAS_CONTENTS) + if (only == (char *) NULL || + strcmp (only, section->name) == 0) { - printf("Contents of section %s:\n", section->name); - - if (bfd_get_section_size_before_reloc(section) == 0) continue; - data = (bfd_byte *)malloc(bfd_get_section_size_before_reloc(section)); - if (data == (bfd_byte *)NULL) { - fprintf (stderr, "%s: memory exhausted.\n", program_name); - exit (1); - } - datasize = bfd_get_section_size_before_reloc(section); + if (section->flags & SEC_HAS_CONTENTS) + { + printf ("Contents of section %s:\n", section->name); + + if (bfd_get_section_size_before_reloc (section) == 0) + continue; + data = (bfd_byte *) malloc (bfd_get_section_size_before_reloc (section)); + if (data == (bfd_byte *) NULL) + { + fprintf (stderr, "%s: memory exhausted.\n", program_name); + exit (1); + } + datasize = bfd_get_section_size_before_reloc (section); - bfd_get_section_contents (abfd, section, (PTR)data, 0, bfd_get_section_size_before_reloc(section)); + bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_get_section_size_before_reloc (section)); - for (i= 0; i < bfd_get_section_size_before_reloc(section); i += onaline) { - bfd_size_type j; - printf(" %04lx ", (unsigned long int)(i + section->vma)); - for (j = i; j < i+ onaline; j++) { - if (j < bfd_get_section_size_before_reloc(section)) - printf("%02x", (unsigned)(data[j])); - else - printf(" "); - if ((j & 3 ) == 3) printf(" "); - } + for (i = 0; i < bfd_get_section_size_before_reloc (section); i += onaline) + { + bfd_size_type j; + + printf (" %04lx ", (unsigned long int) (i + section->vma)); + for (j = i; j < i + onaline; j++) + { + if (j < bfd_get_section_size_before_reloc (section)) + printf ("%02x", (unsigned) (data[j])); + else + printf (" "); + if ((j & 3) == 3) + printf (" "); + } - printf(" "); - for (j = i; j < i+onaline ; j++) { - if (j >= bfd_get_section_size_before_reloc(section)) - printf(" "); - else - printf("%c", isprint(data[j]) ?data[j] : '.'); + printf (" "); + for (j = i; j < i + onaline; j++) + { + if (j >= bfd_get_section_size_before_reloc (section)) + printf (" "); + else + printf ("%c", isprint (data[j]) ? data[j] : '.'); + } + putchar ('\n'); + } } - putchar ('\n'); - } } + free (data); } - - free (data); - } } - - /* Should perhaps share code and display with nm? */ void dump_symbols (abfd) @@ -570,155 +609,193 @@ dump_symbols (abfd) unsigned int count; asymbol **current = syms; - printf("SYMBOL TABLE:\n"); - for (count = 0; count < symcount; count++) { + printf ("SYMBOL TABLE:\n"); - if (*current && (*current)->the_bfd) { - bfd_print_symbol((*current)->the_bfd, - stdout, - *current, bfd_print_symbol_all); + for (count = 0; count < symcount; count++) + { - printf("\n"); + if (*current && (*current)->the_bfd) + { + bfd_print_symbol ((*current)->the_bfd, + stdout, + *current, bfd_print_symbol_all); + printf ("\n"); + + } + current++; } - current++; - } - printf("\n"); - printf("\n"); + printf ("\n"); + printf ("\n"); } - void -dump_relocs(abfd) -bfd *abfd; +dump_relocs (abfd) + bfd *abfd; { arelent **relpp; unsigned int relcount; asection *a; - for (a = abfd->sections; a != (asection *)NULL; a = a->next) { - if (a == &bfd_abs_section) continue; - if (a == &bfd_und_section) continue; - if (a == &bfd_com_section) continue; - - printf("RELOCATION RECORDS FOR [%s]:",a->name); - - if (bfd_get_reloc_upper_bound(abfd, a) == 0) { - printf(" (none)\n\n"); + + for (a = abfd->sections; a != (asection *) NULL; a = a->next) + { + if (a == &bfd_abs_section) + continue; + if (a == &bfd_und_section) + continue; + if (a == &bfd_com_section) + continue; + + printf ("RELOCATION RECORDS FOR [%s]:", a->name); + + if (bfd_get_reloc_upper_bound (abfd, a) == 0) + { + printf (" (none)\n\n"); } - else { + else + { arelent **p; - relpp = (arelent **) xmalloc( bfd_get_reloc_upper_bound(abfd,a) ); - relcount = bfd_canonicalize_reloc(abfd,a,relpp, syms); - if (relcount == 0) { - printf(" (none)\n\n"); + relpp = (arelent **) xmalloc (bfd_get_reloc_upper_bound (abfd, a)); + relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms); + if (relcount == 0) + { + printf (" (none)\n\n"); } - else { - printf("\n"); - printf("OFFSET TYPE VALUE \n"); + else + { + printf ("\n"); + printf ("OFFSET TYPE VALUE \n"); - for (p =relpp; relcount && *p != (arelent *)NULL; p++, - relcount --) { + for (p = relpp; relcount && *p != (arelent *) NULL; p++, + relcount--) + { arelent *q = *p; CONST char *sym_name; + /* CONST char *section_name = q->section == (asection *)NULL ? "*abs" :*/ /* q->section->name;*/ - CONST char *section_name = (*( q->sym_ptr_ptr))->section->name; - - if (q->sym_ptr_ptr && *q->sym_ptr_ptr) { - sym_name = (*(q->sym_ptr_ptr))->name ; + CONST char *section_name = (*(q->sym_ptr_ptr))->section->name; + + if (q->sym_ptr_ptr && *q->sym_ptr_ptr) + { + sym_name = (*(q->sym_ptr_ptr))->name; } - else { + else + { sym_name = 0; } - if (sym_name) { - printf_vma(q->address); - printf(" %-8s %s", - q->howto->name, - sym_name); + if (sym_name) + { + printf_vma (q->address); + printf (" %-8s %s", + q->howto->name, + sym_name); } - else { - printf_vma(q->address); - printf(" %-8s [%s]", - q->howto->name, - section_name); + else + { + printf_vma (q->address); + printf (" %-8s [%s]", + q->howto->name, + section_name); } - if (q->addend) { - printf("+0x"); - printf_vma(q->addend); + if (q->addend) + { + printf ("+0x"); + printf_vma (q->addend); } - printf("\n"); + printf ("\n"); } - printf("\n\n"); - free(relpp); + printf ("\n\n"); + free (relpp); } } } } +#ifdef unix +#define _DUMMY_NAME_ "/dev/null" +#else +#define _DUMMY_NAME_ "##dummy" +#endif static void -DEFUN_VOID(display_info) +DEFUN (display_info_table, (first, last), + int first AND int last) { unsigned int i, j; extern bfd_target *target_vector[]; - printf("BFD header file version %s\n", BFD_VERSION); - for (i = 0; target_vector[i] != (bfd_target *)NULL; i++) - { - bfd_target *p = target_vector[i]; - bfd *abfd = bfd_openw("##dummy",p->name); - printf("%s\n (header %s, data %s)\n", p->name, - p->header_byteorder_big_p ? "big endian" : "little endian", - p->byteorder_big_p ? "big endian" : "little endian" ); - { - for (j = (int)bfd_arch_obscure +1; j < (int)bfd_arch_last; j++) - { - - if (bfd_set_arch_mach(abfd, (enum bfd_architecture)j, 0)) - printf(" %s\n", - bfd_printable_arch_mach((enum bfd_architecture)j,0)); - - } - - } - } - /* Again as a table */ - printf("%12s"," "); - for (i = 0; target_vector[i]; i++) { - printf("%s ",target_vector[i]->name); - } - printf("\n"); - + printf ("\n%12s", " "); + for (i = first; i++ < last && target_vector[i];) + printf ("%s ", target_vector[i]->name); + printf ("\n"); - for (j = (int)bfd_arch_obscure +1; (int)j <(int) bfd_arch_last; j++) + for (j = (int) bfd_arch_obscure + 1; (int) j < (int) bfd_arch_last; j++) + if (strcmp (bfd_printable_arch_mach (j, 0), "UNKNOWN!") != 0) { - if (strcmp(bfd_printable_arch_mach(j,0),"UNKNOWN!") != 0) { - printf("%11s ", bfd_printable_arch_mach(j,0)); - for (i = 0; target_vector[i]; i++) { + printf ("%11s ", bfd_printable_arch_mach (j, 0)); + for (i = first; i++ < last && target_vector[i];) + { + bfd_target *p = target_vector[i]; + bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name); + int l = strlen (p->name); + int ok = bfd_set_arch_mach (abfd, j, 0); + + if (ok) + printf ("%s ", p->name); + else { - bfd_target *p = target_vector[i]; - bfd *abfd = bfd_openw("##dummy",p->name); - int l = strlen(p->name); - int ok = bfd_set_arch_mach(abfd, j, 0); - if (ok) { - printf("%s ", p->name); - } - else { - while (l--) { - printf("%c",ok?'*':'-'); - } - printf(" "); - } - + while (l--) + printf ("%c", ok ? '*' : '-'); + printf (" "); } - } - printf("\n"); - } + printf ("\n"); } } + +static void +DEFUN_VOID (display_info) +{ + char *colum; + unsigned int i, j, columns; + extern bfd_target *target_vector[]; + extern char *getenv (); + + printf ("BFD header file version %s\n", BFD_VERSION); + for (i = 0; target_vector[i]; i++) + { + bfd_target *p = target_vector[i]; + bfd *abfd = bfd_openw (_DUMMY_NAME_, p->name); + + printf ("%s\n (header %s, data %s)\n", p->name, + p->header_byteorder_big_p ? "big endian" : "little endian", + p->byteorder_big_p ? "big endian" : "little endian"); + for (j = (int) bfd_arch_obscure + 1; j < (int) bfd_arch_last; j++) + if (bfd_set_arch_mach (abfd, (enum bfd_architecture) j, 0)) + printf (" %s\n", + bfd_printable_arch_mach ((enum bfd_architecture) j, 0)); + } + columns = 0; + if (colum = getenv ("COLUMNS")) + columns = atoi (colum); + if (!columns) + columns = 80; + for (i = 0; target_vector[i];) + { + int old; + old = i; + for (j = 12; target_vector[i] && j < columns; i++) + j += strlen (target_vector[i]->name) + 1; + i--; + if (old == i) + break; + display_info_table (old, i); + } +} + /** main and like trivia */ int main (argc, argv) @@ -732,62 +809,79 @@ main (argc, argv) boolean seenflag = false; int ind = 0; - bfd_init(); + bfd_init (); program_name = *argv; while ((c = getopt_long (argc, argv, "ib:m:dlfahrtxsj:", long_options, &ind)) - != EOF) { - seenflag = true; - switch (c) { - case 'm': - machine = optarg; - break; - case 'j': - only = optarg; - break; - case 'l': - with_line_numbers = 1; - break; - case 'b': - target = optarg; - break; - case 'f': - dump_file_header = true; - break; - case 'i': - info = true; - break; - case 'x': - dump_symtab = 1; - dump_reloc_info = 1; - dump_file_header = true; - dump_ar_hdrs = 1; - dump_section_headers = 1; - break; - case 0 : break; /* we've been given a long option */ - case 't': dump_symtab = 1; break; - case 'd': disassemble = true ; break; - case 's': dump_section_contents = 1; break; - case 'r': dump_reloc_info = 1; break; - case 'a': dump_ar_hdrs = 1; break; - case 'h': dump_section_headers = 1; break; - default: - usage (); + != EOF) + { + seenflag = true; + switch (c) + { + case 'm': + machine = optarg; + break; + case 'j': + only = optarg; + break; + case 'l': + with_line_numbers = 1; + break; + case 'b': + target = optarg; + break; + case 'f': + dump_file_header = true; + break; + case 'i': + info = true; + break; + case 'x': + dump_symtab = 1; + dump_reloc_info = 1; + dump_file_header = true; + dump_ar_hdrs = 1; + dump_section_headers = 1; + break; + case 0: + break; /* we've been given a long option */ + case 't': + dump_symtab = 1; + break; + case 'd': + disassemble = true; + break; + case 's': + dump_section_contents = 1; + break; + case 'r': + dump_reloc_info = 1; + break; + case 'a': + dump_ar_hdrs = 1; + break; + case 'h': + dump_section_headers = 1; + break; + default: + usage (); + } } - } if (seenflag == false) usage (); - if (info) { - display_info(); - } - else { - if (optind == argc) - display_file ("a.out", target); - else - for (; optind < argc;) - display_file (argv[optind++], target); - } + if (info) + { + display_info (); + } + else + { + if (optind == argc) + display_file ("a.out", target); + else + for (; optind < argc;) + display_file (argv[optind++], target); + } return 0; } -- 2.30.2