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