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