From 51b8c416772b4e6c51495c2b54f8732c4b2a513b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 29 Jan 1997 18:58:04 +0000 Subject: [PATCH] * objdump.c (objdump_print_value): Add skip_zeroes parameter. Change all callers. (objdump_print_addr_with_sym): Likewise. Call objdump_print_value to print address. (objdump_print_addr): New static function. (objdump_print_address): Just call objdump_print_addr. (disassemble_bytes): Print real address, not function offset. Skip a certain number of leading zeroes. * objdump.c (disassemble_zeroes): New static variable. (usage): Mention --disassemble-zeroes. (long_options): Add "disassemble-zeroes". (disassemble_bytes): Check disassemble_zeroes. Changes requested by LSI. --- binutils/ChangeLog | 16 ++++++ binutils/binutils.texi | 14 +++-- binutils/objdump.1 | 17 ++++-- binutils/objdump.c | 116 ++++++++++++++++++++++++++++++----------- 4 files changed, 123 insertions(+), 40 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 7cb57f2d395..98e0a115faf 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,19 @@ +Wed Jan 29 13:21:21 1997 Ian Lance Taylor + + * objdump.c (objdump_print_value): Add skip_zeroes parameter. + Change all callers. + (objdump_print_addr_with_sym): Likewise. Call objdump_print_value + to print address. + (objdump_print_addr): New static function. + (objdump_print_address): Just call objdump_print_addr. + (disassemble_bytes): Print real address, not function offset. + Skip a certain number of leading zeroes. + + * objdump.c (disassemble_zeroes): New static variable. + (usage): Mention --disassemble-zeroes. + (long_options): Add "disassemble-zeroes". + (disassemble_bytes): Check disassemble_zeroes. + Tue Jan 28 16:47:26 1997 Ian Lance Taylor * objdump.c (disassemble_bytes): Don't skip zeroes if the diff --git a/binutils/binutils.texi b/binutils/binutils.texi index 08666ccb96a..9d88a608ac4 100644 --- a/binutils/binutils.texi +++ b/binutils/binutils.texi @@ -1038,6 +1038,7 @@ Show a summary of the options to @code{objcopy}. objdump [ -a | --archive-headers ] [ -b @var{bfdname} | --target=@var{bfdname} ] [ --debugging ] [ -d | --disassemble ] [ -D | --disassemble-all ] + [ --disassemble-zeroes ] [ -EB | -EL | --endian=@{big | little @} ] [ -f | --file-headers ] [ -h | --section-headers | --headers ] [ -i | --info ] @@ -1112,6 +1113,15 @@ expected to contain instructions. Like @samp{-d}, but disassemble the contents of all sections, not just those expected to contain instructions. +@item --prefix-addresses +When disassembling, print the complete address on each line. This is +the older disassembly format. + +@item --disassemble-zeroes +Normally the disassembly output will skip blocks of zeroes. This +option directs the disassembler to disassemble those blocks, just like +any other data. + @item -EB @itemx -EL @itemx --endian=@{big|little@} @@ -1174,10 +1184,6 @@ can be useful when disasembling object files which do not describe architecture information, such as S-records. You can list the available architectures with the @samp{-i} option. -@item --prefix-addresses -When disassembling, print the complete address on each line. This is -the older disassembly format. - @item -r @itemx --reloc @cindex relocation entries, in object file diff --git a/binutils/objdump.1 b/binutils/objdump.1 index 82f9d2bbfa5..85f579d57d9 100644 --- a/binutils/objdump.1 +++ b/binutils/objdump.1 @@ -24,6 +24,7 @@ objdump \- display information from object files. .RB "[\|" \-\-debugging "\|]" .RB "[\|" \-d | \-\-disassemble "\|]" .RB "[\|" \-D | \-\-disassemble-all "\|]" +.RB "[\|" \-\-disassemble\-zeroes "\|]" .RB "[\|" \-EB | \-EL | \-\-endian=\c .I {big|little}\c \&\|] @@ -155,6 +156,17 @@ expected to contain instructions. Like \fB\-d\fP, but disassemble the contents of all sections, not just those expected to contain instructions. +.TP +.B \-\-prefix\-addresses +When disassembling, print the complete address on each line. This is +the older disassembly format. + +.TP +.B \-\-disassemble\-zeroes +Normally the disassembly output will skip blocks of zeroes. This +option directs the disassembler to disassemble those blocks, just like +any other data. + .TP .B \-EB .TP @@ -225,11 +237,6 @@ can be useful when disasembling object files which do not describe architecture information, such as S-records. You can list the available architectures with the \fB\-i\fP option. -.TP -.B \-\-prefix\-addresses -When disassembling, print the complete address on each line. This is -the older disassembly format. - .TP .B \-r .TP diff --git a/binutils/objdump.c b/binutils/objdump.c index 0963904f921..6854cf32a44 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -61,6 +61,7 @@ static int show_raw_insn; /* --show-raw-insn */ static int dump_stab_section_info; /* --stabs */ static boolean disassemble; /* -d */ static boolean disassemble_all; /* -D */ +static int disassemble_zeroes; /* --disassemble-zeroes */ static boolean formats_info; /* -i */ static char *only; /* -j secname */ static int wide_output; /* -w */ @@ -123,14 +124,17 @@ static void display_bfd PARAMS ((bfd *abfd)); static void -objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *)); +objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean)); static asymbol * find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *)); static void objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma, - struct disassemble_info *)); + struct disassemble_info *, boolean)); + +static void +objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean)); static void objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *)); @@ -157,7 +161,8 @@ usage (stream, status) fprintf (stream, "\ Usage: %s [-ahifdDprRtTxsSlw] [-b bfdname] [-m machine] [-j section-name]\n\ [--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\ - [--disassemble-all] [--file-headers] [--section-headers] [--headers]\n\ + [--disassemble-all] [--disassemble-zeroes] [--file-headers]\n\ + [--section-headers] [--headers]\n\ [--info] [--section=section-name] [--line-numbers] [--source]\n", program_name); fprintf (stream, "\ @@ -189,6 +194,7 @@ static struct option long_options[]= {"debugging", no_argument, &dump_debugging, 1}, {"disassemble", no_argument, NULL, 'd'}, {"disassemble-all", no_argument, NULL, 'D'}, + {"disassemble-zeroes", no_argument, &disassemble_zeroes, 1}, {"dynamic-reloc", no_argument, NULL, 'R'}, {"dynamic-syms", no_argument, NULL, 'T'}, {"endian", required_argument, NULL, OPTION_ENDIAN}, @@ -527,21 +533,27 @@ compare_relocs (ap, bp) return 0; } -/* Print VMA to STREAM with no leading zeroes. */ +/* Print VMA to STREAM. If SKIP_ZEROES is true, omit leading zeroes. */ static void -objdump_print_value (vma, info) +objdump_print_value (vma, info, skip_zeroes) bfd_vma vma; struct disassemble_info *info; + boolean skip_zeroes; { char buf[30]; char *p; sprintf_vma (buf, vma); - for (p = buf; *p == '0'; ++p) - ; - if (*p == '\0') - --p; + if (! skip_zeroes) + p = buf; + else + { + for (p = buf; *p == '0'; ++p) + ; + if (*p == '\0') + --p; + } (*info->fprintf_func) (info->stream, "%s", p); } @@ -673,17 +685,15 @@ find_symbol_for_address (abfd, sec, vma, require_sec, place) /* Print an address to INFO symbolically. */ static void -objdump_print_addr_with_sym (abfd, sec, sym, vma, info) +objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes) bfd *abfd; asection *sec; asymbol *sym; bfd_vma vma; struct disassemble_info *info; + boolean skip_zeroes; { - char buf[30]; - - sprintf_vma (buf, vma); - (*info->fprintf_func) (info->stream, "%s", buf); + objdump_print_value (vma, info, skip_zeroes); if (sym == NULL) { @@ -695,12 +705,12 @@ objdump_print_addr_with_sym (abfd, sec, sym, vma, info) if (vma < secaddr) { (*info->fprintf_func) (info->stream, "-"); - objdump_print_value (secaddr - vma, info); + objdump_print_value (secaddr - vma, info, true); } else if (vma > secaddr) { (*info->fprintf_func) (info->stream, "+"); - objdump_print_value (vma - secaddr, info); + objdump_print_value (vma - secaddr, info, true); } (*info->fprintf_func) (info->stream, ">"); } @@ -710,40 +720,51 @@ objdump_print_addr_with_sym (abfd, sec, sym, vma, info) if (bfd_asymbol_value (sym) > vma) { (*info->fprintf_func) (info->stream, "-"); - objdump_print_value (bfd_asymbol_value (sym) - vma, info); + objdump_print_value (bfd_asymbol_value (sym) - vma, info, true); } else if (vma > bfd_asymbol_value (sym)) { (*info->fprintf_func) (info->stream, "+"); - objdump_print_value (vma - bfd_asymbol_value (sym), info); + objdump_print_value (vma - bfd_asymbol_value (sym), info, true); } (*info->fprintf_func) (info->stream, ">"); } } -/* Print VMA symbolically to INFO if possible. */ +/* Print VMA to INFO, symbolically if possible. If SKIP_ZEROES is + true, don't output leading zeroes. */ static void -objdump_print_address (vma, info) +objdump_print_addr (vma, info, skip_zeroes) bfd_vma vma; struct disassemble_info *info; + boolean skip_zeroes; { struct objdump_disasm_info *aux; asymbol *sym; if (sorted_symcount < 1) { - char buf[30]; - - sprintf_vma (buf, vma); - (*info->fprintf_func) (info->stream, "%s", buf); + objdump_print_value (vma, info, skip_zeroes); return; } aux = (struct objdump_disasm_info *) info->application_data; sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec, (long *) NULL); - objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info); + objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info, + skip_zeroes); +} + +/* Print VMA to INFO. This function is passed to the disassembler + routine. */ + +static void +objdump_print_address (vma, info) + bfd_vma vma; + struct disassemble_info *info; +{ + objdump_print_addr (vma, info, ! prefix_addresses); } /* Hold the last function name and the last line number we displayed @@ -1018,6 +1039,7 @@ disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp, asection *section; int bytes_per_line; boolean done_dot; + int skip_addr_chars; long i; aux = (struct objdump_disasm_info *) info->application_data; @@ -1028,6 +1050,27 @@ disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp, else bytes_per_line = 16; + /* Figure out how many characters to skip at the start of an + address, to make the disassembly look nicer. We discard leading + zeroes in chunks of 4, ensuring that there is always a leading + zero remaining. */ + skip_addr_chars = 0; + if (! prefix_addresses) + { + char buf[30]; + char *s; + + sprintf_vma (buf, + section->vma + bfd_section_size (section->owner, section)); + s = buf; + while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0' + && s[4] == '0') + { + skip_addr_chars += 4; + s += 4; + } + } + info->insn_info_valid = 0; done_dot = false; @@ -1043,8 +1086,9 @@ disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp, for (z = i; z < stop; z++) if (data[z] != 0) break; - if ((info->insn_info_valid == 0 - || info->branch_delay_insns == 0) + if (! disassemble_zeroes + && (info->insn_info_valid == 0 + || info->branch_delay_insns == 0) && (z - i >= SKIP_ZEROES || (z == stop && z - i < SKIP_ZEROES_AT_END))) { @@ -1071,7 +1115,16 @@ disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp, show_line (aux->abfd, section, i); if (! prefix_addresses) - printf ("%6lx:\t", (unsigned long) (i - start)); + { + char *s; + + sprintf_vma (buf, section->vma + i); + for (s = buf + skip_addr_chars; *s == '0'; s++) + *s = ' '; + if (*s == '\0') + *--s = '0'; + printf ("%s:\t", buf + skip_addr_chars); + } else { aux->require_sec = true; @@ -1183,7 +1236,7 @@ disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp, else printf ("\t\t\t"); - objdump_print_value (section->vma + q->address - start, info); + objdump_print_value (section->vma + q->address, info, true); printf (": %s\t", q->howto->name); @@ -1209,7 +1262,7 @@ disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp, if (q->addend) { printf ("+0x"); - objdump_print_value (q->addend, info); + objdump_print_value (q->addend, info, true); } printf ("\n"); @@ -1397,7 +1450,8 @@ disassemble_data (abfd) printf ("\n"); objdump_print_addr_with_sym (abfd, section, sym, section->vma + i, - &disasm_info); + &disasm_info, + false); printf (":\n"); if (sym == NULL) -- 2.30.2