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