]> Git Repo - binutils.git/blame - binutils/objdump.c
bfd/
[binutils.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];
17ceb936
AM
1375
1376 bfd_sprintf_vma (aux->abfd, buf, section->vma + section->size / opb);
1377
1378 while (buf[skip_addr_chars] == '0')
1379 ++skip_addr_chars;
1380
1381 /* Don't discard zeros on overflow. */
1382 if (buf[skip_addr_chars] == '\0' && section->vma != 0)
1383 skip_addr_chars = 0;
1384
1385 if (skip_addr_chars != 0)
1386 skip_addr_chars = (skip_addr_chars - 1) & -4;
252b5132
RH
1387 }
1388
1389 info->insn_info_valid = 0;
1390
b34976b6 1391 done_dot = FALSE;
940b2b78
TW
1392 addr_offset = start_offset;
1393 while (addr_offset < stop_offset)
252b5132
RH
1394 {
1395 bfd_vma z;
b34976b6 1396 bfd_boolean need_nl = FALSE;
ce04548a
NC
1397 int previous_octets;
1398
1399 /* Remember the length of the previous instruction. */
1400 previous_octets = octets;
ce04548a 1401 octets = 0;
252b5132 1402
940b2b78 1403 /* If we see more than SKIP_ZEROES octets of zeroes, we just
43ac9881 1404 print `...'. */
940b2b78 1405 for (z = addr_offset * opb; z < stop_offset * opb; z++)
252b5132
RH
1406 if (data[z] != 0)
1407 break;
1408 if (! disassemble_zeroes
1409 && (info->insn_info_valid == 0
1410 || info->branch_delay_insns == 0)
0bcb06d2 1411 && (z - addr_offset * opb >= skip_zeroes
0af11b59 1412 || (z == stop_offset * opb &&
0bcb06d2 1413 z - addr_offset * opb < skip_zeroes_at_end)))
252b5132 1414 {
940b2b78 1415 /* If there are more nonzero octets to follow, we only skip
43ac9881
AM
1416 zeroes in multiples of 4, to try to avoid running over
1417 the start of an instruction which happens to start with
1418 zero. */
940b2b78
TW
1419 if (z != stop_offset * opb)
1420 z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
252b5132 1421
940b2b78 1422 octets = z - addr_offset * opb;
98ec6e72
NC
1423
1424 /* If we are going to display more data, and we are displaying
1425 file offsets, then tell the user how many zeroes we skip
1426 and the file offset from where we resume dumping. */
1427 if (display_file_offsets && ((addr_offset + (octets / opb)) < stop_offset))
1428 printf ("\t... (skipping %d zeroes, resuming at file offset: 0x%lx)\n",
1429 octets / opb,
0af1713e
AM
1430 (unsigned long) (section->filepos
1431 + (addr_offset + (octets / opb))));
98ec6e72
NC
1432 else
1433 printf ("\t...\n");
252b5132
RH
1434 }
1435 else
1436 {
1437 char buf[50];
252b5132
RH
1438 int bpc = 0;
1439 int pb = 0;
1440
b34976b6 1441 done_dot = FALSE;
252b5132
RH
1442
1443 if (with_line_numbers || with_source_code)
bc79cded 1444 show_line (aux->abfd, section, addr_offset);
252b5132
RH
1445
1446 if (! prefix_addresses)
1447 {
1448 char *s;
1449
d8180c76 1450 bfd_sprintf_vma (aux->abfd, buf, section->vma + addr_offset);
252b5132
RH
1451 for (s = buf + skip_addr_chars; *s == '0'; s++)
1452 *s = ' ';
1453 if (*s == '\0')
1454 *--s = '0';
1455 printf ("%s:\t", buf + skip_addr_chars);
1456 }
1457 else
1458 {
b34976b6 1459 aux->require_sec = TRUE;
940b2b78 1460 objdump_print_address (section->vma + addr_offset, info);
b34976b6 1461 aux->require_sec = FALSE;
252b5132
RH
1462 putchar (' ');
1463 }
1464
1465 if (insns)
1466 {
6f104306 1467 sfile.pos = 0;
252b5132 1468 info->fprintf_func = (fprintf_ftype) objdump_sprintf;
5810296b 1469 info->stream = &sfile;
252b5132
RH
1470 info->bytes_per_line = 0;
1471 info->bytes_per_chunk = 0;
ce04548a 1472 info->flags = 0;
252b5132 1473
d99b6465 1474 if (info->disassembler_needs_relocs
7df428b1
RS
1475 && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
1476 && (bfd_get_file_flags (aux->abfd) & DYNAMIC) == 0
d99b6465 1477 && *relppp < relppend)
ce04548a
NC
1478 {
1479 bfd_signed_vma distance_to_rel;
1480
1481 distance_to_rel = (**relppp)->address
1482 - (rel_offset + addr_offset);
1483
1484 /* Check to see if the current reloc is associated with
1485 the instruction that we are about to disassemble. */
1486 if (distance_to_rel == 0
1487 /* FIXME: This is wrong. We are trying to catch
1488 relocs that are addressed part way through the
1489 current instruction, as might happen with a packed
1490 VLIW instruction. Unfortunately we do not know the
1491 length of the current instruction since we have not
1492 disassembled it yet. Instead we take a guess based
1493 upon the length of the previous instruction. The
1494 proper solution is to have a new target-specific
1495 disassembler function which just returns the length
1496 of an instruction at a given address without trying
1497 to display its disassembly. */
1498 || (distance_to_rel > 0
1499 && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
1500 {
1501 info->flags = INSN_HAS_RELOC;
1502 aux->reloc = **relppp;
1503 }
1504 else
1505 aux->reloc = NULL;
1506 }
d99b6465 1507
940b2b78 1508 octets = (*disassemble_fn) (section->vma + addr_offset, info);
252b5132
RH
1509 info->fprintf_func = (fprintf_ftype) fprintf;
1510 info->stream = stdout;
1511 if (info->bytes_per_line != 0)
940b2b78
TW
1512 octets_per_line = info->bytes_per_line;
1513 if (octets < 0)
e07bf1ac 1514 {
6f104306 1515 if (sfile.pos)
e07bf1ac 1516 printf ("%s\n", sfile.buffer);
e07bf1ac
ILT
1517 break;
1518 }
252b5132
RH
1519 }
1520 else
1521 {
b4c96d0d 1522 bfd_vma j;
252b5132 1523
940b2b78
TW
1524 octets = octets_per_line;
1525 if (addr_offset + octets / opb > stop_offset)
1526 octets = (stop_offset - addr_offset) * opb;
252b5132 1527
940b2b78 1528 for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
252b5132 1529 {
3882b010 1530 if (ISPRINT (data[j]))
940b2b78 1531 buf[j - addr_offset * opb] = data[j];
252b5132 1532 else
940b2b78 1533 buf[j - addr_offset * opb] = '.';
252b5132 1534 }
940b2b78 1535 buf[j - addr_offset * opb] = '\0';
252b5132
RH
1536 }
1537
1538 if (prefix_addresses
1539 ? show_raw_insn > 0
1540 : show_raw_insn >= 0)
1541 {
b4c96d0d 1542 bfd_vma j;
252b5132
RH
1543
1544 /* If ! prefix_addresses and ! wide_output, we print
43ac9881 1545 octets_per_line octets per line. */
940b2b78
TW
1546 pb = octets;
1547 if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
1548 pb = octets_per_line;
252b5132
RH
1549
1550 if (info->bytes_per_chunk)
1551 bpc = info->bytes_per_chunk;
1552 else
1553 bpc = 1;
1554
940b2b78 1555 for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
252b5132
RH
1556 {
1557 int k;
ed049af3 1558
252b5132
RH
1559 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1560 {
1561 for (k = bpc - 1; k >= 0; k--)
1562 printf ("%02x", (unsigned) data[j + k]);
1563 putchar (' ');
1564 }
1565 else
1566 {
1567 for (k = 0; k < bpc; k++)
1568 printf ("%02x", (unsigned) data[j + k]);
1569 putchar (' ');
1570 }
1571 }
1572
940b2b78 1573 for (; pb < octets_per_line; pb += bpc)
252b5132
RH
1574 {
1575 int k;
1576
1577 for (k = 0; k < bpc; k++)
1578 printf (" ");
1579 putchar (' ');
1580 }
1581
1582 /* Separate raw data from instruction by extra space. */
1583 if (insns)
1584 putchar ('\t');
1585 else
1586 printf (" ");
1587 }
1588
1589 if (! insns)
1590 printf ("%s", buf);
6f104306
NS
1591 else if (sfile.pos)
1592 printf ("%s", sfile.buffer);
252b5132
RH
1593
1594 if (prefix_addresses
1595 ? show_raw_insn > 0
1596 : show_raw_insn >= 0)
1597 {
940b2b78 1598 while (pb < octets)
252b5132 1599 {
b4c96d0d 1600 bfd_vma j;
252b5132
RH
1601 char *s;
1602
1603 putchar ('\n');
940b2b78 1604 j = addr_offset * opb + pb;
252b5132 1605
d8180c76 1606 bfd_sprintf_vma (aux->abfd, buf, section->vma + j / opb);
252b5132
RH
1607 for (s = buf + skip_addr_chars; *s == '0'; s++)
1608 *s = ' ';
1609 if (*s == '\0')
1610 *--s = '0';
1611 printf ("%s:\t", buf + skip_addr_chars);
1612
940b2b78
TW
1613 pb += octets_per_line;
1614 if (pb > octets)
1615 pb = octets;
1616 for (; j < addr_offset * opb + pb; j += bpc)
252b5132
RH
1617 {
1618 int k;
1619
1620 if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1621 {
1622 for (k = bpc - 1; k >= 0; k--)
1623 printf ("%02x", (unsigned) data[j + k]);
1624 putchar (' ');
1625 }
1626 else
1627 {
1628 for (k = 0; k < bpc; k++)
1629 printf ("%02x", (unsigned) data[j + k]);
1630 putchar (' ');
1631 }
1632 }
1633 }
1634 }
1635
1636 if (!wide_output)
1637 putchar ('\n');
1638 else
b34976b6 1639 need_nl = TRUE;
252b5132
RH
1640 }
1641
fd7bb956
AM
1642 while ((*relppp) < relppend
1643 && (**relppp)->address < rel_offset + addr_offset + octets / opb)
252b5132 1644 {
fd7bb956 1645 if (dump_reloc_info || dump_dynamic_reloc_info)
252b5132
RH
1646 {
1647 arelent *q;
1648
1649 q = **relppp;
1650
1651 if (wide_output)
1652 putchar ('\t');
1653 else
1654 printf ("\t\t\t");
1655
68b3b8dc
JJ
1656 objdump_print_value (section->vma - rel_offset + q->address,
1657 info, TRUE);
252b5132 1658
f9ecb0a4
JJ
1659 if (q->howto == NULL)
1660 printf (": *unknown*\t");
1661 else if (q->howto->name)
1662 printf (": %s\t", q->howto->name);
1663 else
1664 printf (": %d\t", q->howto->type);
252b5132
RH
1665
1666 if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1667 printf ("*unknown*");
1668 else
1669 {
1670 const char *sym_name;
1671
1672 sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1673 if (sym_name != NULL && *sym_name != '\0')
1674 objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1675 else
1676 {
1677 asection *sym_sec;
1678
1679 sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1680 sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1681 if (sym_name == NULL || *sym_name == '\0')
1682 sym_name = "*unknown*";
1683 printf ("%s", sym_name);
1684 }
1685 }
1686
1687 if (q->addend)
1688 {
1689 printf ("+0x");
b34976b6 1690 objdump_print_value (q->addend, info, TRUE);
252b5132
RH
1691 }
1692
1693 printf ("\n");
b34976b6 1694 need_nl = FALSE;
252b5132 1695 }
fd7bb956 1696 ++(*relppp);
252b5132
RH
1697 }
1698
1699 if (need_nl)
1700 printf ("\n");
1701
940b2b78 1702 addr_offset += octets / opb;
252b5132 1703 }
6f104306
NS
1704
1705 free (sfile.buffer);
252b5132
RH
1706}
1707
155e0d23
NC
1708static void
1709disassemble_section (bfd *abfd, asection *section, void *info)
1710{
1711 struct disassemble_info * pinfo = (struct disassemble_info *) info;
3b9ad1cc 1712 struct objdump_disasm_info * paux;
155e0d23
NC
1713 unsigned int opb = pinfo->octets_per_byte;
1714 bfd_byte * data = NULL;
1715 bfd_size_type datasize = 0;
1716 arelent ** rel_pp = NULL;
1717 arelent ** rel_ppstart = NULL;
1718 arelent ** rel_ppend;
1719 unsigned long stop_offset;
1720 asymbol * sym = NULL;
1721 long place = 0;
1722 long rel_count;
1723 bfd_vma rel_offset;
1724 unsigned long addr_offset;
1725
1726 /* Sections that do not contain machine
1727 code are not normally disassembled. */
1728 if (! disassemble_all
1729 && only == NULL
46212538
AM
1730 && ((section->flags & (SEC_CODE | SEC_HAS_CONTENTS))
1731 != (SEC_CODE | SEC_HAS_CONTENTS)))
155e0d23
NC
1732 return;
1733
1734 if (! process_section_p (section))
1735 return;
1736
135dfb4a 1737 datasize = bfd_get_section_size (section);
155e0d23
NC
1738 if (datasize == 0)
1739 return;
1740
1741 /* Decide which set of relocs to use. Load them if necessary. */
3b9ad1cc 1742 paux = (struct objdump_disasm_info *) pinfo->application_data;
155e0d23
NC
1743 if (paux->dynrelbuf)
1744 {
1745 rel_pp = paux->dynrelbuf;
1746 rel_count = paux->dynrelcount;
1747 /* Dynamic reloc addresses are absolute, non-dynamic are section
50c2245b 1748 relative. REL_OFFSET specifies the reloc address corresponding
155e0d23 1749 to the start of this section. */
68b3b8dc 1750 rel_offset = section->vma;
155e0d23
NC
1751 }
1752 else
1753 {
1754 rel_count = 0;
1755 rel_pp = NULL;
1756 rel_offset = 0;
1757
1758 if ((section->flags & SEC_RELOC) != 0
d99b6465 1759 && (dump_reloc_info || pinfo->disassembler_needs_relocs))
155e0d23
NC
1760 {
1761 long relsize;
1762
1763 relsize = bfd_get_reloc_upper_bound (abfd, section);
1764 if (relsize < 0)
1765 bfd_fatal (bfd_get_filename (abfd));
1766
1767 if (relsize > 0)
1768 {
1769 rel_ppstart = rel_pp = xmalloc (relsize);
1770 rel_count = bfd_canonicalize_reloc (abfd, section, rel_pp, syms);
1771 if (rel_count < 0)
1772 bfd_fatal (bfd_get_filename (abfd));
1773
1774 /* Sort the relocs by address. */
1775 qsort (rel_pp, rel_count, sizeof (arelent *), compare_relocs);
1776 }
1777 }
1778
1779 }
1780 rel_ppend = rel_pp + rel_count;
1781
1782 data = xmalloc (datasize);
1783
1784 bfd_get_section_contents (abfd, section, data, 0, datasize);
1785
1786 paux->sec = section;
1787 pinfo->buffer = data;
1788 pinfo->buffer_vma = section->vma;
1789 pinfo->buffer_length = datasize;
1790 pinfo->section = section;
1791
1792 if (start_address == (bfd_vma) -1
1793 || start_address < pinfo->buffer_vma)
1794 addr_offset = 0;
1795 else
1796 addr_offset = start_address - pinfo->buffer_vma;
1797
1798 if (stop_address == (bfd_vma) -1)
1799 stop_offset = datasize / opb;
1800 else
1801 {
1802 if (stop_address < pinfo->buffer_vma)
1803 stop_offset = 0;
1804 else
1805 stop_offset = stop_address - pinfo->buffer_vma;
1806 if (stop_offset > pinfo->buffer_length / opb)
1807 stop_offset = pinfo->buffer_length / opb;
1808 }
1809
1810 /* Skip over the relocs belonging to addresses below the
1811 start address. */
1812 while (rel_pp < rel_ppend
1813 && (*rel_pp)->address < rel_offset + addr_offset)
1814 ++rel_pp;
1815
98ec6e72
NC
1816 if (addr_offset < stop_offset)
1817 printf (_("\nDisassembly of section %s:\n"), section->name);
155e0d23
NC
1818
1819 /* Find the nearest symbol forwards from our current position. */
3b9ad1cc 1820 paux->require_sec = TRUE;
22a398e1 1821 sym = find_symbol_for_address (section->vma + addr_offset, info, &place);
3b9ad1cc 1822 paux->require_sec = FALSE;
155e0d23
NC
1823
1824 /* Disassemble a block of instructions up to the address associated with
1825 the symbol we have just found. Then print the symbol and find the
1826 next symbol on. Repeat until we have disassembled the entire section
1827 or we have reached the end of the address range we are interested in. */
1828 while (addr_offset < stop_offset)
1829 {
22a398e1 1830 bfd_vma addr;
155e0d23
NC
1831 asymbol *nextsym;
1832 unsigned long nextstop_offset;
1833 bfd_boolean insns;
1834
22a398e1
NC
1835 addr = section->vma + addr_offset;
1836
1837 if (sym != NULL && bfd_asymbol_value (sym) <= addr)
155e0d23
NC
1838 {
1839 int x;
1840
1841 for (x = place;
1842 (x < sorted_symcount
22a398e1 1843 && (bfd_asymbol_value (sorted_syms[x]) <= addr));
155e0d23
NC
1844 ++x)
1845 continue;
1846
22a398e1 1847 pinfo->symbols = sorted_syms + place;
155e0d23 1848 pinfo->num_symbols = x - place;
2087ad84 1849 pinfo->symtab_pos = place;
155e0d23
NC
1850 }
1851 else
22a398e1
NC
1852 {
1853 pinfo->symbols = NULL;
1854 pinfo->num_symbols = 0;
2087ad84 1855 pinfo->symtab_pos = -1;
22a398e1 1856 }
155e0d23
NC
1857
1858 if (! prefix_addresses)
1859 {
1860 pinfo->fprintf_func (pinfo->stream, "\n");
22a398e1 1861 objdump_print_addr_with_sym (abfd, section, sym, addr,
155e0d23
NC
1862 pinfo, FALSE);
1863 pinfo->fprintf_func (pinfo->stream, ":\n");
1864 }
1865
22a398e1 1866 if (sym != NULL && bfd_asymbol_value (sym) > addr)
155e0d23
NC
1867 nextsym = sym;
1868 else if (sym == NULL)
1869 nextsym = NULL;
1870 else
1871 {
22a398e1
NC
1872#define is_valid_next_sym(SYM) \
1873 ((SYM)->section == section \
1874 && (bfd_asymbol_value (SYM) > bfd_asymbol_value (sym)) \
1875 && pinfo->symbol_is_valid (SYM, pinfo))
1876
155e0d23
NC
1877 /* Search forward for the next appropriate symbol in
1878 SECTION. Note that all the symbols are sorted
1879 together into one big array, and that some sections
1880 may have overlapping addresses. */
1881 while (place < sorted_symcount
22a398e1 1882 && ! is_valid_next_sym (sorted_syms [place]))
155e0d23 1883 ++place;
22a398e1 1884
155e0d23
NC
1885 if (place >= sorted_symcount)
1886 nextsym = NULL;
1887 else
1888 nextsym = sorted_syms[place];
1889 }
1890
22a398e1
NC
1891 if (sym != NULL && bfd_asymbol_value (sym) > addr)
1892 nextstop_offset = bfd_asymbol_value (sym) - section->vma;
155e0d23
NC
1893 else if (nextsym == NULL)
1894 nextstop_offset = stop_offset;
1895 else
22a398e1
NC
1896 nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
1897
1898 if (nextstop_offset > stop_offset)
1899 nextstop_offset = stop_offset;
155e0d23
NC
1900
1901 /* If a symbol is explicitly marked as being an object
1902 rather than a function, just dump the bytes without
1903 disassembling them. */
1904 if (disassemble_all
1905 || sym == NULL
22a398e1 1906 || bfd_asymbol_value (sym) > addr
155e0d23
NC
1907 || ((sym->flags & BSF_OBJECT) == 0
1908 && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1909 == NULL)
1910 && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1911 == NULL))
1912 || (sym->flags & BSF_FUNCTION) != 0)
1913 insns = TRUE;
1914 else
1915 insns = FALSE;
1916
1917 disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
1918 addr_offset, nextstop_offset,
1919 rel_offset, &rel_pp, rel_ppend);
1920
1921 addr_offset = nextstop_offset;
1922 sym = nextsym;
1923 }
1924
1925 free (data);
1926
1927 if (rel_ppstart != NULL)
1928 free (rel_ppstart);
1929}
1930
252b5132
RH
1931/* Disassemble the contents of an object file. */
1932
1933static void
46dca2e0 1934disassemble_data (bfd *abfd)
252b5132 1935{
252b5132
RH
1936 struct disassemble_info disasm_info;
1937 struct objdump_disasm_info aux;
4c45e5c9 1938 long i;
252b5132
RH
1939
1940 print_files = NULL;
1941 prev_functionname = NULL;
1942 prev_line = -1;
1943
1944 /* We make a copy of syms to sort. We don't want to sort syms
1945 because that will screw up the relocs. */
4c45e5c9
JJ
1946 sorted_symcount = symcount ? symcount : dynsymcount;
1947 sorted_syms = xmalloc ((sorted_symcount + synthcount) * sizeof (asymbol *));
1948 memcpy (sorted_syms, symcount ? syms : dynsyms,
1949 sorted_symcount * sizeof (asymbol *));
252b5132 1950
4c45e5c9
JJ
1951 sorted_symcount = remove_useless_symbols (sorted_syms, sorted_symcount);
1952
1953 for (i = 0; i < synthcount; ++i)
1954 {
1955 sorted_syms[sorted_symcount] = synthsyms + i;
1956 ++sorted_symcount;
1957 }
252b5132 1958
98a91d6a 1959 /* Sort the symbols into section and symbol order. */
252b5132
RH
1960 qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1961
22a398e1 1962 init_disassemble_info (&disasm_info, stdout, (fprintf_ftype) fprintf);
98a91d6a 1963
46dca2e0 1964 disasm_info.application_data = (void *) &aux;
252b5132 1965 aux.abfd = abfd;
b34976b6 1966 aux.require_sec = FALSE;
155e0d23
NC
1967 aux.dynrelbuf = NULL;
1968 aux.dynrelcount = 0;
ce04548a 1969 aux.reloc = NULL;
155e0d23 1970
252b5132
RH
1971 disasm_info.print_address_func = objdump_print_address;
1972 disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1973
d3ba0551 1974 if (machine != NULL)
252b5132
RH
1975 {
1976 const bfd_arch_info_type *info = bfd_scan_arch (machine);
98a91d6a 1977
252b5132 1978 if (info == NULL)
98a91d6a
NC
1979 fatal (_("Can't use supplied machine %s"), machine);
1980
252b5132
RH
1981 abfd->arch_info = info;
1982 }
1983
1984 if (endian != BFD_ENDIAN_UNKNOWN)
1985 {
1986 struct bfd_target *xvec;
1987
d3ba0551 1988 xvec = xmalloc (sizeof (struct bfd_target));
252b5132
RH
1989 memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1990 xvec->byteorder = endian;
1991 abfd->xvec = xvec;
1992 }
1993
155e0d23
NC
1994 /* Use libopcodes to locate a suitable disassembler. */
1995 aux.disassemble_fn = disassembler (abfd);
1996 if (!aux.disassemble_fn)
252b5132 1997 {
37cc8ec1
AM
1998 non_fatal (_("Can't disassemble for architecture %s\n"),
1999 bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
75cd796a 2000 exit_status = 1;
252b5132
RH
2001 return;
2002 }
2003
2004 disasm_info.flavour = bfd_get_flavour (abfd);
2005 disasm_info.arch = bfd_get_arch (abfd);
2006 disasm_info.mach = bfd_get_mach (abfd);
dd92f639 2007 disasm_info.disassembler_options = disassembler_options;
155e0d23 2008 disasm_info.octets_per_byte = bfd_octets_per_byte (abfd);
0bcb06d2
AS
2009 disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES;
2010 disasm_info.skip_zeroes_at_end = DEFAULT_SKIP_ZEROES_AT_END;
d99b6465 2011 disasm_info.disassembler_needs_relocs = FALSE;
0af11b59 2012
252b5132 2013 if (bfd_big_endian (abfd))
a8a9050d 2014 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_BIG;
252b5132 2015 else if (bfd_little_endian (abfd))
a8a9050d 2016 disasm_info.display_endian = disasm_info.endian = BFD_ENDIAN_LITTLE;
252b5132
RH
2017 else
2018 /* ??? Aborting here seems too drastic. We could default to big or little
2019 instead. */
2020 disasm_info.endian = BFD_ENDIAN_UNKNOWN;
2021
22a398e1
NC
2022 /* Allow the target to customize the info structure. */
2023 disassemble_init_for_target (& disasm_info);
2024
155e0d23
NC
2025 /* Pre-load the dynamic relocs if we are going
2026 to be dumping them along with the disassembly. */
fd7bb956
AM
2027 if (dump_dynamic_reloc_info)
2028 {
2029 long relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
155e0d23 2030
fd7bb956
AM
2031 if (relsize < 0)
2032 bfd_fatal (bfd_get_filename (abfd));
2033
2034 if (relsize > 0)
2035 {
155e0d23 2036 aux.dynrelbuf = xmalloc (relsize);
3b9ad1cc
AM
2037 aux.dynrelcount = bfd_canonicalize_dynamic_reloc (abfd,
2038 aux.dynrelbuf,
2039 dynsyms);
155e0d23 2040 if (aux.dynrelcount < 0)
fd7bb956
AM
2041 bfd_fatal (bfd_get_filename (abfd));
2042
2043 /* Sort the relocs by address. */
3b9ad1cc
AM
2044 qsort (aux.dynrelbuf, aux.dynrelcount, sizeof (arelent *),
2045 compare_relocs);
fd7bb956
AM
2046 }
2047 }
2087ad84
PB
2048 disasm_info.symtab = sorted_syms;
2049 disasm_info.symtab_size = sorted_symcount;
fd7bb956 2050
155e0d23 2051 bfd_map_over_sections (abfd, disassemble_section, & disasm_info);
98a91d6a 2052
155e0d23
NC
2053 if (aux.dynrelbuf != NULL)
2054 free (aux.dynrelbuf);
252b5132
RH
2055 free (sorted_syms);
2056}
2057\f
365544c3
L
2058int
2059load_debug_section (enum dwarf_section_display_enum debug, void *file)
2060{
2061 struct dwarf_section *section = &debug_displays [debug].section;
2062 bfd *abfd = file;
2063 asection *sec;
2064 bfd_boolean ret;
1b315056 2065 int section_is_compressed;
365544c3
L
2066
2067 /* If it is already loaded, do nothing. */
2068 if (section->start != NULL)
2069 return 1;
2070
2071 /* Locate the debug section. */
1b315056
CS
2072 sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
2073 if (sec != NULL)
a71cc8e0 2074 section->name = section->uncompressed_name;
1b315056
CS
2075 else
2076 {
2077 sec = bfd_get_section_by_name (abfd, section->compressed_name);
2078 if (sec != NULL)
a71cc8e0 2079 section->name = section->compressed_name;
1b315056 2080 }
365544c3
L
2081 if (sec == NULL)
2082 return 0;
a71cc8e0 2083 section_is_compressed = section->name == section->compressed_name;
365544c3 2084
d5737601
NC
2085 /* Compute a bias to be added to offsets found within the DWARF debug
2086 information. These offsets are meant to be relative to the start of
2087 the dwarf section, and hence the bias should be 0. For MACH-O however
2088 a dwarf section is really just a region of a much larger section and so
2089 the bias is the address of the start of that area within the larger
2090 section. This test is important for PE and COFF based targets which
2091 use DWARF debug information, since unlike ELF, they do not allow the
2092 dwarf sections to be placed at address 0. */
2093 if (bfd_get_flavour (abfd) == bfd_target_mach_o_flavour)
2094 section->address = bfd_get_section_vma (abfd, sec);
2095 else
2096 section->address = 0;
2097
365544c3
L
2098 section->size = bfd_get_section_size (sec);
2099 section->start = xmalloc (section->size);
2100
2101 if (is_relocatable && debug_displays [debug].relocate)
2102 ret = bfd_simple_get_relocated_section_contents (abfd,
2103 sec,
2104 section->start,
2105 syms) != NULL;
2106 else
2107 ret = bfd_get_section_contents (abfd, sec, section->start, 0,
2108 section->size);
2109
1b315056 2110 if (! ret)
365544c3
L
2111 {
2112 free_debug_section (debug);
2113 printf (_("\nCan't get contents for section '%s'.\n"),
2114 section->name);
1b315056
CS
2115 return 0;
2116 }
2117
2118 if (section_is_compressed)
2119 {
2120 bfd_size_type size = section->size;
2121 if (! bfd_uncompress_section_contents (&section->start, &size))
2122 {
2123 free_debug_section (debug);
2124 printf (_("\nCan't uncompress section '%s'.\n"), section->name);
2125 return 0;
2126 }
2127 section->size = size;
365544c3
L
2128 }
2129
2130 return ret;
2131}
2132
2133void
2134free_debug_section (enum dwarf_section_display_enum debug)
2135{
2136 struct dwarf_section *section = &debug_displays [debug].section;
2137
2138 if (section->start == NULL)
2139 return;
2140
2141 free ((char *) section->start);
2142 section->start = NULL;
2143 section->address = 0;
2144 section->size = 0;
2145}
2146
2147static void
2148dump_dwarf_section (bfd *abfd, asection *section,
2149 void *arg ATTRIBUTE_UNUSED)
2150{
2151 const char *name = bfd_get_section_name (abfd, section);
2152 const char *match;
2153 enum dwarf_section_display_enum i;
2154
0112cd26 2155 if (CONST_STRNEQ (name, ".gnu.linkonce.wi."))
365544c3
L
2156 match = ".debug_info";
2157 else
2158 match = name;
2159
2160 for (i = 0; i < max; i++)
1b315056
CS
2161 if (strcmp (debug_displays [i].section.uncompressed_name, match) == 0
2162 || strcmp (debug_displays [i].section.compressed_name, match) == 0)
365544c3 2163 {
1b315056 2164 if (!debug_displays [i].eh_frame)
365544c3
L
2165 {
2166 struct dwarf_section *sec = &debug_displays [i].section;
2167
2168 if (load_debug_section (i, abfd))
2169 {
1b315056 2170 debug_displays [i].display (sec, abfd);
365544c3
L
2171
2172 if (i != info && i != abbrev)
2173 free_debug_section (i);
2174 }
2175 }
2176 break;
2177 }
2178}
2179
1b315056 2180static const char *mach_o_uncompressed_dwarf_sections [] = {
bfe2612a
L
2181 "LC_SEGMENT.__DWARFA.__debug_abbrev", /* .debug_abbrev */
2182 "LC_SEGMENT.__DWARFA.__debug_aranges", /* .debug_aranges */
2183 "LC_SEGMENT.__DWARFA.__debug_frame", /* .debug_frame */
2184 "LC_SEGMENT.__DWARFA.__debug_info", /* .debug_info */
2185 "LC_SEGMENT.__DWARFA.__debug_line", /* .debug_line */
2186 "LC_SEGMENT.__DWARFA.__debug_pubnames", /* .debug_pubnames */
2187 ".eh_frame", /* .eh_frame */
2188 "LC_SEGMENT.__DWARFA.__debug_macinfo", /* .debug_macinfo */
2189 "LC_SEGMENT.__DWARFA.__debug_str", /* .debug_str */
2190 "LC_SEGMENT.__DWARFA.__debug_loc", /* .debug_loc */
2191 "LC_SEGMENT.__DWARFA.__debug_pubtypes", /* .debug_pubtypes */
2192 "LC_SEGMENT.__DWARFA.__debug_ranges", /* .debug_ranges */
2193 "LC_SEGMENT.__DWARFA.__debug_static_func", /* .debug_static_func */
2194 "LC_SEGMENT.__DWARFA.__debug_static_vars", /* .debug_static_vars */
2195 "LC_SEGMENT.__DWARFA.__debug_types", /* .debug_types */
2196 "LC_SEGMENT.__DWARFA.__debug_weaknames" /* .debug_weaknames */
2197};
2198
1b315056
CS
2199static const char *mach_o_compressed_dwarf_sections [] = {
2200 "LC_SEGMENT.__DWARFA.__zdebug_abbrev", /* .zdebug_abbrev */
2201 "LC_SEGMENT.__DWARFA.__zdebug_aranges", /* .zdebug_aranges */
2202 "LC_SEGMENT.__DWARFA.__zdebug_frame", /* .zdebug_frame */
2203 "LC_SEGMENT.__DWARFA.__zdebug_info", /* .zdebug_info */
2204 "LC_SEGMENT.__DWARFA.__zdebug_line", /* .zdebug_line */
2205 "LC_SEGMENT.__DWARFA.__zdebug_pubnames", /* .zdebug_pubnames */
2206 ".eh_frame", /* .eh_frame */
2207 "LC_SEGMENT.__DWARFA.__zdebug_macinfo", /* .zdebug_macinfo */
2208 "LC_SEGMENT.__DWARFA.__zdebug_str", /* .zdebug_str */
2209 "LC_SEGMENT.__DWARFA.__zdebug_loc", /* .zdebug_loc */
2210 "LC_SEGMENT.__DWARFA.__zdebug_pubtypes", /* .zdebug_pubtypes */
2211 "LC_SEGMENT.__DWARFA.__zdebug_ranges", /* .zdebug_ranges */
2212 "LC_SEGMENT.__DWARFA.__zdebug_static_func", /* .zdebug_static_func */
2213 "LC_SEGMENT.__DWARFA.__zdebug_static_vars", /* .zdebug_static_vars */
2214 "LC_SEGMENT.__DWARFA.__zdebug_types", /* .zdebug_types */
2215 "LC_SEGMENT.__DWARFA.__zdebug_weaknames" /* .zdebug_weaknames */
2216};
2217
2218static const char *generic_uncompressed_dwarf_sections [max];
2219static const char *generic_compressed_dwarf_sections [max];
bfe2612a
L
2220
2221static void
2222check_mach_o_dwarf (bfd *abfd)
2223{
2224 static enum bfd_flavour old_flavour = bfd_target_unknown_flavour;
2225 enum bfd_flavour current_flavour = bfd_get_flavour (abfd);
2226 enum dwarf_section_display_enum i;
2227
1b315056 2228 if (generic_uncompressed_dwarf_sections [0] == NULL)
bfe2612a 2229 for (i = 0; i < max; i++)
1b315056
CS
2230 {
2231 generic_uncompressed_dwarf_sections [i]
2232 = debug_displays[i].section.uncompressed_name;
2233 generic_compressed_dwarf_sections [i]
2234 = debug_displays[i].section.compressed_name;
2235 }
bfe2612a
L
2236
2237 if (old_flavour != current_flavour)
2238 {
2239 if (current_flavour == bfd_target_mach_o_flavour)
2240 for (i = 0; i < max; i++)
1b315056
CS
2241 {
2242 debug_displays[i].section.uncompressed_name
2243 = mach_o_uncompressed_dwarf_sections [i];
2244 debug_displays[i].section.compressed_name
2245 = mach_o_compressed_dwarf_sections [i];
2246 }
bfe2612a
L
2247 else if (old_flavour == bfd_target_mach_o_flavour)
2248 for (i = 0; i < max; i++)
1b315056
CS
2249 {
2250 debug_displays[i].section.uncompressed_name
2251 = generic_uncompressed_dwarf_sections [i];
2252 debug_displays[i].section.compressed_name
2253 = generic_compressed_dwarf_sections [i];
2254 }
bfe2612a
L
2255
2256 old_flavour = current_flavour;
2257 }
2258}
2259
365544c3
L
2260/* Dump the dwarf debugging information. */
2261
2262static void
2263dump_dwarf (bfd *abfd)
2264{
5184c2ae 2265 is_relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
365544c3
L
2266
2267 /* FIXME: bfd_get_arch_size may return -1. We assume that 64bit
2268 targets will return 64. */
2269 eh_addr_size = bfd_get_arch_size (abfd) == 64 ? 8 : 4;
2270
2271 if (bfd_big_endian (abfd))
2272 byte_get = byte_get_big_endian;
2273 else if (bfd_little_endian (abfd))
2274 byte_get = byte_get_little_endian;
2275 else
2276 abort ();
2277
bfe2612a
L
2278 check_mach_o_dwarf (abfd);
2279
2dc4cec1
L
2280 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
2281 {
2282 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2283 init_dwarf_regnames (bed->elf_machine_code);
2284 }
2285
365544c3
L
2286 bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
2287
2288 free_debug_memory ();
2289}
2290\f
29ca8dc5
NS
2291/* Read ABFD's stabs section STABSECT_NAME, and return a pointer to
2292 it. Return NULL on failure. */
252b5132 2293
29ca8dc5
NS
2294static char *
2295read_section_stabs (bfd *abfd, const char *sect_name, bfd_size_type *size_ptr)
252b5132 2296{
29ca8dc5
NS
2297 asection *stabsect;
2298 bfd_size_type size;
2299 char *contents;
252b5132 2300
29ca8dc5 2301 stabsect = bfd_get_section_by_name (abfd, sect_name);
155e0d23 2302 if (stabsect == NULL)
252b5132 2303 {
29ca8dc5 2304 printf (_("No %s section present\n\n"), sect_name);
b34976b6 2305 return FALSE;
252b5132
RH
2306 }
2307
29ca8dc5
NS
2308 size = bfd_section_size (abfd, stabsect);
2309 contents = xmalloc (size);
0af11b59 2310
29ca8dc5 2311 if (! bfd_get_section_contents (abfd, stabsect, contents, 0, size))
252b5132 2312 {
37cc8ec1 2313 non_fatal (_("Reading %s section of %s failed: %s"),
29ca8dc5 2314 sect_name, bfd_get_filename (abfd),
37cc8ec1 2315 bfd_errmsg (bfd_get_error ()));
29ca8dc5 2316 free (contents);
75cd796a 2317 exit_status = 1;
29ca8dc5 2318 return NULL;
252b5132
RH
2319 }
2320
29ca8dc5 2321 *size_ptr = size;
252b5132 2322
29ca8dc5 2323 return contents;
252b5132
RH
2324}
2325
2326/* Stabs entries use a 12 byte format:
2327 4 byte string table index
2328 1 byte stab type
2329 1 byte stab other field
2330 2 byte stab desc field
2331 4 byte stab value
2332 FIXME: This will have to change for a 64 bit object format. */
2333
46dca2e0
NC
2334#define STRDXOFF (0)
2335#define TYPEOFF (4)
2336#define OTHEROFF (5)
2337#define DESCOFF (6)
2338#define VALOFF (8)
252b5132
RH
2339#define STABSIZE (12)
2340
2341/* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
2342 using string table section STRSECT_NAME (in `strtab'). */
2343
2344static void
3b9ad1cc
AM
2345print_section_stabs (bfd *abfd,
2346 const char *stabsect_name,
2347 unsigned *string_offset_ptr)
252b5132
RH
2348{
2349 int i;
46dca2e0 2350 unsigned file_string_table_offset = 0;
29ca8dc5 2351 unsigned next_file_string_table_offset = *string_offset_ptr;
252b5132
RH
2352 bfd_byte *stabp, *stabs_end;
2353
2354 stabp = stabs;
2355 stabs_end = stabp + stab_size;
2356
2357 printf (_("Contents of %s section:\n\n"), stabsect_name);
2358 printf ("Symnum n_type n_othr n_desc n_value n_strx String\n");
2359
2360 /* Loop through all symbols and print them.
2361
2362 We start the index at -1 because there is a dummy symbol on
2363 the front of stabs-in-{coff,elf} sections that supplies sizes. */
252b5132
RH
2364 for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
2365 {
2366 const char *name;
2367 unsigned long strx;
2368 unsigned char type, other;
2369 unsigned short desc;
2370 bfd_vma value;
2371
2372 strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
2373 type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
2374 other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
2375 desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
2376 value = bfd_h_get_32 (abfd, stabp + VALOFF);
2377
2378 printf ("\n%-6d ", i);
2379 /* Either print the stab name, or, if unnamed, print its number
0af11b59 2380 again (makes consistent formatting for tools like awk). */
252b5132
RH
2381 name = bfd_get_stab_name (type);
2382 if (name != NULL)
2383 printf ("%-6s", name);
2384 else if (type == N_UNDF)
2385 printf ("HdrSym");
2386 else
2387 printf ("%-6d", type);
2388 printf (" %-6d %-6d ", other, desc);
d8180c76 2389 bfd_printf_vma (abfd, value);
252b5132
RH
2390 printf (" %-6lu", strx);
2391
2392 /* Symbols with type == 0 (N_UNDF) specify the length of the
2393 string table associated with this file. We use that info
2394 to know how to relocate the *next* file's string table indices. */
252b5132
RH
2395 if (type == N_UNDF)
2396 {
2397 file_string_table_offset = next_file_string_table_offset;
2398 next_file_string_table_offset += value;
2399 }
2400 else
2401 {
2402 /* Using the (possibly updated) string table offset, print the
2403 string (if any) associated with this symbol. */
252b5132
RH
2404 if ((strx + file_string_table_offset) < stabstr_size)
2405 printf (" %s", &strtab[strx + file_string_table_offset]);
2406 else
2407 printf (" *");
2408 }
2409 }
2410 printf ("\n\n");
29ca8dc5 2411 *string_offset_ptr = next_file_string_table_offset;
252b5132
RH
2412}
2413
155e0d23
NC
2414typedef struct
2415{
2416 const char * section_name;
2417 const char * string_section_name;
29ca8dc5 2418 unsigned string_offset;
155e0d23
NC
2419}
2420stab_section_names;
2421
252b5132 2422static void
155e0d23 2423find_stabs_section (bfd *abfd, asection *section, void *names)
252b5132 2424{
155e0d23
NC
2425 int len;
2426 stab_section_names * sought = (stab_section_names *) names;
252b5132
RH
2427
2428 /* Check for section names for which stabsect_name is a prefix, to
29ca8dc5 2429 handle .stab.N, etc. */
155e0d23
NC
2430 len = strlen (sought->section_name);
2431
2432 /* If the prefix matches, and the files section name ends with a
2433 nul or a digit, then we match. I.e., we want either an exact
2434 match or a section followed by a number. */
2435 if (strncmp (sought->section_name, section->name, len) == 0
2436 && (section->name[len] == 0
29ca8dc5 2437 || (section->name[len] == '.' && ISDIGIT (section->name[len + 1]))))
252b5132 2438 {
29ca8dc5
NS
2439 if (strtab == NULL)
2440 strtab = read_section_stabs (abfd, sought->string_section_name,
2441 &stabstr_size);
2442
2443 if (strtab)
252b5132 2444 {
9210d879
AM
2445 stabs = (bfd_byte *) read_section_stabs (abfd, section->name,
2446 &stab_size);
29ca8dc5
NS
2447 if (stabs)
2448 print_section_stabs (abfd, section->name, &sought->string_offset);
252b5132
RH
2449 }
2450 }
2451}
98a91d6a 2452
155e0d23
NC
2453static void
2454dump_stabs_section (bfd *abfd, char *stabsect_name, char *strsect_name)
2455{
2456 stab_section_names s;
2457
2458 s.section_name = stabsect_name;
2459 s.string_section_name = strsect_name;
29ca8dc5
NS
2460 s.string_offset = 0;
2461
155e0d23 2462 bfd_map_over_sections (abfd, find_stabs_section, & s);
29ca8dc5
NS
2463
2464 free (strtab);
2465 strtab = NULL;
155e0d23
NC
2466}
2467
2468/* Dump the any sections containing stabs debugging information. */
2469
2470static void
2471dump_stabs (bfd *abfd)
2472{
2473 dump_stabs_section (abfd, ".stab", ".stabstr");
2474 dump_stabs_section (abfd, ".stab.excl", ".stab.exclstr");
2475 dump_stabs_section (abfd, ".stab.index", ".stab.indexstr");
62bb81b8
TG
2476
2477 /* For Darwin. */
2478 dump_stabs_section (abfd, "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr");
2479
155e0d23
NC
2480 dump_stabs_section (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
2481}
252b5132
RH
2482\f
2483static void
46dca2e0 2484dump_bfd_header (bfd *abfd)
252b5132
RH
2485{
2486 char *comma = "";
2487
2488 printf (_("architecture: %s, "),
2489 bfd_printable_arch_mach (bfd_get_arch (abfd),
2490 bfd_get_mach (abfd)));
2491 printf (_("flags 0x%08x:\n"), abfd->flags);
2492
2493#define PF(x, y) if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
2494 PF (HAS_RELOC, "HAS_RELOC");
2495 PF (EXEC_P, "EXEC_P");
2496 PF (HAS_LINENO, "HAS_LINENO");
2497 PF (HAS_DEBUG, "HAS_DEBUG");
2498 PF (HAS_SYMS, "HAS_SYMS");
2499 PF (HAS_LOCALS, "HAS_LOCALS");
2500 PF (DYNAMIC, "DYNAMIC");
2501 PF (WP_TEXT, "WP_TEXT");
2502 PF (D_PAGED, "D_PAGED");
2503 PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
026df7c5 2504 PF (HAS_LOAD_PAGE, "HAS_LOAD_PAGE");
252b5132 2505 printf (_("\nstart address 0x"));
d8180c76 2506 bfd_printf_vma (abfd, abfd->start_address);
252b5132
RH
2507 printf ("\n");
2508}
98a91d6a 2509
252b5132
RH
2510\f
2511static void
46dca2e0 2512dump_bfd_private_header (bfd *abfd)
252b5132
RH
2513{
2514 bfd_print_private_bfd_data (abfd, stdout);
2515}
2516
155e0d23
NC
2517\f
2518/* Display a section in hexadecimal format with associated characters.
2519 Each line prefixed by the zero padded address. */
d24de309 2520
252b5132 2521static void
155e0d23 2522dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
252b5132 2523{
155e0d23
NC
2524 bfd_byte *data = 0;
2525 bfd_size_type datasize;
2526 bfd_size_type addr_offset;
2527 bfd_size_type start_offset;
2528 bfd_size_type stop_offset;
2529 unsigned int opb = bfd_octets_per_byte (abfd);
2530 /* Bytes per line. */
2531 const int onaline = 16;
2532 char buf[64];
2533 int count;
2534 int width;
2535
2536 if ((section->flags & SEC_HAS_CONTENTS) == 0)
2537 return;
2538
2539 if (! process_section_p (section))
2540 return;
2541
2542 if ((datasize = bfd_section_size (abfd, section)) == 0)
2543 return;
2544
155e0d23
NC
2545 /* Compute the address range to display. */
2546 if (start_address == (bfd_vma) -1
2547 || start_address < section->vma)
2548 start_offset = 0;
2549 else
2550 start_offset = start_address - section->vma;
2551
2552 if (stop_address == (bfd_vma) -1)
2553 stop_offset = datasize / opb;
2554 else
252b5132 2555 {
155e0d23
NC
2556 if (stop_address < section->vma)
2557 stop_offset = 0;
2558 else
2559 stop_offset = stop_address - section->vma;
252b5132 2560
155e0d23
NC
2561 if (stop_offset > datasize / opb)
2562 stop_offset = datasize / opb;
252b5132
RH
2563 }
2564
32760852
NC
2565 if (start_offset >= stop_offset)
2566 return;
2567
2568 printf (_("Contents of section %s:"), section->name);
2569 if (display_file_offsets)
0af1713e
AM
2570 printf (_(" (Starting at file offset: 0x%lx)"),
2571 (unsigned long) (section->filepos + start_offset));
32760852
NC
2572 printf ("\n");
2573
2574 data = xmalloc (datasize);
2575
2576 bfd_get_section_contents (abfd, section, data, 0, datasize);
2577
155e0d23 2578 width = 4;
026df7c5 2579
155e0d23
NC
2580 bfd_sprintf_vma (abfd, buf, start_offset + section->vma);
2581 if (strlen (buf) >= sizeof (buf))
2582 abort ();
026df7c5 2583
155e0d23
NC
2584 count = 0;
2585 while (buf[count] == '0' && buf[count+1] != '\0')
2586 count++;
2587 count = strlen (buf) - count;
2588 if (count > width)
2589 width = count;
252b5132 2590
155e0d23
NC
2591 bfd_sprintf_vma (abfd, buf, stop_offset + section->vma - 1);
2592 if (strlen (buf) >= sizeof (buf))
2593 abort ();
026df7c5 2594
155e0d23
NC
2595 count = 0;
2596 while (buf[count] == '0' && buf[count+1] != '\0')
2597 count++;
2598 count = strlen (buf) - count;
2599 if (count > width)
2600 width = count;
026df7c5 2601
155e0d23
NC
2602 for (addr_offset = start_offset;
2603 addr_offset < stop_offset; addr_offset += onaline / opb)
d24de309 2604 {
155e0d23 2605 bfd_size_type j;
d24de309 2606
155e0d23
NC
2607 bfd_sprintf_vma (abfd, buf, (addr_offset + section->vma));
2608 count = strlen (buf);
2609 if ((size_t) count >= sizeof (buf))
2610 abort ();
d24de309 2611
155e0d23
NC
2612 putchar (' ');
2613 while (count < width)
252b5132 2614 {
155e0d23
NC
2615 putchar ('0');
2616 count++;
2617 }
2618 fputs (buf + count - width, stdout);
2619 putchar (' ');
252b5132 2620
155e0d23
NC
2621 for (j = addr_offset * opb;
2622 j < addr_offset * opb + onaline; j++)
2623 {
2624 if (j < stop_offset * opb)
2625 printf ("%02x", (unsigned) (data[j]));
2626 else
2627 printf (" ");
2628 if ((j & 3) == 3)
2629 printf (" ");
252b5132
RH
2630 }
2631
155e0d23
NC
2632 printf (" ");
2633 for (j = addr_offset * opb;
2634 j < addr_offset * opb + onaline; j++)
2635 {
2636 if (j >= stop_offset * opb)
2637 printf (" ");
2638 else
2639 printf ("%c", ISPRINT (data[j]) ? data[j] : '.');
2640 }
2641 putchar ('\n');
252b5132 2642 }
155e0d23 2643 free (data);
252b5132 2644}
155e0d23 2645
98a91d6a 2646/* Actually display the various requested regions. */
252b5132
RH
2647
2648static void
46dca2e0 2649dump_data (bfd *abfd)
252b5132 2650{
155e0d23 2651 bfd_map_over_sections (abfd, dump_section, NULL);
252b5132
RH
2652}
2653
98a91d6a
NC
2654/* Should perhaps share code and display with nm? */
2655
252b5132 2656static void
46dca2e0 2657dump_symbols (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean dynamic)
252b5132
RH
2658{
2659 asymbol **current;
2660 long max;
2661 long count;
2662
2663 if (dynamic)
2664 {
2665 current = dynsyms;
2666 max = dynsymcount;
252b5132
RH
2667 printf ("DYNAMIC SYMBOL TABLE:\n");
2668 }
2669 else
2670 {
2671 current = syms;
2672 max = symcount;
252b5132
RH
2673 printf ("SYMBOL TABLE:\n");
2674 }
2675
a1df01d1
AM
2676 if (max == 0)
2677 printf (_("no symbols\n"));
2678
252b5132
RH
2679 for (count = 0; count < max; count++)
2680 {
155e0d23
NC
2681 bfd *cur_bfd;
2682
2683 if (*current == NULL)
83ef0798 2684 printf (_("no information for symbol number %ld\n"), count);
155e0d23
NC
2685
2686 else if ((cur_bfd = bfd_asymbol_bfd (*current)) == NULL)
83ef0798 2687 printf (_("could not determine the type of symbol number %ld\n"),
155e0d23
NC
2688 count);
2689
661f7c35
NC
2690 else if (process_section_p ((* current)->section)
2691 && (dump_special_syms
2692 || !bfd_is_target_special_symbol (cur_bfd, *current)))
252b5132 2693 {
155e0d23 2694 const char *name = (*current)->name;
252b5132 2695
155e0d23 2696 if (do_demangle && name != NULL && *name != '\0')
252b5132 2697 {
252b5132
RH
2698 char *alloc;
2699
155e0d23
NC
2700 /* If we want to demangle the name, we demangle it
2701 here, and temporarily clobber it while calling
2702 bfd_print_symbol. FIXME: This is a gross hack. */
ed180cc5
AM
2703 alloc = bfd_demangle (cur_bfd, name, DMGL_ANSI | DMGL_PARAMS);
2704 if (alloc != NULL)
2705 (*current)->name = alloc;
252b5132
RH
2706 bfd_print_symbol (cur_bfd, stdout, *current,
2707 bfd_print_symbol_all);
ed180cc5
AM
2708 if (alloc != NULL)
2709 {
2710 (*current)->name = name;
2711 free (alloc);
2712 }
252b5132 2713 }
252b5132 2714 else
155e0d23
NC
2715 bfd_print_symbol (cur_bfd, stdout, *current,
2716 bfd_print_symbol_all);
83ef0798 2717 printf ("\n");
252b5132 2718 }
661f7c35 2719
155e0d23 2720 current++;
252b5132 2721 }
155e0d23 2722 printf ("\n\n");
252b5132 2723}
155e0d23 2724\f
252b5132 2725static void
46dca2e0 2726dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
252b5132
RH
2727{
2728 arelent **p;
2729 char *last_filename, *last_functionname;
2730 unsigned int last_line;
2731
2732 /* Get column headers lined up reasonably. */
2733 {
2734 static int width;
98a91d6a 2735
252b5132
RH
2736 if (width == 0)
2737 {
2738 char buf[30];
155e0d23 2739
d8180c76 2740 bfd_sprintf_vma (abfd, buf, (bfd_vma) -1);
252b5132
RH
2741 width = strlen (buf) - 7;
2742 }
2743 printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2744 }
2745
2746 last_filename = NULL;
2747 last_functionname = NULL;
2748 last_line = 0;
2749
d3ba0551 2750 for (p = relpp; relcount && *p != NULL; p++, relcount--)
252b5132
RH
2751 {
2752 arelent *q = *p;
2753 const char *filename, *functionname;
2754 unsigned int line;
2755 const char *sym_name;
2756 const char *section_name;
2757
2758 if (start_address != (bfd_vma) -1
2759 && q->address < start_address)
2760 continue;
2761 if (stop_address != (bfd_vma) -1
2762 && q->address > stop_address)
2763 continue;
2764
2765 if (with_line_numbers
2766 && sec != NULL
2767 && bfd_find_nearest_line (abfd, sec, syms, q->address,
2768 &filename, &functionname, &line))
2769 {
2770 if (functionname != NULL
2771 && (last_functionname == NULL
2772 || strcmp (functionname, last_functionname) != 0))
2773 {
2774 printf ("%s():\n", functionname);
2775 if (last_functionname != NULL)
2776 free (last_functionname);
2777 last_functionname = xstrdup (functionname);
2778 }
98a91d6a 2779
252b5132
RH
2780 if (line > 0
2781 && (line != last_line
2782 || (filename != NULL
2783 && last_filename != NULL
2784 && strcmp (filename, last_filename) != 0)))
2785 {
2786 printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2787 last_line = line;
2788 if (last_filename != NULL)
2789 free (last_filename);
2790 if (filename == NULL)
2791 last_filename = NULL;
2792 else
2793 last_filename = xstrdup (filename);
2794 }
2795 }
2796
2797 if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2798 {
2799 sym_name = (*(q->sym_ptr_ptr))->name;
2800 section_name = (*(q->sym_ptr_ptr))->section->name;
2801 }
2802 else
2803 {
2804 sym_name = NULL;
2805 section_name = NULL;
2806 }
98a91d6a 2807
f9ecb0a4
JJ
2808 bfd_printf_vma (abfd, q->address);
2809 if (q->howto == NULL)
2810 printf (" *unknown* ");
2811 else if (q->howto->name)
2812 printf (" %-16s ", q->howto->name);
2813 else
2814 printf (" %-16d ", q->howto->type);
252b5132 2815 if (sym_name)
f9ecb0a4 2816 objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
252b5132
RH
2817 else
2818 {
d3ba0551 2819 if (section_name == NULL)
252b5132 2820 section_name = "*unknown*";
f9ecb0a4 2821 printf ("[%s]", section_name);
252b5132 2822 }
98a91d6a 2823
252b5132
RH
2824 if (q->addend)
2825 {
2826 printf ("+0x");
d8180c76 2827 bfd_printf_vma (abfd, q->addend);
252b5132 2828 }
98a91d6a 2829
252b5132
RH
2830 printf ("\n");
2831 }
2832}
43ac9881 2833
155e0d23 2834static void
3b9ad1cc
AM
2835dump_relocs_in_section (bfd *abfd,
2836 asection *section,
2837 void *dummy ATTRIBUTE_UNUSED)
155e0d23
NC
2838{
2839 arelent **relpp;
2840 long relcount;
2841 long relsize;
2842
2843 if ( bfd_is_abs_section (section)
2844 || bfd_is_und_section (section)
2845 || bfd_is_com_section (section)
2846 || (! process_section_p (section))
2847 || ((section->flags & SEC_RELOC) == 0))
2848 return;
2849
2850 relsize = bfd_get_reloc_upper_bound (abfd, section);
2851 if (relsize < 0)
2852 bfd_fatal (bfd_get_filename (abfd));
2853
2854 printf ("RELOCATION RECORDS FOR [%s]:", section->name);
2855
2856 if (relsize == 0)
2857 {
2858 printf (" (none)\n\n");
2859 return;
2860 }
2861
2862 relpp = xmalloc (relsize);
2863 relcount = bfd_canonicalize_reloc (abfd, section, relpp, syms);
2864
2865 if (relcount < 0)
2866 bfd_fatal (bfd_get_filename (abfd));
2867 else if (relcount == 0)
2868 printf (" (none)\n\n");
2869 else
2870 {
2871 printf ("\n");
2872 dump_reloc_set (abfd, section, relpp, relcount);
2873 printf ("\n\n");
2874 }
2875 free (relpp);
2876}
2877
2878static void
2879dump_relocs (bfd *abfd)
2880{
2881 bfd_map_over_sections (abfd, dump_relocs_in_section, NULL);
2882}
2883
2884static void
2885dump_dynamic_relocs (bfd *abfd)
2886{
2887 long relsize;
2888 arelent **relpp;
2889 long relcount;
2890
2891 relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2892 if (relsize < 0)
2893 bfd_fatal (bfd_get_filename (abfd));
2894
2895 printf ("DYNAMIC RELOCATION RECORDS");
2896
2897 if (relsize == 0)
2898 printf (" (none)\n\n");
2899 else
2900 {
2901 relpp = xmalloc (relsize);
2902 relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2903
2904 if (relcount < 0)
2905 bfd_fatal (bfd_get_filename (abfd));
2906 else if (relcount == 0)
2907 printf (" (none)\n\n");
2908 else
2909 {
2910 printf ("\n");
2911 dump_reloc_set (abfd, NULL, relpp, relcount);
2912 printf ("\n\n");
2913 }
2914 free (relpp);
2915 }
2916}
2917
43ac9881
AM
2918/* Creates a table of paths, to search for source files. */
2919
2920static void
2921add_include_path (const char *path)
2922{
2923 if (path[0] == 0)
2924 return;
2925 include_path_count++;
2926 include_paths = xrealloc (include_paths,
2927 include_path_count * sizeof (*include_paths));
2928#ifdef HAVE_DOS_BASED_FILE_SYSTEM
2929 if (path[1] == ':' && path[2] == 0)
2930 path = concat (path, ".", (const char *) 0);
2931#endif
2932 include_paths[include_path_count - 1] = path;
2933}
155e0d23
NC
2934
2935static void
3b9ad1cc
AM
2936adjust_addresses (bfd *abfd ATTRIBUTE_UNUSED,
2937 asection *section,
bc79cded 2938 void *arg)
155e0d23 2939{
bc79cded
L
2940 if ((section->flags & SEC_DEBUGGING) == 0)
2941 {
2942 bfd_boolean *has_reloc_p = (bfd_boolean *) arg;
2943 section->vma += adjust_section_vma;
2944 if (*has_reloc_p)
2945 section->lma += adjust_section_vma;
2946 }
155e0d23
NC
2947}
2948
2949/* Dump selected contents of ABFD. */
2950
2951static void
2952dump_bfd (bfd *abfd)
2953{
2954 /* If we are adjusting section VMA's, change them all now. Changing
2955 the BFD information is a hack. However, we must do it, or
2956 bfd_find_nearest_line will not do the right thing. */
2957 if (adjust_section_vma != 0)
bc79cded
L
2958 {
2959 bfd_boolean has_reloc = (abfd->flags & HAS_RELOC);
2960 bfd_map_over_sections (abfd, adjust_addresses, &has_reloc);
2961 }
155e0d23
NC
2962
2963 if (! dump_debugging_tags)
2964 printf (_("\n%s: file format %s\n"), bfd_get_filename (abfd),
2965 abfd->xvec->name);
2966 if (dump_ar_hdrs)
2967 print_arelt_descr (stdout, abfd, TRUE);
2968 if (dump_file_header)
2969 dump_bfd_header (abfd);
2970 if (dump_private_headers)
2971 dump_bfd_private_header (abfd);
2972 if (! dump_debugging_tags)
2973 putchar ('\n');
2974 if (dump_section_headers)
2975 dump_headers (abfd);
2976
365544c3
L
2977 if (dump_symtab
2978 || dump_reloc_info
2979 || disassemble
2980 || dump_debugging
2981 || dump_dwarf_section_info)
155e0d23 2982 syms = slurp_symtab (abfd);
4c45e5c9
JJ
2983 if (dump_dynamic_symtab || dump_dynamic_reloc_info
2984 || (disassemble && bfd_get_dynamic_symtab_upper_bound (abfd) > 0))
155e0d23 2985 dynsyms = slurp_dynamic_symtab (abfd);
90e3cdf2 2986 if (disassemble)
4c45e5c9 2987 {
c9727e01
AM
2988 synthcount = bfd_get_synthetic_symtab (abfd, symcount, syms,
2989 dynsymcount, dynsyms, &synthsyms);
2990 if (synthcount < 0)
2991 synthcount = 0;
4c45e5c9 2992 }
155e0d23
NC
2993
2994 if (dump_symtab)
2995 dump_symbols (abfd, FALSE);
2996 if (dump_dynamic_symtab)
2997 dump_symbols (abfd, TRUE);
365544c3
L
2998 if (dump_dwarf_section_info)
2999 dump_dwarf (abfd);
155e0d23
NC
3000 if (dump_stab_section_info)
3001 dump_stabs (abfd);
3002 if (dump_reloc_info && ! disassemble)
3003 dump_relocs (abfd);
3004 if (dump_dynamic_reloc_info && ! disassemble)
3005 dump_dynamic_relocs (abfd);
3006 if (dump_section_contents)
3007 dump_data (abfd);
3008 if (disassemble)
3009 disassemble_data (abfd);
3010
3011 if (dump_debugging)
3012 {
3013 void *dhandle;
3014
b922d590 3015 dhandle = read_debugging_info (abfd, syms, symcount, TRUE);
155e0d23
NC
3016 if (dhandle != NULL)
3017 {
ed180cc5
AM
3018 if (!print_debugging_info (stdout, dhandle, abfd, syms,
3019 bfd_demangle,
3020 dump_debugging_tags ? TRUE : FALSE))
155e0d23
NC
3021 {
3022 non_fatal (_("%s: printing debugging information failed"),
3023 bfd_get_filename (abfd));
3024 exit_status = 1;
3025 }
3026 }
b922d590
NC
3027 /* PR 6483: If there was no STABS or IEEE debug
3028 info in the file, try DWARF instead. */
3029 else if (! dump_dwarf_section_info)
3030 {
3031 dump_dwarf (abfd);
3032 }
155e0d23
NC
3033 }
3034
3035 if (syms)
3036 {
3037 free (syms);
3038 syms = NULL;
3039 }
3040
3041 if (dynsyms)
3042 {
3043 free (dynsyms);
3044 dynsyms = NULL;
3045 }
4c45e5c9
JJ
3046
3047 if (synthsyms)
3048 {
3049 free (synthsyms);
3050 synthsyms = NULL;
3051 }
3052
3053 symcount = 0;
3054 dynsymcount = 0;
3055 synthcount = 0;
155e0d23
NC
3056}
3057
3058static void
3059display_bfd (bfd *abfd)
3060{
3061 char **matching;
3062
3063 if (bfd_check_format_matches (abfd, bfd_object, &matching))
3064 {
3065 dump_bfd (abfd);
3066 return;
3067 }
3068
3069 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3070 {
3071 nonfatal (bfd_get_filename (abfd));
3072 list_matching_formats (matching);
3073 free (matching);
3074 return;
3075 }
3076
3077 if (bfd_get_error () != bfd_error_file_not_recognized)
3078 {
3079 nonfatal (bfd_get_filename (abfd));
3080 return;
3081 }
3082
3083 if (bfd_check_format_matches (abfd, bfd_core, &matching))
3084 {
3085 dump_bfd (abfd);
3086 return;
3087 }
3088
3089 nonfatal (bfd_get_filename (abfd));
3090
3091 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
3092 {
3093 list_matching_formats (matching);
3094 free (matching);
3095 }
3096}
3097
3098static void
3099display_file (char *filename, char *target)
3100{
f24ddbdd
NC
3101 bfd *file;
3102 bfd *arfile = NULL;
3103
3104 if (get_file_size (filename) < 1)
d68c385b
NC
3105 {
3106 exit_status = 1;
3107 return;
3108 }
155e0d23
NC
3109
3110 file = bfd_openr (filename, target);
3111 if (file == NULL)
3112 {
3113 nonfatal (filename);
3114 return;
3115 }
3116
3117 /* If the file is an archive, process all of its elements. */
3118 if (bfd_check_format (file, bfd_archive))
3119 {
3120 bfd *last_arfile = NULL;
3121
3122 printf (_("In archive %s:\n"), bfd_get_filename (file));
3123 for (;;)
3124 {
3125 bfd_set_error (bfd_error_no_error);
3126
3127 arfile = bfd_openr_next_archived_file (file, arfile);
3128 if (arfile == NULL)
3129 {
3130 if (bfd_get_error () != bfd_error_no_more_archived_files)
3131 nonfatal (bfd_get_filename (file));
3132 break;
3133 }
3134
3135 display_bfd (arfile);
3136
3137 if (last_arfile != NULL)
3138 bfd_close (last_arfile);
3139 last_arfile = arfile;
3140 }
3141
3142 if (last_arfile != NULL)
3143 bfd_close (last_arfile);
3144 }
3145 else
3146 display_bfd (file);
3147
3148 bfd_close (file);
3149}
252b5132 3150\f
252b5132 3151int
46dca2e0 3152main (int argc, char **argv)
252b5132
RH
3153{
3154 int c;
3155 char *target = default_target;
b34976b6 3156 bfd_boolean seenflag = FALSE;
252b5132 3157
155e0d23
NC
3158#if defined (HAVE_SETLOCALE)
3159#if defined (HAVE_LC_MESSAGES)
252b5132 3160 setlocale (LC_MESSAGES, "");
3882b010 3161#endif
3882b010 3162 setlocale (LC_CTYPE, "");
252b5132 3163#endif
155e0d23 3164
252b5132
RH
3165 bindtextdomain (PACKAGE, LOCALEDIR);
3166 textdomain (PACKAGE);
3167
3168 program_name = *argv;
3169 xmalloc_set_program_name (program_name);
3170
3171 START_PROGRESS (program_name, 0);
3172
869b9d07
MM
3173 expandargv (&argc, &argv);
3174
252b5132
RH
3175 bfd_init ();
3176 set_default_bfd_target ();
3177
98ec6e72 3178 while ((c = getopt_long (argc, argv, "pib:m:M:VvCdDlfFaHhrRtTxsSI:j:wE:zgeGW",
252b5132
RH
3179 long_options, (int *) 0))
3180 != EOF)
3181 {
252b5132
RH
3182 switch (c)
3183 {
3184 case 0:
8b53311e 3185 break; /* We've been given a long option. */
252b5132
RH
3186 case 'm':
3187 machine = optarg;
3188 break;
dd92f639 3189 case 'M':
073fbac6 3190 if (disassembler_options)
31e0f3cd 3191 /* Ignore potential memory leak for now. */
46dca2e0 3192 disassembler_options = concat (disassembler_options, ",",
ee832e18 3193 optarg, (const char *) NULL);
31e0f3cd
NC
3194 else
3195 disassembler_options = optarg;
dd92f639 3196 break;
252b5132 3197 case 'j':
43ac9881 3198 if (only_used == only_size)
6e50c90c
L
3199 {
3200 only_size += 8;
43ac9881 3201 only = xrealloc (only, only_size * sizeof (char *));
6e50c90c
L
3202 }
3203 only [only_used++] = optarg;
252b5132 3204 break;
98ec6e72
NC
3205 case 'F':
3206 display_file_offsets = TRUE;
3207 break;
252b5132 3208 case 'l':
b34976b6 3209 with_line_numbers = TRUE;
252b5132
RH
3210 break;
3211 case 'b':
3212 target = optarg;
3213 break;
1dada9c5 3214 case 'C':
b34976b6 3215 do_demangle = TRUE;
28c309a2
NC
3216 if (optarg != NULL)
3217 {
3218 enum demangling_styles style;
8b53311e 3219
28c309a2 3220 style = cplus_demangle_name_to_style (optarg);
0af11b59 3221 if (style == unknown_demangling)
28c309a2
NC
3222 fatal (_("unknown demangling style `%s'"),
3223 optarg);
8b53311e 3224
28c309a2 3225 cplus_demangle_set_style (style);
0af11b59 3226 }
1dada9c5
NC
3227 break;
3228 case 'w':
b34976b6 3229 wide_output = TRUE;
1dada9c5
NC
3230 break;
3231 case OPTION_ADJUST_VMA:
3232 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
3233 break;
3234 case OPTION_START_ADDRESS:
3235 start_address = parse_vma (optarg, "--start-address");
98ec6e72
NC
3236 if ((stop_address != (bfd_vma) -1) && stop_address <= start_address)
3237 fatal (_("error: the start address should be before the end address"));
1dada9c5
NC
3238 break;
3239 case OPTION_STOP_ADDRESS:
3240 stop_address = parse_vma (optarg, "--stop-address");
98ec6e72
NC
3241 if ((start_address != (bfd_vma) -1) && stop_address <= start_address)
3242 fatal (_("error: the stop address should be after the start address"));
1dada9c5
NC
3243 break;
3244 case 'E':
3245 if (strcmp (optarg, "B") == 0)
3246 endian = BFD_ENDIAN_BIG;
3247 else if (strcmp (optarg, "L") == 0)
3248 endian = BFD_ENDIAN_LITTLE;
3249 else
3250 {
37cc8ec1 3251 non_fatal (_("unrecognized -E option"));
1dada9c5
NC
3252 usage (stderr, 1);
3253 }
3254 break;
3255 case OPTION_ENDIAN:
3256 if (strncmp (optarg, "big", strlen (optarg)) == 0)
3257 endian = BFD_ENDIAN_BIG;
3258 else if (strncmp (optarg, "little", strlen (optarg)) == 0)
3259 endian = BFD_ENDIAN_LITTLE;
3260 else
3261 {
37cc8ec1 3262 non_fatal (_("unrecognized --endian type `%s'"), optarg);
1dada9c5
NC
3263 usage (stderr, 1);
3264 }
3265 break;
8b53311e 3266
252b5132 3267 case 'f':
b34976b6
AM
3268 dump_file_header = TRUE;
3269 seenflag = TRUE;
252b5132
RH
3270 break;
3271 case 'i':
b34976b6
AM
3272 formats_info = TRUE;
3273 seenflag = TRUE;
252b5132 3274 break;
43ac9881
AM
3275 case 'I':
3276 add_include_path (optarg);
3277 break;
252b5132 3278 case 'p':
b34976b6
AM
3279 dump_private_headers = TRUE;
3280 seenflag = TRUE;
252b5132
RH
3281 break;
3282 case 'x':
b34976b6
AM
3283 dump_private_headers = TRUE;
3284 dump_symtab = TRUE;
3285 dump_reloc_info = TRUE;
3286 dump_file_header = TRUE;
3287 dump_ar_hdrs = TRUE;
3288 dump_section_headers = TRUE;
3289 seenflag = TRUE;
252b5132
RH
3290 break;
3291 case 't':
b34976b6
AM
3292 dump_symtab = TRUE;
3293 seenflag = TRUE;
252b5132
RH
3294 break;
3295 case 'T':
b34976b6
AM
3296 dump_dynamic_symtab = TRUE;
3297 seenflag = TRUE;
252b5132
RH
3298 break;
3299 case 'd':
b34976b6
AM
3300 disassemble = TRUE;
3301 seenflag = TRUE;
1dada9c5
NC
3302 break;
3303 case 'z':
b34976b6 3304 disassemble_zeroes = TRUE;
252b5132
RH
3305 break;
3306 case 'D':
b34976b6
AM
3307 disassemble = TRUE;
3308 disassemble_all = TRUE;
3309 seenflag = TRUE;
252b5132
RH
3310 break;
3311 case 'S':
b34976b6
AM
3312 disassemble = TRUE;
3313 with_source_code = TRUE;
3314 seenflag = TRUE;
1dada9c5
NC
3315 break;
3316 case 'g':
3317 dump_debugging = 1;
b34976b6 3318 seenflag = TRUE;
1dada9c5 3319 break;
51cdc6e0
NC
3320 case 'e':
3321 dump_debugging = 1;
3322 dump_debugging_tags = 1;
3323 do_demangle = TRUE;
3324 seenflag = TRUE;
3325 break;
365544c3
L
3326 case 'W':
3327 dump_dwarf_section_info = TRUE;
3328 seenflag = TRUE;
3329 do_debug_info = 1;
3330 do_debug_abbrevs = 1;
3331 do_debug_lines = 1;
3332 do_debug_pubnames = 1;
3333 do_debug_aranges = 1;
3334 do_debug_ranges = 1;
3335 do_debug_frames = 1;
3336 do_debug_macinfo = 1;
3337 do_debug_str = 1;
3338 do_debug_loc = 1;
3339 break;
1dada9c5 3340 case 'G':
b34976b6
AM
3341 dump_stab_section_info = TRUE;
3342 seenflag = TRUE;
252b5132
RH
3343 break;
3344 case 's':
b34976b6
AM
3345 dump_section_contents = TRUE;
3346 seenflag = TRUE;
252b5132
RH
3347 break;
3348 case 'r':
b34976b6
AM
3349 dump_reloc_info = TRUE;
3350 seenflag = TRUE;
252b5132
RH
3351 break;
3352 case 'R':
b34976b6
AM
3353 dump_dynamic_reloc_info = TRUE;
3354 seenflag = TRUE;
252b5132
RH
3355 break;
3356 case 'a':
b34976b6
AM
3357 dump_ar_hdrs = TRUE;
3358 seenflag = TRUE;
252b5132
RH
3359 break;
3360 case 'h':
b34976b6
AM
3361 dump_section_headers = TRUE;
3362 seenflag = TRUE;
252b5132
RH
3363 break;
3364 case 'H':
3365 usage (stdout, 0);
b34976b6 3366 seenflag = TRUE;
8b53311e 3367 case 'v':
252b5132 3368 case 'V':
b34976b6
AM
3369 show_version = TRUE;
3370 seenflag = TRUE;
252b5132 3371 break;
0af11b59 3372
252b5132
RH
3373 default:
3374 usage (stderr, 1);
3375 }
3376 }
3377
3378 if (show_version)
3379 print_version ("objdump");
3380
b34976b6 3381 if (!seenflag)
1dada9c5 3382 usage (stderr, 2);
252b5132
RH
3383
3384 if (formats_info)
06d86cf7 3385 exit_status = display_info ();
252b5132
RH
3386 else
3387 {
3388 if (optind == argc)
3389 display_file ("a.out", target);
3390 else
3391 for (; optind < argc;)
3392 display_file (argv[optind++], target);
3393 }
3394
3395 END_PROGRESS (program_name);
3396
75cd796a 3397 return exit_status;
252b5132 3398}
This page took 1.166699 seconds and 4 git commands to generate.