683203f854de0e2232c33e55cf5099964ff21aa3
[binutils-gdb.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 /* Objdump overview.
23
24 Objdump displays information about one or more object files, either on
25 their own, or inside libraries. It is commonly used as a disassembler,
26 but it can also display information about file headers, symbol tables,
27 relocations, debugging directives and more.
28
29 The flow of execution is as follows:
30
31 1. Command line arguments are checked for control switches and the
32 information to be displayed is selected.
33
34 2. Any remaining arguments are assumed to be object files, and they are
35 processed in order by display_bfd(). If the file is an archive each
36 of its elements is processed in turn.
37
38 3. The file's target architecture and binary file format are determined
39 by bfd_check_format(). If they are recognised, then dump_bfd() is
40 called.
41
42 4. dump_bfd() in turn calls separate functions to display the requested
43 item(s) of information(s). For example disassemble_data() is called if
44 a disassembly has been requested.
45
46 When disassembling the code loops through blocks of instructions bounded
47 by symbols, calling disassemble_bytes() on each block. The actual
48 disassembling is done by the libopcodes library, via a function pointer
49 supplied by the disassembler() function. */
50
51 #include "bfd.h"
52 #include "bfdver.h"
53 #include "progress.h"
54 #include "bucomm.h"
55 #include "budemang.h"
56 #include "getopt.h"
57 #include "safe-ctype.h"
58 #include "dis-asm.h"
59 #include "libiberty.h"
60 #include "demangle.h"
61 #include "debug.h"
62 #include "budbg.h"
63
64 /* Internal headers for the ELF .stab-dump code - sorry. */
65 #define BYTES_IN_WORD 32
66 #include "aout/aout64.h"
67
68 #ifdef NEED_DECLARATION_FPRINTF
69 /* This is needed by init_disassemble_info(). */
70 extern int fprintf (FILE *, const char *, ...);
71 #endif
72
73 /* Exit status. */
74 static int exit_status = 0;
75
76 static char *default_target = NULL; /* Default at runtime. */
77
78 /* The following variables are set based on arguments passed on the
79 command line. */
80 static int show_version = 0; /* Show the version number. */
81 static int dump_section_contents; /* -s */
82 static int dump_section_headers; /* -h */
83 static bfd_boolean dump_file_header; /* -f */
84 static int dump_symtab; /* -t */
85 static int dump_dynamic_symtab; /* -T */
86 static int dump_reloc_info; /* -r */
87 static int dump_dynamic_reloc_info; /* -R */
88 static int dump_ar_hdrs; /* -a */
89 static int dump_private_headers; /* -p */
90 static int prefix_addresses; /* --prefix-addresses */
91 static int with_line_numbers; /* -l */
92 static bfd_boolean with_source_code; /* -S */
93 static int show_raw_insn; /* --show-raw-insn */
94 static int dump_stab_section_info; /* --stabs */
95 static int do_demangle; /* -C, --demangle */
96 static bfd_boolean disassemble; /* -d */
97 static bfd_boolean disassemble_all; /* -D */
98 static int disassemble_zeroes; /* --disassemble-zeroes */
99 static bfd_boolean formats_info; /* -i */
100 static int wide_output; /* -w */
101 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
102 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
103 static int dump_debugging; /* --debugging */
104 static int dump_debugging_tags; /* --debugging-tags */
105 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
106 static int file_start_context = 0; /* --file-start-context */
107
108 /* Pointer to an array of section names provided by
109 one or more "-j secname" command line options. */
110 static char **only;
111 /* The total number of slots in the only[] array. */
112 static size_t only_size = 0;
113 /* The number of occupied slots in the only[] array. */
114 static size_t only_used = 0;
115
116 /* Variables for handling include file path table. */
117 static const char **include_paths;
118 static int include_path_count;
119
120 /* Extra info to pass to the section disassembler and address printing
121 function. */
122 struct objdump_disasm_info
123 {
124 bfd * abfd;
125 asection * sec;
126 bfd_boolean require_sec;
127 arelent ** dynrelbuf;
128 long dynrelcount;
129 disassembler_ftype disassemble_fn;
130 };
131
132 /* Architecture to disassemble for, or default if NULL. */
133 static char *machine = NULL;
134
135 /* Target specific options to the disassembler. */
136 static char *disassembler_options = NULL;
137
138 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
139 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
140
141 /* The symbol table. */
142 static asymbol **syms;
143
144 /* Number of symbols in `syms'. */
145 static long symcount = 0;
146
147 /* The sorted symbol table. */
148 static asymbol **sorted_syms;
149
150 /* Number of symbols in `sorted_syms'. */
151 static long sorted_symcount = 0;
152
153 /* The dynamic symbol table. */
154 static asymbol **dynsyms;
155
156 /* The synthetic symbol table. */
157 static asymbol *synthsyms;
158 static long synthcount = 0;
159
160 /* Number of symbols in `dynsyms'. */
161 static long dynsymcount = 0;
162
163 static bfd_byte *stabs;
164 static bfd_size_type stab_size;
165
166 static char *strtab;
167 static bfd_size_type stabstr_size;
168 \f
169 static void
170 usage (FILE *stream, int status)
171 {
172 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
173 fprintf (stream, _(" Display information from object <file(s)>.\n"));
174 fprintf (stream, _(" At least one of the following switches must be given:\n"));
175 fprintf (stream, _("\
176 -a, --archive-headers Display archive header information\n\
177 -f, --file-headers Display the contents of the overall file header\n\
178 -p, --private-headers Display object format specific file header contents\n\
179 -h, --[section-]headers Display the contents of the section headers\n\
180 -x, --all-headers Display the contents of all headers\n\
181 -d, --disassemble Display assembler contents of executable sections\n\
182 -D, --disassemble-all Display assembler contents of all sections\n\
183 -S, --source Intermix source code with disassembly\n\
184 -s, --full-contents Display the full contents of all sections requested\n\
185 -g, --debugging Display debug information in object file\n\
186 -e, --debugging-tags Display debug information using ctags style\n\
187 -G, --stabs Display (in raw form) any STABS info in the file\n\
188 -t, --syms Display the contents of the symbol table(s)\n\
189 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
190 -r, --reloc Display the relocation entries in the file\n\
191 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
192 -v, --version Display this program's version number\n\
193 -i, --info List object formats and architectures supported\n\
194 -H, --help Display this information\n\
195 "));
196 if (status != 2)
197 {
198 fprintf (stream, _("\n The following switches are optional:\n"));
199 fprintf (stream, _("\
200 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
201 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
202 -j, --section=NAME Only display information for section NAME\n\
203 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
204 -EB --endian=big Assume big endian format when disassembling\n\
205 -EL --endian=little Assume little endian format when disassembling\n\
206 --file-start-context Include context from start of file (with -S)\n\
207 -I, --include=DIR Add DIR to search list for source files\n\
208 -l, --line-numbers Include line numbers and filenames in output\n\
209 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
210 The STYLE, if specified, can be `auto', `gnu',\n\
211 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
212 or `gnat'\n\
213 -w, --wide Format output for more than 80 columns\n\
214 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
215 --start-address=ADDR Only process data whose address is >= ADDR\n\
216 --stop-address=ADDR Only process data whose address is <= ADDR\n\
217 --prefix-addresses Print complete address alongside disassembly\n\
218 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
219 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
220 \n"));
221 list_supported_targets (program_name, stream);
222 list_supported_architectures (program_name, stream);
223
224 disassembler_usage (stream);
225 }
226 if (status == 0)
227 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
228 exit (status);
229 }
230
231 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
232 enum option_values
233 {
234 OPTION_ENDIAN=150,
235 OPTION_START_ADDRESS,
236 OPTION_STOP_ADDRESS,
237 OPTION_ADJUST_VMA
238 };
239
240 static struct option long_options[]=
241 {
242 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
243 {"all-headers", no_argument, NULL, 'x'},
244 {"private-headers", no_argument, NULL, 'p'},
245 {"architecture", required_argument, NULL, 'm'},
246 {"archive-headers", no_argument, NULL, 'a'},
247 {"debugging", no_argument, NULL, 'g'},
248 {"debugging-tags", no_argument, NULL, 'e'},
249 {"demangle", optional_argument, NULL, 'C'},
250 {"disassemble", no_argument, NULL, 'd'},
251 {"disassemble-all", no_argument, NULL, 'D'},
252 {"disassembler-options", required_argument, NULL, 'M'},
253 {"disassemble-zeroes", no_argument, NULL, 'z'},
254 {"dynamic-reloc", no_argument, NULL, 'R'},
255 {"dynamic-syms", no_argument, NULL, 'T'},
256 {"endian", required_argument, NULL, OPTION_ENDIAN},
257 {"file-headers", no_argument, NULL, 'f'},
258 {"file-start-context", no_argument, &file_start_context, 1},
259 {"full-contents", no_argument, NULL, 's'},
260 {"headers", no_argument, NULL, 'h'},
261 {"help", no_argument, NULL, 'H'},
262 {"info", no_argument, NULL, 'i'},
263 {"line-numbers", no_argument, NULL, 'l'},
264 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
265 {"prefix-addresses", no_argument, &prefix_addresses, 1},
266 {"reloc", no_argument, NULL, 'r'},
267 {"section", required_argument, NULL, 'j'},
268 {"section-headers", no_argument, NULL, 'h'},
269 {"show-raw-insn", no_argument, &show_raw_insn, 1},
270 {"source", no_argument, NULL, 'S'},
271 {"include", required_argument, NULL, 'I'},
272 {"stabs", no_argument, NULL, 'G'},
273 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
274 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
275 {"syms", no_argument, NULL, 't'},
276 {"target", required_argument, NULL, 'b'},
277 {"version", no_argument, NULL, 'V'},
278 {"wide", no_argument, NULL, 'w'},
279 {0, no_argument, 0, 0}
280 };
281 \f
282 static void
283 nonfatal (const char *msg)
284 {
285 bfd_nonfatal (msg);
286 exit_status = 1;
287 }
288 \f
289 static void
290 dump_section_header (bfd *abfd ATTRIBUTE_UNUSED, asection *section,
291 void *ignored ATTRIBUTE_UNUSED)
292 {
293 char *comma = "";
294 unsigned int opb = bfd_octets_per_byte (abfd);
295
296 printf ("%3d %-13s %08lx ", section->index,
297 bfd_get_section_name (abfd, section),
298 (unsigned long) bfd_section_size (abfd, section) / opb);
299 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
300 printf (" ");
301 bfd_printf_vma (abfd, section->lma);
302 printf (" %08lx 2**%u", (unsigned long) section->filepos,
303 bfd_get_section_alignment (abfd, section));
304 if (! wide_output)
305 printf ("\n ");
306 printf (" ");
307
308 #define PF(x, y) \
309 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
310
311 PF (SEC_HAS_CONTENTS, "CONTENTS");
312 PF (SEC_ALLOC, "ALLOC");
313 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
314 PF (SEC_LOAD, "LOAD");
315 PF (SEC_RELOC, "RELOC");
316 PF (SEC_READONLY, "READONLY");
317 PF (SEC_CODE, "CODE");
318 PF (SEC_DATA, "DATA");
319 PF (SEC_ROM, "ROM");
320 PF (SEC_DEBUGGING, "DEBUGGING");
321 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
322 PF (SEC_EXCLUDE, "EXCLUDE");
323 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
324 PF (SEC_BLOCK, "BLOCK");
325 PF (SEC_CLINK, "CLINK");
326 PF (SEC_SMALL_DATA, "SMALL_DATA");
327 PF (SEC_SHARED, "SHARED");
328 PF (SEC_ARCH_BIT_0, "ARCH_BIT_0");
329 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
330
331 if ((section->flags & SEC_LINK_ONCE) != 0)
332 {
333 const char *ls;
334 struct coff_comdat_info *comdat;
335
336 switch (section->flags & SEC_LINK_DUPLICATES)
337 {
338 default:
339 abort ();
340 case SEC_LINK_DUPLICATES_DISCARD:
341 ls = "LINK_ONCE_DISCARD";
342 break;
343 case SEC_LINK_DUPLICATES_ONE_ONLY:
344 ls = "LINK_ONCE_ONE_ONLY";
345 break;
346 case SEC_LINK_DUPLICATES_SAME_SIZE:
347 ls = "LINK_ONCE_SAME_SIZE";
348 break;
349 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
350 ls = "LINK_ONCE_SAME_CONTENTS";
351 break;
352 }
353 printf ("%s%s", comma, ls);
354
355 comdat = bfd_coff_get_comdat_section (abfd, section);
356 if (comdat != NULL)
357 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
358
359 comma = ", ";
360 }
361
362 printf ("\n");
363 #undef PF
364 }
365
366 static void
367 dump_headers (bfd *abfd)
368 {
369 printf (_("Sections:\n"));
370
371 #ifndef BFD64
372 printf (_("Idx Name Size VMA LMA File off Algn"));
373 #else
374 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
375 if (bfd_get_arch_size (abfd) == 32)
376 printf (_("Idx Name Size VMA LMA File off Algn"));
377 else
378 printf (_("Idx Name Size VMA LMA File off Algn"));
379 #endif
380
381 if (wide_output)
382 printf (_(" Flags"));
383 if (abfd->flags & HAS_LOAD_PAGE)
384 printf (_(" Pg"));
385 printf ("\n");
386
387 bfd_map_over_sections (abfd, dump_section_header, NULL);
388 }
389 \f
390 static asymbol **
391 slurp_symtab (bfd *abfd)
392 {
393 asymbol **sy = NULL;
394 long storage;
395
396 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
397 {
398 symcount = 0;
399 return NULL;
400 }
401
402 storage = bfd_get_symtab_upper_bound (abfd);
403 if (storage < 0)
404 bfd_fatal (bfd_get_filename (abfd));
405 if (storage)
406 sy = xmalloc (storage);
407
408 symcount = bfd_canonicalize_symtab (abfd, sy);
409 if (symcount < 0)
410 bfd_fatal (bfd_get_filename (abfd));
411 return sy;
412 }
413
414 /* Read in the dynamic symbols. */
415
416 static asymbol **
417 slurp_dynamic_symtab (bfd *abfd)
418 {
419 asymbol **sy = NULL;
420 long storage;
421
422 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
423 if (storage < 0)
424 {
425 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
426 {
427 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
428 dynsymcount = 0;
429 return NULL;
430 }
431
432 bfd_fatal (bfd_get_filename (abfd));
433 }
434 if (storage)
435 sy = xmalloc (storage);
436
437 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
438 if (dynsymcount < 0)
439 bfd_fatal (bfd_get_filename (abfd));
440 return sy;
441 }
442
443 /* Filter out (in place) symbols that are useless for disassembly.
444 COUNT is the number of elements in SYMBOLS.
445 Return the number of useful symbols. */
446
447 static long
448 remove_useless_symbols (asymbol **symbols, long count)
449 {
450 asymbol **in_ptr = symbols, **out_ptr = symbols;
451
452 while (--count >= 0)
453 {
454 asymbol *sym = *in_ptr++;
455
456 if (sym->name == NULL || sym->name[0] == '\0')
457 continue;
458 if (sym->flags & (BSF_DEBUGGING))
459 continue;
460 if (bfd_is_und_section (sym->section)
461 || bfd_is_com_section (sym->section))
462 continue;
463
464 *out_ptr++ = sym;
465 }
466 return out_ptr - symbols;
467 }
468
469 /* Sort symbols into value order. */
470
471 static int
472 compare_symbols (const void *ap, const void *bp)
473 {
474 const asymbol *a = * (const asymbol **) ap;
475 const asymbol *b = * (const asymbol **) bp;
476 const char *an;
477 const char *bn;
478 size_t anl;
479 size_t bnl;
480 bfd_boolean af;
481 bfd_boolean bf;
482 flagword aflags;
483 flagword bflags;
484
485 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
486 return 1;
487 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
488 return -1;
489
490 if (a->section > b->section)
491 return 1;
492 else if (a->section < b->section)
493 return -1;
494
495 an = bfd_asymbol_name (a);
496 bn = bfd_asymbol_name (b);
497 anl = strlen (an);
498 bnl = strlen (bn);
499
500 /* The symbols gnu_compiled and gcc2_compiled convey no real
501 information, so put them after other symbols with the same value. */
502 af = (strstr (an, "gnu_compiled") != NULL
503 || strstr (an, "gcc2_compiled") != NULL);
504 bf = (strstr (bn, "gnu_compiled") != NULL
505 || strstr (bn, "gcc2_compiled") != NULL);
506
507 if (af && ! bf)
508 return 1;
509 if (! af && bf)
510 return -1;
511
512 /* We use a heuristic for the file name, to try to sort it after
513 more useful symbols. It may not work on non Unix systems, but it
514 doesn't really matter; the only difference is precisely which
515 symbol names get printed. */
516
517 #define file_symbol(s, sn, snl) \
518 (((s)->flags & BSF_FILE) != 0 \
519 || ((sn)[(snl) - 2] == '.' \
520 && ((sn)[(snl) - 1] == 'o' \
521 || (sn)[(snl) - 1] == 'a')))
522
523 af = file_symbol (a, an, anl);
524 bf = file_symbol (b, bn, bnl);
525
526 if (af && ! bf)
527 return 1;
528 if (! af && bf)
529 return -1;
530
531 /* Try to sort global symbols before local symbols before function
532 symbols before debugging symbols. */
533
534 aflags = a->flags;
535 bflags = b->flags;
536
537 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
538 {
539 if ((aflags & BSF_DEBUGGING) != 0)
540 return 1;
541 else
542 return -1;
543 }
544 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
545 {
546 if ((aflags & BSF_FUNCTION) != 0)
547 return -1;
548 else
549 return 1;
550 }
551 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
552 {
553 if ((aflags & BSF_LOCAL) != 0)
554 return 1;
555 else
556 return -1;
557 }
558 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
559 {
560 if ((aflags & BSF_GLOBAL) != 0)
561 return -1;
562 else
563 return 1;
564 }
565
566 /* Symbols that start with '.' might be section names, so sort them
567 after symbols that don't start with '.'. */
568 if (an[0] == '.' && bn[0] != '.')
569 return 1;
570 if (an[0] != '.' && bn[0] == '.')
571 return -1;
572
573 /* Finally, if we can't distinguish them in any other way, try to
574 get consistent results by sorting the symbols by name. */
575 return strcmp (an, bn);
576 }
577
578 /* Sort relocs into address order. */
579
580 static int
581 compare_relocs (const void *ap, const void *bp)
582 {
583 const arelent *a = * (const arelent **) ap;
584 const arelent *b = * (const arelent **) bp;
585
586 if (a->address > b->address)
587 return 1;
588 else if (a->address < b->address)
589 return -1;
590
591 /* So that associated relocations tied to the same address show up
592 in the correct order, we don't do any further sorting. */
593 if (a > b)
594 return 1;
595 else if (a < b)
596 return -1;
597 else
598 return 0;
599 }
600
601 /* Print an address (VMA) to the output stream in INFO.
602 If SKIP_ZEROES is TRUE, omit leading zeroes. */
603
604 static void
605 objdump_print_value (bfd_vma vma, struct disassemble_info *info,
606 bfd_boolean skip_zeroes)
607 {
608 char buf[30];
609 char *p;
610 struct objdump_disasm_info *aux;
611
612 aux = (struct objdump_disasm_info *) info->application_data;
613 bfd_sprintf_vma (aux->abfd, buf, vma);
614 if (! skip_zeroes)
615 p = buf;
616 else
617 {
618 for (p = buf; *p == '0'; ++p)
619 ;
620 if (*p == '\0')
621 --p;
622 }
623 (*info->fprintf_func) (info->stream, "%s", p);
624 }
625
626 /* Print the name of a symbol. */
627
628 static void
629 objdump_print_symname (bfd *abfd, struct disassemble_info *info,
630 asymbol *sym)
631 {
632 char *alloc;
633 const char *name;
634
635 alloc = NULL;
636 name = bfd_asymbol_name (sym);
637 if (do_demangle && name[0] != '\0')
638 {
639 /* Demangle the name. */
640 alloc = demangle (abfd, name);
641 name = alloc;
642 }
643
644 if (info != NULL)
645 (*info->fprintf_func) (info->stream, "%s", name);
646 else
647 printf ("%s", name);
648
649 if (alloc != NULL)
650 free (alloc);
651 }
652
653 /* Locate a symbol given a bfd and a section (from INFO->application_data),
654 and a VMA. If INFO->application_data->require_sec is TRUE, then always
655 require the symbol to be in the section. Returns NULL if there is no
656 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
657 of the symbol in sorted_syms. */
658
659 static asymbol *
660 find_symbol_for_address (bfd_vma vma,
661 struct disassemble_info *info,
662 long *place)
663 {
664 /* @@ Would it speed things up to cache the last two symbols returned,
665 and maybe their address ranges? For many processors, only one memory
666 operand can be present at a time, so the 2-entry cache wouldn't be
667 constantly churned by code doing heavy memory accesses. */
668
669 /* Indices in `sorted_syms'. */
670 long min = 0;
671 long max = sorted_symcount;
672 long thisplace;
673 struct objdump_disasm_info *aux;
674 bfd *abfd;
675 asection *sec;
676 unsigned int opb;
677
678 if (sorted_symcount < 1)
679 return NULL;
680
681 aux = (struct objdump_disasm_info *) info->application_data;
682 abfd = aux->abfd;
683 sec = aux->sec;
684 opb = bfd_octets_per_byte (abfd);
685
686 /* Perform a binary search looking for the closest symbol to the
687 required value. We are searching the range (min, max]. */
688 while (min + 1 < max)
689 {
690 asymbol *sym;
691
692 thisplace = (max + min) / 2;
693 sym = sorted_syms[thisplace];
694
695 if (bfd_asymbol_value (sym) > vma)
696 max = thisplace;
697 else if (bfd_asymbol_value (sym) < vma)
698 min = thisplace;
699 else
700 {
701 min = thisplace;
702 break;
703 }
704 }
705
706 /* The symbol we want is now in min, the low end of the range we
707 were searching. If there are several symbols with the same
708 value, we want the first one. */
709 thisplace = min;
710 while (thisplace > 0
711 && (bfd_asymbol_value (sorted_syms[thisplace])
712 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
713 --thisplace;
714
715 /* If the file is relocatable, and the symbol could be from this
716 section, prefer a symbol from this section over symbols from
717 others, even if the other symbol's value might be closer.
718
719 Note that this may be wrong for some symbol references if the
720 sections have overlapping memory ranges, but in that case there's
721 no way to tell what's desired without looking at the relocation
722 table. */
723 if (sorted_syms[thisplace]->section != sec
724 && (aux->require_sec
725 || ((abfd->flags & HAS_RELOC) != 0
726 && vma >= bfd_get_section_vma (abfd, sec)
727 && vma < (bfd_get_section_vma (abfd, sec)
728 + bfd_section_size (abfd, sec) / opb))))
729 {
730 long i;
731
732 for (i = thisplace + 1; i < sorted_symcount; i++)
733 {
734 if (bfd_asymbol_value (sorted_syms[i])
735 != bfd_asymbol_value (sorted_syms[thisplace]))
736 break;
737 }
738
739 --i;
740
741 for (; i >= 0; i--)
742 {
743 if (sorted_syms[i]->section == sec
744 && (i == 0
745 || sorted_syms[i - 1]->section != sec
746 || (bfd_asymbol_value (sorted_syms[i])
747 != bfd_asymbol_value (sorted_syms[i - 1]))))
748 {
749 thisplace = i;
750 break;
751 }
752 }
753
754 if (sorted_syms[thisplace]->section != sec)
755 {
756 /* We didn't find a good symbol with a smaller value.
757 Look for one with a larger value. */
758 for (i = thisplace + 1; i < sorted_symcount; i++)
759 {
760 if (sorted_syms[i]->section == sec)
761 {
762 thisplace = i;
763 break;
764 }
765 }
766 }
767
768 if (sorted_syms[thisplace]->section != sec
769 && (aux->require_sec
770 || ((abfd->flags & HAS_RELOC) != 0
771 && vma >= bfd_get_section_vma (abfd, sec)
772 && vma < (bfd_get_section_vma (abfd, sec)
773 + bfd_section_size (abfd, sec)))))
774 /* There is no suitable symbol. */
775 return NULL;
776 }
777
778 /* Give the target a chance to reject the symbol. */
779 while (! info->symbol_is_valid (sorted_syms [thisplace], info))
780 {
781 ++ thisplace;
782 if (thisplace >= sorted_symcount
783 || bfd_asymbol_value (sorted_syms [thisplace]) > vma)
784 return NULL;
785 }
786
787 if (place != NULL)
788 *place = thisplace;
789
790 return sorted_syms[thisplace];
791 }
792
793 /* Print an address and the offset to the nearest symbol. */
794
795 static void
796 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
797 bfd_vma vma, struct disassemble_info *info,
798 bfd_boolean skip_zeroes)
799 {
800 objdump_print_value (vma, info, skip_zeroes);
801
802 if (sym == NULL)
803 {
804 bfd_vma secaddr;
805
806 (*info->fprintf_func) (info->stream, " <%s",
807 bfd_get_section_name (abfd, sec));
808 secaddr = bfd_get_section_vma (abfd, sec);
809 if (vma < secaddr)
810 {
811 (*info->fprintf_func) (info->stream, "-0x");
812 objdump_print_value (secaddr - vma, info, TRUE);
813 }
814 else if (vma > secaddr)
815 {
816 (*info->fprintf_func) (info->stream, "+0x");
817 objdump_print_value (vma - secaddr, info, TRUE);
818 }
819 (*info->fprintf_func) (info->stream, ">");
820 }
821 else
822 {
823 (*info->fprintf_func) (info->stream, " <");
824 objdump_print_symname (abfd, info, sym);
825 if (bfd_asymbol_value (sym) > vma)
826 {
827 (*info->fprintf_func) (info->stream, "-0x");
828 objdump_print_value (bfd_asymbol_value (sym) - vma, info, TRUE);
829 }
830 else if (vma > bfd_asymbol_value (sym))
831 {
832 (*info->fprintf_func) (info->stream, "+0x");
833 objdump_print_value (vma - bfd_asymbol_value (sym), info, TRUE);
834 }
835 (*info->fprintf_func) (info->stream, ">");
836 }
837 }
838
839 /* Print an address (VMA), symbolically if possible.
840 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
841
842 static void
843 objdump_print_addr (bfd_vma vma,
844 struct disassemble_info *info,
845 bfd_boolean skip_zeroes)
846 {
847 struct objdump_disasm_info *aux;
848 asymbol *sym;
849
850 if (sorted_symcount < 1)
851 {
852 (*info->fprintf_func) (info->stream, "0x");
853 objdump_print_value (vma, info, skip_zeroes);
854 return;
855 }
856
857 aux = (struct objdump_disasm_info *) info->application_data;
858 sym = find_symbol_for_address (vma, info, NULL);
859 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
860 skip_zeroes);
861 }
862
863 /* Print VMA to INFO. This function is passed to the disassembler
864 routine. */
865
866 static void
867 objdump_print_address (bfd_vma vma, struct disassemble_info *info)
868 {
869 objdump_print_addr (vma, info, ! prefix_addresses);
870 }
871
872 /* Determine of the given address has a symbol associated with it. */
873
874 static int
875 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * info)
876 {
877 asymbol * sym;
878
879 sym = find_symbol_for_address (vma, info, NULL);
880
881 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
882 }
883
884 /* Hold the last function name and the last line number we displayed
885 in a disassembly. */
886
887 static char *prev_functionname;
888 static unsigned int prev_line;
889
890 /* We keep a list of all files that we have seen when doing a
891 disassembly with source, so that we know how much of the file to
892 display. This can be important for inlined functions. */
893
894 struct print_file_list
895 {
896 struct print_file_list *next;
897 const char *filename;
898 const char *modname;
899 unsigned int line;
900 FILE *f;
901 };
902
903 static struct print_file_list *print_files;
904
905 /* The number of preceding context lines to show when we start
906 displaying a file for the first time. */
907
908 #define SHOW_PRECEDING_CONTEXT_LINES (5)
909
910 /* Tries to open MODNAME, and if successful adds a node to print_files
911 linked list and returns that node. Returns NULL on failure. */
912
913 static struct print_file_list *
914 try_print_file_open (const char *origname, const char *modname)
915 {
916 struct print_file_list *p;
917 FILE *f;
918
919 f = fopen (modname, "r");
920 if (f == NULL)
921 return NULL;
922
923 if (print_files != NULL && print_files->f != NULL)
924 {
925 fclose (print_files->f);
926 print_files->f = NULL;
927 }
928
929 p = xmalloc (sizeof (struct print_file_list));
930 p->filename = origname;
931 p->modname = modname;
932 p->line = 0;
933 p->f = f;
934 p->next = print_files;
935 print_files = p;
936 return p;
937 }
938
939 /* If the the source file, as described in the symtab, is not found
940 try to locate it in one of the paths specified with -I
941 If found, add location to print_files linked list. */
942
943 static struct print_file_list *
944 update_source_path (const char *filename)
945 {
946 struct print_file_list *p;
947 const char *fname;
948 int i;
949
950 if (filename == NULL)
951 return NULL;
952
953 p = try_print_file_open (filename, filename);
954 if (p != NULL)
955 return p;
956
957 if (include_path_count == 0)
958 return NULL;
959
960 /* Get the name of the file. */
961 fname = strrchr (filename, '/');
962 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
963 {
964 /* We could have a mixed forward/back slash case. */
965 char *backslash = strrchr (filename, '\\');
966 if (fname == NULL || (backslash != NULL && backslash > fname))
967 fname = backslash;
968 if (fname == NULL && filename[0] != '\0' && filename[1] == ':')
969 fname = filename + 1;
970 }
971 #endif
972 if (fname == NULL)
973 fname = filename;
974 else
975 ++fname;
976
977 /* If file exists under a new path, we need to add it to the list
978 so that show_line knows about it. */
979 for (i = 0; i < include_path_count; i++)
980 {
981 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
982
983 p = try_print_file_open (filename, modname);
984 if (p)
985 return p;
986
987 free (modname);
988 }
989
990 return NULL;
991 }
992
993 /* Skip ahead to a given line in a file, optionally printing each
994 line. */
995
996 static void
997 skip_to_line (struct print_file_list *p, unsigned int line,
998 bfd_boolean show)
999 {
1000 while (p->line < line)
1001 {
1002 char buf[100];
1003
1004 if (fgets (buf, sizeof buf, p->f) == NULL)
1005 {
1006 fclose (p->f);
1007 p->f = NULL;
1008 break;
1009 }
1010
1011 if (show)
1012 printf ("%s", buf);
1013
1014 if (strchr (buf, '\n') != NULL)
1015 ++p->line;
1016 }
1017 }
1018
1019 /* Show the line number, or the source line, in a disassembly
1020 listing. */
1021
1022 static void
1023 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1024 {
1025 const char *filename;
1026 const char *functionname;
1027 unsigned int line;
1028
1029 if (! with_line_numbers && ! with_source_code)
1030 return;
1031
1032 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1033 &functionname, &line))
1034 return;
1035
1036 if (filename != NULL && *filename == '\0')
1037 filename = NULL;
1038 if (functionname != NULL && *functionname == '\0')
1039 functionname = NULL;
1040
1041 if (with_line_numbers)
1042 {
1043 if (functionname != NULL
1044 && (prev_functionname == NULL
1045 || strcmp (functionname, prev_functionname) != 0))
1046 printf ("%s():\n", functionname);
1047 if (line > 0 && line != prev_line)
1048 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
1049 }
1050
1051 if (with_source_code
1052 && filename != NULL
1053 && line > 0)
1054 {
1055 struct print_file_list **pp, *p;
1056
1057 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1058 if (strcmp ((*pp)->filename, filename) == 0)
1059 break;
1060 p = *pp;
1061
1062 if (p != NULL)
1063 {
1064 if (p != print_files)
1065 {
1066 int l;
1067
1068 /* We have reencountered a file name which we saw
1069 earlier. This implies that either we are dumping out
1070 code from an included file, or the same file was
1071 linked in more than once. There are two common cases
1072 of an included file: inline functions in a header
1073 file, and a bison or flex skeleton file. In the
1074 former case we want to just start printing (but we
1075 back up a few lines to give context); in the latter
1076 case we want to continue from where we left off. I
1077 can't think of a good way to distinguish the cases,
1078 so I used a heuristic based on the file name. */
1079 if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1080 l = p->line;
1081 else
1082 {
1083 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1084 if (l < 0)
1085 l = 0;
1086 }
1087
1088 if (p->f == NULL)
1089 {
1090 p->f = fopen (p->modname, "r");
1091 p->line = 0;
1092 }
1093 if (p->f != NULL)
1094 skip_to_line (p, l, FALSE);
1095
1096 if (print_files->f != NULL)
1097 {
1098 fclose (print_files->f);
1099 print_files->f = NULL;
1100 }
1101 }
1102
1103 if (p->f != NULL)
1104 {
1105 skip_to_line (p, line, TRUE);
1106 *pp = p->next;
1107 p->next = print_files;
1108 print_files = p;
1109 }
1110 }
1111 else
1112 {
1113 p = update_source_path (filename);
1114
1115 if (p != NULL)
1116 {
1117 int l;
1118
1119 if (file_start_context)
1120 l = 0;
1121 else
1122 l = line - SHOW_PRECEDING_CONTEXT_LINES;
1123 if (l < 0)
1124 l = 0;
1125 skip_to_line (p, l, FALSE);
1126 if (p->f != NULL)
1127 skip_to_line (p, line, TRUE);
1128 }
1129 }
1130 }
1131
1132 if (functionname != NULL
1133 && (prev_functionname == NULL
1134 || strcmp (functionname, prev_functionname) != 0))
1135 {
1136 if (prev_functionname != NULL)
1137 free (prev_functionname);
1138 prev_functionname = xmalloc (strlen (functionname) + 1);
1139 strcpy (prev_functionname, functionname);
1140 }
1141
1142 if (line > 0 && line != prev_line)
1143 prev_line = line;
1144 }
1145
1146 /* Pseudo FILE object for strings. */
1147 typedef struct
1148 {
1149 char *buffer;
1150 size_t pos;
1151 size_t alloc;
1152 } SFILE;
1153
1154 /* sprintf to a "stream". */
1155
1156 static int
1157 objdump_sprintf (SFILE *f, const char *format, ...)
1158 {
1159 size_t n;
1160 va_list args;
1161
1162 while (1)
1163 {
1164 size_t space = f->alloc - f->pos;
1165
1166 va_start (args, format);
1167 n = vsnprintf (f->buffer + f->pos, space, format, args);
1168 va_end (args);
1169
1170 if (space > n)
1171 break;
1172
1173 f->alloc = (f->alloc + n) * 2;
1174 f->buffer = xrealloc (f->buffer, f->alloc);
1175 }
1176 f->pos += n;
1177
1178 return n;
1179 }
1180
1181 /* Returns TRUE if the specified section should be dumped. */
1182
1183 static bfd_boolean
1184 process_section_p (asection * section)
1185 {
1186 size_t i;
1187
1188 if (only == NULL)
1189 return TRUE;
1190
1191 for (i = 0; i < only_used; i++)
1192 if (strcmp (only [i], section->name) == 0)
1193 return TRUE;
1194
1195 return FALSE;
1196 }
1197
1198
1199 /* The number of zeroes we want to see before we start skipping them.
1200 The number is arbitrarily chosen. */
1201
1202 #ifndef SKIP_ZEROES
1203 #define SKIP_ZEROES (8)
1204 #endif
1205
1206 /* The number of zeroes to skip at the end of a section. If the
1207 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1208 SKIP_ZEROES, they will be disassembled. If there are fewer than
1209 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1210 attempt to avoid disassembling zeroes inserted by section
1211 alignment. */
1212
1213 #ifndef SKIP_ZEROES_AT_END
1214 #define SKIP_ZEROES_AT_END (3)
1215 #endif
1216
1217 /* Disassemble some data in memory between given values. */
1218
1219 static void
1220 disassemble_bytes (struct disassemble_info * info,
1221 disassembler_ftype disassemble_fn,
1222 bfd_boolean insns,
1223 bfd_byte * data,
1224 bfd_vma start_offset,
1225 bfd_vma stop_offset,
1226 bfd_vma rel_offset,
1227 arelent *** relppp,
1228 arelent ** relppend)
1229 {
1230 struct objdump_disasm_info *aux;
1231 asection *section;
1232 int octets_per_line;
1233 bfd_boolean done_dot;
1234 int skip_addr_chars;
1235 bfd_vma addr_offset;
1236 int opb = info->octets_per_byte;
1237 SFILE sfile;
1238
1239 aux = (struct objdump_disasm_info *) info->application_data;
1240 section = aux->sec;
1241
1242 sfile.alloc = 120;
1243 sfile.buffer = xmalloc (sfile.alloc);
1244 sfile.pos = 0;
1245
1246 if (insns)
1247 octets_per_line = 4;
1248 else
1249 octets_per_line = 16;
1250
1251 /* Figure out how many characters to skip at the start of an
1252 address, to make the disassembly look nicer. We discard leading
1253 zeroes in chunks of 4, ensuring that there is always a leading
1254 zero remaining. */
1255 skip_addr_chars = 0;
1256 if (! prefix_addresses)
1257 {
1258 char buf[30];
1259 char *s;
1260
1261 bfd_sprintf_vma
1262 (aux->abfd, buf,
1263 (section->vma
1264 + bfd_section_size (section->owner, section) / opb));
1265 s = buf;
1266 while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1267 && s[4] == '0')
1268 {
1269 skip_addr_chars += 4;
1270 s += 4;
1271 }
1272 }
1273
1274 info->insn_info_valid = 0;
1275
1276 done_dot = FALSE;
1277 addr_offset = start_offset;
1278 while (addr_offset < stop_offset)
1279 {
1280 bfd_vma z;
1281 int octets = 0;
1282 bfd_boolean need_nl = FALSE;
1283
1284 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1285 print `...'. */
1286 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1287 if (data[z] != 0)
1288 break;
1289 if (! disassemble_zeroes
1290 && (info->insn_info_valid == 0
1291 || info->branch_delay_insns == 0)
1292 && (z - addr_offset * opb >= SKIP_ZEROES
1293 || (z == stop_offset * opb &&
1294 z - addr_offset * opb < SKIP_ZEROES_AT_END)))
1295 {
1296 printf ("\t...\n");
1297
1298 /* If there are more nonzero octets to follow, we only skip
1299 zeroes in multiples of 4, to try to avoid running over
1300 the start of an instruction which happens to start with
1301 zero. */
1302 if (z != stop_offset * opb)
1303 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1304
1305 octets = z - addr_offset * opb;
1306 }
1307 else
1308 {
1309 char buf[50];
1310 int bpc = 0;
1311 int pb = 0;
1312
1313 done_dot = FALSE;
1314
1315 if (with_line_numbers || with_source_code)
1316 /* The line number tables will refer to unadjusted
1317 section VMAs, so we must undo any VMA modifications
1318 when calling show_line. */
1319 show_line (aux->abfd, section, addr_offset - adjust_section_vma);
1320
1321 if (! prefix_addresses)
1322 {
1323 char *s;
1324
1325 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1326 for (s = buf + skip_addr_chars; *s == '0'; s++)
1327 *s = ' ';
1328 if (*s == '\0')
1329 *--s = '0';
1330 printf ("%s:\t", buf + skip_addr_chars);
1331 }
1332 else
1333 {
1334 aux->require_sec = TRUE;
1335 objdump_print_address (section->vma + addr_offset, info);
1336 aux->require_sec = FALSE;
1337 putchar (' ');
1338 }
1339
1340 if (insns)
1341 {
1342 sfile.pos = 0;
1343 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1344 info->stream = (FILE *) &sfile;
1345 info->bytes_per_line = 0;
1346 info->bytes_per_chunk = 0;
1347
1348 #ifdef DISASSEMBLER_NEEDS_RELOCS
1349 /* FIXME: This is wrong. It tests the number of octets
1350 in the last instruction, not the current one. */
1351 if (*relppp < relppend
1352 && (**relppp)->address >= rel_offset + addr_offset
1353 && ((**relppp)->address
1354 < rel_offset + addr_offset + octets / opb))
1355 info->flags = INSN_HAS_RELOC;
1356 else
1357 #endif
1358 info->flags = 0;
1359
1360 octets = (*disassemble_fn) (section->vma + addr_offset, info);
1361 info->fprintf_func = (fprintf_ftype) fprintf;
1362 info->stream = stdout;
1363 if (info->bytes_per_line != 0)
1364 octets_per_line = info->bytes_per_line;
1365 if (octets < 0)
1366 {
1367 if (sfile.pos)
1368 printf ("%s\n", sfile.buffer);
1369 break;
1370 }
1371 }
1372 else
1373 {
1374 bfd_vma j;
1375
1376 octets = octets_per_line;
1377 if (addr_offset + octets / opb > stop_offset)
1378 octets = (stop_offset - addr_offset) * opb;
1379
1380 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1381 {
1382 if (ISPRINT (data[j]))
1383 buf[j - addr_offset * opb] = data[j];
1384 else
1385 buf[j - addr_offset * opb] = '.';
1386 }
1387 buf[j - addr_offset * opb] = '\0';
1388 }
1389
1390 if (prefix_addresses
1391 ? show_raw_insn > 0
1392 : show_raw_insn >= 0)
1393 {
1394 bfd_vma j;
1395
1396 /* If ! prefix_addresses and ! wide_output, we print
1397 octets_per_line octets per line. */
1398 pb = octets;
1399 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1400 pb = octets_per_line;
1401
1402 if (info->bytes_per_chunk)
1403 bpc = info->bytes_per_chunk;
1404 else
1405 bpc = 1;
1406
1407 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1408 {
1409 int k;
1410 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1411 {
1412 for (k = bpc - 1; k >= 0; k--)
1413 printf ("%02x", (unsigned) data[j + k]);
1414 putchar (' ');
1415 }
1416 else
1417 {
1418 for (k = 0; k < bpc; k++)
1419 printf ("%02x", (unsigned) data[j + k]);
1420 putchar (' ');
1421 }
1422 }
1423
1424 for (; pb < octets_per_line; pb += bpc)
1425 {
1426 int k;
1427
1428 for (k = 0; k < bpc; k++)
1429 printf (" ");
1430 putchar (' ');
1431 }
1432
1433 /* Separate raw data from instruction by extra space. */
1434 if (insns)
1435 putchar ('\t');
1436 else
1437 printf (" ");
1438 }
1439
1440 if (! insns)
1441 printf ("%s", buf);
1442 else if (sfile.pos)
1443 printf ("%s", sfile.buffer);
1444
1445 if (prefix_addresses
1446 ? show_raw_insn > 0
1447 : show_raw_insn >= 0)
1448 {
1449 while (pb < octets)
1450 {
1451 bfd_vma j;
1452 char *s;
1453
1454 putchar ('\n');
1455 j = addr_offset * opb + pb;
1456
1457 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1458 for (s = buf + skip_addr_chars; *s == '0'; s++)
1459 *s = ' ';
1460 if (*s == '\0')
1461 *--s = '0';
1462 printf ("%s:\t", buf + skip_addr_chars);
1463
1464 pb += octets_per_line;
1465 if (pb > octets)
1466 pb = octets;
1467 for (; j < addr_offset * opb + pb; j += bpc)
1468 {
1469 int k;
1470
1471 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1472 {
1473 for (k = bpc - 1; k >= 0; k--)
1474 printf ("%02x", (unsigned) data[j + k]);
1475 putchar (' ');
1476 }
1477 else
1478 {
1479 for (k = 0; k < bpc; k++)
1480 printf ("%02x", (unsigned) data[j + k]);
1481 putchar (' ');
1482 }
1483 }
1484 }
1485 }
1486
1487 if (!wide_output)
1488 putchar ('\n');
1489 else
1490 need_nl = TRUE;
1491 }
1492
1493 while ((*relppp) < relppend
1494 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1495 {
1496 if (dump_reloc_info || dump_dynamic_reloc_info)
1497 {
1498 arelent *q;
1499
1500 q = **relppp;
1501
1502 if (wide_output)
1503 putchar ('\t');
1504 else
1505 printf ("\t\t\t");
1506
1507 objdump_print_value (section->vma - rel_offset + q->address,
1508 info, TRUE);
1509
1510 printf (": %s\t", q->howto->name);
1511
1512 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1513 printf ("*unknown*");
1514 else
1515 {
1516 const char *sym_name;
1517
1518 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1519 if (sym_name != NULL && *sym_name != '\0')
1520 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1521 else
1522 {
1523 asection *sym_sec;
1524
1525 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1526 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1527 if (sym_name == NULL || *sym_name == '\0')
1528 sym_name = "*unknown*";
1529 printf ("%s", sym_name);
1530 }
1531 }
1532
1533 if (q->addend)
1534 {
1535 printf ("+0x");
1536 objdump_print_value (q->addend, info, TRUE);
1537 }
1538
1539 printf ("\n");
1540 need_nl = FALSE;
1541 }
1542 ++(*relppp);
1543 }
1544
1545 if (need_nl)
1546 printf ("\n");
1547
1548 addr_offset += octets / opb;
1549 }
1550
1551 free (sfile.buffer);
1552 }
1553
1554 static void
1555 disassemble_section (bfd *abfd, asection *section, void *info)
1556 {
1557 struct disassemble_info * pinfo = (struct disassemble_info *) info;
1558 struct objdump_disasm_info * paux;
1559 unsigned int opb = pinfo->octets_per_byte;
1560 bfd_byte * data = NULL;
1561 bfd_size_type datasize = 0;
1562 arelent ** rel_pp = NULL;
1563 arelent ** rel_ppstart = NULL;
1564 arelent ** rel_ppend;
1565 unsigned long stop_offset;
1566 asymbol * sym = NULL;
1567 long place = 0;
1568 long rel_count;
1569 bfd_vma rel_offset;
1570 unsigned long addr_offset;
1571
1572 /* Sections that do not contain machine
1573 code are not normally disassembled. */
1574 if (! disassemble_all
1575 && only == NULL
1576 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1577 != (SEC_CODE | SEC_HAS_CONTENTS)))
1578 return;
1579
1580 if (! process_section_p (section))
1581 return;
1582
1583 datasize = bfd_get_section_size (section);
1584 if (datasize == 0)
1585 return;
1586
1587 /* Decide which set of relocs to use. Load them if necessary. */
1588 paux = (struct objdump_disasm_info *) pinfo->application_data;
1589 if (paux->dynrelbuf)
1590 {
1591 rel_pp = paux->dynrelbuf;
1592 rel_count = paux->dynrelcount;
1593 /* Dynamic reloc addresses are absolute, non-dynamic are section
1594 relative. REL_OFFSET specifies the reloc address corresponding
1595 to the start of this section. */
1596 rel_offset = section->vma;
1597 }
1598 else
1599 {
1600 rel_count = 0;
1601 rel_pp = NULL;
1602 rel_offset = 0;
1603
1604 if ((section->flags & SEC_RELOC) != 0
1605 #ifndef DISASSEMBLER_NEEDS_RELOCS
1606 && dump_reloc_info
1607 #endif
1608 )
1609 {
1610 long relsize;
1611
1612 relsize = bfd_get_reloc_upper_bound (abfd, section);
1613 if (relsize < 0)
1614 bfd_fatal (bfd_get_filename (abfd));
1615
1616 if (relsize > 0)
1617 {
1618 rel_ppstart = rel_pp = xmalloc (relsize);
1619 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1620 if (rel_count < 0)
1621 bfd_fatal (bfd_get_filename (abfd));
1622
1623 /* Sort the relocs by address. */
1624 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1625 }
1626 }
1627
1628 }
1629 rel_ppend = rel_pp + rel_count;
1630
1631 data = xmalloc (datasize);
1632
1633 bfd_get_section_contents (abfd, section, data, 0, datasize);
1634
1635 paux->sec = section;
1636 pinfo->buffer = data;
1637 pinfo->buffer_vma = section->vma;
1638 pinfo->buffer_length = datasize;
1639 pinfo->section = section;
1640
1641 if (start_address == (bfd_vma) -1
1642 || start_address < pinfo->buffer_vma)
1643 addr_offset = 0;
1644 else
1645 addr_offset = start_address - pinfo->buffer_vma;
1646
1647 if (stop_address == (bfd_vma) -1)
1648 stop_offset = datasize / opb;
1649 else
1650 {
1651 if (stop_address < pinfo->buffer_vma)
1652 stop_offset = 0;
1653 else
1654 stop_offset = stop_address - pinfo->buffer_vma;
1655 if (stop_offset > pinfo->buffer_length / opb)
1656 stop_offset = pinfo->buffer_length / opb;
1657 }
1658
1659 /* Skip over the relocs belonging to addresses below the
1660 start address. */
1661 while (rel_pp < rel_ppend
1662 && (*rel_pp)->address < rel_offset + addr_offset)
1663 ++rel_pp;
1664
1665 printf (_("Disassembly of section %s:\n"), section->name);
1666
1667 /* Find the nearest symbol forwards from our current position. */
1668 paux->require_sec = TRUE;
1669 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
1670 paux->require_sec = FALSE;
1671
1672 /* Disassemble a block of instructions up to the address associated with
1673 the symbol we have just found. Then print the symbol and find the
1674 next symbol on. Repeat until we have disassembled the entire section
1675 or we have reached the end of the address range we are interested in. */
1676 while (addr_offset < stop_offset)
1677 {
1678 bfd_vma addr;
1679 asymbol *nextsym;
1680 unsigned long nextstop_offset;
1681 bfd_boolean insns;
1682
1683 addr = section->vma + addr_offset;
1684
1685 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
1686 {
1687 int x;
1688
1689 for (x = place;
1690 (x < sorted_symcount
1691 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
1692 ++x)
1693 continue;
1694
1695 pinfo->symbols = sorted_syms + place;
1696 pinfo->num_symbols = x - place;
1697 }
1698 else
1699 {
1700 pinfo->symbols = NULL;
1701 pinfo->num_symbols = 0;
1702 }
1703
1704 if (! prefix_addresses)
1705 {
1706 pinfo->fprintf_func (pinfo->stream, "\n");
1707 objdump_print_addr_with_sym (abfd, section, sym, addr,
1708 pinfo, FALSE);
1709 pinfo->fprintf_func (pinfo->stream, ":\n");
1710 }
1711
1712 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1713 nextsym = sym;
1714 else if (sym == NULL)
1715 nextsym = NULL;
1716 else
1717 {
1718 #define is_valid_next_sym(SYM) \
1719 ((SYM)->section == section \
1720 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1721 && pinfo->symbol_is_valid (SYM, pinfo))
1722
1723 /* Search forward for the next appropriate symbol in
1724 SECTION. Note that all the symbols are sorted
1725 together into one big array, and that some sections
1726 may have overlapping addresses. */
1727 while (place < sorted_symcount
1728 && ! is_valid_next_sym (sorted_syms [place]))
1729 ++place;
1730
1731 if (place >= sorted_symcount)
1732 nextsym = NULL;
1733 else
1734 nextsym = sorted_syms[place];
1735 }
1736
1737 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1738 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
1739 else if (nextsym == NULL)
1740 nextstop_offset = stop_offset;
1741 else
1742 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1743
1744 if (nextstop_offset > stop_offset)
1745 nextstop_offset = stop_offset;
1746
1747 /* If a symbol is explicitly marked as being an object
1748 rather than a function, just dump the bytes without
1749 disassembling them. */
1750 if (disassemble_all
1751 || sym == NULL
1752 || bfd_asymbol_value (sym) > addr
1753 || ((sym->flags & BSF_OBJECT) == 0
1754 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1755 == NULL)
1756 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1757 == NULL))
1758 || (sym->flags & BSF_FUNCTION) != 0)
1759 insns = TRUE;
1760 else
1761 insns = FALSE;
1762
1763 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1764 addr_offset, nextstop_offset,
1765 rel_offset, &rel_pp, rel_ppend);
1766
1767 addr_offset = nextstop_offset;
1768 sym = nextsym;
1769 }
1770
1771 free (data);
1772
1773 if (rel_ppstart != NULL)
1774 free (rel_ppstart);
1775 }
1776
1777 /* Disassemble the contents of an object file. */
1778
1779 static void
1780 disassemble_data (bfd *abfd)
1781 {
1782 struct disassemble_info disasm_info;
1783 struct objdump_disasm_info aux;
1784 long i;
1785
1786 print_files = NULL;
1787 prev_functionname = NULL;
1788 prev_line = -1;
1789
1790 /* We make a copy of syms to sort. We don't want to sort syms
1791 because that will screw up the relocs. */
1792 sorted_symcount = symcount ? symcount : dynsymcount;
1793 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1794 memcpy (sorted_syms, symcount ? syms : dynsyms,
1795 sorted_symcount * sizeof (asymbol *));
1796
1797 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1798
1799 for (i = 0; i < synthcount; ++i)
1800 {
1801 sorted_syms[sorted_symcount] = synthsyms + i;
1802 ++sorted_symcount;
1803 }
1804
1805 /* Sort the symbols into section and symbol order. */
1806 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1807
1808 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
1809
1810 disasm_info.application_data = (void *) &aux;
1811 aux.abfd = abfd;
1812 aux.require_sec = FALSE;
1813 aux.dynrelbuf = NULL;
1814 aux.dynrelcount = 0;
1815
1816 disasm_info.print_address_func = objdump_print_address;
1817 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1818
1819 if (machine != NULL)
1820 {
1821 const bfd_arch_info_type *info = bfd_scan_arch (machine);
1822
1823 if (info == NULL)
1824 fatal (_("Can't use supplied machine %s"), machine);
1825
1826 abfd->arch_info = info;
1827 }
1828
1829 if (endian != BFD_ENDIAN_UNKNOWN)
1830 {
1831 struct bfd_target *xvec;
1832
1833 xvec = xmalloc (sizeof (struct bfd_target));
1834 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1835 xvec->byteorder = endian;
1836 abfd->xvec = xvec;
1837 }
1838
1839 /* Use libopcodes to locate a suitable disassembler. */
1840 aux.disassemble_fn = disassembler (abfd);
1841 if (!aux.disassemble_fn)
1842 {
1843 non_fatal (_("Can't disassemble for architecture %s\n"),
1844 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1845 exit_status = 1;
1846 return;
1847 }
1848
1849 disasm_info.flavour = bfd_get_flavour (abfd);
1850 disasm_info.arch = bfd_get_arch (abfd);
1851 disasm_info.mach = bfd_get_mach (abfd);
1852 disasm_info.disassembler_options = disassembler_options;
1853 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
1854
1855 if (bfd_big_endian (abfd))
1856 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
1857 else if (bfd_little_endian (abfd))
1858 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
1859 else
1860 /* ??? Aborting here seems too drastic. We could default to big or little
1861 instead. */
1862 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1863
1864 /* Allow the target to customize the info structure. */
1865 disassemble_init_for_target (& disasm_info);
1866
1867 /* Pre-load the dynamic relocs if we are going
1868 to be dumping them along with the disassembly. */
1869 if (dump_dynamic_reloc_info)
1870 {
1871 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
1872
1873 if (relsize < 0)
1874 bfd_fatal (bfd_get_filename (abfd));
1875
1876 if (relsize > 0)
1877 {
1878 aux.dynrelbuf = xmalloc (relsize);
1879 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
1880 aux.dynrelbuf,
1881 dynsyms);
1882 if (aux.dynrelcount < 0)
1883 bfd_fatal (bfd_get_filename (abfd));
1884
1885 /* Sort the relocs by address. */
1886 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
1887 compare_relocs);
1888 }
1889 }
1890
1891 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
1892
1893 if (aux.dynrelbuf != NULL)
1894 free (aux.dynrelbuf);
1895 free (sorted_syms);
1896 }
1897 \f
1898 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
1899 it. Return NULL on failure. */
1900
1901 static char *
1902 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
1903 {
1904 asection *stabsect;
1905 bfd_size_type size;
1906 char *contents;
1907
1908 stabsect = bfd_get_section_by_name (abfd, sect_name);
1909 if (stabsect == NULL)
1910 {
1911 printf (_("No %s section present\n\n"), sect_name);
1912 return FALSE;
1913 }
1914
1915 size = bfd_section_size (abfd, stabsect);
1916 contents = xmalloc (size);
1917
1918 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
1919 {
1920 non_fatal (_("Reading %s section of %s failed: %s"),
1921 sect_name, bfd_get_filename (abfd),
1922 bfd_errmsg (bfd_get_error ()));
1923 free (contents);
1924 exit_status = 1;
1925 return NULL;
1926 }
1927
1928 *size_ptr = size;
1929
1930 return contents;
1931 }
1932
1933 /* Stabs entries use a 12 byte format:
1934 4 byte string table index
1935 1 byte stab type
1936 1 byte stab other field
1937 2 byte stab desc field
1938 4 byte stab value
1939 FIXME: This will have to change for a 64 bit object format. */
1940
1941 #define STRDXOFF (0)
1942 #define TYPEOFF (4)
1943 #define OTHEROFF (5)
1944 #define DESCOFF (6)
1945 #define VALOFF (8)
1946 #define STABSIZE (12)
1947
1948 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1949 using string table section STRSECT_NAME (in `strtab'). */
1950
1951 static void
1952 print_section_stabs (bfd *abfd,
1953 const char *stabsect_name,
1954 unsigned *string_offset_ptr)
1955 {
1956 int i;
1957 unsigned file_string_table_offset = 0;
1958 unsigned next_file_string_table_offset = *string_offset_ptr;
1959 bfd_byte *stabp, *stabs_end;
1960
1961 stabp = stabs;
1962 stabs_end = stabp + stab_size;
1963
1964 printf (_("Contents of %s section:\n\n"), stabsect_name);
1965 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
1966
1967 /* Loop through all symbols and print them.
1968
1969 We start the index at -1 because there is a dummy symbol on
1970 the front of stabs-in-{coff,elf} sections that supplies sizes. */
1971 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1972 {
1973 const char *name;
1974 unsigned long strx;
1975 unsigned char type, other;
1976 unsigned short desc;
1977 bfd_vma value;
1978
1979 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1980 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1981 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1982 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1983 value = bfd_h_get_32 (abfd, stabp + VALOFF);
1984
1985 printf ("\n%-6d ", i);
1986 /* Either print the stab name, or, if unnamed, print its number
1987 again (makes consistent formatting for tools like awk). */
1988 name = bfd_get_stab_name (type);
1989 if (name != NULL)
1990 printf ("%-6s", name);
1991 else if (type == N_UNDF)
1992 printf ("HdrSym");
1993 else
1994 printf ("%-6d", type);
1995 printf (" %-6d %-6d ", other, desc);
1996 bfd_printf_vma (abfd, value);
1997 printf (" %-6lu", strx);
1998
1999 /* Symbols with type == 0 (N_UNDF) specify the length of the
2000 string table associated with this file. We use that info
2001 to know how to relocate the *next* file's string table indices. */
2002 if (type == N_UNDF)
2003 {
2004 file_string_table_offset = next_file_string_table_offset;
2005 next_file_string_table_offset += value;
2006 }
2007 else
2008 {
2009 /* Using the (possibly updated) string table offset, print the
2010 string (if any) associated with this symbol. */
2011 if ((strx + file_string_table_offset) < stabstr_size)
2012 printf (" %s", &strtab[strx + file_string_table_offset]);
2013 else
2014 printf (" *");
2015 }
2016 }
2017 printf ("\n\n");
2018 *string_offset_ptr = next_file_string_table_offset;
2019 }
2020
2021 typedef struct
2022 {
2023 const char * section_name;
2024 const char * string_section_name;
2025 unsigned string_offset;
2026 }
2027 stab_section_names;
2028
2029 static void
2030 find_stabs_section (bfd *abfd, asection *section, void *names)
2031 {
2032 int len;
2033 stab_section_names * sought = (stab_section_names *) names;
2034
2035 /* Check for section names for which stabsect_name is a prefix, to
2036 handle .stab.N, etc. */
2037 len = strlen (sought->section_name);
2038
2039 /* If the prefix matches, and the files section name ends with a
2040 nul or a digit, then we match. I.e., we want either an exact
2041 match or a section followed by a number. */
2042 if (strncmp (sought->section_name, section->name, len) == 0
2043 && (section->name[len] == 0
2044 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2045 {
2046 if (strtab == NULL)
2047 strtab = read_section_stabs (abfd, sought->string_section_name,
2048 &stabstr_size);
2049
2050 if (strtab)
2051 {
2052 stabs = read_section_stabs (abfd, section->name, &stab_size);
2053 if (stabs)
2054 print_section_stabs (abfd, section->name, &sought->string_offset);
2055 }
2056 }
2057 }
2058
2059 static void
2060 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2061 {
2062 stab_section_names s;
2063
2064 s.section_name = stabsect_name;
2065 s.string_section_name = strsect_name;
2066 s.string_offset = 0;
2067
2068 bfd_map_over_sections (abfd, find_stabs_section, & s);
2069
2070 free (strtab);
2071 strtab = NULL;
2072 }
2073
2074 /* Dump the any sections containing stabs debugging information. */
2075
2076 static void
2077 dump_stabs (bfd *abfd)
2078 {
2079 dump_stabs_section (abfd, ".stab", ".stabstr");
2080 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2081 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2082 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2083 }
2084 \f
2085 static void
2086 dump_bfd_header (bfd *abfd)
2087 {
2088 char *comma = "";
2089
2090 printf (_("architecture: %s, "),
2091 bfd_printable_arch_mach (bfd_get_arch (abfd),
2092 bfd_get_mach (abfd)));
2093 printf (_("flags 0x%08x:\n"), abfd->flags);
2094
2095 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2096 PF (HAS_RELOC, "HAS_RELOC");
2097 PF (EXEC_P, "EXEC_P");
2098 PF (HAS_LINENO, "HAS_LINENO");
2099 PF (HAS_DEBUG, "HAS_DEBUG");
2100 PF (HAS_SYMS, "HAS_SYMS");
2101 PF (HAS_LOCALS, "HAS_LOCALS");
2102 PF (DYNAMIC, "DYNAMIC");
2103 PF (WP_TEXT, "WP_TEXT");
2104 PF (D_PAGED, "D_PAGED");
2105 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2106 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2107 printf (_("\nstart address 0x"));
2108 bfd_printf_vma (abfd, abfd->start_address);
2109 printf ("\n");
2110 }
2111
2112 \f
2113 static void
2114 dump_bfd_private_header (bfd *abfd)
2115 {
2116 bfd_print_private_bfd_data (abfd, stdout);
2117 }
2118
2119 \f
2120 /* Display a section in hexadecimal format with associated characters.
2121 Each line prefixed by the zero padded address. */
2122
2123 static void
2124 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2125 {
2126 bfd_byte *data = 0;
2127 bfd_size_type datasize;
2128 bfd_size_type addr_offset;
2129 bfd_size_type start_offset;
2130 bfd_size_type stop_offset;
2131 unsigned int opb = bfd_octets_per_byte (abfd);
2132 /* Bytes per line. */
2133 const int onaline = 16;
2134 char buf[64];
2135 int count;
2136 int width;
2137
2138 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2139 return;
2140
2141 if (! process_section_p (section))
2142 return;
2143
2144 if ((datasize = bfd_section_size (abfd, section)) == 0)
2145 return;
2146
2147 printf (_("Contents of section %s:\n"), section->name);
2148
2149 data = xmalloc (datasize);
2150
2151 bfd_get_section_contents (abfd, section, data, 0, datasize);
2152
2153 /* Compute the address range to display. */
2154 if (start_address == (bfd_vma) -1
2155 || start_address < section->vma)
2156 start_offset = 0;
2157 else
2158 start_offset = start_address - section->vma;
2159
2160 if (stop_address == (bfd_vma) -1)
2161 stop_offset = datasize / opb;
2162 else
2163 {
2164 if (stop_address < section->vma)
2165 stop_offset = 0;
2166 else
2167 stop_offset = stop_address - section->vma;
2168
2169 if (stop_offset > datasize / opb)
2170 stop_offset = datasize / opb;
2171 }
2172
2173 width = 4;
2174
2175 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2176 if (strlen (buf) >= sizeof (buf))
2177 abort ();
2178
2179 count = 0;
2180 while (buf[count] == '0' && buf[count+1] != '\0')
2181 count++;
2182 count = strlen (buf) - count;
2183 if (count > width)
2184 width = count;
2185
2186 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2187 if (strlen (buf) >= sizeof (buf))
2188 abort ();
2189
2190 count = 0;
2191 while (buf[count] == '0' && buf[count+1] != '\0')
2192 count++;
2193 count = strlen (buf) - count;
2194 if (count > width)
2195 width = count;
2196
2197 for (addr_offset = start_offset;
2198 addr_offset < stop_offset; addr_offset += onaline / opb)
2199 {
2200 bfd_size_type j;
2201
2202 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2203 count = strlen (buf);
2204 if ((size_t) count >= sizeof (buf))
2205 abort ();
2206
2207 putchar (' ');
2208 while (count < width)
2209 {
2210 putchar ('0');
2211 count++;
2212 }
2213 fputs (buf + count - width, stdout);
2214 putchar (' ');
2215
2216 for (j = addr_offset * opb;
2217 j < addr_offset * opb + onaline; j++)
2218 {
2219 if (j < stop_offset * opb)
2220 printf ("%02x", (unsigned) (data[j]));
2221 else
2222 printf (" ");
2223 if ((j & 3) == 3)
2224 printf (" ");
2225 }
2226
2227 printf (" ");
2228 for (j = addr_offset * opb;
2229 j < addr_offset * opb + onaline; j++)
2230 {
2231 if (j >= stop_offset * opb)
2232 printf (" ");
2233 else
2234 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2235 }
2236 putchar ('\n');
2237 }
2238 free (data);
2239 }
2240
2241 /* Actually display the various requested regions. */
2242
2243 static void
2244 dump_data (bfd *abfd)
2245 {
2246 bfd_map_over_sections (abfd, dump_section, NULL);
2247 }
2248
2249 /* Should perhaps share code and display with nm? */
2250
2251 static void
2252 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2253 {
2254 asymbol **current;
2255 long max;
2256 long count;
2257
2258 if (dynamic)
2259 {
2260 current = dynsyms;
2261 max = dynsymcount;
2262 printf ("DYNAMIC SYMBOL TABLE:\n");
2263 }
2264 else
2265 {
2266 current = syms;
2267 max = symcount;
2268 printf ("SYMBOL TABLE:\n");
2269 }
2270
2271 if (max == 0)
2272 printf (_("no symbols\n"));
2273
2274 for (count = 0; count < max; count++)
2275 {
2276 bfd *cur_bfd;
2277
2278 if (*current == NULL)
2279 printf (_("no information for the %ld'th symbol"), count);
2280
2281 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2282 printf (_("could not determine the type of the %ld'th symbol"),
2283 count);
2284
2285 else
2286 {
2287 const char *name = (*current)->name;
2288
2289 if (do_demangle && name != NULL && *name != '\0')
2290 {
2291 char *alloc;
2292
2293 /* If we want to demangle the name, we demangle it
2294 here, and temporarily clobber it while calling
2295 bfd_print_symbol. FIXME: This is a gross hack. */
2296 alloc = demangle (cur_bfd, name);
2297 (*current)->name = alloc;
2298 bfd_print_symbol (cur_bfd, stdout, *current,
2299 bfd_print_symbol_all);
2300 (*current)->name = name;
2301 free (alloc);
2302 }
2303 else
2304 bfd_print_symbol (cur_bfd, stdout, *current,
2305 bfd_print_symbol_all);
2306 }
2307
2308 printf ("\n");
2309 current++;
2310 }
2311 printf ("\n\n");
2312 }
2313 \f
2314 static void
2315 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2316 {
2317 arelent **p;
2318 char *last_filename, *last_functionname;
2319 unsigned int last_line;
2320
2321 /* Get column headers lined up reasonably. */
2322 {
2323 static int width;
2324
2325 if (width == 0)
2326 {
2327 char buf[30];
2328
2329 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2330 width = strlen (buf) - 7;
2331 }
2332 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2333 }
2334
2335 last_filename = NULL;
2336 last_functionname = NULL;
2337 last_line = 0;
2338
2339 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2340 {
2341 arelent *q = *p;
2342 const char *filename, *functionname;
2343 unsigned int line;
2344 const char *sym_name;
2345 const char *section_name;
2346
2347 if (start_address != (bfd_vma) -1
2348 && q->address < start_address)
2349 continue;
2350 if (stop_address != (bfd_vma) -1
2351 && q->address > stop_address)
2352 continue;
2353
2354 if (with_line_numbers
2355 && sec != NULL
2356 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2357 &filename, &functionname, &line))
2358 {
2359 if (functionname != NULL
2360 && (last_functionname == NULL
2361 || strcmp (functionname, last_functionname) != 0))
2362 {
2363 printf ("%s():\n", functionname);
2364 if (last_functionname != NULL)
2365 free (last_functionname);
2366 last_functionname = xstrdup (functionname);
2367 }
2368
2369 if (line > 0
2370 && (line != last_line
2371 || (filename != NULL
2372 && last_filename != NULL
2373 && strcmp (filename, last_filename) != 0)))
2374 {
2375 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2376 last_line = line;
2377 if (last_filename != NULL)
2378 free (last_filename);
2379 if (filename == NULL)
2380 last_filename = NULL;
2381 else
2382 last_filename = xstrdup (filename);
2383 }
2384 }
2385
2386 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2387 {
2388 sym_name = (*(q->sym_ptr_ptr))->name;
2389 section_name = (*(q->sym_ptr_ptr))->section->name;
2390 }
2391 else
2392 {
2393 sym_name = NULL;
2394 section_name = NULL;
2395 }
2396
2397 if (sym_name)
2398 {
2399 bfd_printf_vma (abfd, q->address);
2400 if (q->howto->name)
2401 printf (" %-16s ", q->howto->name);
2402 else
2403 printf (" %-16d ", q->howto->type);
2404 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
2405 }
2406 else
2407 {
2408 if (section_name == NULL)
2409 section_name = "*unknown*";
2410 bfd_printf_vma (abfd, q->address);
2411 printf (" %-16s [%s]",
2412 q->howto->name,
2413 section_name);
2414 }
2415
2416 if (q->addend)
2417 {
2418 printf ("+0x");
2419 bfd_printf_vma (abfd, q->addend);
2420 }
2421
2422 printf ("\n");
2423 }
2424 }
2425
2426 static void
2427 dump_relocs_in_section (bfd *abfd,
2428 asection *section,
2429 void *dummy ATTRIBUTE_UNUSED)
2430 {
2431 arelent **relpp;
2432 long relcount;
2433 long relsize;
2434
2435 if ( bfd_is_abs_section (section)
2436 || bfd_is_und_section (section)
2437 || bfd_is_com_section (section)
2438 || (! process_section_p (section))
2439 || ((section->flags & SEC_RELOC) == 0))
2440 return;
2441
2442 relsize = bfd_get_reloc_upper_bound (abfd, section);
2443 if (relsize < 0)
2444 bfd_fatal (bfd_get_filename (abfd));
2445
2446 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2447
2448 if (relsize == 0)
2449 {
2450 printf (" (none)\n\n");
2451 return;
2452 }
2453
2454 relpp = xmalloc (relsize);
2455 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2456
2457 if (relcount < 0)
2458 bfd_fatal (bfd_get_filename (abfd));
2459 else if (relcount == 0)
2460 printf (" (none)\n\n");
2461 else
2462 {
2463 printf ("\n");
2464 dump_reloc_set (abfd, section, relpp, relcount);
2465 printf ("\n\n");
2466 }
2467 free (relpp);
2468 }
2469
2470 static void
2471 dump_relocs (bfd *abfd)
2472 {
2473 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2474 }
2475
2476 static void
2477 dump_dynamic_relocs (bfd *abfd)
2478 {
2479 long relsize;
2480 arelent **relpp;
2481 long relcount;
2482
2483 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2484 if (relsize < 0)
2485 bfd_fatal (bfd_get_filename (abfd));
2486
2487 printf ("DYNAMIC RELOCATION RECORDS");
2488
2489 if (relsize == 0)
2490 printf (" (none)\n\n");
2491 else
2492 {
2493 relpp = xmalloc (relsize);
2494 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2495
2496 if (relcount < 0)
2497 bfd_fatal (bfd_get_filename (abfd));
2498 else if (relcount == 0)
2499 printf (" (none)\n\n");
2500 else
2501 {
2502 printf ("\n");
2503 dump_reloc_set (abfd, NULL, relpp, relcount);
2504 printf ("\n\n");
2505 }
2506 free (relpp);
2507 }
2508 }
2509
2510 /* Creates a table of paths, to search for source files. */
2511
2512 static void
2513 add_include_path (const char *path)
2514 {
2515 if (path[0] == 0)
2516 return;
2517 include_path_count++;
2518 include_paths = xrealloc (include_paths,
2519 include_path_count * sizeof (*include_paths));
2520 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
2521 if (path[1] == ':' && path[2] == 0)
2522 path = concat (path, ".", (const char *) 0);
2523 #endif
2524 include_paths[include_path_count - 1] = path;
2525 }
2526
2527 static void
2528 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2529 asection *section,
2530 void *dummy ATTRIBUTE_UNUSED)
2531 {
2532 section->vma += adjust_section_vma;
2533 section->lma += adjust_section_vma;
2534 }
2535
2536 /* Dump selected contents of ABFD. */
2537
2538 static void
2539 dump_bfd (bfd *abfd)
2540 {
2541 /* If we are adjusting section VMA's, change them all now. Changing
2542 the BFD information is a hack. However, we must do it, or
2543 bfd_find_nearest_line will not do the right thing. */
2544 if (adjust_section_vma != 0)
2545 bfd_map_over_sections (abfd, adjust_addresses, NULL);
2546
2547 if (! dump_debugging_tags)
2548 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2549 abfd->xvec->name);
2550 if (dump_ar_hdrs)
2551 print_arelt_descr (stdout, abfd, TRUE);
2552 if (dump_file_header)
2553 dump_bfd_header (abfd);
2554 if (dump_private_headers)
2555 dump_bfd_private_header (abfd);
2556 if (! dump_debugging_tags)
2557 putchar ('\n');
2558 if (dump_section_headers)
2559 dump_headers (abfd);
2560
2561 if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
2562 syms = slurp_symtab (abfd);
2563 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2564 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
2565 dynsyms = slurp_dynamic_symtab (abfd);
2566 if (disassemble && dynsymcount > 0)
2567 {
2568 synthcount = bfd_get_synthetic_symtab (abfd, dynsyms, &synthsyms);
2569 if (synthcount < 0) synthcount = 0;
2570 }
2571
2572 if (dump_symtab)
2573 dump_symbols (abfd, FALSE);
2574 if (dump_dynamic_symtab)
2575 dump_symbols (abfd, TRUE);
2576 if (dump_stab_section_info)
2577 dump_stabs (abfd);
2578 if (dump_reloc_info && ! disassemble)
2579 dump_relocs (abfd);
2580 if (dump_dynamic_reloc_info && ! disassemble)
2581 dump_dynamic_relocs (abfd);
2582 if (dump_section_contents)
2583 dump_data (abfd);
2584 if (disassemble)
2585 disassemble_data (abfd);
2586
2587 if (dump_debugging)
2588 {
2589 void *dhandle;
2590
2591 dhandle = read_debugging_info (abfd, syms, symcount);
2592 if (dhandle != NULL)
2593 {
2594 if (! print_debugging_info (stdout, dhandle, abfd, syms, demangle,
2595 dump_debugging_tags ? TRUE : FALSE))
2596 {
2597 non_fatal (_("%s: printing debugging information failed"),
2598 bfd_get_filename (abfd));
2599 exit_status = 1;
2600 }
2601 }
2602 }
2603
2604 if (syms)
2605 {
2606 free (syms);
2607 syms = NULL;
2608 }
2609
2610 if (dynsyms)
2611 {
2612 free (dynsyms);
2613 dynsyms = NULL;
2614 }
2615
2616 if (synthsyms)
2617 {
2618 free (synthsyms);
2619 synthsyms = NULL;
2620 }
2621
2622 symcount = 0;
2623 dynsymcount = 0;
2624 synthcount = 0;
2625 }
2626
2627 static void
2628 display_bfd (bfd *abfd)
2629 {
2630 char **matching;
2631
2632 if (bfd_check_format_matches (abfd, bfd_object, &matching))
2633 {
2634 dump_bfd (abfd);
2635 return;
2636 }
2637
2638 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2639 {
2640 nonfatal (bfd_get_filename (abfd));
2641 list_matching_formats (matching);
2642 free (matching);
2643 return;
2644 }
2645
2646 if (bfd_get_error () != bfd_error_file_not_recognized)
2647 {
2648 nonfatal (bfd_get_filename (abfd));
2649 return;
2650 }
2651
2652 if (bfd_check_format_matches (abfd, bfd_core, &matching))
2653 {
2654 dump_bfd (abfd);
2655 return;
2656 }
2657
2658 nonfatal (bfd_get_filename (abfd));
2659
2660 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
2661 {
2662 list_matching_formats (matching);
2663 free (matching);
2664 }
2665 }
2666
2667 static void
2668 display_file (char *filename, char *target)
2669 {
2670 bfd *file;
2671 bfd *arfile = NULL;
2672
2673 if (get_file_size (filename) < 1)
2674 return;
2675
2676 file = bfd_openr (filename, target);
2677 if (file == NULL)
2678 {
2679 nonfatal (filename);
2680 return;
2681 }
2682
2683 /* If the file is an archive, process all of its elements. */
2684 if (bfd_check_format (file, bfd_archive))
2685 {
2686 bfd *last_arfile = NULL;
2687
2688 printf (_("In archive %s:\n"), bfd_get_filename (file));
2689 for (;;)
2690 {
2691 bfd_set_error (bfd_error_no_error);
2692
2693 arfile = bfd_openr_next_archived_file (file, arfile);
2694 if (arfile == NULL)
2695 {
2696 if (bfd_get_error () != bfd_error_no_more_archived_files)
2697 nonfatal (bfd_get_filename (file));
2698 break;
2699 }
2700
2701 display_bfd (arfile);
2702
2703 if (last_arfile != NULL)
2704 bfd_close (last_arfile);
2705 last_arfile = arfile;
2706 }
2707
2708 if (last_arfile != NULL)
2709 bfd_close (last_arfile);
2710 }
2711 else
2712 display_bfd (file);
2713
2714 bfd_close (file);
2715 }
2716 \f
2717 int
2718 main (int argc, char **argv)
2719 {
2720 int c;
2721 char *target = default_target;
2722 bfd_boolean seenflag = FALSE;
2723
2724 #if defined (HAVE_SETLOCALE)
2725 #if defined (HAVE_LC_MESSAGES)
2726 setlocale (LC_MESSAGES, "");
2727 #endif
2728 setlocale (LC_CTYPE, "");
2729 #endif
2730
2731 bindtextdomain (PACKAGE, LOCALEDIR);
2732 textdomain (PACKAGE);
2733
2734 program_name = *argv;
2735 xmalloc_set_program_name (program_name);
2736
2737 START_PROGRESS (program_name, 0);
2738
2739 bfd_init ();
2740 set_default_bfd_target ();
2741
2742 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfaHhrRtTxsSI:j:wE:zgeG",
2743 long_options, (int *) 0))
2744 != EOF)
2745 {
2746 switch (c)
2747 {
2748 case 0:
2749 break; /* We've been given a long option. */
2750 case 'm':
2751 machine = optarg;
2752 break;
2753 case 'M':
2754 if (disassembler_options)
2755 /* Ignore potential memory leak for now. */
2756 disassembler_options = concat (disassembler_options, ",",
2757 optarg, NULL);
2758 else
2759 disassembler_options = optarg;
2760 break;
2761 case 'j':
2762 if (only_used == only_size)
2763 {
2764 only_size += 8;
2765 only = xrealloc (only, only_size * sizeof (char *));
2766 }
2767 only [only_used++] = optarg;
2768 break;
2769 case 'l':
2770 with_line_numbers = TRUE;
2771 break;
2772 case 'b':
2773 target = optarg;
2774 break;
2775 case 'C':
2776 do_demangle = TRUE;
2777 if (optarg != NULL)
2778 {
2779 enum demangling_styles style;
2780
2781 style = cplus_demangle_name_to_style (optarg);
2782 if (style == unknown_demangling)
2783 fatal (_("unknown demangling style `%s'"),
2784 optarg);
2785
2786 cplus_demangle_set_style (style);
2787 }
2788 break;
2789 case 'w':
2790 wide_output = TRUE;
2791 break;
2792 case OPTION_ADJUST_VMA:
2793 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2794 break;
2795 case OPTION_START_ADDRESS:
2796 start_address = parse_vma (optarg, "--start-address");
2797 break;
2798 case OPTION_STOP_ADDRESS:
2799 stop_address = parse_vma (optarg, "--stop-address");
2800 break;
2801 case 'E':
2802 if (strcmp (optarg, "B") == 0)
2803 endian = BFD_ENDIAN_BIG;
2804 else if (strcmp (optarg, "L") == 0)
2805 endian = BFD_ENDIAN_LITTLE;
2806 else
2807 {
2808 non_fatal (_("unrecognized -E option"));
2809 usage (stderr, 1);
2810 }
2811 break;
2812 case OPTION_ENDIAN:
2813 if (strncmp (optarg, "big", strlen (optarg)) == 0)
2814 endian = BFD_ENDIAN_BIG;
2815 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2816 endian = BFD_ENDIAN_LITTLE;
2817 else
2818 {
2819 non_fatal (_("unrecognized --endian type `%s'"), optarg);
2820 usage (stderr, 1);
2821 }
2822 break;
2823
2824 case 'f':
2825 dump_file_header = TRUE;
2826 seenflag = TRUE;
2827 break;
2828 case 'i':
2829 formats_info = TRUE;
2830 seenflag = TRUE;
2831 break;
2832 case 'I':
2833 add_include_path (optarg);
2834 break;
2835 case 'p':
2836 dump_private_headers = TRUE;
2837 seenflag = TRUE;
2838 break;
2839 case 'x':
2840 dump_private_headers = TRUE;
2841 dump_symtab = TRUE;
2842 dump_reloc_info = TRUE;
2843 dump_file_header = TRUE;
2844 dump_ar_hdrs = TRUE;
2845 dump_section_headers = TRUE;
2846 seenflag = TRUE;
2847 break;
2848 case 't':
2849 dump_symtab = TRUE;
2850 seenflag = TRUE;
2851 break;
2852 case 'T':
2853 dump_dynamic_symtab = TRUE;
2854 seenflag = TRUE;
2855 break;
2856 case 'd':
2857 disassemble = TRUE;
2858 seenflag = TRUE;
2859 break;
2860 case 'z':
2861 disassemble_zeroes = TRUE;
2862 break;
2863 case 'D':
2864 disassemble = TRUE;
2865 disassemble_all = TRUE;
2866 seenflag = TRUE;
2867 break;
2868 case 'S':
2869 disassemble = TRUE;
2870 with_source_code = TRUE;
2871 seenflag = TRUE;
2872 break;
2873 case 'g':
2874 dump_debugging = 1;
2875 seenflag = TRUE;
2876 break;
2877 case 'e':
2878 dump_debugging = 1;
2879 dump_debugging_tags = 1;
2880 do_demangle = TRUE;
2881 seenflag = TRUE;
2882 break;
2883 case 'G':
2884 dump_stab_section_info = TRUE;
2885 seenflag = TRUE;
2886 break;
2887 case 's':
2888 dump_section_contents = TRUE;
2889 seenflag = TRUE;
2890 break;
2891 case 'r':
2892 dump_reloc_info = TRUE;
2893 seenflag = TRUE;
2894 break;
2895 case 'R':
2896 dump_dynamic_reloc_info = TRUE;
2897 seenflag = TRUE;
2898 break;
2899 case 'a':
2900 dump_ar_hdrs = TRUE;
2901 seenflag = TRUE;
2902 break;
2903 case 'h':
2904 dump_section_headers = TRUE;
2905 seenflag = TRUE;
2906 break;
2907 case 'H':
2908 usage (stdout, 0);
2909 seenflag = TRUE;
2910 case 'v':
2911 case 'V':
2912 show_version = TRUE;
2913 seenflag = TRUE;
2914 break;
2915
2916 default:
2917 usage (stderr, 1);
2918 }
2919 }
2920
2921 if (show_version)
2922 print_version ("objdump");
2923
2924 if (!seenflag)
2925 usage (stderr, 2);
2926
2927 if (formats_info)
2928 exit_status = display_info ();
2929 else
2930 {
2931 if (optind == argc)
2932 display_file ("a.out", target);
2933 else
2934 for (; optind < argc;)
2935 display_file (argv[optind++], target);
2936 }
2937
2938 END_PROGRESS (program_name);
2939
2940 return exit_status;
2941 }