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