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