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