* dwarf.c (display_gdb_index): Handle index version 6.
[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, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
4 2012 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 3, 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, 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23
24 /* Objdump overview.
25
26 Objdump displays information about one or more object files, either on
27 their own, or inside libraries. It is commonly used as a disassembler,
28 but it can also display information about file headers, symbol tables,
29 relocations, debugging directives and more.
30
31 The flow of execution is as follows:
32
33 1. Command line arguments are checked for control switches and the
34 information to be displayed is selected.
35
36 2. Any remaining arguments are assumed to be object files, and they are
37 processed in order by display_bfd(). If the file is an archive each
38 of its elements is processed in turn.
39
40 3. The file's target architecture and binary file format are determined
41 by bfd_check_format(). If they are recognised, then dump_bfd() is
42 called.
43
44 4. dump_bfd() in turn calls separate functions to display the requested
45 item(s) of information(s). For example disassemble_data() is called if
46 a disassembly has been requested.
47
48 When disassembling the code loops through blocks of instructions bounded
49 by symbols, calling disassemble_bytes() on each block. The actual
50 disassembling is done by the libopcodes library, via a function pointer
51 supplied by the disassembler() function. */
52
53 #include "sysdep.h"
54 #include "bfd.h"
55 #include "elf-bfd.h"
56 #include "progress.h"
57 #include "bucomm.h"
58 #include "elfcomm.h"
59 #include "dwarf.h"
60 #include "getopt.h"
61 #include "safe-ctype.h"
62 #include "dis-asm.h"
63 #include "libiberty.h"
64 #include "demangle.h"
65 #include "filenames.h"
66 #include "debug.h"
67 #include "budbg.h"
68 #include "objdump.h"
69
70 #ifdef HAVE_MMAP
71 #include <sys/mman.h>
72 #endif
73
74 /* Internal headers for the ELF .stab-dump code - sorry. */
75 #define BYTES_IN_WORD 32
76 #include "aout/aout64.h"
77
78 /* Exit status. */
79 static int exit_status = 0;
80
81 static char *default_target = NULL; /* Default at runtime. */
82
83 /* The following variables are set based on arguments passed on the
84 command line. */
85 static int show_version = 0; /* Show the version number. */
86 static int dump_section_contents; /* -s */
87 static int dump_section_headers; /* -h */
88 static bfd_boolean dump_file_header; /* -f */
89 static int dump_symtab; /* -t */
90 static int dump_dynamic_symtab; /* -T */
91 static int dump_reloc_info; /* -r */
92 static int dump_dynamic_reloc_info; /* -R */
93 static int dump_ar_hdrs; /* -a */
94 static int dump_private_headers; /* -p */
95 static char *dump_private_options; /* -P */
96 static int prefix_addresses; /* --prefix-addresses */
97 static int with_line_numbers; /* -l */
98 static bfd_boolean with_source_code; /* -S */
99 static int show_raw_insn; /* --show-raw-insn */
100 static int dump_dwarf_section_info; /* --dwarf */
101 static int dump_stab_section_info; /* --stabs */
102 static int do_demangle; /* -C, --demangle */
103 static bfd_boolean disassemble; /* -d */
104 static bfd_boolean disassemble_all; /* -D */
105 static int disassemble_zeroes; /* --disassemble-zeroes */
106 static bfd_boolean formats_info; /* -i */
107 static int wide_output; /* -w */
108 static int insn_width; /* --insn-width */
109 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
110 static bfd_vma stop_address = (bfd_vma) -1; /* --stop-address */
111 static int dump_debugging; /* --debugging */
112 static int dump_debugging_tags; /* --debugging-tags */
113 static int suppress_bfd_header;
114 static int dump_special_syms = 0; /* --special-syms */
115 static bfd_vma adjust_section_vma = 0; /* --adjust-vma */
116 static int file_start_context = 0; /* --file-start-context */
117 static bfd_boolean display_file_offsets;/* -F */
118 static const char *prefix; /* --prefix */
119 static int prefix_strip; /* --prefix-strip */
120 static size_t prefix_length;
121
122 /* A structure to record the sections mentioned in -j switches. */
123 struct only
124 {
125 const char * name; /* The name of the section. */
126 bfd_boolean seen; /* A flag to indicate that the section has been found in one or more input files. */
127 struct only * next; /* Pointer to the next structure in the list. */
128 };
129 /* Pointer to an array of 'only' structures.
130 This pointer is NULL if the -j switch has not been used. */
131 static struct only * only_list = NULL;
132
133 /* Variables for handling include file path table. */
134 static const char **include_paths;
135 static int include_path_count;
136
137 /* Extra info to pass to the section disassembler and address printing
138 function. */
139 struct objdump_disasm_info
140 {
141 bfd * abfd;
142 asection * sec;
143 bfd_boolean require_sec;
144 arelent ** dynrelbuf;
145 long dynrelcount;
146 disassembler_ftype disassemble_fn;
147 arelent * reloc;
148 };
149
150 /* Architecture to disassemble for, or default if NULL. */
151 static char *machine = NULL;
152
153 /* Target specific options to the disassembler. */
154 static char *disassembler_options = NULL;
155
156 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN. */
157 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
158
159 /* The symbol table. */
160 static asymbol **syms;
161
162 /* Number of symbols in `syms'. */
163 static long symcount = 0;
164
165 /* The sorted symbol table. */
166 static asymbol **sorted_syms;
167
168 /* Number of symbols in `sorted_syms'. */
169 static long sorted_symcount = 0;
170
171 /* The dynamic symbol table. */
172 static asymbol **dynsyms;
173
174 /* The synthetic symbol table. */
175 static asymbol *synthsyms;
176 static long synthcount = 0;
177
178 /* Number of symbols in `dynsyms'. */
179 static long dynsymcount = 0;
180
181 static bfd_byte *stabs;
182 static bfd_size_type stab_size;
183
184 static char *strtab;
185 static bfd_size_type stabstr_size;
186
187 static bfd_boolean is_relocatable = FALSE;
188
189 /* Handlers for -P/--private. */
190 static const struct objdump_private_desc * const objdump_private_vectors[] =
191 {
192 OBJDUMP_PRIVATE_VECTORS
193 NULL
194 };
195 \f
196 static void
197 usage (FILE *stream, int status)
198 {
199 fprintf (stream, _("Usage: %s <option(s)> <file(s)>\n"), program_name);
200 fprintf (stream, _(" Display information from object <file(s)>.\n"));
201 fprintf (stream, _(" At least one of the following switches must be given:\n"));
202 fprintf (stream, _("\
203 -a, --archive-headers Display archive header information\n\
204 -f, --file-headers Display the contents of the overall file header\n\
205 -p, --private-headers Display object format specific file header contents\n\
206 -P, --private=OPT,OPT... Display object format specific contents\n\
207 -h, --[section-]headers Display the contents of the section headers\n\
208 -x, --all-headers Display the contents of all headers\n\
209 -d, --disassemble Display assembler contents of executable sections\n\
210 -D, --disassemble-all Display assembler contents of all sections\n\
211 -S, --source Intermix source code with disassembly\n\
212 -s, --full-contents Display the full contents of all sections requested\n\
213 -g, --debugging Display debug information in object file\n\
214 -e, --debugging-tags Display debug information using ctags style\n\
215 -G, --stabs Display (in raw form) any STABS info in the file\n\
216 -W[lLiaprmfFsoRt] or\n\
217 --dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
218 =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
219 =gdb_index,=trace_info,=trace_abbrev,=trace_aranges]\n\
220 Display DWARF info in the file\n\
221 -t, --syms Display the contents of the symbol table(s)\n\
222 -T, --dynamic-syms Display the contents of the dynamic symbol table\n\
223 -r, --reloc Display the relocation entries in the file\n\
224 -R, --dynamic-reloc Display the dynamic relocation entries in the file\n\
225 @<file> Read options from <file>\n\
226 -v, --version Display this program's version number\n\
227 -i, --info List object formats and architectures supported\n\
228 -H, --help Display this information\n\
229 "));
230 if (status != 2)
231 {
232 const struct objdump_private_desc * const *desc;
233
234 fprintf (stream, _("\n The following switches are optional:\n"));
235 fprintf (stream, _("\
236 -b, --target=BFDNAME Specify the target object format as BFDNAME\n\
237 -m, --architecture=MACHINE Specify the target architecture as MACHINE\n\
238 -j, --section=NAME Only display information for section NAME\n\
239 -M, --disassembler-options=OPT Pass text OPT on to the disassembler\n\
240 -EB --endian=big Assume big endian format when disassembling\n\
241 -EL --endian=little Assume little endian format when disassembling\n\
242 --file-start-context Include context from start of file (with -S)\n\
243 -I, --include=DIR Add DIR to search list for source files\n\
244 -l, --line-numbers Include line numbers and filenames in output\n\
245 -F, --file-offsets Include file offsets when displaying information\n\
246 -C, --demangle[=STYLE] Decode mangled/processed symbol names\n\
247 The STYLE, if specified, can be `auto', `gnu',\n\
248 `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
249 or `gnat'\n\
250 -w, --wide Format output for more than 80 columns\n\
251 -z, --disassemble-zeroes Do not skip blocks of zeroes when disassembling\n\
252 --start-address=ADDR Only process data whose address is >= ADDR\n\
253 --stop-address=ADDR Only process data whose address is <= ADDR\n\
254 --prefix-addresses Print complete address alongside disassembly\n\
255 --[no-]show-raw-insn Display hex alongside symbolic disassembly\n\
256 --insn-width=WIDTH Display WIDTH bytes on a single line for -d\n\
257 --adjust-vma=OFFSET Add OFFSET to all displayed section addresses\n\
258 --special-syms Include special symbols in symbol dumps\n\
259 --prefix=PREFIX Add PREFIX to absolute paths for -S\n\
260 --prefix-strip=LEVEL Strip initial directory names for -S\n"));
261 fprintf (stream, _("\
262 --dwarf-depth=N Do not display DIEs at depth N or greater\n\
263 --dwarf-start=N Display DIEs starting with N, at the same depth\n\
264 or deeper\n\n"));
265 list_supported_targets (program_name, stream);
266 list_supported_architectures (program_name, stream);
267
268 disassembler_usage (stream);
269
270 if (objdump_private_vectors[0] != NULL)
271 {
272 fprintf (stream,
273 _("\nOptions supported for -P/--private switch:\n"));
274 for (desc = objdump_private_vectors; *desc != NULL; desc++)
275 (*desc)->help (stream);
276 }
277 }
278 if (REPORT_BUGS_TO[0] && status == 0)
279 fprintf (stream, _("Report bugs to %s.\n"), REPORT_BUGS_TO);
280 exit (status);
281 }
282
283 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
284 enum option_values
285 {
286 OPTION_ENDIAN=150,
287 OPTION_START_ADDRESS,
288 OPTION_STOP_ADDRESS,
289 OPTION_DWARF,
290 OPTION_PREFIX,
291 OPTION_PREFIX_STRIP,
292 OPTION_INSN_WIDTH,
293 OPTION_ADJUST_VMA,
294 OPTION_DWARF_DEPTH,
295 OPTION_DWARF_START
296 };
297
298 static struct option long_options[]=
299 {
300 {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
301 {"all-headers", no_argument, NULL, 'x'},
302 {"private-headers", no_argument, NULL, 'p'},
303 {"private", required_argument, NULL, 'P'},
304 {"architecture", required_argument, NULL, 'm'},
305 {"archive-headers", no_argument, NULL, 'a'},
306 {"debugging", no_argument, NULL, 'g'},
307 {"debugging-tags", no_argument, NULL, 'e'},
308 {"demangle", optional_argument, NULL, 'C'},
309 {"disassemble", no_argument, NULL, 'd'},
310 {"disassemble-all", no_argument, NULL, 'D'},
311 {"disassembler-options", required_argument, NULL, 'M'},
312 {"disassemble-zeroes", no_argument, NULL, 'z'},
313 {"dynamic-reloc", no_argument, NULL, 'R'},
314 {"dynamic-syms", no_argument, NULL, 'T'},
315 {"endian", required_argument, NULL, OPTION_ENDIAN},
316 {"file-headers", no_argument, NULL, 'f'},
317 {"file-offsets", no_argument, NULL, 'F'},
318 {"file-start-context", no_argument, &file_start_context, 1},
319 {"full-contents", no_argument, NULL, 's'},
320 {"headers", no_argument, NULL, 'h'},
321 {"help", no_argument, NULL, 'H'},
322 {"info", no_argument, NULL, 'i'},
323 {"line-numbers", no_argument, NULL, 'l'},
324 {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
325 {"prefix-addresses", no_argument, &prefix_addresses, 1},
326 {"reloc", no_argument, NULL, 'r'},
327 {"section", required_argument, NULL, 'j'},
328 {"section-headers", no_argument, NULL, 'h'},
329 {"show-raw-insn", no_argument, &show_raw_insn, 1},
330 {"source", no_argument, NULL, 'S'},
331 {"special-syms", no_argument, &dump_special_syms, 1},
332 {"include", required_argument, NULL, 'I'},
333 {"dwarf", optional_argument, NULL, OPTION_DWARF},
334 {"stabs", no_argument, NULL, 'G'},
335 {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
336 {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
337 {"syms", no_argument, NULL, 't'},
338 {"target", required_argument, NULL, 'b'},
339 {"version", no_argument, NULL, 'V'},
340 {"wide", no_argument, NULL, 'w'},
341 {"prefix", required_argument, NULL, OPTION_PREFIX},
342 {"prefix-strip", required_argument, NULL, OPTION_PREFIX_STRIP},
343 {"insn-width", required_argument, NULL, OPTION_INSN_WIDTH},
344 {"dwarf-depth", required_argument, 0, OPTION_DWARF_DEPTH},
345 {"dwarf-start", required_argument, 0, OPTION_DWARF_START},
346 {0, no_argument, 0, 0}
347 };
348 \f
349 static void
350 nonfatal (const char *msg)
351 {
352 bfd_nonfatal (msg);
353 exit_status = 1;
354 }
355 \f
356 /* Returns TRUE if the specified section should be dumped. */
357
358 static bfd_boolean
359 process_section_p (asection * section)
360 {
361 struct only * only;
362
363 if (only_list == NULL)
364 return TRUE;
365
366 for (only = only_list; only; only = only->next)
367 if (strcmp (only->name, section->name) == 0)
368 {
369 only->seen = TRUE;
370 return TRUE;
371 }
372
373 return FALSE;
374 }
375
376 /* Add an entry to the 'only' list. */
377
378 static void
379 add_only (char * name)
380 {
381 struct only * only;
382
383 /* First check to make sure that we do not
384 already have an entry for this name. */
385 for (only = only_list; only; only = only->next)
386 if (strcmp (only->name, name) == 0)
387 return;
388
389 only = xmalloc (sizeof * only);
390 only->name = name;
391 only->seen = FALSE;
392 only->next = only_list;
393 only_list = only;
394 }
395
396 /* Release the memory used by the 'only' list.
397 PR 11225: Issue a warning message for unseen sections.
398 Only do this if none of the sections were seen. This is mainly to support
399 tools like the GAS testsuite where an object file is dumped with a list of
400 generic section names known to be present in a range of different file
401 formats. */
402
403 static void
404 free_only_list (void)
405 {
406 bfd_boolean at_least_one_seen = FALSE;
407 struct only * only;
408 struct only * next;
409
410 if (only_list == NULL)
411 return;
412
413 for (only = only_list; only; only = only->next)
414 if (only->seen)
415 {
416 at_least_one_seen = TRUE;
417 break;
418 }
419
420 for (only = only_list; only; only = next)
421 {
422 if (! at_least_one_seen)
423 {
424 non_fatal (_("section '%s' mentioned in a -j option, "
425 "but not found in any input file"),
426 only->name);
427 exit_status = 1;
428 }
429 next = only->next;
430 free (only);
431 }
432 }
433
434 \f
435 static void
436 dump_section_header (bfd *abfd, asection *section,
437 void *ignored ATTRIBUTE_UNUSED)
438 {
439 char *comma = "";
440 unsigned int opb = bfd_octets_per_byte (abfd);
441
442 /* Ignore linker created section. See elfNN_ia64_object_p in
443 bfd/elfxx-ia64.c. */
444 if (section->flags & SEC_LINKER_CREATED)
445 return;
446
447 /* PR 10413: Skip sections that we are ignoring. */
448 if (! process_section_p (section))
449 return;
450
451 printf ("%3d %-13s %08lx ", section->index,
452 bfd_get_section_name (abfd, section),
453 (unsigned long) bfd_section_size (abfd, section) / opb);
454 bfd_printf_vma (abfd, bfd_get_section_vma (abfd, section));
455 printf (" ");
456 bfd_printf_vma (abfd, section->lma);
457 printf (" %08lx 2**%u", (unsigned long) section->filepos,
458 bfd_get_section_alignment (abfd, section));
459 if (! wide_output)
460 printf ("\n ");
461 printf (" ");
462
463 #define PF(x, y) \
464 if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
465
466 PF (SEC_HAS_CONTENTS, "CONTENTS");
467 PF (SEC_ALLOC, "ALLOC");
468 PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
469 PF (SEC_LOAD, "LOAD");
470 PF (SEC_RELOC, "RELOC");
471 PF (SEC_READONLY, "READONLY");
472 PF (SEC_CODE, "CODE");
473 PF (SEC_DATA, "DATA");
474 PF (SEC_ROM, "ROM");
475 PF (SEC_DEBUGGING, "DEBUGGING");
476 PF (SEC_NEVER_LOAD, "NEVER_LOAD");
477 PF (SEC_EXCLUDE, "EXCLUDE");
478 PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
479 if (bfd_get_arch (abfd) == bfd_arch_tic54x)
480 {
481 PF (SEC_TIC54X_BLOCK, "BLOCK");
482 PF (SEC_TIC54X_CLINK, "CLINK");
483 }
484 PF (SEC_SMALL_DATA, "SMALL_DATA");
485 if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
486 PF (SEC_COFF_SHARED, "SHARED");
487 PF (SEC_THREAD_LOCAL, "THREAD_LOCAL");
488 PF (SEC_GROUP, "GROUP");
489
490 if ((section->flags & SEC_LINK_ONCE) != 0)
491 {
492 const char *ls;
493 struct coff_comdat_info *comdat;
494
495 switch (section->flags & SEC_LINK_DUPLICATES)
496 {
497 default:
498 abort ();
499 case SEC_LINK_DUPLICATES_DISCARD:
500 ls = "LINK_ONCE_DISCARD";
501 break;
502 case SEC_LINK_DUPLICATES_ONE_ONLY:
503 ls = "LINK_ONCE_ONE_ONLY";
504 break;
505 case SEC_LINK_DUPLICATES_SAME_SIZE:
506 ls = "LINK_ONCE_SAME_SIZE";
507 break;
508 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
509 ls = "LINK_ONCE_SAME_CONTENTS";
510 break;
511 }
512 printf ("%s%s", comma, ls);
513
514 comdat = bfd_coff_get_comdat_section (abfd, section);
515 if (comdat != NULL)
516 printf (" (COMDAT %s %ld)", comdat->name, comdat->symbol);
517
518 comma = ", ";
519 }
520
521 printf ("\n");
522 #undef PF
523 }
524
525 static void
526 dump_headers (bfd *abfd)
527 {
528 printf (_("Sections:\n"));
529
530 #ifndef BFD64
531 printf (_("Idx Name Size VMA LMA File off Algn"));
532 #else
533 /* With BFD64, non-ELF returns -1 and wants always 64 bit addresses. */
534 if (bfd_get_arch_size (abfd) == 32)
535 printf (_("Idx Name Size VMA LMA File off Algn"));
536 else
537 printf (_("Idx Name Size VMA LMA File off Algn"));
538 #endif
539
540 if (wide_output)
541 printf (_(" Flags"));
542 printf ("\n");
543
544 bfd_map_over_sections (abfd, dump_section_header, NULL);
545 }
546 \f
547 static asymbol **
548 slurp_symtab (bfd *abfd)
549 {
550 asymbol **sy = NULL;
551 long storage;
552
553 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
554 {
555 symcount = 0;
556 return NULL;
557 }
558
559 storage = bfd_get_symtab_upper_bound (abfd);
560 if (storage < 0)
561 bfd_fatal (bfd_get_filename (abfd));
562 if (storage)
563 sy = (asymbol **) xmalloc (storage);
564
565 symcount = bfd_canonicalize_symtab (abfd, sy);
566 if (symcount < 0)
567 bfd_fatal (bfd_get_filename (abfd));
568 return sy;
569 }
570
571 /* Read in the dynamic symbols. */
572
573 static asymbol **
574 slurp_dynamic_symtab (bfd *abfd)
575 {
576 asymbol **sy = NULL;
577 long storage;
578
579 storage = bfd_get_dynamic_symtab_upper_bound (abfd);
580 if (storage < 0)
581 {
582 if (!(bfd_get_file_flags (abfd) & DYNAMIC))
583 {
584 non_fatal (_("%s: not a dynamic object"), bfd_get_filename (abfd));
585 exit_status = 1;
586 dynsymcount = 0;
587 return NULL;
588 }
589
590 bfd_fatal (bfd_get_filename (abfd));
591 }
592 if (storage)
593 sy = (asymbol **) xmalloc (storage);
594
595 dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
596 if (dynsymcount < 0)
597 bfd_fatal (bfd_get_filename (abfd));
598 return sy;
599 }
600
601 /* Filter out (in place) symbols that are useless for disassembly.
602 COUNT is the number of elements in SYMBOLS.
603 Return the number of useful symbols. */
604
605 static long
606 remove_useless_symbols (asymbol **symbols, long count)
607 {
608 asymbol **in_ptr = symbols, **out_ptr = symbols;
609
610 while (--count >= 0)
611 {
612 asymbol *sym = *in_ptr++;
613
614 if (sym->name == NULL || sym->name[0] == '\0')
615 continue;
616 if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
617 continue;
618 if (bfd_is_und_section (sym->section)
619 || bfd_is_com_section (sym->section))
620 continue;
621
622 *out_ptr++ = sym;
623 }
624 return out_ptr - symbols;
625 }
626
627 /* Sort symbols into value order. */
628
629 static int
630 compare_symbols (const void *ap, const void *bp)
631 {
632 const asymbol *a = * (const asymbol **) ap;
633 const asymbol *b = * (const asymbol **) bp;
634 const char *an;
635 const char *bn;
636 size_t anl;
637 size_t bnl;
638 bfd_boolean af;
639 bfd_boolean bf;
640 flagword aflags;
641 flagword bflags;
642
643 if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
644 return 1;
645 else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
646 return -1;
647
648 if (a->section > b->section)
649 return 1;
650 else if (a->section < b->section)
651 return -1;
652
653 an = bfd_asymbol_name (a);
654 bn = bfd_asymbol_name (b);
655 anl = strlen (an);
656 bnl = strlen (bn);
657
658 /* The symbols gnu_compiled and gcc2_compiled convey no real
659 information, so put them after other symbols with the same value. */
660 af = (strstr (an, "gnu_compiled") != NULL
661 || strstr (an, "gcc2_compiled") != NULL);
662 bf = (strstr (bn, "gnu_compiled") != NULL
663 || strstr (bn, "gcc2_compiled") != NULL);
664
665 if (af && ! bf)
666 return 1;
667 if (! af && bf)
668 return -1;
669
670 /* We use a heuristic for the file name, to try to sort it after
671 more useful symbols. It may not work on non Unix systems, but it
672 doesn't really matter; the only difference is precisely which
673 symbol names get printed. */
674
675 #define file_symbol(s, sn, snl) \
676 (((s)->flags & BSF_FILE) != 0 \
677 || ((sn)[(snl) - 2] == '.' \
678 && ((sn)[(snl) - 1] == 'o' \
679 || (sn)[(snl) - 1] == 'a')))
680
681 af = file_symbol (a, an, anl);
682 bf = file_symbol (b, bn, bnl);
683
684 if (af && ! bf)
685 return 1;
686 if (! af && bf)
687 return -1;
688
689 /* Try to sort global symbols before local symbols before function
690 symbols before debugging symbols. */
691
692 aflags = a->flags;
693 bflags = b->flags;
694
695 if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
696 {
697 if ((aflags & BSF_DEBUGGING) != 0)
698 return 1;
699 else
700 return -1;
701 }
702 if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
703 {
704 if ((aflags & BSF_FUNCTION) != 0)
705 return -1;
706 else
707 return 1;
708 }
709 if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
710 {
711 if ((aflags & BSF_LOCAL) != 0)
712 return 1;
713 else
714 return -1;
715 }
716 if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
717 {
718 if ((aflags & BSF_GLOBAL) != 0)
719 return -1;
720 else
721 return 1;
722 }
723
724 /* Symbols that start with '.' might be section names, so sort them
725 after symbols that don't start with '.'. */
726 if (an[0] == '.' && bn[0] != '.')
727 return 1;
728 if (an[0] != '.' && bn[0] == '.')
729 return -1;
730
731 /* Finally, if we can't distinguish them in any other way, try to
732 get consistent results by sorting the symbols by name. */
733 return strcmp (an, bn);
734 }
735
736 /* Sort relocs into address order. */
737
738 static int
739 compare_relocs (const void *ap, const void *bp)
740 {
741 const arelent *a = * (const arelent **) ap;
742 const arelent *b = * (const arelent **) bp;
743
744 if (a->address > b->address)
745 return 1;
746 else if (a->address < b->address)
747 return -1;
748
749 /* So that associated relocations tied to the same address show up
750 in the correct order, we don't do any further sorting. */
751 if (a > b)
752 return 1;
753 else if (a < b)
754 return -1;
755 else
756 return 0;
757 }
758
759 /* Print an address (VMA) to the output stream in INFO.
760 If SKIP_ZEROES is TRUE, omit leading zeroes. */
761
762 static void
763 objdump_print_value (bfd_vma vma, struct disassemble_info *inf,
764 bfd_boolean skip_zeroes)
765 {
766 char buf[30];
767 char *p;
768 struct objdump_disasm_info *aux;
769
770 aux = (struct objdump_disasm_info *) inf->application_data;
771 bfd_sprintf_vma (aux->abfd, buf, vma);
772 if (! skip_zeroes)
773 p = buf;
774 else
775 {
776 for (p = buf; *p == '0'; ++p)
777 ;
778 if (*p == '\0')
779 --p;
780 }
781 (*inf->fprintf_func) (inf->stream, "%s", p);
782 }
783
784 /* Print the name of a symbol. */
785
786 static void
787 objdump_print_symname (bfd *abfd, struct disassemble_info *inf,
788 asymbol *sym)
789 {
790 char *alloc;
791 const char *name;
792
793 alloc = NULL;
794 name = bfd_asymbol_name (sym);
795 if (do_demangle && name[0] != '\0')
796 {
797 /* Demangle the name. */
798 alloc = bfd_demangle (abfd, name, DMGL_ANSI | DMGL_PARAMS);
799 if (alloc != NULL)
800 name = alloc;
801 }
802
803 if (inf != NULL)
804 (*inf->fprintf_func) (inf->stream, "%s", name);
805 else
806 printf ("%s", name);
807
808 if (alloc != NULL)
809 free (alloc);
810 }
811
812 /* Locate a symbol given a bfd and a section (from INFO->application_data),
813 and a VMA. If INFO->application_data->require_sec is TRUE, then always
814 require the symbol to be in the section. Returns NULL if there is no
815 suitable symbol. If PLACE is not NULL, then *PLACE is set to the index
816 of the symbol in sorted_syms. */
817
818 static asymbol *
819 find_symbol_for_address (bfd_vma vma,
820 struct disassemble_info *inf,
821 long *place)
822 {
823 /* @@ Would it speed things up to cache the last two symbols returned,
824 and maybe their address ranges? For many processors, only one memory
825 operand can be present at a time, so the 2-entry cache wouldn't be
826 constantly churned by code doing heavy memory accesses. */
827
828 /* Indices in `sorted_syms'. */
829 long min = 0;
830 long max_count = sorted_symcount;
831 long thisplace;
832 struct objdump_disasm_info *aux;
833 bfd *abfd;
834 asection *sec;
835 unsigned int opb;
836 bfd_boolean want_section;
837
838 if (sorted_symcount < 1)
839 return NULL;
840
841 aux = (struct objdump_disasm_info *) inf->application_data;
842 abfd = aux->abfd;
843 sec = aux->sec;
844 opb = inf->octets_per_byte;
845
846 /* Perform a binary search looking for the closest symbol to the
847 required value. We are searching the range (min, max_count]. */
848 while (min + 1 < max_count)
849 {
850 asymbol *sym;
851
852 thisplace = (max_count + min) / 2;
853 sym = sorted_syms[thisplace];
854
855 if (bfd_asymbol_value (sym) > vma)
856 max_count = thisplace;
857 else if (bfd_asymbol_value (sym) < vma)
858 min = thisplace;
859 else
860 {
861 min = thisplace;
862 break;
863 }
864 }
865
866 /* The symbol we want is now in min, the low end of the range we
867 were searching. If there are several symbols with the same
868 value, we want the first one. */
869 thisplace = min;
870 while (thisplace > 0
871 && (bfd_asymbol_value (sorted_syms[thisplace])
872 == bfd_asymbol_value (sorted_syms[thisplace - 1])))
873 --thisplace;
874
875 /* Prefer a symbol in the current section if we have multple symbols
876 with the same value, as can occur with overlays or zero size
877 sections. */
878 min = thisplace;
879 while (min < max_count
880 && (bfd_asymbol_value (sorted_syms[min])
881 == bfd_asymbol_value (sorted_syms[thisplace])))
882 {
883 if (sorted_syms[min]->section == sec
884 && inf->symbol_is_valid (sorted_syms[min], inf))
885 {
886 thisplace = min;
887
888 if (place != NULL)
889 *place = thisplace;
890
891 return sorted_syms[thisplace];
892 }
893 ++min;
894 }
895
896 /* If the file is relocatable, and the symbol could be from this
897 section, prefer a symbol from this section over symbols from
898 others, even if the other symbol's value might be closer.
899
900 Note that this may be wrong for some symbol references if the
901 sections have overlapping memory ranges, but in that case there's
902 no way to tell what's desired without looking at the relocation
903 table.
904
905 Also give the target a chance to reject symbols. */
906 want_section = (aux->require_sec
907 || ((abfd->flags & HAS_RELOC) != 0
908 && vma >= bfd_get_section_vma (abfd, sec)
909 && vma < (bfd_get_section_vma (abfd, sec)
910 + bfd_section_size (abfd, sec) / opb)));
911 if ((sorted_syms[thisplace]->section != sec && want_section)
912 || ! inf->symbol_is_valid (sorted_syms[thisplace], inf))
913 {
914 long i;
915 long newplace = sorted_symcount;
916
917 for (i = min - 1; i >= 0; i--)
918 {
919 if ((sorted_syms[i]->section == sec || !want_section)
920 && inf->symbol_is_valid (sorted_syms[i], inf))
921 {
922 if (newplace == sorted_symcount)
923 newplace = i;
924
925 if (bfd_asymbol_value (sorted_syms[i])
926 != bfd_asymbol_value (sorted_syms[newplace]))
927 break;
928
929 /* Remember this symbol and keep searching until we reach
930 an earlier address. */
931 newplace = i;
932 }
933 }
934
935 if (newplace != sorted_symcount)
936 thisplace = newplace;
937 else
938 {
939 /* We didn't find a good symbol with a smaller value.
940 Look for one with a larger value. */
941 for (i = thisplace + 1; i < sorted_symcount; i++)
942 {
943 if ((sorted_syms[i]->section == sec || !want_section)
944 && inf->symbol_is_valid (sorted_syms[i], inf))
945 {
946 thisplace = i;
947 break;
948 }
949 }
950 }
951
952 if ((sorted_syms[thisplace]->section != sec && want_section)
953 || ! inf->symbol_is_valid (sorted_syms[thisplace], inf))
954 /* There is no suitable symbol. */
955 return NULL;
956 }
957
958 if (place != NULL)
959 *place = thisplace;
960
961 return sorted_syms[thisplace];
962 }
963
964 /* Print an address and the offset to the nearest symbol. */
965
966 static void
967 objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
968 bfd_vma vma, struct disassemble_info *inf,
969 bfd_boolean skip_zeroes)
970 {
971 objdump_print_value (vma, inf, skip_zeroes);
972
973 if (sym == NULL)
974 {
975 bfd_vma secaddr;
976
977 (*inf->fprintf_func) (inf->stream, " <%s",
978 bfd_get_section_name (abfd, sec));
979 secaddr = bfd_get_section_vma (abfd, sec);
980 if (vma < secaddr)
981 {
982 (*inf->fprintf_func) (inf->stream, "-0x");
983 objdump_print_value (secaddr - vma, inf, TRUE);
984 }
985 else if (vma > secaddr)
986 {
987 (*inf->fprintf_func) (inf->stream, "+0x");
988 objdump_print_value (vma - secaddr, inf, TRUE);
989 }
990 (*inf->fprintf_func) (inf->stream, ">");
991 }
992 else
993 {
994 (*inf->fprintf_func) (inf->stream, " <");
995 objdump_print_symname (abfd, inf, sym);
996 if (bfd_asymbol_value (sym) > vma)
997 {
998 (*inf->fprintf_func) (inf->stream, "-0x");
999 objdump_print_value (bfd_asymbol_value (sym) - vma, inf, TRUE);
1000 }
1001 else if (vma > bfd_asymbol_value (sym))
1002 {
1003 (*inf->fprintf_func) (inf->stream, "+0x");
1004 objdump_print_value (vma - bfd_asymbol_value (sym), inf, TRUE);
1005 }
1006 (*inf->fprintf_func) (inf->stream, ">");
1007 }
1008
1009 if (display_file_offsets)
1010 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1011 (long int)(sec->filepos + (vma - sec->vma)));
1012 }
1013
1014 /* Print an address (VMA), symbolically if possible.
1015 If SKIP_ZEROES is TRUE, don't output leading zeroes. */
1016
1017 static void
1018 objdump_print_addr (bfd_vma vma,
1019 struct disassemble_info *inf,
1020 bfd_boolean skip_zeroes)
1021 {
1022 struct objdump_disasm_info *aux;
1023 asymbol *sym = NULL;
1024 bfd_boolean skip_find = FALSE;
1025
1026 aux = (struct objdump_disasm_info *) inf->application_data;
1027
1028 if (sorted_symcount < 1)
1029 {
1030 (*inf->fprintf_func) (inf->stream, "0x");
1031 objdump_print_value (vma, inf, skip_zeroes);
1032
1033 if (display_file_offsets)
1034 inf->fprintf_func (inf->stream, _(" (File Offset: 0x%lx)"),
1035 (long int)(aux->sec->filepos + (vma - aux->sec->vma)));
1036 return;
1037 }
1038
1039 if (aux->reloc != NULL
1040 && aux->reloc->sym_ptr_ptr != NULL
1041 && * aux->reloc->sym_ptr_ptr != NULL)
1042 {
1043 sym = * aux->reloc->sym_ptr_ptr;
1044
1045 /* Adjust the vma to the reloc. */
1046 vma += bfd_asymbol_value (sym);
1047
1048 if (bfd_is_und_section (bfd_get_section (sym)))
1049 skip_find = TRUE;
1050 }
1051
1052 if (!skip_find)
1053 sym = find_symbol_for_address (vma, inf, NULL);
1054
1055 objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, inf,
1056 skip_zeroes);
1057 }
1058
1059 /* Print VMA to INFO. This function is passed to the disassembler
1060 routine. */
1061
1062 static void
1063 objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
1064 {
1065 objdump_print_addr (vma, inf, ! prefix_addresses);
1066 }
1067
1068 /* Determine if the given address has a symbol associated with it. */
1069
1070 static int
1071 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
1072 {
1073 asymbol * sym;
1074
1075 sym = find_symbol_for_address (vma, inf, NULL);
1076
1077 return (sym != NULL && (bfd_asymbol_value (sym) == vma));
1078 }
1079
1080 /* Hold the last function name and the last line number we displayed
1081 in a disassembly. */
1082
1083 static char *prev_functionname;
1084 static unsigned int prev_line;
1085
1086 /* We keep a list of all files that we have seen when doing a
1087 disassembly with source, so that we know how much of the file to
1088 display. This can be important for inlined functions. */
1089
1090 struct print_file_list
1091 {
1092 struct print_file_list *next;
1093 const char *filename;
1094 const char *modname;
1095 const char *map;
1096 size_t mapsize;
1097 const char **linemap;
1098 unsigned maxline;
1099 unsigned last_line;
1100 int first;
1101 };
1102
1103 static struct print_file_list *print_files;
1104
1105 /* The number of preceding context lines to show when we start
1106 displaying a file for the first time. */
1107
1108 #define SHOW_PRECEDING_CONTEXT_LINES (5)
1109
1110 /* Read a complete file into memory. */
1111
1112 static const char *
1113 slurp_file (const char *fn, size_t *size)
1114 {
1115 #ifdef HAVE_MMAP
1116 int ps = getpagesize ();
1117 size_t msize;
1118 #endif
1119 const char *map;
1120 struct stat st;
1121 int fd = open (fn, O_RDONLY | O_BINARY);
1122
1123 if (fd < 0)
1124 return NULL;
1125 if (fstat (fd, &st) < 0)
1126 {
1127 close (fd);
1128 return NULL;
1129 }
1130 *size = st.st_size;
1131 #ifdef HAVE_MMAP
1132 msize = (*size + ps - 1) & ~(ps - 1);
1133 map = mmap (NULL, msize, PROT_READ, MAP_SHARED, fd, 0);
1134 if (map != (char *) -1L)
1135 {
1136 close (fd);
1137 return map;
1138 }
1139 #endif
1140 map = (const char *) malloc (*size);
1141 if (!map || (size_t) read (fd, (char *) map, *size) != *size)
1142 {
1143 free ((void *) map);
1144 map = NULL;
1145 }
1146 close (fd);
1147 return map;
1148 }
1149
1150 #define line_map_decrease 5
1151
1152 /* Precompute array of lines for a mapped file. */
1153
1154 static const char **
1155 index_file (const char *map, size_t size, unsigned int *maxline)
1156 {
1157 const char *p, *lstart, *end;
1158 int chars_per_line = 45; /* First iteration will use 40. */
1159 unsigned int lineno;
1160 const char **linemap = NULL;
1161 unsigned long line_map_size = 0;
1162
1163 lineno = 0;
1164 lstart = map;
1165 end = map + size;
1166
1167 for (p = map; p < end; p++)
1168 {
1169 if (*p == '\n')
1170 {
1171 if (p + 1 < end && p[1] == '\r')
1172 p++;
1173 }
1174 else if (*p == '\r')
1175 {
1176 if (p + 1 < end && p[1] == '\n')
1177 p++;
1178 }
1179 else
1180 continue;
1181
1182 /* End of line found. */
1183
1184 if (linemap == NULL || line_map_size < lineno + 1)
1185 {
1186 unsigned long newsize;
1187
1188 chars_per_line -= line_map_decrease;
1189 if (chars_per_line <= 1)
1190 chars_per_line = 1;
1191 line_map_size = size / chars_per_line + 1;
1192 if (line_map_size < lineno + 1)
1193 line_map_size = lineno + 1;
1194 newsize = line_map_size * sizeof (char *);
1195 linemap = (const char **) xrealloc (linemap, newsize);
1196 }
1197
1198 linemap[lineno++] = lstart;
1199 lstart = p + 1;
1200 }
1201
1202 *maxline = lineno;
1203 return linemap;
1204 }
1205
1206 /* Tries to open MODNAME, and if successful adds a node to print_files
1207 linked list and returns that node. Returns NULL on failure. */
1208
1209 static struct print_file_list *
1210 try_print_file_open (const char *origname, const char *modname)
1211 {
1212 struct print_file_list *p;
1213
1214 p = (struct print_file_list *) xmalloc (sizeof (struct print_file_list));
1215
1216 p->map = slurp_file (modname, &p->mapsize);
1217 if (p->map == NULL)
1218 {
1219 free (p);
1220 return NULL;
1221 }
1222
1223 p->linemap = index_file (p->map, p->mapsize, &p->maxline);
1224 p->last_line = 0;
1225 p->filename = origname;
1226 p->modname = modname;
1227 p->next = print_files;
1228 p->first = 1;
1229 print_files = p;
1230 return p;
1231 }
1232
1233 /* If the the source file, as described in the symtab, is not found
1234 try to locate it in one of the paths specified with -I
1235 If found, add location to print_files linked list. */
1236
1237 static struct print_file_list *
1238 update_source_path (const char *filename)
1239 {
1240 struct print_file_list *p;
1241 const char *fname;
1242 int i;
1243
1244 p = try_print_file_open (filename, filename);
1245 if (p != NULL)
1246 return p;
1247
1248 if (include_path_count == 0)
1249 return NULL;
1250
1251 /* Get the name of the file. */
1252 fname = lbasename (filename);
1253
1254 /* If file exists under a new path, we need to add it to the list
1255 so that show_line knows about it. */
1256 for (i = 0; i < include_path_count; i++)
1257 {
1258 char *modname = concat (include_paths[i], "/", fname, (const char *) 0);
1259
1260 p = try_print_file_open (filename, modname);
1261 if (p)
1262 return p;
1263
1264 free (modname);
1265 }
1266
1267 return NULL;
1268 }
1269
1270 /* Print a source file line. */
1271
1272 static void
1273 print_line (struct print_file_list *p, unsigned int linenum)
1274 {
1275 const char *l;
1276 size_t len;
1277
1278 --linenum;
1279 if (linenum >= p->maxline)
1280 return;
1281 l = p->linemap [linenum];
1282 /* Test fwrite return value to quiet glibc warning. */
1283 len = strcspn (l, "\n\r");
1284 if (len == 0 || fwrite (l, len, 1, stdout) == 1)
1285 putchar ('\n');
1286 }
1287
1288 /* Print a range of source code lines. */
1289
1290 static void
1291 dump_lines (struct print_file_list *p, unsigned int start, unsigned int end)
1292 {
1293 if (p->map == NULL)
1294 return;
1295 while (start <= end)
1296 {
1297 print_line (p, start);
1298 start++;
1299 }
1300 }
1301
1302 /* Show the line number, or the source line, in a disassembly
1303 listing. */
1304
1305 static void
1306 show_line (bfd *abfd, asection *section, bfd_vma addr_offset)
1307 {
1308 const char *filename;
1309 const char *functionname;
1310 unsigned int linenumber;
1311 bfd_boolean reloc;
1312
1313 if (! with_line_numbers && ! with_source_code)
1314 return;
1315
1316 if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
1317 &functionname, &linenumber))
1318 return;
1319
1320 if (filename != NULL && *filename == '\0')
1321 filename = NULL;
1322 if (functionname != NULL && *functionname == '\0')
1323 functionname = NULL;
1324
1325 if (filename
1326 && IS_ABSOLUTE_PATH (filename)
1327 && prefix)
1328 {
1329 char *path_up;
1330 const char *fname = filename;
1331 char *path = (char *) alloca (prefix_length + PATH_MAX + 1);
1332
1333 if (prefix_length)
1334 memcpy (path, prefix, prefix_length);
1335 path_up = path + prefix_length;
1336
1337 /* Build relocated filename, stripping off leading directories
1338 from the initial filename if requested. */
1339 if (prefix_strip > 0)
1340 {
1341 int level = 0;
1342 const char *s;
1343
1344 /* Skip selected directory levels. */
1345 for (s = fname + 1; *s != '\0' && level < prefix_strip; s++)
1346 if (IS_DIR_SEPARATOR(*s))
1347 {
1348 fname = s;
1349 level++;
1350 }
1351 }
1352
1353 /* Update complete filename. */
1354 strncpy (path_up, fname, PATH_MAX);
1355 path_up[PATH_MAX] = '\0';
1356
1357 filename = path;
1358 reloc = TRUE;
1359 }
1360 else
1361 reloc = FALSE;
1362
1363 if (with_line_numbers)
1364 {
1365 if (functionname != NULL
1366 && (prev_functionname == NULL
1367 || strcmp (functionname, prev_functionname) != 0))
1368 printf ("%s():\n", functionname);
1369 if (linenumber > 0 && linenumber != prev_line)
1370 printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
1371 }
1372
1373 if (with_source_code
1374 && filename != NULL
1375 && linenumber > 0)
1376 {
1377 struct print_file_list **pp, *p;
1378 unsigned l;
1379
1380 for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
1381 if (filename_cmp ((*pp)->filename, filename) == 0)
1382 break;
1383 p = *pp;
1384
1385 if (p == NULL)
1386 {
1387 if (reloc)
1388 filename = xstrdup (filename);
1389 p = update_source_path (filename);
1390 }
1391
1392 if (p != NULL && linenumber != p->last_line)
1393 {
1394 if (file_start_context && p->first)
1395 l = 1;
1396 else
1397 {
1398 l = linenumber - SHOW_PRECEDING_CONTEXT_LINES;
1399 if (l >= linenumber)
1400 l = 1;
1401 if (p->last_line >= l && p->last_line <= linenumber)
1402 l = p->last_line + 1;
1403 }
1404 dump_lines (p, l, linenumber);
1405 p->last_line = linenumber;
1406 p->first = 0;
1407 }
1408 }
1409
1410 if (functionname != NULL
1411 && (prev_functionname == NULL
1412 || strcmp (functionname, prev_functionname) != 0))
1413 {
1414 if (prev_functionname != NULL)
1415 free (prev_functionname);
1416 prev_functionname = (char *) xmalloc (strlen (functionname) + 1);
1417 strcpy (prev_functionname, functionname);
1418 }
1419
1420 if (linenumber > 0 && linenumber != prev_line)
1421 prev_line = linenumber;
1422 }
1423
1424 /* Pseudo FILE object for strings. */
1425 typedef struct
1426 {
1427 char *buffer;
1428 size_t pos;
1429 size_t alloc;
1430 } SFILE;
1431
1432 /* sprintf to a "stream". */
1433
1434 static int ATTRIBUTE_PRINTF_2
1435 objdump_sprintf (SFILE *f, const char *format, ...)
1436 {
1437 size_t n;
1438 va_list args;
1439
1440 while (1)
1441 {
1442 size_t space = f->alloc - f->pos;
1443
1444 va_start (args, format);
1445 n = vsnprintf (f->buffer + f->pos, space, format, args);
1446 va_end (args);
1447
1448 if (space > n)
1449 break;
1450
1451 f->alloc = (f->alloc + n) * 2;
1452 f->buffer = (char *) xrealloc (f->buffer, f->alloc);
1453 }
1454 f->pos += n;
1455
1456 return n;
1457 }
1458
1459 /* The number of zeroes we want to see before we start skipping them.
1460 The number is arbitrarily chosen. */
1461
1462 #define DEFAULT_SKIP_ZEROES 8
1463
1464 /* The number of zeroes to skip at the end of a section. If the
1465 number of zeroes at the end is between SKIP_ZEROES_AT_END and
1466 SKIP_ZEROES, they will be disassembled. If there are fewer than
1467 SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic
1468 attempt to avoid disassembling zeroes inserted by section
1469 alignment. */
1470
1471 #define DEFAULT_SKIP_ZEROES_AT_END 3
1472
1473 /* Disassemble some data in memory between given values. */
1474
1475 static void
1476 disassemble_bytes (struct disassemble_info * inf,
1477 disassembler_ftype disassemble_fn,
1478 bfd_boolean insns,
1479 bfd_byte * data,
1480 bfd_vma start_offset,
1481 bfd_vma stop_offset,
1482 bfd_vma rel_offset,
1483 arelent *** relppp,
1484 arelent ** relppend)
1485 {
1486 struct objdump_disasm_info *aux;
1487 asection *section;
1488 int octets_per_line;
1489 int skip_addr_chars;
1490 bfd_vma addr_offset;
1491 unsigned int opb = inf->octets_per_byte;
1492 unsigned int skip_zeroes = inf->skip_zeroes;
1493 unsigned int skip_zeroes_at_end = inf->skip_zeroes_at_end;
1494 int octets = opb;
1495 SFILE sfile;
1496
1497 aux = (struct objdump_disasm_info *) inf->application_data;
1498 section = aux->sec;
1499
1500 sfile.alloc = 120;
1501 sfile.buffer = (char *) xmalloc (sfile.alloc);
1502 sfile.pos = 0;
1503
1504 if (insn_width)
1505 octets_per_line = insn_width;
1506 else if (insns)
1507 octets_per_line = 4;
1508 else
1509 octets_per_line = 16;
1510
1511 /* Figure out how many characters to skip at the start of an
1512 address, to make the disassembly look nicer. We discard leading
1513 zeroes in chunks of 4, ensuring that there is always a leading
1514 zero remaining. */
1515 skip_addr_chars = 0;
1516 if (! prefix_addresses)
1517 {
1518 char buf[30];
1519
1520 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1521
1522 while (buf[skip_addr_chars] == '0')
1523 ++skip_addr_chars;
1524
1525 /* Don't discard zeros on overflow. */
1526 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1527 skip_addr_chars = 0;
1528
1529 if (skip_addr_chars != 0)
1530 skip_addr_chars = (skip_addr_chars - 1) & -4;
1531 }
1532
1533 inf->insn_info_valid = 0;
1534
1535 addr_offset = start_offset;
1536 while (addr_offset < stop_offset)
1537 {
1538 bfd_vma z;
1539 bfd_boolean need_nl = FALSE;
1540 int previous_octets;
1541
1542 /* Remember the length of the previous instruction. */
1543 previous_octets = octets;
1544 octets = 0;
1545
1546 /* Make sure we don't use relocs from previous instructions. */
1547 aux->reloc = NULL;
1548
1549 /* If we see more than SKIP_ZEROES octets of zeroes, we just
1550 print `...'. */
1551 for (z = addr_offset * opb; z < stop_offset * opb; z++)
1552 if (data[z] != 0)
1553 break;
1554 if (! disassemble_zeroes
1555 && (inf->insn_info_valid == 0
1556 || inf->branch_delay_insns == 0)
1557 && (z - addr_offset * opb >= skip_zeroes
1558 || (z == stop_offset * opb &&
1559 z - addr_offset * opb < skip_zeroes_at_end)))
1560 {
1561 /* If there are more nonzero octets to follow, we only skip
1562 zeroes in multiples of 4, to try to avoid running over
1563 the start of an instruction which happens to start with
1564 zero. */
1565 if (z != stop_offset * opb)
1566 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
1567
1568 octets = z - addr_offset * opb;
1569
1570 /* If we are going to display more data, and we are displaying
1571 file offsets, then tell the user how many zeroes we skip
1572 and the file offset from where we resume dumping. */
1573 if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1574 printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1575 octets / opb,
1576 (unsigned long) (section->filepos
1577 + (addr_offset + (octets / opb))));
1578 else
1579 printf ("\t...\n");
1580 }
1581 else
1582 {
1583 char buf[50];
1584 int bpc = 0;
1585 int pb = 0;
1586
1587 if (with_line_numbers || with_source_code)
1588 show_line (aux->abfd, section, addr_offset);
1589
1590 if (! prefix_addresses)
1591 {
1592 char *s;
1593
1594 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
1595 for (s = buf + skip_addr_chars; *s == '0'; s++)
1596 *s = ' ';
1597 if (*s == '\0')
1598 *--s = '0';
1599 printf ("%s:\t", buf + skip_addr_chars);
1600 }
1601 else
1602 {
1603 aux->require_sec = TRUE;
1604 objdump_print_address (section->vma + addr_offset, inf);
1605 aux->require_sec = FALSE;
1606 putchar (' ');
1607 }
1608
1609 if (insns)
1610 {
1611 sfile.pos = 0;
1612 inf->fprintf_func = (fprintf_ftype) objdump_sprintf;
1613 inf->stream = &sfile;
1614 inf->bytes_per_line = 0;
1615 inf->bytes_per_chunk = 0;
1616 inf->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
1617 if (machine)
1618 inf->flags |= USER_SPECIFIED_MACHINE_TYPE;
1619
1620 if (inf->disassembler_needs_relocs
1621 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1622 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
1623 && *relppp < relppend)
1624 {
1625 bfd_signed_vma distance_to_rel;
1626
1627 distance_to_rel = (**relppp)->address
1628 - (rel_offset + addr_offset);
1629
1630 /* Check to see if the current reloc is associated with
1631 the instruction that we are about to disassemble. */
1632 if (distance_to_rel == 0
1633 /* FIXME: This is wrong. We are trying to catch
1634 relocs that are addressed part way through the
1635 current instruction, as might happen with a packed
1636 VLIW instruction. Unfortunately we do not know the
1637 length of the current instruction since we have not
1638 disassembled it yet. Instead we take a guess based
1639 upon the length of the previous instruction. The
1640 proper solution is to have a new target-specific
1641 disassembler function which just returns the length
1642 of an instruction at a given address without trying
1643 to display its disassembly. */
1644 || (distance_to_rel > 0
1645 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1646 {
1647 inf->flags |= INSN_HAS_RELOC;
1648 aux->reloc = **relppp;
1649 }
1650 }
1651
1652 octets = (*disassemble_fn) (section->vma + addr_offset, inf);
1653 inf->fprintf_func = (fprintf_ftype) fprintf;
1654 inf->stream = stdout;
1655 if (insn_width == 0 && inf->bytes_per_line != 0)
1656 octets_per_line = inf->bytes_per_line;
1657 if (octets < (int) opb)
1658 {
1659 if (sfile.pos)
1660 printf ("%s\n", sfile.buffer);
1661 if (octets >= 0)
1662 {
1663 non_fatal (_("disassemble_fn returned length %d"),
1664 octets);
1665 exit_status = 1;
1666 }
1667 break;
1668 }
1669 }
1670 else
1671 {
1672 bfd_vma j;
1673
1674 octets = octets_per_line;
1675 if (addr_offset + octets / opb > stop_offset)
1676 octets = (stop_offset - addr_offset) * opb;
1677
1678 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
1679 {
1680 if (ISPRINT (data[j]))
1681 buf[j - addr_offset * opb] = data[j];
1682 else
1683 buf[j - addr_offset * opb] = '.';
1684 }
1685 buf[j - addr_offset * opb] = '\0';
1686 }
1687
1688 if (prefix_addresses
1689 ? show_raw_insn > 0
1690 : show_raw_insn >= 0)
1691 {
1692 bfd_vma j;
1693
1694 /* If ! prefix_addresses and ! wide_output, we print
1695 octets_per_line octets per line. */
1696 pb = octets;
1697 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1698 pb = octets_per_line;
1699
1700 if (inf->bytes_per_chunk)
1701 bpc = inf->bytes_per_chunk;
1702 else
1703 bpc = 1;
1704
1705 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
1706 {
1707 int k;
1708
1709 if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1710 {
1711 for (k = bpc - 1; k >= 0; k--)
1712 printf ("%02x", (unsigned) data[j + k]);
1713 putchar (' ');
1714 }
1715 else
1716 {
1717 for (k = 0; k < bpc; k++)
1718 printf ("%02x", (unsigned) data[j + k]);
1719 putchar (' ');
1720 }
1721 }
1722
1723 for (; pb < octets_per_line; pb += bpc)
1724 {
1725 int k;
1726
1727 for (k = 0; k < bpc; k++)
1728 printf (" ");
1729 putchar (' ');
1730 }
1731
1732 /* Separate raw data from instruction by extra space. */
1733 if (insns)
1734 putchar ('\t');
1735 else
1736 printf (" ");
1737 }
1738
1739 if (! insns)
1740 printf ("%s", buf);
1741 else if (sfile.pos)
1742 printf ("%s", sfile.buffer);
1743
1744 if (prefix_addresses
1745 ? show_raw_insn > 0
1746 : show_raw_insn >= 0)
1747 {
1748 while (pb < octets)
1749 {
1750 bfd_vma j;
1751 char *s;
1752
1753 putchar ('\n');
1754 j = addr_offset * opb + pb;
1755
1756 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
1757 for (s = buf + skip_addr_chars; *s == '0'; s++)
1758 *s = ' ';
1759 if (*s == '\0')
1760 *--s = '0';
1761 printf ("%s:\t", buf + skip_addr_chars);
1762
1763 pb += octets_per_line;
1764 if (pb > octets)
1765 pb = octets;
1766 for (; j < addr_offset * opb + pb; j += bpc)
1767 {
1768 int k;
1769
1770 if (bpc > 1 && inf->display_endian == BFD_ENDIAN_LITTLE)
1771 {
1772 for (k = bpc - 1; k >= 0; k--)
1773 printf ("%02x", (unsigned) data[j + k]);
1774 putchar (' ');
1775 }
1776 else
1777 {
1778 for (k = 0; k < bpc; k++)
1779 printf ("%02x", (unsigned) data[j + k]);
1780 putchar (' ');
1781 }
1782 }
1783 }
1784 }
1785
1786 if (!wide_output)
1787 putchar ('\n');
1788 else
1789 need_nl = TRUE;
1790 }
1791
1792 while ((*relppp) < relppend
1793 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
1794 {
1795 if (dump_reloc_info || dump_dynamic_reloc_info)
1796 {
1797 arelent *q;
1798
1799 q = **relppp;
1800
1801 if (wide_output)
1802 putchar ('\t');
1803 else
1804 printf ("\t\t\t");
1805
1806 objdump_print_value (section->vma - rel_offset + q->address,
1807 inf, TRUE);
1808
1809 if (q->howto == NULL)
1810 printf (": *unknown*\t");
1811 else if (q->howto->name)
1812 printf (": %s\t", q->howto->name);
1813 else
1814 printf (": %d\t", q->howto->type);
1815
1816 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1817 printf ("*unknown*");
1818 else
1819 {
1820 const char *sym_name;
1821
1822 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1823 if (sym_name != NULL && *sym_name != '\0')
1824 objdump_print_symname (aux->abfd, inf, *q->sym_ptr_ptr);
1825 else
1826 {
1827 asection *sym_sec;
1828
1829 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1830 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1831 if (sym_name == NULL || *sym_name == '\0')
1832 sym_name = "*unknown*";
1833 printf ("%s", sym_name);
1834 }
1835 }
1836
1837 if (q->addend)
1838 {
1839 printf ("+0x");
1840 objdump_print_value (q->addend, inf, TRUE);
1841 }
1842
1843 printf ("\n");
1844 need_nl = FALSE;
1845 }
1846 ++(*relppp);
1847 }
1848
1849 if (need_nl)
1850 printf ("\n");
1851
1852 addr_offset += octets / opb;
1853 }
1854
1855 free (sfile.buffer);
1856 }
1857
1858 static void
1859 disassemble_section (bfd *abfd, asection *section, void *inf)
1860 {
1861 const struct elf_backend_data * bed;
1862 bfd_vma sign_adjust = 0;
1863 struct disassemble_info * pinfo = (struct disassemble_info *) inf;
1864 struct objdump_disasm_info * paux;
1865 unsigned int opb = pinfo->octets_per_byte;
1866 bfd_byte * data = NULL;
1867 bfd_size_type datasize = 0;
1868 arelent ** rel_pp = NULL;
1869 arelent ** rel_ppstart = NULL;
1870 arelent ** rel_ppend;
1871 unsigned long stop_offset;
1872 asymbol * sym = NULL;
1873 long place = 0;
1874 long rel_count;
1875 bfd_vma rel_offset;
1876 unsigned long addr_offset;
1877
1878 /* Sections that do not contain machine
1879 code are not normally disassembled. */
1880 if (! disassemble_all
1881 && only_list == NULL
1882 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1883 != (SEC_CODE | SEC_HAS_CONTENTS)))
1884 return;
1885
1886 if (! process_section_p (section))
1887 return;
1888
1889 datasize = bfd_get_section_size (section);
1890 if (datasize == 0)
1891 return;
1892
1893 /* Decide which set of relocs to use. Load them if necessary. */
1894 paux = (struct objdump_disasm_info *) pinfo->application_data;
1895 if (paux->dynrelbuf)
1896 {
1897 rel_pp = paux->dynrelbuf;
1898 rel_count = paux->dynrelcount;
1899 /* Dynamic reloc addresses are absolute, non-dynamic are section
1900 relative. REL_OFFSET specifies the reloc address corresponding
1901 to the start of this section. */
1902 rel_offset = section->vma;
1903 }
1904 else
1905 {
1906 rel_count = 0;
1907 rel_pp = NULL;
1908 rel_offset = 0;
1909
1910 if ((section->flags & SEC_RELOC) != 0
1911 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
1912 {
1913 long relsize;
1914
1915 relsize = bfd_get_reloc_upper_bound (abfd, section);
1916 if (relsize < 0)
1917 bfd_fatal (bfd_get_filename (abfd));
1918
1919 if (relsize > 0)
1920 {
1921 rel_ppstart = rel_pp = (arelent **) xmalloc (relsize);
1922 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1923 if (rel_count < 0)
1924 bfd_fatal (bfd_get_filename (abfd));
1925
1926 /* Sort the relocs by address. */
1927 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1928 }
1929 }
1930 }
1931 rel_ppend = rel_pp + rel_count;
1932
1933 data = (bfd_byte *) xmalloc (datasize);
1934
1935 bfd_get_section_contents (abfd, section, data, 0, datasize);
1936
1937 paux->sec = section;
1938 pinfo->buffer = data;
1939 pinfo->buffer_vma = section->vma;
1940 pinfo->buffer_length = datasize;
1941 pinfo->section = section;
1942
1943 if (start_address == (bfd_vma) -1
1944 || start_address < pinfo->buffer_vma)
1945 addr_offset = 0;
1946 else
1947 addr_offset = start_address - pinfo->buffer_vma;
1948
1949 if (stop_address == (bfd_vma) -1)
1950 stop_offset = datasize / opb;
1951 else
1952 {
1953 if (stop_address < pinfo->buffer_vma)
1954 stop_offset = 0;
1955 else
1956 stop_offset = stop_address - pinfo->buffer_vma;
1957 if (stop_offset > pinfo->buffer_length / opb)
1958 stop_offset = pinfo->buffer_length / opb;
1959 }
1960
1961 /* Skip over the relocs belonging to addresses below the
1962 start address. */
1963 while (rel_pp < rel_ppend
1964 && (*rel_pp)->address < rel_offset + addr_offset)
1965 ++rel_pp;
1966
1967 if (addr_offset < stop_offset)
1968 printf (_("\nDisassembly of section %s:\n"), section->name);
1969
1970 /* Find the nearest symbol forwards from our current position. */
1971 paux->require_sec = TRUE;
1972 sym = (asymbol *) find_symbol_for_address (section->vma + addr_offset,
1973 (struct disassemble_info *) inf,
1974 &place);
1975 paux->require_sec = FALSE;
1976
1977 /* PR 9774: If the target used signed addresses then we must make
1978 sure that we sign extend the value that we calculate for 'addr'
1979 in the loop below. */
1980 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
1981 && (bed = get_elf_backend_data (abfd)) != NULL
1982 && bed->sign_extend_vma)
1983 sign_adjust = (bfd_vma) 1 << (bed->s->arch_size - 1);
1984
1985 /* Disassemble a block of instructions up to the address associated with
1986 the symbol we have just found. Then print the symbol and find the
1987 next symbol on. Repeat until we have disassembled the entire section
1988 or we have reached the end of the address range we are interested in. */
1989 while (addr_offset < stop_offset)
1990 {
1991 bfd_vma addr;
1992 asymbol *nextsym;
1993 unsigned long nextstop_offset;
1994 bfd_boolean insns;
1995
1996 addr = section->vma + addr_offset;
1997 addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
1998
1999 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
2000 {
2001 int x;
2002
2003 for (x = place;
2004 (x < sorted_symcount
2005 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
2006 ++x)
2007 continue;
2008
2009 pinfo->symbols = sorted_syms + place;
2010 pinfo->num_symbols = x - place;
2011 pinfo->symtab_pos = place;
2012 }
2013 else
2014 {
2015 pinfo->symbols = NULL;
2016 pinfo->num_symbols = 0;
2017 pinfo->symtab_pos = -1;
2018 }
2019
2020 if (! prefix_addresses)
2021 {
2022 pinfo->fprintf_func (pinfo->stream, "\n");
2023 objdump_print_addr_with_sym (abfd, section, sym, addr,
2024 pinfo, FALSE);
2025 pinfo->fprintf_func (pinfo->stream, ":\n");
2026 }
2027
2028 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2029 nextsym = sym;
2030 else if (sym == NULL)
2031 nextsym = NULL;
2032 else
2033 {
2034 #define is_valid_next_sym(SYM) \
2035 ((SYM)->section == section \
2036 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
2037 && pinfo->symbol_is_valid (SYM, pinfo))
2038
2039 /* Search forward for the next appropriate symbol in
2040 SECTION. Note that all the symbols are sorted
2041 together into one big array, and that some sections
2042 may have overlapping addresses. */
2043 while (place < sorted_symcount
2044 && ! is_valid_next_sym (sorted_syms [place]))
2045 ++place;
2046
2047 if (place >= sorted_symcount)
2048 nextsym = NULL;
2049 else
2050 nextsym = sorted_syms[place];
2051 }
2052
2053 if (sym != NULL && bfd_asymbol_value (sym) > addr)
2054 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
2055 else if (nextsym == NULL)
2056 nextstop_offset = stop_offset;
2057 else
2058 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
2059
2060 if (nextstop_offset > stop_offset
2061 || nextstop_offset <= addr_offset)
2062 nextstop_offset = stop_offset;
2063
2064 /* If a symbol is explicitly marked as being an object
2065 rather than a function, just dump the bytes without
2066 disassembling them. */
2067 if (disassemble_all
2068 || sym == NULL
2069 || sym->section != section
2070 || bfd_asymbol_value (sym) > addr
2071 || ((sym->flags & BSF_OBJECT) == 0
2072 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
2073 == NULL)
2074 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
2075 == NULL))
2076 || (sym->flags & BSF_FUNCTION) != 0)
2077 insns = TRUE;
2078 else
2079 insns = FALSE;
2080
2081 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
2082 addr_offset, nextstop_offset,
2083 rel_offset, &rel_pp, rel_ppend);
2084
2085 addr_offset = nextstop_offset;
2086 sym = nextsym;
2087 }
2088
2089 free (data);
2090
2091 if (rel_ppstart != NULL)
2092 free (rel_ppstart);
2093 }
2094
2095 /* Disassemble the contents of an object file. */
2096
2097 static void
2098 disassemble_data (bfd *abfd)
2099 {
2100 struct disassemble_info disasm_info;
2101 struct objdump_disasm_info aux;
2102 long i;
2103
2104 print_files = NULL;
2105 prev_functionname = NULL;
2106 prev_line = -1;
2107
2108 /* We make a copy of syms to sort. We don't want to sort syms
2109 because that will screw up the relocs. */
2110 sorted_symcount = symcount ? symcount : dynsymcount;
2111 sorted_syms = (asymbol **) xmalloc ((sorted_symcount + synthcount)
2112 * sizeof (asymbol *));
2113 memcpy (sorted_syms, symcount ? syms : dynsyms,
2114 sorted_symcount * sizeof (asymbol *));
2115
2116 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
2117
2118 for (i = 0; i < synthcount; ++i)
2119 {
2120 sorted_syms[sorted_symcount] = synthsyms + i;
2121 ++sorted_symcount;
2122 }
2123
2124 /* Sort the symbols into section and symbol order. */
2125 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
2126
2127 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
2128
2129 disasm_info.application_data = (void *) &aux;
2130 aux.abfd = abfd;
2131 aux.require_sec = FALSE;
2132 aux.dynrelbuf = NULL;
2133 aux.dynrelcount = 0;
2134 aux.reloc = NULL;
2135
2136 disasm_info.print_address_func = objdump_print_address;
2137 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
2138
2139 if (machine != NULL)
2140 {
2141 const bfd_arch_info_type *inf = bfd_scan_arch (machine);
2142
2143 if (inf == NULL)
2144 fatal (_("can't use supplied machine %s"), machine);
2145
2146 abfd->arch_info = inf;
2147 }
2148
2149 if (endian != BFD_ENDIAN_UNKNOWN)
2150 {
2151 struct bfd_target *xvec;
2152
2153 xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
2154 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
2155 xvec->byteorder = endian;
2156 abfd->xvec = xvec;
2157 }
2158
2159 /* Use libopcodes to locate a suitable disassembler. */
2160 aux.disassemble_fn = disassembler (abfd);
2161 if (!aux.disassemble_fn)
2162 {
2163 non_fatal (_("can't disassemble for architecture %s\n"),
2164 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
2165 exit_status = 1;
2166 return;
2167 }
2168
2169 disasm_info.flavour = bfd_get_flavour (abfd);
2170 disasm_info.arch = bfd_get_arch (abfd);
2171 disasm_info.mach = bfd_get_mach (abfd);
2172 disasm_info.disassembler_options = disassembler_options;
2173 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
2174 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2175 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
2176 disasm_info.disassembler_needs_relocs = FALSE;
2177
2178 if (bfd_big_endian (abfd))
2179 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
2180 else if (bfd_little_endian (abfd))
2181 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
2182 else
2183 /* ??? Aborting here seems too drastic. We could default to big or little
2184 instead. */
2185 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2186
2187 /* Allow the target to customize the info structure. */
2188 disassemble_init_for_target (& disasm_info);
2189
2190 /* Pre-load the dynamic relocs if we are going
2191 to be dumping them along with the disassembly. */
2192 if (dump_dynamic_reloc_info)
2193 {
2194 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2195
2196 if (relsize < 0)
2197 bfd_fatal (bfd_get_filename (abfd));
2198
2199 if (relsize > 0)
2200 {
2201 aux.dynrelbuf = (arelent **) xmalloc (relsize);
2202 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2203 aux.dynrelbuf,
2204 dynsyms);
2205 if (aux.dynrelcount < 0)
2206 bfd_fatal (bfd_get_filename (abfd));
2207
2208 /* Sort the relocs by address. */
2209 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2210 compare_relocs);
2211 }
2212 }
2213 disasm_info.symtab = sorted_syms;
2214 disasm_info.symtab_size = sorted_symcount;
2215
2216 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
2217
2218 if (aux.dynrelbuf != NULL)
2219 free (aux.dynrelbuf);
2220 free (sorted_syms);
2221 }
2222 \f
2223 static int
2224 load_specific_debug_section (enum dwarf_section_display_enum debug,
2225 asection *sec, void *file)
2226 {
2227 struct dwarf_section *section = &debug_displays [debug].section;
2228 bfd *abfd = (bfd *) file;
2229 bfd_boolean ret;
2230
2231 /* If it is already loaded, do nothing. */
2232 if (section->start != NULL)
2233 return 1;
2234
2235 section->address = 0;
2236 section->size = bfd_get_section_size (sec);
2237 section->start = NULL;
2238 ret = bfd_get_full_section_contents (abfd, sec, &section->start);
2239
2240 if (! ret)
2241 {
2242 free_debug_section (debug);
2243 printf (_("\nCan't get contents for section '%s'.\n"),
2244 section->name);
2245 return 0;
2246 }
2247
2248 if (is_relocatable && debug_displays [debug].relocate)
2249 {
2250 /* We want to relocate the data we've already read (and
2251 decompressed), so we store a pointer to the data in
2252 the bfd_section, and tell it that the contents are
2253 already in memory. */
2254 sec->contents = section->start;
2255 sec->flags |= SEC_IN_MEMORY;
2256 sec->size = section->size;
2257
2258 ret = bfd_simple_get_relocated_section_contents (abfd,
2259 sec,
2260 section->start,
2261 syms) != NULL;
2262
2263 if (! ret)
2264 {
2265 free_debug_section (debug);
2266 printf (_("\nCan't get contents for section '%s'.\n"),
2267 section->name);
2268 return 0;
2269 }
2270 }
2271
2272 return 1;
2273 }
2274
2275 int
2276 load_debug_section (enum dwarf_section_display_enum debug, void *file)
2277 {
2278 struct dwarf_section *section = &debug_displays [debug].section;
2279 bfd *abfd = (bfd *) file;
2280 asection *sec;
2281
2282 /* If it is already loaded, do nothing. */
2283 if (section->start != NULL)
2284 return 1;
2285
2286 /* Locate the debug section. */
2287 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2288 if (sec != NULL)
2289 section->name = section->uncompressed_name;
2290 else
2291 {
2292 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2293 if (sec != NULL)
2294 section->name = section->compressed_name;
2295 }
2296 if (sec == NULL)
2297 return 0;
2298
2299 return load_specific_debug_section (debug, sec, file);
2300 }
2301
2302 void
2303 free_debug_section (enum dwarf_section_display_enum debug)
2304 {
2305 struct dwarf_section *section = &debug_displays [debug].section;
2306
2307 if (section->start == NULL)
2308 return;
2309
2310 free ((char *) section->start);
2311 section->start = NULL;
2312 section->address = 0;
2313 section->size = 0;
2314 }
2315
2316 static void
2317 dump_dwarf_section (bfd *abfd, asection *section,
2318 void *arg ATTRIBUTE_UNUSED)
2319 {
2320 const char *name = bfd_get_section_name (abfd, section);
2321 const char *match;
2322 int i;
2323
2324 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
2325 match = ".debug_info";
2326 else
2327 match = name;
2328
2329 for (i = 0; i < max; i++)
2330 if ((strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2331 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
2332 && debug_displays [i].enabled != NULL
2333 && *debug_displays [i].enabled)
2334 {
2335 struct dwarf_section *sec = &debug_displays [i].section;
2336
2337 if (strcmp (sec->uncompressed_name, match) == 0)
2338 sec->name = sec->uncompressed_name;
2339 else
2340 sec->name = sec->compressed_name;
2341 if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
2342 section, abfd))
2343 {
2344 debug_displays [i].display (sec, abfd);
2345
2346 if (i != info && i != abbrev)
2347 free_debug_section ((enum dwarf_section_display_enum) i);
2348 }
2349 break;
2350 }
2351 }
2352
2353 /* Dump the dwarf debugging information. */
2354
2355 static void
2356 dump_dwarf (bfd *abfd)
2357 {
2358 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2359
2360 eh_addr_size = bfd_arch_bits_per_address (abfd) / 8;
2361
2362 if (bfd_big_endian (abfd))
2363 byte_get = byte_get_big_endian;
2364 else if (bfd_little_endian (abfd))
2365 byte_get = byte_get_little_endian;
2366 else
2367 abort ();
2368
2369 switch (bfd_get_arch (abfd))
2370 {
2371 case bfd_arch_i386:
2372 switch (bfd_get_mach (abfd))
2373 {
2374 case bfd_mach_x86_64:
2375 case bfd_mach_x86_64_intel_syntax:
2376 init_dwarf_regnames_x86_64 ();
2377 break;
2378
2379 default:
2380 init_dwarf_regnames_i386 ();
2381 break;
2382 }
2383 break;
2384
2385 default:
2386 break;
2387 }
2388
2389 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2390
2391 free_debug_memory ();
2392 }
2393 \f
2394 /* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2395 it. Return NULL on failure. */
2396
2397 static char *
2398 read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
2399 {
2400 asection *stabsect;
2401 bfd_size_type size;
2402 char *contents;
2403
2404 stabsect = bfd_get_section_by_name (abfd, sect_name);
2405 if (stabsect == NULL)
2406 {
2407 printf (_("No %s section present\n\n"), sect_name);
2408 return FALSE;
2409 }
2410
2411 size = bfd_section_size (abfd, stabsect);
2412 contents = (char *) xmalloc (size);
2413
2414 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
2415 {
2416 non_fatal (_("reading %s section of %s failed: %s"),
2417 sect_name, bfd_get_filename (abfd),
2418 bfd_errmsg (bfd_get_error ()));
2419 exit_status = 1;
2420 free (contents);
2421 return NULL;
2422 }
2423
2424 *size_ptr = size;
2425
2426 return contents;
2427 }
2428
2429 /* Stabs entries use a 12 byte format:
2430 4 byte string table index
2431 1 byte stab type
2432 1 byte stab other field
2433 2 byte stab desc field
2434 4 byte stab value
2435 FIXME: This will have to change for a 64 bit object format. */
2436
2437 #define STRDXOFF (0)
2438 #define TYPEOFF (4)
2439 #define OTHEROFF (5)
2440 #define DESCOFF (6)
2441 #define VALOFF (8)
2442 #define STABSIZE (12)
2443
2444 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2445 using string table section STRSECT_NAME (in `strtab'). */
2446
2447 static void
2448 print_section_stabs (bfd *abfd,
2449 const char *stabsect_name,
2450 unsigned *string_offset_ptr)
2451 {
2452 int i;
2453 unsigned file_string_table_offset = 0;
2454 unsigned next_file_string_table_offset = *string_offset_ptr;
2455 bfd_byte *stabp, *stabs_end;
2456
2457 stabp = stabs;
2458 stabs_end = stabp + stab_size;
2459
2460 printf (_("Contents of %s section:\n\n"), stabsect_name);
2461 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2462
2463 /* Loop through all symbols and print them.
2464
2465 We start the index at -1 because there is a dummy symbol on
2466 the front of stabs-in-{coff,elf} sections that supplies sizes. */
2467 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2468 {
2469 const char *name;
2470 unsigned long strx;
2471 unsigned char type, other;
2472 unsigned short desc;
2473 bfd_vma value;
2474
2475 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2476 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2477 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2478 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2479 value = bfd_h_get_32 (abfd, stabp + VALOFF);
2480
2481 printf ("\n%-6d ", i);
2482 /* Either print the stab name, or, if unnamed, print its number
2483 again (makes consistent formatting for tools like awk). */
2484 name = bfd_get_stab_name (type);
2485 if (name != NULL)
2486 printf ("%-6s", name);
2487 else if (type == N_UNDF)
2488 printf ("HdrSym");
2489 else
2490 printf ("%-6d", type);
2491 printf (" %-6d %-6d ", other, desc);
2492 bfd_printf_vma (abfd, value);
2493 printf (" %-6lu", strx);
2494
2495 /* Symbols with type == 0 (N_UNDF) specify the length of the
2496 string table associated with this file. We use that info
2497 to know how to relocate the *next* file's string table indices. */
2498 if (type == N_UNDF)
2499 {
2500 file_string_table_offset = next_file_string_table_offset;
2501 next_file_string_table_offset += value;
2502 }
2503 else
2504 {
2505 /* Using the (possibly updated) string table offset, print the
2506 string (if any) associated with this symbol. */
2507 if ((strx + file_string_table_offset) < stabstr_size)
2508 printf (" %s", &strtab[strx + file_string_table_offset]);
2509 else
2510 printf (" *");
2511 }
2512 }
2513 printf ("\n\n");
2514 *string_offset_ptr = next_file_string_table_offset;
2515 }
2516
2517 typedef struct
2518 {
2519 const char * section_name;
2520 const char * string_section_name;
2521 unsigned string_offset;
2522 }
2523 stab_section_names;
2524
2525 static void
2526 find_stabs_section (bfd *abfd, asection *section, void *names)
2527 {
2528 int len;
2529 stab_section_names * sought = (stab_section_names *) names;
2530
2531 /* Check for section names for which stabsect_name is a prefix, to
2532 handle .stab.N, etc. */
2533 len = strlen (sought->section_name);
2534
2535 /* If the prefix matches, and the files section name ends with a
2536 nul or a digit, then we match. I.e., we want either an exact
2537 match or a section followed by a number. */
2538 if (strncmp (sought->section_name, section->name, len) == 0
2539 && (section->name[len] == 0
2540 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
2541 {
2542 if (strtab == NULL)
2543 strtab = read_section_stabs (abfd, sought->string_section_name,
2544 &stabstr_size);
2545
2546 if (strtab)
2547 {
2548 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2549 &stab_size);
2550 if (stabs)
2551 print_section_stabs (abfd, section->name, &sought->string_offset);
2552 }
2553 }
2554 }
2555
2556 static void
2557 dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2558 {
2559 stab_section_names s;
2560
2561 s.section_name = stabsect_name;
2562 s.string_section_name = strsect_name;
2563 s.string_offset = 0;
2564
2565 bfd_map_over_sections (abfd, find_stabs_section, & s);
2566
2567 free (strtab);
2568 strtab = NULL;
2569 }
2570
2571 /* Dump the any sections containing stabs debugging information. */
2572
2573 static void
2574 dump_stabs (bfd *abfd)
2575 {
2576 dump_stabs_section (abfd, ".stab", ".stabstr");
2577 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2578 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
2579
2580 /* For Darwin. */
2581 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2582
2583 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2584 }
2585 \f
2586 static void
2587 dump_bfd_header (bfd *abfd)
2588 {
2589 char *comma = "";
2590
2591 printf (_("architecture: %s, "),
2592 bfd_printable_arch_mach (bfd_get_arch (abfd),
2593 bfd_get_mach (abfd)));
2594 printf (_("flags 0x%08x:\n"), abfd->flags & ~BFD_FLAGS_FOR_BFD_USE_MASK);
2595
2596 #define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2597 PF (HAS_RELOC, "HAS_RELOC");
2598 PF (EXEC_P, "EXEC_P");
2599 PF (HAS_LINENO, "HAS_LINENO");
2600 PF (HAS_DEBUG, "HAS_DEBUG");
2601 PF (HAS_SYMS, "HAS_SYMS");
2602 PF (HAS_LOCALS, "HAS_LOCALS");
2603 PF (DYNAMIC, "DYNAMIC");
2604 PF (WP_TEXT, "WP_TEXT");
2605 PF (D_PAGED, "D_PAGED");
2606 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
2607 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
2608 printf (_("\nstart address 0x"));
2609 bfd_printf_vma (abfd, abfd->start_address);
2610 printf ("\n");
2611 }
2612
2613 \f
2614 static void
2615 dump_bfd_private_header (bfd *abfd)
2616 {
2617 bfd_print_private_bfd_data (abfd, stdout);
2618 }
2619
2620 static void
2621 dump_target_specific (bfd *abfd)
2622 {
2623 const struct objdump_private_desc * const *desc;
2624 struct objdump_private_option *opt;
2625 char *e, *b;
2626
2627 /* Find the desc. */
2628 for (desc = objdump_private_vectors; *desc != NULL; desc++)
2629 if ((*desc)->filter (abfd))
2630 break;
2631
2632 if (desc == NULL)
2633 {
2634 non_fatal (_("option -P/--private not supported by this file"));
2635 return;
2636 }
2637
2638 /* Clear all options. */
2639 for (opt = (*desc)->options; opt->name; opt++)
2640 opt->selected = FALSE;
2641
2642 /* Decode options. */
2643 b = dump_private_options;
2644 do
2645 {
2646 e = strchr (b, ',');
2647
2648 if (e)
2649 *e = 0;
2650
2651 for (opt = (*desc)->options; opt->name; opt++)
2652 if (strcmp (opt->name, b) == 0)
2653 {
2654 opt->selected = TRUE;
2655 break;
2656 }
2657 if (opt->name == NULL)
2658 non_fatal (_("target specific dump '%s' not supported"), b);
2659
2660 if (e)
2661 {
2662 *e = ',';
2663 b = e + 1;
2664 }
2665 }
2666 while (e != NULL);
2667
2668 /* Dump. */
2669 (*desc)->dump (abfd);
2670 }
2671 \f
2672 /* Display a section in hexadecimal format with associated characters.
2673 Each line prefixed by the zero padded address. */
2674
2675 static void
2676 dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
2677 {
2678 bfd_byte *data = 0;
2679 bfd_size_type datasize;
2680 bfd_size_type addr_offset;
2681 bfd_size_type start_offset;
2682 bfd_size_type stop_offset;
2683 unsigned int opb = bfd_octets_per_byte (abfd);
2684 /* Bytes per line. */
2685 const int onaline = 16;
2686 char buf[64];
2687 int count;
2688 int width;
2689
2690 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2691 return;
2692
2693 if (! process_section_p (section))
2694 return;
2695
2696 if ((datasize = bfd_section_size (abfd, section)) == 0)
2697 return;
2698
2699 /* Compute the address range to display. */
2700 if (start_address == (bfd_vma) -1
2701 || start_address < section->vma)
2702 start_offset = 0;
2703 else
2704 start_offset = start_address - section->vma;
2705
2706 if (stop_address == (bfd_vma) -1)
2707 stop_offset = datasize / opb;
2708 else
2709 {
2710 if (stop_address < section->vma)
2711 stop_offset = 0;
2712 else
2713 stop_offset = stop_address - section->vma;
2714
2715 if (stop_offset > datasize / opb)
2716 stop_offset = datasize / opb;
2717 }
2718
2719 if (start_offset >= stop_offset)
2720 return;
2721
2722 printf (_("Contents of section %s:"), section->name);
2723 if (display_file_offsets)
2724 printf (_(" (Starting at file offset: 0x%lx)"),
2725 (unsigned long) (section->filepos + start_offset));
2726 printf ("\n");
2727
2728 if (!bfd_get_full_section_contents (abfd, section, &data))
2729 {
2730 non_fatal (_("Reading section failed"));
2731 return;
2732 }
2733
2734 width = 4;
2735
2736 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2737 if (strlen (buf) >= sizeof (buf))
2738 abort ();
2739
2740 count = 0;
2741 while (buf[count] == '0' && buf[count+1] != '\0')
2742 count++;
2743 count = strlen (buf) - count;
2744 if (count > width)
2745 width = count;
2746
2747 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2748 if (strlen (buf) >= sizeof (buf))
2749 abort ();
2750
2751 count = 0;
2752 while (buf[count] == '0' && buf[count+1] != '\0')
2753 count++;
2754 count = strlen (buf) - count;
2755 if (count > width)
2756 width = count;
2757
2758 for (addr_offset = start_offset;
2759 addr_offset < stop_offset; addr_offset += onaline / opb)
2760 {
2761 bfd_size_type j;
2762
2763 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2764 count = strlen (buf);
2765 if ((size_t) count >= sizeof (buf))
2766 abort ();
2767
2768 putchar (' ');
2769 while (count < width)
2770 {
2771 putchar ('0');
2772 count++;
2773 }
2774 fputs (buf + count - width, stdout);
2775 putchar (' ');
2776
2777 for (j = addr_offset * opb;
2778 j < addr_offset * opb + onaline; j++)
2779 {
2780 if (j < stop_offset * opb)
2781 printf ("%02x", (unsigned) (data[j]));
2782 else
2783 printf (" ");
2784 if ((j & 3) == 3)
2785 printf (" ");
2786 }
2787
2788 printf (" ");
2789 for (j = addr_offset * opb;
2790 j < addr_offset * opb + onaline; j++)
2791 {
2792 if (j >= stop_offset * opb)
2793 printf (" ");
2794 else
2795 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2796 }
2797 putchar ('\n');
2798 }
2799 free (data);
2800 }
2801
2802 /* Actually display the various requested regions. */
2803
2804 static void
2805 dump_data (bfd *abfd)
2806 {
2807 bfd_map_over_sections (abfd, dump_section, NULL);
2808 }
2809
2810 /* Should perhaps share code and display with nm? */
2811
2812 static void
2813 dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
2814 {
2815 asymbol **current;
2816 long max_count;
2817 long count;
2818
2819 if (dynamic)
2820 {
2821 current = dynsyms;
2822 max_count = dynsymcount;
2823 printf ("DYNAMIC SYMBOL TABLE:\n");
2824 }
2825 else
2826 {
2827 current = syms;
2828 max_count = symcount;
2829 printf ("SYMBOL TABLE:\n");
2830 }
2831
2832 if (max_count == 0)
2833 printf (_("no symbols\n"));
2834
2835 for (count = 0; count < max_count; count++)
2836 {
2837 bfd *cur_bfd;
2838
2839 if (*current == NULL)
2840 printf (_("no information for symbol number %ld\n"), count);
2841
2842 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
2843 printf (_("could not determine the type of symbol number %ld\n"),
2844 count);
2845
2846 else if (process_section_p ((* current)->section)
2847 && (dump_special_syms
2848 || !bfd_is_target_special_symbol (cur_bfd, *current)))
2849 {
2850 const char *name = (*current)->name;
2851
2852 if (do_demangle && name != NULL && *name != '\0')
2853 {
2854 char *alloc;
2855
2856 /* If we want to demangle the name, we demangle it
2857 here, and temporarily clobber it while calling
2858 bfd_print_symbol. FIXME: This is a gross hack. */
2859 alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2860 if (alloc != NULL)
2861 (*current)->name = alloc;
2862 bfd_print_symbol (cur_bfd, stdout, *current,
2863 bfd_print_symbol_all);
2864 if (alloc != NULL)
2865 {
2866 (*current)->name = name;
2867 free (alloc);
2868 }
2869 }
2870 else
2871 bfd_print_symbol (cur_bfd, stdout, *current,
2872 bfd_print_symbol_all);
2873 printf ("\n");
2874 }
2875
2876 current++;
2877 }
2878 printf ("\n\n");
2879 }
2880 \f
2881 static void
2882 dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
2883 {
2884 arelent **p;
2885 char *last_filename, *last_functionname;
2886 unsigned int last_line;
2887
2888 /* Get column headers lined up reasonably. */
2889 {
2890 static int width;
2891
2892 if (width == 0)
2893 {
2894 char buf[30];
2895
2896 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
2897 width = strlen (buf) - 7;
2898 }
2899 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2900 }
2901
2902 last_filename = NULL;
2903 last_functionname = NULL;
2904 last_line = 0;
2905
2906 for (p = relpp; relcount && *p != NULL; p++, relcount--)
2907 {
2908 arelent *q = *p;
2909 const char *filename, *functionname;
2910 unsigned int linenumber;
2911 const char *sym_name;
2912 const char *section_name;
2913 bfd_vma addend2 = 0;
2914
2915 if (start_address != (bfd_vma) -1
2916 && q->address < start_address)
2917 continue;
2918 if (stop_address != (bfd_vma) -1
2919 && q->address > stop_address)
2920 continue;
2921
2922 if (with_line_numbers
2923 && sec != NULL
2924 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2925 &filename, &functionname, &linenumber))
2926 {
2927 if (functionname != NULL
2928 && (last_functionname == NULL
2929 || strcmp (functionname, last_functionname) != 0))
2930 {
2931 printf ("%s():\n", functionname);
2932 if (last_functionname != NULL)
2933 free (last_functionname);
2934 last_functionname = xstrdup (functionname);
2935 }
2936
2937 if (linenumber > 0
2938 && (linenumber != last_line
2939 || (filename != NULL
2940 && last_filename != NULL
2941 && filename_cmp (filename, last_filename) != 0)))
2942 {
2943 printf ("%s:%u\n", filename == NULL ? "???" : filename, linenumber);
2944 last_line = linenumber;
2945 if (last_filename != NULL)
2946 free (last_filename);
2947 if (filename == NULL)
2948 last_filename = NULL;
2949 else
2950 last_filename = xstrdup (filename);
2951 }
2952 }
2953
2954 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2955 {
2956 sym_name = (*(q->sym_ptr_ptr))->name;
2957 section_name = (*(q->sym_ptr_ptr))->section->name;
2958 }
2959 else
2960 {
2961 sym_name = NULL;
2962 section_name = NULL;
2963 }
2964
2965 bfd_printf_vma (abfd, q->address);
2966 if (q->howto == NULL)
2967 printf (" *unknown* ");
2968 else if (q->howto->name)
2969 {
2970 const char *name = q->howto->name;
2971
2972 /* R_SPARC_OLO10 relocations contain two addends.
2973 But because 'arelent' lacks enough storage to
2974 store them both, the 64-bit ELF Sparc backend
2975 records this as two relocations. One R_SPARC_LO10
2976 and one R_SPARC_13, both pointing to the same
2977 address. This is merely so that we have some
2978 place to store both addend fields.
2979
2980 Undo this transformation, otherwise the output
2981 will be confusing. */
2982 if (abfd->xvec->flavour == bfd_target_elf_flavour
2983 && elf_tdata(abfd)->elf_header->e_machine == EM_SPARCV9
2984 && relcount > 1
2985 && !strcmp (q->howto->name, "R_SPARC_LO10"))
2986 {
2987 arelent *q2 = *(p + 1);
2988 if (q2 != NULL
2989 && q2->howto
2990 && q->address == q2->address
2991 && !strcmp (q2->howto->name, "R_SPARC_13"))
2992 {
2993 name = "R_SPARC_OLO10";
2994 addend2 = q2->addend;
2995 p++;
2996 }
2997 }
2998 printf (" %-16s ", name);
2999 }
3000 else
3001 printf (" %-16d ", q->howto->type);
3002
3003 if (sym_name)
3004 {
3005 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
3006 }
3007 else
3008 {
3009 if (section_name == NULL)
3010 section_name = "*unknown*";
3011 printf ("[%s]", section_name);
3012 }
3013
3014 if (q->addend)
3015 {
3016 printf ("+0x");
3017 bfd_printf_vma (abfd, q->addend);
3018 }
3019 if (addend2)
3020 {
3021 printf ("+0x");
3022 bfd_printf_vma (abfd, addend2);
3023 }
3024
3025 printf ("\n");
3026 }
3027
3028 if (last_filename != NULL)
3029 free (last_filename);
3030 if (last_functionname != NULL)
3031 free (last_functionname);
3032 }
3033
3034 static void
3035 dump_relocs_in_section (bfd *abfd,
3036 asection *section,
3037 void *dummy ATTRIBUTE_UNUSED)
3038 {
3039 arelent **relpp;
3040 long relcount;
3041 long relsize;
3042
3043 if ( bfd_is_abs_section (section)
3044 || bfd_is_und_section (section)
3045 || bfd_is_com_section (section)
3046 || (! process_section_p (section))
3047 || ((section->flags & SEC_RELOC) == 0))
3048 return;
3049
3050 relsize = bfd_get_reloc_upper_bound (abfd, section);
3051 if (relsize < 0)
3052 bfd_fatal (bfd_get_filename (abfd));
3053
3054 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
3055
3056 if (relsize == 0)
3057 {
3058 printf (" (none)\n\n");
3059 return;
3060 }
3061
3062 relpp = (arelent **) xmalloc (relsize);
3063 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
3064
3065 if (relcount < 0)
3066 bfd_fatal (bfd_get_filename (abfd));
3067 else if (relcount == 0)
3068 printf (" (none)\n\n");
3069 else
3070 {
3071 printf ("\n");
3072 dump_reloc_set (abfd, section, relpp, relcount);
3073 printf ("\n\n");
3074 }
3075 free (relpp);
3076 }
3077
3078 static void
3079 dump_relocs (bfd *abfd)
3080 {
3081 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
3082 }
3083
3084 static void
3085 dump_dynamic_relocs (bfd *abfd)
3086 {
3087 long relsize;
3088 arelent **relpp;
3089 long relcount;
3090
3091 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
3092 if (relsize < 0)
3093 bfd_fatal (bfd_get_filename (abfd));
3094
3095 printf ("DYNAMIC RELOCATION RECORDS");
3096
3097 if (relsize == 0)
3098 printf (" (none)\n\n");
3099 else
3100 {
3101 relpp = (arelent **) xmalloc (relsize);
3102 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
3103
3104 if (relcount < 0)
3105 bfd_fatal (bfd_get_filename (abfd));
3106 else if (relcount == 0)
3107 printf (" (none)\n\n");
3108 else
3109 {
3110 printf ("\n");
3111 dump_reloc_set (abfd, NULL, relpp, relcount);
3112 printf ("\n\n");
3113 }
3114 free (relpp);
3115 }
3116 }
3117
3118 /* Creates a table of paths, to search for source files. */
3119
3120 static void
3121 add_include_path (const char *path)
3122 {
3123 if (path[0] == 0)
3124 return;
3125 include_path_count++;
3126 include_paths = (const char **)
3127 xrealloc (include_paths, include_path_count * sizeof (*include_paths));
3128 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
3129 if (path[1] == ':' && path[2] == 0)
3130 path = concat (path, ".", (const char *) 0);
3131 #endif
3132 include_paths[include_path_count - 1] = path;
3133 }
3134
3135 static void
3136 adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
3137 asection *section,
3138 void *arg)
3139 {
3140 if ((section->flags & SEC_DEBUGGING) == 0)
3141 {
3142 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
3143 section->vma += adjust_section_vma;
3144 if (*has_reloc_p)
3145 section->lma += adjust_section_vma;
3146 }
3147 }
3148
3149 /* Dump selected contents of ABFD. */
3150
3151 static void
3152 dump_bfd (bfd *abfd)
3153 {
3154 /* If we are adjusting section VMA's, change them all now. Changing
3155 the BFD information is a hack. However, we must do it, or
3156 bfd_find_nearest_line will not do the right thing. */
3157 if (adjust_section_vma != 0)
3158 {
3159 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
3160 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
3161 }
3162
3163 if (! dump_debugging_tags && ! suppress_bfd_header)
3164 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
3165 abfd->xvec->name);
3166 if (dump_ar_hdrs)
3167 print_arelt_descr (stdout, abfd, TRUE);
3168 if (dump_file_header)
3169 dump_bfd_header (abfd);
3170 if (dump_private_headers)
3171 dump_bfd_private_header (abfd);
3172 if (dump_private_options != NULL)
3173 dump_target_specific (abfd);
3174 if (! dump_debugging_tags && ! suppress_bfd_header)
3175 putchar ('\n');
3176 if (dump_section_headers)
3177 dump_headers (abfd);
3178
3179 if (dump_symtab
3180 || dump_reloc_info
3181 || disassemble
3182 || dump_debugging
3183 || dump_dwarf_section_info)
3184 syms = slurp_symtab (abfd);
3185 if (dump_dynamic_symtab || dump_dynamic_reloc_info
3186 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
3187 dynsyms = slurp_dynamic_symtab (abfd);
3188 if (disassemble)
3189 {
3190 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
3191 dynsymcount, dynsyms, &synthsyms);
3192 if (synthcount < 0)
3193 synthcount = 0;
3194 }
3195
3196 if (dump_symtab)
3197 dump_symbols (abfd, FALSE);
3198 if (dump_dynamic_symtab)
3199 dump_symbols (abfd, TRUE);
3200 if (dump_dwarf_section_info)
3201 dump_dwarf (abfd);
3202 if (dump_stab_section_info)
3203 dump_stabs (abfd);
3204 if (dump_reloc_info && ! disassemble)
3205 dump_relocs (abfd);
3206 if (dump_dynamic_reloc_info && ! disassemble)
3207 dump_dynamic_relocs (abfd);
3208 if (dump_section_contents)
3209 dump_data (abfd);
3210 if (disassemble)
3211 disassemble_data (abfd);
3212
3213 if (dump_debugging)
3214 {
3215 void *dhandle;
3216
3217 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
3218 if (dhandle != NULL)
3219 {
3220 if (!print_debugging_info (stdout, dhandle, abfd, syms,
3221 bfd_demangle,
3222 dump_debugging_tags ? TRUE : FALSE))
3223 {
3224 non_fatal (_("%s: printing debugging information failed"),
3225 bfd_get_filename (abfd));
3226 exit_status = 1;
3227 }
3228 }
3229 /* PR 6483: If there was no STABS or IEEE debug
3230 info in the file, try DWARF instead. */
3231 else if (! dump_dwarf_section_info)
3232 {
3233 dump_dwarf (abfd);
3234 }
3235 }
3236
3237 if (syms)
3238 {
3239 free (syms);
3240 syms = NULL;
3241 }
3242
3243 if (dynsyms)
3244 {
3245 free (dynsyms);
3246 dynsyms = NULL;
3247 }
3248
3249 if (synthsyms)
3250 {
3251 free (synthsyms);
3252 synthsyms = NULL;
3253 }
3254
3255 symcount = 0;
3256 dynsymcount = 0;
3257 synthcount = 0;
3258 }
3259
3260 static void
3261 display_object_bfd (bfd *abfd)
3262 {
3263 char **matching;
3264
3265 if (bfd_check_format_matches (abfd, bfd_object, &matching))
3266 {
3267 dump_bfd (abfd);
3268 return;
3269 }
3270
3271 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3272 {
3273 nonfatal (bfd_get_filename (abfd));
3274 list_matching_formats (matching);
3275 free (matching);
3276 return;
3277 }
3278
3279 if (bfd_get_error () != bfd_error_file_not_recognized)
3280 {
3281 nonfatal (bfd_get_filename (abfd));
3282 return;
3283 }
3284
3285 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3286 {
3287 dump_bfd (abfd);
3288 return;
3289 }
3290
3291 nonfatal (bfd_get_filename (abfd));
3292
3293 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3294 {
3295 list_matching_formats (matching);
3296 free (matching);
3297 }
3298 }
3299
3300 static void
3301 display_any_bfd (bfd *file, int level)
3302 {
3303 /* Decompress sections unless dumping the section contents. */
3304 if (!dump_section_contents)
3305 file->flags |= BFD_DECOMPRESS;
3306
3307 /* If the file is an archive, process all of its elements. */
3308 if (bfd_check_format (file, bfd_archive))
3309 {
3310 bfd *arfile = NULL;
3311 bfd *last_arfile = NULL;
3312
3313 if (level == 0)
3314 printf (_("In archive %s:\n"), bfd_get_filename (file));
3315 else
3316 printf (_("In nested archive %s:\n"), bfd_get_filename (file));
3317
3318 for (;;)
3319 {
3320 bfd_set_error (bfd_error_no_error);
3321
3322 arfile = bfd_openr_next_archived_file (file, arfile);
3323 if (arfile == NULL)
3324 {
3325 if (bfd_get_error () != bfd_error_no_more_archived_files)
3326 nonfatal (bfd_get_filename (file));
3327 break;
3328 }
3329
3330 display_any_bfd (arfile, level + 1);
3331
3332 if (last_arfile != NULL)
3333 bfd_close (last_arfile);
3334 last_arfile = arfile;
3335 }
3336
3337 if (last_arfile != NULL)
3338 bfd_close (last_arfile);
3339 }
3340 else
3341 display_object_bfd (file);
3342 }
3343
3344 static void
3345 display_file (char *filename, char *target)
3346 {
3347 bfd *file;
3348
3349 if (get_file_size (filename) < 1)
3350 {
3351 exit_status = 1;
3352 return;
3353 }
3354
3355 file = bfd_openr (filename, target);
3356 if (file == NULL)
3357 {
3358 nonfatal (filename);
3359 return;
3360 }
3361
3362 display_any_bfd (file, 0);
3363
3364 bfd_close (file);
3365 }
3366 \f
3367 int
3368 main (int argc, char **argv)
3369 {
3370 int c;
3371 char *target = default_target;
3372 bfd_boolean seenflag = FALSE;
3373
3374 #if defined (HAVE_SETLOCALE)
3375 #if defined (HAVE_LC_MESSAGES)
3376 setlocale (LC_MESSAGES, "");
3377 #endif
3378 setlocale (LC_CTYPE, "");
3379 #endif
3380
3381 bindtextdomain (PACKAGE, LOCALEDIR);
3382 textdomain (PACKAGE);
3383
3384 program_name = *argv;
3385 xmalloc_set_program_name (program_name);
3386
3387 START_PROGRESS (program_name, 0);
3388
3389 expandargv (&argc, &argv);
3390
3391 bfd_init ();
3392 set_default_bfd_target ();
3393
3394 while ((c = getopt_long (argc, argv,
3395 "pP:ib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW::",
3396 long_options, (int *) 0))
3397 != EOF)
3398 {
3399 switch (c)
3400 {
3401 case 0:
3402 break; /* We've been given a long option. */
3403 case 'm':
3404 machine = optarg;
3405 break;
3406 case 'M':
3407 if (disassembler_options)
3408 /* Ignore potential memory leak for now. */
3409 disassembler_options = concat (disassembler_options, ",",
3410 optarg, (const char *) NULL);
3411 else
3412 disassembler_options = optarg;
3413 break;
3414 case 'j':
3415 add_only (optarg);
3416 break;
3417 case 'F':
3418 display_file_offsets = TRUE;
3419 break;
3420 case 'l':
3421 with_line_numbers = TRUE;
3422 break;
3423 case 'b':
3424 target = optarg;
3425 break;
3426 case 'C':
3427 do_demangle = TRUE;
3428 if (optarg != NULL)
3429 {
3430 enum demangling_styles style;
3431
3432 style = cplus_demangle_name_to_style (optarg);
3433 if (style == unknown_demangling)
3434 fatal (_("unknown demangling style `%s'"),
3435 optarg);
3436
3437 cplus_demangle_set_style (style);
3438 }
3439 break;
3440 case 'w':
3441 wide_output = TRUE;
3442 break;
3443 case OPTION_ADJUST_VMA:
3444 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3445 break;
3446 case OPTION_START_ADDRESS:
3447 start_address = parse_vma (optarg, "--start-address");
3448 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3449 fatal (_("error: the start address should be before the end address"));
3450 break;
3451 case OPTION_STOP_ADDRESS:
3452 stop_address = parse_vma (optarg, "--stop-address");
3453 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3454 fatal (_("error: the stop address should be after the start address"));
3455 break;
3456 case OPTION_PREFIX:
3457 prefix = optarg;
3458 prefix_length = strlen (prefix);
3459 /* Remove an unnecessary trailing '/' */
3460 while (IS_DIR_SEPARATOR (prefix[prefix_length - 1]))
3461 prefix_length--;
3462 break;
3463 case OPTION_PREFIX_STRIP:
3464 prefix_strip = atoi (optarg);
3465 if (prefix_strip < 0)
3466 fatal (_("error: prefix strip must be non-negative"));
3467 break;
3468 case OPTION_INSN_WIDTH:
3469 insn_width = strtoul (optarg, NULL, 0);
3470 if (insn_width <= 0)
3471 fatal (_("error: instruction width must be positive"));
3472 break;
3473 case 'E':
3474 if (strcmp (optarg, "B") == 0)
3475 endian = BFD_ENDIAN_BIG;
3476 else if (strcmp (optarg, "L") == 0)
3477 endian = BFD_ENDIAN_LITTLE;
3478 else
3479 {
3480 nonfatal (_("unrecognized -E option"));
3481 usage (stderr, 1);
3482 }
3483 break;
3484 case OPTION_ENDIAN:
3485 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3486 endian = BFD_ENDIAN_BIG;
3487 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3488 endian = BFD_ENDIAN_LITTLE;
3489 else
3490 {
3491 non_fatal (_("unrecognized --endian type `%s'"), optarg);
3492 exit_status = 1;
3493 usage (stderr, 1);
3494 }
3495 break;
3496
3497 case 'f':
3498 dump_file_header = TRUE;
3499 seenflag = TRUE;
3500 break;
3501 case 'i':
3502 formats_info = TRUE;
3503 seenflag = TRUE;
3504 break;
3505 case 'I':
3506 add_include_path (optarg);
3507 break;
3508 case 'p':
3509 dump_private_headers = TRUE;
3510 seenflag = TRUE;
3511 break;
3512 case 'P':
3513 dump_private_options = optarg;
3514 seenflag = TRUE;
3515 break;
3516 case 'x':
3517 dump_private_headers = TRUE;
3518 dump_symtab = TRUE;
3519 dump_reloc_info = TRUE;
3520 dump_file_header = TRUE;
3521 dump_ar_hdrs = TRUE;
3522 dump_section_headers = TRUE;
3523 seenflag = TRUE;
3524 break;
3525 case 't':
3526 dump_symtab = TRUE;
3527 seenflag = TRUE;
3528 break;
3529 case 'T':
3530 dump_dynamic_symtab = TRUE;
3531 seenflag = TRUE;
3532 break;
3533 case 'd':
3534 disassemble = TRUE;
3535 seenflag = TRUE;
3536 break;
3537 case 'z':
3538 disassemble_zeroes = TRUE;
3539 break;
3540 case 'D':
3541 disassemble = TRUE;
3542 disassemble_all = TRUE;
3543 seenflag = TRUE;
3544 break;
3545 case 'S':
3546 disassemble = TRUE;
3547 with_source_code = TRUE;
3548 seenflag = TRUE;
3549 break;
3550 case 'g':
3551 dump_debugging = 1;
3552 seenflag = TRUE;
3553 break;
3554 case 'e':
3555 dump_debugging = 1;
3556 dump_debugging_tags = 1;
3557 do_demangle = TRUE;
3558 seenflag = TRUE;
3559 break;
3560 case 'W':
3561 dump_dwarf_section_info = TRUE;
3562 seenflag = TRUE;
3563 if (optarg)
3564 dwarf_select_sections_by_letters (optarg);
3565 else
3566 dwarf_select_sections_all ();
3567 break;
3568 case OPTION_DWARF:
3569 dump_dwarf_section_info = TRUE;
3570 seenflag = TRUE;
3571 if (optarg)
3572 dwarf_select_sections_by_names (optarg);
3573 else
3574 dwarf_select_sections_all ();
3575 break;
3576 case OPTION_DWARF_DEPTH:
3577 {
3578 char *cp;
3579 dwarf_cutoff_level = strtoul (optarg, & cp, 0);
3580 }
3581 break;
3582 case OPTION_DWARF_START:
3583 {
3584 char *cp;
3585 dwarf_start_die = strtoul (optarg, & cp, 0);
3586 suppress_bfd_header = 1;
3587 }
3588 break;
3589 case 'G':
3590 dump_stab_section_info = TRUE;
3591 seenflag = TRUE;
3592 break;
3593 case 's':
3594 dump_section_contents = TRUE;
3595 seenflag = TRUE;
3596 break;
3597 case 'r':
3598 dump_reloc_info = TRUE;
3599 seenflag = TRUE;
3600 break;
3601 case 'R':
3602 dump_dynamic_reloc_info = TRUE;
3603 seenflag = TRUE;
3604 break;
3605 case 'a':
3606 dump_ar_hdrs = TRUE;
3607 seenflag = TRUE;
3608 break;
3609 case 'h':
3610 dump_section_headers = TRUE;
3611 seenflag = TRUE;
3612 break;
3613 case 'H':
3614 usage (stdout, 0);
3615 seenflag = TRUE;
3616 case 'v':
3617 case 'V':
3618 show_version = TRUE;
3619 seenflag = TRUE;
3620 break;
3621
3622 default:
3623 usage (stderr, 1);
3624 }
3625 }
3626
3627 if (show_version)
3628 print_version ("objdump");
3629
3630 if (!seenflag)
3631 usage (stderr, 2);
3632
3633 if (formats_info)
3634 exit_status = display_info ();
3635 else
3636 {
3637 if (optind == argc)
3638 display_file ("a.out", target);
3639 else
3640 for (; optind < argc;)
3641 display_file (argv[optind++], target);
3642 }
3643
3644 free_only_list ();
3645
3646 END_PROGRESS (program_name);
3647
3648 return exit_status;
3649 }