Add call to disasm_symaddr()
[platform/upstream/binutils.git] / binutils / objdump.c
1 /* objdump.c -- dump information about an object file.
2    Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
3
4 This file is part of GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #include "bfd.h"
21 #include "getopt.h"
22 #include "progress.h"
23 #include "bucomm.h"
24 #include <ctype.h>
25 #include "dis-asm.h"
26 #include "libiberty.h"
27 #include "demangle.h"
28 #include "debug.h"
29 #include "budbg.h"
30
31 #ifdef ANSI_PROTOTYPES
32 #include <stdarg.h>
33 #else
34 #include <varargs.h>
35 #endif
36
37 /* Internal headers for the ELF .stab-dump code - sorry.  */
38 #define BYTES_IN_WORD   32
39 #include "aout/aout64.h"
40
41 #ifdef NEED_DECLARATION_FPRINTF
42 /* This is needed by INIT_DISASSEMBLE_INFO.  */
43 extern int fprintf PARAMS ((FILE *, const char *, ...));
44 #endif
45
46 static char *default_target = NULL;     /* default at runtime */
47
48 static int show_version = 0;            /* show the version number */
49 static int dump_section_contents;       /* -s */
50 static int dump_section_headers;        /* -h */
51 static boolean dump_file_header;        /* -f */
52 static int dump_symtab;                 /* -t */
53 static int dump_dynamic_symtab;         /* -T */
54 static int dump_reloc_info;             /* -r */
55 static int dump_dynamic_reloc_info;     /* -R */
56 static int dump_ar_hdrs;                /* -a */
57 static int dump_private_headers;        /* -p */
58 static int prefix_addresses;            /* --prefix-addresses */
59 static int with_line_numbers;           /* -l */
60 static boolean with_source_code;        /* -S */
61 static int show_raw_insn;               /* --show-raw-insn */
62 static int dump_stab_section_info;      /* --stabs */
63 static int do_demangle;                 /* -C, --demangle */
64 static boolean disassemble;             /* -d */
65 static boolean disassemble_all;         /* -D */
66 static int disassemble_zeroes;          /* --disassemble-zeroes */
67 static boolean formats_info;            /* -i */
68 static char *only;                      /* -j secname */
69 static int wide_output;                 /* -w */
70 static bfd_vma start_address = (bfd_vma) -1; /* --start-address */
71 static bfd_vma stop_address = (bfd_vma) -1;  /* --stop-address */
72 static int dump_debugging;              /* --debugging */
73 static bfd_vma adjust_section_vma = 0;  /* --adjust-vma */
74
75 /* Extra info to pass to the disassembler address printing function.  */
76 struct objdump_disasm_info {
77   bfd *abfd;
78   asection *sec;
79   boolean require_sec;
80 };
81
82 /* Architecture to disassemble for, or default if NULL.  */
83 static char *machine = (char *) NULL;
84
85 /* Endianness to disassemble for, or default if BFD_ENDIAN_UNKNOWN.  */
86 static enum bfd_endian endian = BFD_ENDIAN_UNKNOWN;
87
88 /* The symbol table.  */
89 static asymbol **syms;
90
91 /* Number of symbols in `syms'.  */
92 static long symcount = 0;
93
94 /* The sorted symbol table.  */
95 static asymbol **sorted_syms;
96
97 /* Number of symbols in `sorted_syms'.  */
98 static long sorted_symcount = 0;
99
100 /* The dynamic symbol table.  */
101 static asymbol **dynsyms;
102
103 /* Number of symbols in `dynsyms'.  */
104 static long dynsymcount = 0;
105
106 /* Static declarations.  */
107
108 static void
109 usage PARAMS ((FILE *, int));
110
111 static void
112 display_file PARAMS ((char *filename, char *target));
113
114 static void
115 dump_section_header PARAMS ((bfd *, asection *, PTR));
116
117 static void
118 dump_headers PARAMS ((bfd *));
119
120 static void
121 dump_data PARAMS ((bfd *abfd));
122
123 static void
124 dump_relocs PARAMS ((bfd *abfd));
125
126 static void
127 dump_dynamic_relocs PARAMS ((bfd * abfd));
128
129 static void
130 dump_reloc_set PARAMS ((bfd *, asection *, arelent **, long));
131
132 static void
133 dump_symbols PARAMS ((bfd *abfd, boolean dynamic));
134
135 static void
136 dump_bfd_header PARAMS ((bfd *));
137
138 static void
139 dump_bfd_private_header PARAMS ((bfd *));
140
141 static void
142 display_bfd PARAMS ((bfd *abfd));
143
144 static void
145 display_target_list PARAMS ((void));
146
147 static void
148 display_info_table PARAMS ((int, int));
149
150 static void
151 display_target_tables PARAMS ((void));
152
153 static void
154 display_info PARAMS ((void));
155
156 static void
157 objdump_print_value PARAMS ((bfd_vma, struct disassemble_info *, boolean));
158
159 static void
160 objdump_print_symname PARAMS ((bfd *, struct disassemble_info *, asymbol *));
161
162 static asymbol *
163 find_symbol_for_address PARAMS ((bfd *, asection *, bfd_vma, boolean, long *));
164
165 static void
166 objdump_print_addr_with_sym PARAMS ((bfd *, asection *, asymbol *, bfd_vma,
167                                      struct disassemble_info *, boolean));
168
169 static void
170 objdump_print_addr PARAMS ((bfd_vma, struct disassemble_info *, boolean));
171
172 static void
173 objdump_print_address PARAMS ((bfd_vma, struct disassemble_info *));
174
175 static void
176 show_line PARAMS ((bfd *, asection *, bfd_vma));
177
178 static void
179 disassemble_bytes PARAMS ((struct disassemble_info *, disassembler_ftype,
180                            boolean, bfd_byte *, long, long, arelent ***,
181                            arelent **));
182
183 static void
184 disassemble_data PARAMS ((bfd *));
185
186 static const char *
187 endian_string PARAMS ((enum bfd_endian));
188
189 static asymbol **
190 slurp_symtab PARAMS ((bfd *));
191
192 static asymbol **
193 slurp_dynamic_symtab PARAMS ((bfd *));
194
195 static long
196 remove_useless_symbols PARAMS ((asymbol **, long));
197
198 static int
199 compare_symbols PARAMS ((const PTR, const PTR));
200
201 static int
202 compare_relocs PARAMS ((const PTR, const PTR));
203
204 static void
205 dump_stabs PARAMS ((bfd *));
206
207 static boolean
208 read_section_stabs PARAMS ((bfd *, const char *, const char *));
209
210 static void
211 print_section_stabs PARAMS ((bfd *, const char *, const char *));
212 \f
213 static void
214 usage (stream, status)
215      FILE *stream;
216      int status;
217 {
218   fprintf (stream, "\
219 Usage: %s [-ahifCdDprRtTxsSlw] [-b bfdname] [-m machine] [-j section-name]\n\
220        [--archive-headers] [--target=bfdname] [--debugging] [--disassemble]\n\
221        [--disassemble-all] [--disassemble-zeroes] [--file-headers]\n\
222        [--section-headers] [--headers]\n\
223        [--info] [--section=section-name] [--line-numbers] [--source]\n",
224            program_name);
225   fprintf (stream, "\
226        [--architecture=machine] [--reloc] [--full-contents] [--stabs]\n\
227        [--syms] [--all-headers] [--dynamic-syms] [--dynamic-reloc]\n\
228        [--wide] [--version] [--help] [--private-headers]\n\
229        [--start-address=addr] [--stop-address=addr]\n\
230        [--prefix-addresses] [--[no-]show-raw-insn] [--demangle]\n\
231        [--adjust-vma=offset] [-EB|-EL] [--endian={big|little}] objfile...\n\
232 at least one option besides -l (--line-numbers) must be given\n");
233   list_supported_targets (program_name, stream);
234   if (status == 0)
235     fprintf (stream, "Report bugs to bug-gnu-utils@prep.ai.mit.edu\n");
236   exit (status);
237 }
238
239 /* 150 isn't special; it's just an arbitrary non-ASCII char value.  */
240
241 #define OPTION_ENDIAN (150)
242 #define OPTION_START_ADDRESS (OPTION_ENDIAN + 1)
243 #define OPTION_STOP_ADDRESS (OPTION_START_ADDRESS + 1)
244 #define OPTION_ADJUST_VMA (OPTION_STOP_ADDRESS + 1)
245
246 static struct option long_options[]=
247 {
248   {"adjust-vma", required_argument, NULL, OPTION_ADJUST_VMA},
249   {"all-headers", no_argument, NULL, 'x'},
250   {"private-headers", no_argument, NULL, 'p'},
251   {"architecture", required_argument, NULL, 'm'},
252   {"archive-headers", no_argument, NULL, 'a'},
253   {"debugging", no_argument, &dump_debugging, 1},
254   {"demangle", no_argument, &do_demangle, 1},
255   {"disassemble", no_argument, NULL, 'd'},
256   {"disassemble-all", no_argument, NULL, 'D'},
257   {"disassemble-zeroes", no_argument, &disassemble_zeroes, 1},
258   {"dynamic-reloc", no_argument, NULL, 'R'},
259   {"dynamic-syms", no_argument, NULL, 'T'},
260   {"endian", required_argument, NULL, OPTION_ENDIAN},
261   {"file-headers", no_argument, NULL, 'f'},
262   {"full-contents", no_argument, NULL, 's'},
263   {"headers", no_argument, NULL, 'h'},
264   {"help", no_argument, NULL, 'H'},
265   {"info", no_argument, NULL, 'i'},
266   {"line-numbers", no_argument, NULL, 'l'},
267   {"no-show-raw-insn", no_argument, &show_raw_insn, -1},
268   {"prefix-addresses", no_argument, &prefix_addresses, 1},
269   {"reloc", no_argument, NULL, 'r'},
270   {"section", required_argument, NULL, 'j'},
271   {"section-headers", no_argument, NULL, 'h'},
272   {"show-raw-insn", no_argument, &show_raw_insn, 1},
273   {"source", no_argument, NULL, 'S'},
274   {"stabs", no_argument, &dump_stab_section_info, 1},
275   {"start-address", required_argument, NULL, OPTION_START_ADDRESS},
276   {"stop-address", required_argument, NULL, OPTION_STOP_ADDRESS},
277   {"syms", no_argument, NULL, 't'},
278   {"target", required_argument, NULL, 'b'},
279   {"version", no_argument, &show_version, 1},
280   {"wide", no_argument, &wide_output, 'w'},
281   {0, no_argument, 0, 0}
282 };
283 \f
284 static void
285 dump_section_header (abfd, section, ignored)
286      bfd *abfd;
287      asection *section;
288      PTR ignored;
289 {
290   char *comma = "";
291
292   printf ("%3d %-13s %08lx  ", section->index,
293           bfd_get_section_name (abfd, section),
294           (unsigned long) bfd_section_size (abfd, section));
295   printf_vma (bfd_get_section_vma (abfd, section));
296   printf ("  ");
297   printf_vma (section->lma);
298   printf ("  %08lx  2**%u", section->filepos,
299           bfd_get_section_alignment (abfd, section));
300   if (! wide_output)
301     printf ("\n                ");
302   printf ("  ");
303
304 #define PF(x, y) \
305   if (section->flags & x) { printf ("%s%s", comma, y); comma = ", "; }
306
307   PF (SEC_HAS_CONTENTS, "CONTENTS");
308   PF (SEC_ALLOC, "ALLOC");
309   PF (SEC_CONSTRUCTOR, "CONSTRUCTOR");
310   PF (SEC_CONSTRUCTOR_TEXT, "CONSTRUCTOR TEXT");
311   PF (SEC_CONSTRUCTOR_DATA, "CONSTRUCTOR DATA");
312   PF (SEC_CONSTRUCTOR_BSS, "CONSTRUCTOR BSS");
313   PF (SEC_LOAD, "LOAD");
314   PF (SEC_RELOC, "RELOC");
315 #ifdef SEC_BALIGN
316   PF (SEC_BALIGN, "BALIGN");
317 #endif
318   PF (SEC_READONLY, "READONLY");
319   PF (SEC_CODE, "CODE");
320   PF (SEC_DATA, "DATA");
321   PF (SEC_ROM, "ROM");
322   PF (SEC_DEBUGGING, "DEBUGGING");
323   PF (SEC_NEVER_LOAD, "NEVER_LOAD");
324   PF (SEC_EXCLUDE, "EXCLUDE");
325   PF (SEC_SORT_ENTRIES, "SORT_ENTRIES");
326
327   if ((section->flags & SEC_LINK_ONCE) != 0)
328     {
329       const char *ls;
330
331       switch (section->flags & SEC_LINK_DUPLICATES)
332         {
333         default:
334           abort ();
335         case SEC_LINK_DUPLICATES_DISCARD:
336           ls = "LINK_ONCE_DISCARD";
337           break;
338         case SEC_LINK_DUPLICATES_ONE_ONLY:
339           ls = "LINK_ONCE_ONE_ONLY";
340           break;
341         case SEC_LINK_DUPLICATES_SAME_SIZE:
342           ls = "LINK_ONCE_SAME_SIZE";
343           break;
344         case SEC_LINK_DUPLICATES_SAME_CONTENTS:
345           ls = "LINK_ONCE_SAME_CONTENTS";
346           break;
347         }
348       printf ("%s%s", comma, ls);
349       comma = ", ";
350     }
351
352   printf ("\n");
353 #undef PF
354 }
355
356 static void
357 dump_headers (abfd)
358      bfd *abfd;
359 {
360   printf ("Sections:\n");
361 #ifndef BFD64
362   printf ("Idx Name          Size      VMA       LMA       File off  Algn\n");
363 #else
364   printf ("Idx Name          Size      VMA               LMA               File off  Algn\n");
365 #endif
366   bfd_map_over_sections (abfd, dump_section_header, (PTR) NULL);
367 }
368 \f
369 static asymbol **
370 slurp_symtab (abfd)
371      bfd *abfd;
372 {
373   asymbol **sy = (asymbol **) NULL;
374   long storage;
375
376   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
377     {
378       printf ("No symbols in \"%s\".\n", bfd_get_filename (abfd));
379       symcount = 0;
380       return NULL;
381     }
382
383   storage = bfd_get_symtab_upper_bound (abfd);
384   if (storage < 0)
385     bfd_fatal (bfd_get_filename (abfd));
386
387   if (storage)
388     {
389       sy = (asymbol **) xmalloc (storage);
390     }
391   symcount = bfd_canonicalize_symtab (abfd, sy);
392   if (symcount < 0)
393     bfd_fatal (bfd_get_filename (abfd));
394   if (symcount == 0)
395     fprintf (stderr, "%s: %s: No symbols\n",
396              program_name, bfd_get_filename (abfd));
397   return sy;
398 }
399
400 /* Read in the dynamic symbols.  */
401
402 static asymbol **
403 slurp_dynamic_symtab (abfd)
404      bfd *abfd;
405 {
406   asymbol **sy = (asymbol **) NULL;
407   long storage;
408
409   storage = bfd_get_dynamic_symtab_upper_bound (abfd);
410   if (storage < 0)
411     {
412       if (!(bfd_get_file_flags (abfd) & DYNAMIC))
413         {
414           fprintf (stderr, "%s: %s: not a dynamic object\n",
415                    program_name, bfd_get_filename (abfd));
416           dynsymcount = 0;
417           return NULL;
418         }
419
420       bfd_fatal (bfd_get_filename (abfd));
421     }
422
423   if (storage)
424     {
425       sy = (asymbol **) xmalloc (storage);
426     }
427   dynsymcount = bfd_canonicalize_dynamic_symtab (abfd, sy);
428   if (dynsymcount < 0)
429     bfd_fatal (bfd_get_filename (abfd));
430   if (dynsymcount == 0)
431     fprintf (stderr, "%s: %s: No dynamic symbols\n",
432              program_name, bfd_get_filename (abfd));
433   return sy;
434 }
435
436 /* Filter out (in place) symbols that are useless for disassembly.
437    COUNT is the number of elements in SYMBOLS.
438    Return the number of useful symbols. */
439
440 static long
441 remove_useless_symbols (symbols, count)
442      asymbol **symbols;
443      long count;
444 {
445   register asymbol **in_ptr = symbols, **out_ptr = symbols;
446
447   while (--count >= 0)
448     {
449       asymbol *sym = *in_ptr++;
450
451       if (sym->name == NULL || sym->name[0] == '\0')
452         continue;
453       if (sym->flags & (BSF_DEBUGGING))
454         continue;
455       if (bfd_is_und_section (sym->section)
456           || bfd_is_com_section (sym->section))
457         continue;
458
459       *out_ptr++ = sym;
460     }
461   return out_ptr - symbols;
462 }
463
464 /* Sort symbols into value order.  */
465
466 static int 
467 compare_symbols (ap, bp)
468      const PTR ap;
469      const PTR bp;
470 {
471   const asymbol *a = *(const asymbol **)ap;
472   const asymbol *b = *(const asymbol **)bp;
473   const char *an, *bn;
474   size_t anl, bnl;
475   boolean af, bf;
476   flagword aflags, bflags;
477
478   if (bfd_asymbol_value (a) > bfd_asymbol_value (b))
479     return 1;
480   else if (bfd_asymbol_value (a) < bfd_asymbol_value (b))
481     return -1;
482
483   if (a->section > b->section)
484     return 1;
485   else if (a->section < b->section)
486     return -1;
487
488   an = bfd_asymbol_name (a);
489   bn = bfd_asymbol_name (b);
490   anl = strlen (an);
491   bnl = strlen (bn);
492
493   /* The symbols gnu_compiled and gcc2_compiled convey no real
494      information, so put them after other symbols with the same value.  */
495
496   af = (strstr (an, "gnu_compiled") != NULL
497         || strstr (an, "gcc2_compiled") != NULL);
498   bf = (strstr (bn, "gnu_compiled") != NULL
499         || strstr (bn, "gcc2_compiled") != NULL);
500
501   if (af && ! bf)
502     return 1;
503   if (! af && bf)
504     return -1;
505
506   /* We use a heuristic for the file name, to try to sort it after
507      more useful symbols.  It may not work on non Unix systems, but it
508      doesn't really matter; the only difference is precisely which
509      symbol names get printed.  */
510
511 #define file_symbol(s, sn, snl)                 \
512   (((s)->flags & BSF_FILE) != 0                 \
513    || ((sn)[(snl) - 2] == '.'                   \
514        && ((sn)[(snl) - 1] == 'o'               \
515            || (sn)[(snl) - 1] == 'a')))
516
517   af = file_symbol (a, an, anl);
518   bf = file_symbol (b, bn, bnl);
519
520   if (af && ! bf)
521     return 1;
522   if (! af && bf)
523     return -1;
524
525   /* Try to sort global symbols before local symbols before function
526      symbols before debugging symbols.  */
527
528   aflags = a->flags;
529   bflags = b->flags;
530
531   if ((aflags & BSF_DEBUGGING) != (bflags & BSF_DEBUGGING))
532     {
533       if ((aflags & BSF_DEBUGGING) != 0)
534         return 1;
535       else
536         return -1;
537     }
538   if ((aflags & BSF_FUNCTION) != (bflags & BSF_FUNCTION))
539     {
540       if ((aflags & BSF_FUNCTION) != 0)
541         return -1;
542       else
543         return 1;
544     }
545   if ((aflags & BSF_LOCAL) != (bflags & BSF_LOCAL))
546     {
547       if ((aflags & BSF_LOCAL) != 0)
548         return 1;
549       else
550         return -1;
551     }
552   if ((aflags & BSF_GLOBAL) != (bflags & BSF_GLOBAL))
553     {
554       if ((aflags & BSF_GLOBAL) != 0)
555         return -1;
556       else
557         return 1;
558     }
559
560   /* Symbols that start with '.' might be section names, so sort them
561      after symbols that don't start with '.'.  */
562   if (an[0] == '.' && bn[0] != '.')
563     return 1;
564   if (an[0] != '.' && bn[0] == '.')
565     return -1;
566
567   /* Finally, if we can't distinguish them in any other way, try to
568      get consistent results by sorting the symbols by name.  */
569   return strcmp (an, bn);
570 }
571
572 /* Sort relocs into address order.  */
573
574 static int
575 compare_relocs (ap, bp)
576      const PTR ap;
577      const PTR bp;
578 {
579   const arelent *a = *(const arelent **)ap;
580   const arelent *b = *(const arelent **)bp;
581
582   if (a->address > b->address)
583     return 1;
584   else if (a->address < b->address)
585     return -1;
586
587   /* So that associated relocations tied to the same address show up
588      in the correct order, we don't do any further sorting.  */
589   if (a > b)
590     return 1;
591   else if (a < b)
592     return -1;
593   else
594     return 0;
595 }
596
597 /* Print VMA to STREAM.  If SKIP_ZEROES is true, omit leading zeroes.  */
598
599 static void
600 objdump_print_value (vma, info, skip_zeroes)
601      bfd_vma vma;
602      struct disassemble_info *info;
603      boolean skip_zeroes;
604 {
605   char buf[30];
606   char *p;
607
608   sprintf_vma (buf, vma);
609   if (! skip_zeroes)
610     p = buf;
611   else
612     {
613       for (p = buf; *p == '0'; ++p)
614         ;
615       if (*p == '\0')
616         --p;
617     }
618   (*info->fprintf_func) (info->stream, "%s", p);
619 }
620
621 /* Print the name of a symbol.  */
622
623 static void
624 objdump_print_symname (abfd, info, sym)
625      bfd *abfd;
626      struct disassemble_info *info;
627      asymbol *sym;
628 {
629   char *alloc;
630   const char *name;
631   const char *print;
632
633   alloc = NULL;
634   name = bfd_asymbol_name (sym);
635   if (! do_demangle || name[0] == '\0')
636     print = name;
637   else
638     {
639       /* Demangle the name.  */
640       if (bfd_get_symbol_leading_char (abfd) == name[0])
641         ++name;
642
643       alloc = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
644       if (alloc == NULL)
645         print = name;
646       else
647         print = alloc;
648     }
649
650   if (info != NULL)
651     (*info->fprintf_func) (info->stream, "%s", print);
652   else
653     printf ("%s", print);
654
655   if (alloc != NULL)
656     free (alloc);
657 }
658
659 /* Locate a symbol given a bfd, a section, and a VMA.  If REQUIRE_SEC
660    is true, then always require the symbol to be in the section.  This
661    returns NULL if there is no suitable symbol.  If PLACE is not NULL,
662    then *PLACE is set to the index of the symbol in sorted_syms.  */
663
664 static asymbol *
665 find_symbol_for_address (abfd, sec, vma, require_sec, place)
666      bfd *abfd;
667      asection *sec;
668      bfd_vma vma;
669      boolean require_sec;
670      long *place;
671 {
672   /* @@ Would it speed things up to cache the last two symbols returned,
673      and maybe their address ranges?  For many processors, only one memory
674      operand can be present at a time, so the 2-entry cache wouldn't be
675      constantly churned by code doing heavy memory accesses.  */
676
677   /* Indices in `sorted_syms'.  */
678   long min = 0;
679   long max = sorted_symcount;
680   long thisplace;
681
682   if (sorted_symcount < 1)
683     return NULL;
684
685   /* Perform a binary search looking for the closest symbol to the
686      required value.  We are searching the range (min, max].  */
687   while (min + 1 < max)
688     {
689       asymbol *sym;
690
691       thisplace = (max + min) / 2;
692       sym = sorted_syms[thisplace];
693
694       if (bfd_asymbol_value (sym) > vma)
695         max = thisplace;
696       else if (bfd_asymbol_value (sym) < vma)
697         min = thisplace;
698       else
699         {
700           min = thisplace;
701           break;
702         }
703     }
704
705   /* The symbol we want is now in min, the low end of the range we
706      were searching.  If there are several symbols with the same
707      value, we want the first one.  */
708   thisplace = min;
709   while (thisplace > 0
710          && (bfd_asymbol_value (sorted_syms[thisplace])
711              == bfd_asymbol_value (sorted_syms[thisplace - 1])))
712     --thisplace;
713
714   /* If the file is relocateable, and the symbol could be from this
715      section, prefer a symbol from this section over symbols from
716      others, even if the other symbol's value might be closer.
717        
718      Note that this may be wrong for some symbol references if the
719      sections have overlapping memory ranges, but in that case there's
720      no way to tell what's desired without looking at the relocation
721      table.  */
722
723   if (sorted_syms[thisplace]->section != sec
724       && (require_sec
725           || ((abfd->flags & HAS_RELOC) != 0
726               && vma >= bfd_get_section_vma (abfd, sec)
727               && vma < (bfd_get_section_vma (abfd, sec)
728                         + bfd_section_size (abfd, sec)))))
729     {
730       long i;
731
732       for (i = thisplace + 1; i < sorted_symcount; i++)
733         {
734           if (bfd_asymbol_value (sorted_syms[i])
735               != bfd_asymbol_value (sorted_syms[thisplace]))
736             break;
737         }
738       --i;
739       for (; i >= 0; i--)
740         {
741           if (sorted_syms[i]->section == sec
742               && (i == 0
743                   || sorted_syms[i - 1]->section != sec
744                   || (bfd_asymbol_value (sorted_syms[i])
745                       != bfd_asymbol_value (sorted_syms[i - 1]))))
746             {
747               thisplace = i;
748               break;
749             }
750         }
751
752       if (sorted_syms[thisplace]->section != sec)
753         {
754           /* We didn't find a good symbol with a smaller value.
755              Look for one with a larger value.  */
756           for (i = thisplace + 1; i < sorted_symcount; i++)
757             {
758               if (sorted_syms[i]->section == sec)
759                 {
760                   thisplace = i;
761                   break;
762                 }
763             }
764         }
765
766       if (sorted_syms[thisplace]->section != sec
767           && (require_sec
768               || ((abfd->flags & HAS_RELOC) != 0
769                   && vma >= bfd_get_section_vma (abfd, sec)
770                   && vma < (bfd_get_section_vma (abfd, sec)
771                             + bfd_section_size (abfd, sec)))))
772         {
773           /* There is no suitable symbol.  */
774           return NULL;
775         }
776     }
777
778   if (place != NULL)
779     *place = thisplace;
780
781   return sorted_syms[thisplace];
782 }
783
784 /* Print an address to INFO symbolically.  */
785
786 static void
787 objdump_print_addr_with_sym (abfd, sec, sym, vma, info, skip_zeroes)
788      bfd *abfd;
789      asection *sec;
790      asymbol *sym;
791      bfd_vma vma;
792      struct disassemble_info *info;
793      boolean skip_zeroes;
794 {
795   objdump_print_value (vma, info, skip_zeroes);
796
797   if (sym == NULL)
798     {
799       bfd_vma secaddr;
800
801       (*info->fprintf_func) (info->stream, " <%s",
802                              bfd_get_section_name (abfd, sec));
803       secaddr = bfd_get_section_vma (abfd, sec);
804       if (vma < secaddr)
805         {
806           (*info->fprintf_func) (info->stream, "-0x");
807           objdump_print_value (secaddr - vma, info, true);
808         }
809       else if (vma > secaddr)
810         {
811           (*info->fprintf_func) (info->stream, "+0x");
812           objdump_print_value (vma - secaddr, info, true);
813         }
814       (*info->fprintf_func) (info->stream, ">");
815     }
816   else
817     {
818       (*info->fprintf_func) (info->stream, " <");
819       objdump_print_symname (abfd, info, sym);
820       if (bfd_asymbol_value (sym) > vma)
821         {
822           (*info->fprintf_func) (info->stream, "-0x");
823           objdump_print_value (bfd_asymbol_value (sym) - vma, info, true);
824         }
825       else if (vma > bfd_asymbol_value (sym))
826         {
827           (*info->fprintf_func) (info->stream, "+0x");
828           objdump_print_value (vma - bfd_asymbol_value (sym), info, true);
829         }
830       (*info->fprintf_func) (info->stream, ">");
831       
832       /* Notify the disassembler of the symbol being used:  */
833       disasm_symaddr (sym, info);
834     }
835 }
836
837 /* Print VMA to INFO, symbolically if possible.  If SKIP_ZEROES is
838    true, don't output leading zeroes.  */
839
840 static void
841 objdump_print_addr (vma, info, skip_zeroes)
842      bfd_vma vma;
843      struct disassemble_info *info;
844      boolean skip_zeroes;
845 {
846   struct objdump_disasm_info *aux;
847   asymbol *sym;
848
849   if (sorted_symcount < 1)
850     {
851       (*info->fprintf_func) (info->stream, "0x");
852       objdump_print_value (vma, info, skip_zeroes);
853       return;
854     }
855
856   aux = (struct objdump_disasm_info *) info->application_data;
857   sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
858                                  (long *) NULL);
859   objdump_print_addr_with_sym (aux->abfd, aux->sec, sym, vma, info,
860                                skip_zeroes);
861 }
862
863 /* Print VMA to INFO.  This function is passed to the disassembler
864    routine.  */
865
866 static void
867 objdump_print_address (vma, info)
868      bfd_vma vma;
869      struct disassemble_info *info;
870 {
871   objdump_print_addr (vma, info, ! prefix_addresses);
872 }
873
874 /* Determine of the given address has a symbol associated with it.  */
875
876 static int
877 objdump_symbol_at_address (vma, info)
878      bfd_vma vma;
879      struct disassemble_info * info;
880 {
881   struct objdump_disasm_info * aux;
882   asymbol * sym;
883
884   /* No symbols - do not bother checking.  */
885   if (sorted_symcount < 1)
886     return 0;
887
888   aux = (struct objdump_disasm_info *) info->application_data;
889   sym = find_symbol_for_address (aux->abfd, aux->sec, vma, aux->require_sec,
890                                  (long *) NULL);
891
892   return (sym != NULL && (bfd_asymbol_value (sym) == vma));
893 }
894
895 /* Hold the last function name and the last line number we displayed
896    in a disassembly.  */
897
898 static char *prev_functionname;
899 static unsigned int prev_line;
900
901 /* We keep a list of all files that we have seen when doing a
902    dissassembly with source, so that we know how much of the file to
903    display.  This can be important for inlined functions.  */
904
905 struct print_file_list
906 {
907   struct print_file_list *next;
908   char *filename;
909   unsigned int line;
910   FILE *f;
911 };
912
913 static struct print_file_list *print_files;
914
915 /* The number of preceding context lines to show when we start
916    displaying a file for the first time.  */
917
918 #define SHOW_PRECEDING_CONTEXT_LINES (5)
919
920 /* Skip ahead to a given line in a file, optionally printing each
921    line.  */
922
923 static void
924 skip_to_line PARAMS ((struct print_file_list *, unsigned int, boolean));
925
926 static void
927 skip_to_line (p, line, show)
928      struct print_file_list *p;
929      unsigned int line;
930      boolean show;
931 {
932   while (p->line < line)
933     {
934       char buf[100];
935
936       if (fgets (buf, sizeof buf, p->f) == NULL)
937         {
938           fclose (p->f);
939           p->f = NULL;
940           break;
941         }
942
943       if (show)
944         printf ("%s", buf);
945
946       if (strchr (buf, '\n') != NULL)
947         ++p->line;
948     }
949 }  
950
951 /* Show the line number, or the source line, in a dissassembly
952    listing.  */
953
954 static void
955 show_line (abfd, section, off)
956      bfd *abfd;
957      asection *section;
958      bfd_vma off;
959 {
960   CONST char *filename;
961   CONST char *functionname;
962   unsigned int line;
963
964   if (! with_line_numbers && ! with_source_code)
965     return;
966
967   if (! bfd_find_nearest_line (abfd, section, syms, off, &filename,
968                                &functionname, &line))
969     return;
970
971   if (filename != NULL && *filename == '\0')
972     filename = NULL;
973   if (functionname != NULL && *functionname == '\0')
974     functionname = NULL;
975
976   if (with_line_numbers)
977     {
978       if (functionname != NULL
979           && (prev_functionname == NULL
980               || strcmp (functionname, prev_functionname) != 0))
981         printf ("%s():\n", functionname);
982       if (line > 0 && line != prev_line)
983         printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
984     }
985
986   if (with_source_code
987       && filename != NULL
988       && line > 0)
989     {
990       struct print_file_list **pp, *p;
991
992       for (pp = &print_files; *pp != NULL; pp = &(*pp)->next)
993         if (strcmp ((*pp)->filename, filename) == 0)
994           break;
995       p = *pp;
996
997       if (p != NULL)
998         {
999           if (p != print_files)
1000             {
1001               int l;
1002
1003               /* We have reencountered a file name which we saw
1004                  earlier.  This implies that either we are dumping out
1005                  code from an included file, or the same file was
1006                  linked in more than once.  There are two common cases
1007                  of an included file: inline functions in a header
1008                  file, and a bison or flex skeleton file.  In the
1009                  former case we want to just start printing (but we
1010                  back up a few lines to give context); in the latter
1011                  case we want to continue from where we left off.  I
1012                  can't think of a good way to distinguish the cases,
1013                  so I used a heuristic based on the file name.  */
1014               if (strcmp (p->filename + strlen (p->filename) - 2, ".h") != 0)
1015                 l = p->line;
1016               else
1017                 {
1018                   l = line - SHOW_PRECEDING_CONTEXT_LINES;
1019                   if (l <= 0)
1020                     l = 1;
1021                 }
1022
1023               if (p->f == NULL)
1024                 {
1025                   p->f = fopen (p->filename, "r");
1026                   p->line = 0;
1027                 }
1028               if (p->f != NULL)
1029                 skip_to_line (p, l, false);
1030
1031               if (print_files->f != NULL)
1032                 {
1033                   fclose (print_files->f);
1034                   print_files->f = NULL;
1035                 }
1036             }
1037
1038           if (p->f != NULL)
1039             {
1040               skip_to_line (p, line, true);
1041               *pp = p->next;
1042               p->next = print_files;
1043               print_files = p;
1044             }
1045         }
1046       else
1047         {
1048           FILE *f;
1049
1050           f = fopen (filename, "r");
1051           if (f != NULL)
1052             {
1053               int l;
1054
1055               p = ((struct print_file_list *)
1056                    xmalloc (sizeof (struct print_file_list)));
1057               p->filename = xmalloc (strlen (filename) + 1);
1058               strcpy (p->filename, filename);
1059               p->line = 0;
1060               p->f = f;
1061
1062               if (print_files != NULL && print_files->f != NULL)
1063                 {
1064                   fclose (print_files->f);
1065                   print_files->f = NULL;
1066                 }
1067               p->next = print_files;
1068               print_files = p;
1069
1070               l = line - SHOW_PRECEDING_CONTEXT_LINES;
1071               if (l <= 0)
1072                 l = 1;
1073               skip_to_line (p, l, false);
1074               if (p->f != NULL)
1075                 skip_to_line (p, line, true);
1076             }
1077         }
1078     }
1079
1080   if (functionname != NULL
1081       && (prev_functionname == NULL
1082           || strcmp (functionname, prev_functionname) != 0))
1083     {
1084       if (prev_functionname != NULL)
1085         free (prev_functionname);
1086       prev_functionname = xmalloc (strlen (functionname) + 1);
1087       strcpy (prev_functionname, functionname);
1088     }
1089
1090   if (line > 0 && line != prev_line)
1091     prev_line = line;
1092 }
1093
1094 /* Pseudo FILE object for strings.  */
1095 typedef struct {
1096   char *buffer;
1097   char *current;
1098 } SFILE;
1099
1100 /* sprintf to a "stream" */
1101
1102 #ifdef ANSI_PROTOTYPES
1103 static int
1104 objdump_sprintf (SFILE *f, const char *format, ...)
1105 {
1106   int n;
1107   va_list args;
1108
1109   va_start (args, format);
1110   vsprintf (f->current, format, args);
1111   f->current += n = strlen (f->current);
1112   va_end (args);
1113   return n;
1114 }
1115 #else
1116 static int
1117 objdump_sprintf (va_alist)
1118      va_dcl
1119 {
1120   int n;
1121   SFILE *f;
1122   const char *format;
1123   va_list args;
1124
1125   va_start (args);
1126   f = va_arg (args, SFILE *);
1127   format = va_arg (args, const char *);
1128   vsprintf (f->current, format, args);
1129   f->current += n = strlen (f->current);
1130   va_end (args);
1131   return n;
1132 }
1133 #endif
1134
1135 /* The number of zeroes we want to see before we start skipping them.
1136    The number is arbitrarily chosen.  */
1137
1138 #define SKIP_ZEROES (8)
1139
1140 /* The number of zeroes to skip at the end of a section.  If the
1141    number of zeroes at the end is between SKIP_ZEROES_AT_END and
1142    SKIP_ZEROES, they will be disassembled.  If there are fewer than
1143    SKIP_ZEROES_AT_END, they will be skipped.  This is a heuristic
1144    attempt to avoid disassembling zeroes inserted by section
1145    alignment.  */
1146
1147 #define SKIP_ZEROES_AT_END (3)
1148
1149 /* Disassemble some data in memory between given values.  */
1150
1151 static void
1152 disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp,
1153                    relppend)
1154      struct disassemble_info *info;
1155      disassembler_ftype disassemble_fn;
1156      boolean insns;
1157      bfd_byte *data;
1158      long start;
1159      long stop;
1160      arelent ***relppp;
1161      arelent **relppend;
1162 {
1163   struct objdump_disasm_info *aux;
1164   asection *section;
1165   int bytes_per_line;
1166   boolean done_dot;
1167   int skip_addr_chars;
1168   long i;
1169
1170   aux = (struct objdump_disasm_info *) info->application_data;
1171   section = aux->sec;
1172
1173   if (insns)
1174     bytes_per_line = 4;
1175   else
1176     bytes_per_line = 16;
1177
1178   /* Figure out how many characters to skip at the start of an
1179      address, to make the disassembly look nicer.  We discard leading
1180      zeroes in chunks of 4, ensuring that there is always a leading
1181      zero remaining.  */
1182   skip_addr_chars = 0;
1183   if (! prefix_addresses)
1184     {
1185       char buf[30];
1186       char *s;
1187
1188       sprintf_vma (buf,
1189                    section->vma + bfd_section_size (section->owner, section));
1190       s = buf;
1191       while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
1192              && s[4] == '0')
1193         {
1194           skip_addr_chars += 4;
1195           s += 4;
1196         }
1197     }
1198
1199   info->insn_info_valid = 0;
1200
1201   done_dot = false;
1202   i = start;
1203   while (i < stop)
1204     {
1205       long z;
1206       int bytes;
1207       boolean need_nl = false;
1208
1209       /* If we see more than SKIP_ZEROES bytes of zeroes, we just
1210          print `...'.  */
1211       for (z = i; z < stop; z++)
1212         if (data[z] != 0)
1213           break;
1214       if (! disassemble_zeroes
1215           && (info->insn_info_valid == 0
1216               || info->branch_delay_insns == 0)
1217           && (z - i >= SKIP_ZEROES
1218               || (z == stop && z - i < SKIP_ZEROES_AT_END)))
1219         {
1220           printf ("\t...\n");
1221
1222           /* If there are more nonzero bytes to follow, we only skip
1223              zeroes in multiples of 4, to try to avoid running over
1224              the start of an instruction which happens to start with
1225              zero.  */
1226           if (z != stop)
1227             z = i + ((z - i) &~ 3);
1228
1229           bytes = z - i;
1230         }
1231       else
1232         {
1233           char buf[1000];
1234           SFILE sfile;
1235           int bpc, pb = 0;
1236
1237           done_dot = false;
1238
1239           if (with_line_numbers || with_source_code)
1240             show_line (aux->abfd, section, i);
1241
1242           if (! prefix_addresses)
1243             {
1244               char *s;
1245
1246               sprintf_vma (buf, section->vma + i);
1247               for (s = buf + skip_addr_chars; *s == '0'; s++)
1248                 *s = ' ';
1249               if (*s == '\0')
1250                 *--s = '0';
1251               printf ("%s:\t", buf + skip_addr_chars);
1252             }
1253           else
1254             {
1255               aux->require_sec = true;
1256               objdump_print_address (section->vma + i, info);
1257               aux->require_sec = false;
1258               putchar (' ');
1259             }
1260
1261           if (insns)
1262             {
1263               sfile.buffer = sfile.current = buf;
1264               info->fprintf_func = (fprintf_ftype) objdump_sprintf;
1265               info->stream = (FILE *) &sfile;
1266               info->bytes_per_line = 0;
1267               info->bytes_per_chunk = 0;
1268               bytes = (*disassemble_fn) (section->vma + i, info);
1269               info->fprintf_func = (fprintf_ftype) fprintf;
1270               info->stream = stdout;
1271               if (info->bytes_per_line != 0)
1272                 bytes_per_line = info->bytes_per_line;
1273               if (bytes < 0)
1274                 break;
1275             }
1276           else
1277             {
1278               long j;
1279
1280               bytes = bytes_per_line;
1281               if (i + bytes > stop)
1282                 bytes = stop - i;
1283
1284               for (j = i; j < i + bytes; ++j)
1285                 {
1286                   if (isprint (data[j]))
1287                     buf[j - i] = data[j];
1288                   else
1289                     buf[j - i] = '.';
1290                 }
1291               buf[j - i] = '\0';
1292             }
1293
1294           if (prefix_addresses
1295               ? show_raw_insn > 0
1296               : show_raw_insn >= 0)
1297             {
1298               long j;
1299
1300               /* If ! prefix_addresses and ! wide_output, we print
1301                  bytes_per_line bytes per line.  */
1302               pb = bytes;
1303               if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
1304                 pb = bytes_per_line;
1305
1306               if (info->bytes_per_chunk)
1307                 bpc = info->bytes_per_chunk;
1308               else
1309                 bpc = 1;
1310
1311               for (j = i; j < i + pb; j += bpc)
1312                 {
1313                   int k;
1314                   if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1315                     {
1316                       for (k = bpc - 1; k >= 0; k--)
1317                         printf ("%02x", (unsigned) data[j + k]);
1318                       putchar (' ');
1319                     }
1320                   else
1321                     {
1322                       for (k = 0; k < bpc; k++)
1323                         printf ("%02x", (unsigned) data[j + k]);
1324                       putchar (' ');
1325                     }
1326                 }
1327
1328               for (; pb < bytes_per_line; pb += bpc)
1329                 {
1330                   int k;
1331
1332                   for (k = 0; k < bpc; k++)
1333                     printf ("  ");
1334                   putchar (' ');
1335                 }
1336
1337               /* Separate raw data from instruction by extra space.  */
1338               if (insns)
1339                 putchar ('\t');
1340               else
1341                 printf ("    ");
1342             }
1343
1344           printf ("%s", buf);
1345
1346           if (prefix_addresses
1347               ? show_raw_insn > 0
1348               : show_raw_insn >= 0)
1349             {
1350               while (pb < bytes)
1351                 {
1352                   long j;
1353                   char *s;
1354
1355                   putchar ('\n');
1356                   j = i + pb;
1357
1358                   sprintf_vma (buf, section->vma + j);
1359                   for (s = buf + skip_addr_chars; *s == '0'; s++)
1360                     *s = ' ';
1361                   if (*s == '\0')
1362                     *--s = '0';
1363                   printf ("%s:\t", buf + skip_addr_chars);
1364
1365                   pb += bytes_per_line;
1366                   if (pb > bytes)
1367                     pb = bytes;
1368                   for (; j < i + pb; j += bpc)
1369                     {
1370                       int k;
1371
1372                       if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
1373                         {
1374                           for (k = bpc - 1; k >= 0; k--)
1375                             printf ("%02x", (unsigned) data[j + k]);
1376                           putchar (' ');
1377                         }
1378                       else
1379                         {
1380                           for (k = 0; k < bpc; k++)
1381                             printf ("%02x", (unsigned) data[j + k]);
1382                           putchar (' ');
1383                         }
1384                     }
1385                 }
1386             }
1387
1388           if (!wide_output)
1389             putchar ('\n');
1390           else
1391             need_nl = true;
1392         }
1393
1394       if (dump_reloc_info
1395           && (section->flags & SEC_RELOC) != 0)
1396         {
1397           while ((*relppp) < relppend
1398                  && ((**relppp)->address >= (bfd_vma) i
1399                      && (**relppp)->address < (bfd_vma) i + bytes))
1400             {
1401               arelent *q;
1402
1403               q = **relppp;
1404
1405               if (wide_output)
1406                 putchar ('\t');
1407               else
1408                 printf ("\t\t\t");
1409
1410               objdump_print_value (section->vma + q->address, info, true);
1411
1412               printf (": %s\t", q->howto->name);
1413
1414               if (q->sym_ptr_ptr == NULL || *q->sym_ptr_ptr == NULL)
1415                 printf ("*unknown*");
1416               else
1417                 {
1418                   const char *sym_name;
1419
1420                   sym_name = bfd_asymbol_name (*q->sym_ptr_ptr);
1421                   if (sym_name != NULL && *sym_name != '\0')
1422                     objdump_print_symname (aux->abfd, info, *q->sym_ptr_ptr);
1423                   else
1424                     {
1425                       asection *sym_sec;
1426
1427                       sym_sec = bfd_get_section (*q->sym_ptr_ptr);
1428                       sym_name = bfd_get_section_name (aux->abfd, sym_sec);
1429                       if (sym_name == NULL || *sym_name == '\0')
1430                         sym_name = "*unknown*";
1431                       printf ("%s", sym_name);
1432                     }
1433                 }
1434
1435               if (q->addend)
1436                 {
1437                   printf ("+0x");
1438                   objdump_print_value (q->addend, info, true);
1439                 }
1440
1441               printf ("\n");
1442               need_nl = false;
1443               ++(*relppp);
1444             }
1445         }
1446
1447       if (need_nl)
1448         printf ("\n");
1449
1450       i += bytes;
1451     }
1452 }
1453
1454 /* Disassemble the contents of an object file.  */
1455
1456 static void
1457 disassemble_data (abfd)
1458      bfd *abfd;
1459 {
1460   long i;
1461   disassembler_ftype disassemble_fn;
1462   struct disassemble_info disasm_info;
1463   struct objdump_disasm_info aux;
1464   asection *section;
1465
1466   print_files = NULL;
1467   prev_functionname = NULL;
1468   prev_line = -1;
1469
1470   /* We make a copy of syms to sort.  We don't want to sort syms
1471      because that will screw up the relocs.  */
1472   sorted_syms = (asymbol **) xmalloc (symcount * sizeof (asymbol *));
1473   memcpy (sorted_syms, syms, symcount * sizeof (asymbol *));
1474
1475   sorted_symcount = remove_useless_symbols (sorted_syms, symcount);
1476
1477   /* Sort the symbols into section and symbol order */
1478   qsort (sorted_syms, sorted_symcount, sizeof (asymbol *), compare_symbols);
1479
1480   INIT_DISASSEMBLE_INFO(disasm_info, stdout, fprintf);
1481   disasm_info.application_data = (PTR) &aux;
1482   aux.abfd = abfd;
1483   aux.require_sec = false;
1484   disasm_info.print_address_func = objdump_print_address;
1485   disasm_info.symbol_at_address_func = objdump_symbol_at_address;
1486
1487   if (machine != (char *) NULL)
1488     {
1489       const bfd_arch_info_type *info = bfd_scan_arch (machine);
1490       if (info == NULL)
1491         {
1492           fprintf (stderr, "%s: Can't use supplied machine %s\n",
1493                    program_name,
1494                    machine);
1495           exit (1);
1496         }
1497       abfd->arch_info = info;
1498     }
1499
1500   if (endian != BFD_ENDIAN_UNKNOWN)
1501     {
1502       struct bfd_target *xvec;
1503
1504       xvec = (struct bfd_target *) xmalloc (sizeof (struct bfd_target));
1505       memcpy (xvec, abfd->xvec, sizeof (struct bfd_target));
1506       xvec->byteorder = endian;
1507       abfd->xvec = xvec;
1508     }
1509
1510   disassemble_fn = disassembler (abfd);
1511   if (!disassemble_fn)
1512     {
1513       fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
1514                program_name,
1515                bfd_printable_arch_mach (bfd_get_arch (abfd), 0));
1516       return;
1517     }
1518
1519   disasm_info.flavour = bfd_get_flavour (abfd);
1520   disasm_info.arch = bfd_get_arch (abfd);
1521   disasm_info.mach = bfd_get_mach (abfd);
1522   if (bfd_big_endian (abfd))
1523     disasm_info.endian = BFD_ENDIAN_BIG;
1524   else if (bfd_little_endian (abfd))
1525     disasm_info.endian = BFD_ENDIAN_LITTLE;
1526   else
1527     /* ??? Aborting here seems too drastic.  We could default to big or little
1528        instead.  */
1529     disasm_info.endian = BFD_ENDIAN_UNKNOWN;
1530
1531   for (section = abfd->sections;
1532        section != (asection *) NULL;
1533        section = section->next)
1534     {
1535       bfd_byte *data = NULL;
1536       bfd_size_type datasize = 0;
1537       arelent **relbuf = NULL;
1538       arelent **relpp = NULL;
1539       arelent **relppend = NULL;
1540       long stop;
1541       asymbol *sym = NULL;
1542       long place = 0;
1543
1544       if ((section->flags & SEC_LOAD) == 0
1545           || (! disassemble_all
1546               && only == NULL
1547               && (section->flags & SEC_CODE) == 0))
1548         continue;
1549       if (only != (char *) NULL && strcmp (only, section->name) != 0)
1550         continue;
1551
1552       if (dump_reloc_info
1553           && (section->flags & SEC_RELOC) != 0)
1554         {
1555           long relsize;
1556
1557           relsize = bfd_get_reloc_upper_bound (abfd, section);
1558           if (relsize < 0)
1559             bfd_fatal (bfd_get_filename (abfd));
1560
1561           if (relsize > 0)
1562             {
1563               long relcount;
1564
1565               relbuf = (arelent **) xmalloc (relsize);
1566               relcount = bfd_canonicalize_reloc (abfd, section, relbuf, syms);
1567               if (relcount < 0)
1568                 bfd_fatal (bfd_get_filename (abfd));
1569
1570               /* Sort the relocs by address.  */
1571               qsort (relbuf, relcount, sizeof (arelent *), compare_relocs);
1572
1573               relpp = relbuf;
1574               relppend = relpp + relcount;
1575             }
1576         }
1577
1578       printf ("Disassembly of section %s:\n", section->name);
1579
1580       datasize = bfd_get_section_size_before_reloc (section);
1581       if (datasize == 0)
1582         continue;
1583
1584       data = (bfd_byte *) xmalloc ((size_t) datasize);
1585
1586       bfd_get_section_contents (abfd, section, data, 0, datasize);
1587
1588       aux.sec = section;
1589       disasm_info.buffer = data;
1590       disasm_info.buffer_vma = section->vma;
1591       disasm_info.buffer_length = datasize;
1592       if (start_address == (bfd_vma) -1
1593           || start_address < disasm_info.buffer_vma)
1594         i = 0;
1595       else
1596         i = start_address - disasm_info.buffer_vma;
1597       if (stop_address == (bfd_vma) -1)
1598         stop = datasize;
1599       else
1600         {
1601           if (stop_address < disasm_info.buffer_vma)
1602             stop = 0;
1603           else
1604             stop = stop_address - disasm_info.buffer_vma;
1605           if (stop > disasm_info.buffer_length)
1606             stop = disasm_info.buffer_length;
1607         }
1608
1609       sym = find_symbol_for_address (abfd, section, section->vma + i,
1610                                      true, &place);
1611       ++place;
1612       while (i < stop)
1613         {
1614           asymbol *nextsym;
1615           long nextstop;
1616           boolean insns;
1617           
1618           if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + i)
1619             disasm_info.symbol = sym;
1620           else
1621             disasm_info.symbol = NULL;
1622           
1623           if (! prefix_addresses)
1624             {
1625               printf ("\n");
1626               objdump_print_addr_with_sym (abfd, section, sym,
1627                                            section->vma + i,
1628                                            &disasm_info,
1629                                            false);
1630               printf (":\n");
1631             }
1632           
1633           if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1634             nextsym = sym;
1635           else if (sym == NULL)
1636             nextsym = NULL;
1637           else
1638             {
1639               while (place < sorted_symcount
1640                      && (sorted_syms[place]->section != section
1641                          || (bfd_asymbol_value (sorted_syms[place])
1642                              <= bfd_asymbol_value (sym))))
1643                 ++place;
1644               if (place >= sorted_symcount)
1645                 nextsym = NULL;
1646               else
1647                 nextsym = sorted_syms[place];
1648             }
1649           
1650           if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
1651             {
1652               nextstop = bfd_asymbol_value (sym) - section->vma;
1653               if (nextstop > stop)
1654                 nextstop = stop;
1655             }
1656           else if (nextsym == NULL)
1657             nextstop = stop;
1658           else
1659             {
1660               nextstop = bfd_asymbol_value (nextsym) - section->vma;
1661               if (nextstop > stop)
1662                 nextstop = stop;
1663             }
1664           
1665           /* If a symbol is explicitly marked as being an object
1666              rather than a function, just dump the bytes without
1667              disassembling them.  */
1668           if (disassemble_all
1669               || sym == NULL
1670               || bfd_asymbol_value (sym) > section->vma + i
1671               || ((sym->flags & BSF_OBJECT) == 0
1672                   && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
1673                       == NULL)
1674                   && (strstr (bfd_asymbol_name (sym), "gcc2_compiled")
1675                       == NULL))
1676               || (sym->flags & BSF_FUNCTION) != 0)
1677             insns = true;
1678           else
1679             insns = false;
1680           
1681           disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
1682                              nextstop, &relpp, relppend);
1683           
1684           i = nextstop;
1685           sym = nextsym;
1686         }
1687       
1688       free (data);
1689       if (relbuf != NULL)
1690         free (relbuf);
1691     }
1692   free (sorted_syms);
1693 }
1694 \f
1695
1696 /* Define a table of stab values and print-strings.  We wish the initializer
1697    could be a direct-mapped table, but instead we build one the first
1698    time we need it.  */
1699
1700 static void dump_section_stabs PARAMS ((bfd *abfd, char *stabsect_name,
1701                                         char *strsect_name));
1702
1703 /* Dump the stabs sections from an object file that has a section that
1704    uses Sun stabs encoding.  */
1705
1706 static void
1707 dump_stabs (abfd)
1708      bfd *abfd;
1709 {
1710   dump_section_stabs (abfd, ".stab", ".stabstr");
1711   dump_section_stabs (abfd, ".stab.excl", ".stab.exclstr");
1712   dump_section_stabs (abfd, ".stab.index", ".stab.indexstr");
1713   dump_section_stabs (abfd, "$GDB_SYMBOLS$", "$GDB_STRINGS$");
1714 }
1715
1716 static bfd_byte *stabs;
1717 static bfd_size_type stab_size;
1718
1719 static char *strtab;
1720 static bfd_size_type stabstr_size;
1721
1722 /* Read ABFD's stabs section STABSECT_NAME into `stabs'
1723    and string table section STRSECT_NAME into `strtab'.
1724    If the section exists and was read, allocate the space and return true.
1725    Otherwise return false.  */
1726
1727 static boolean
1728 read_section_stabs (abfd, stabsect_name, strsect_name)
1729      bfd *abfd;
1730      const char *stabsect_name;
1731      const char *strsect_name;
1732 {
1733   asection *stabsect, *stabstrsect;
1734
1735   stabsect = bfd_get_section_by_name (abfd, stabsect_name);
1736   if (0 == stabsect)
1737     {
1738       printf ("No %s section present\n\n", stabsect_name);
1739       return false;
1740     }
1741
1742   stabstrsect = bfd_get_section_by_name (abfd, strsect_name);
1743   if (0 == stabstrsect)
1744     {
1745       fprintf (stderr, "%s: %s has no %s section\n", program_name,
1746                bfd_get_filename (abfd), strsect_name);
1747       return false;
1748     }
1749  
1750   stab_size    = bfd_section_size (abfd, stabsect);
1751   stabstr_size = bfd_section_size (abfd, stabstrsect);
1752
1753   stabs  = (bfd_byte *) xmalloc (stab_size);
1754   strtab = (char *) xmalloc (stabstr_size);
1755   
1756   if (! bfd_get_section_contents (abfd, stabsect, (PTR) stabs, 0, stab_size))
1757     {
1758       fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1759                program_name, stabsect_name, bfd_get_filename (abfd),
1760                bfd_errmsg (bfd_get_error ()));
1761       free (stabs);
1762       free (strtab);
1763       return false;
1764     }
1765
1766   if (! bfd_get_section_contents (abfd, stabstrsect, (PTR) strtab, 0,
1767                                   stabstr_size))
1768     {
1769       fprintf (stderr, "%s: Reading %s section of %s failed: %s\n",
1770                program_name, strsect_name, bfd_get_filename (abfd),
1771                bfd_errmsg (bfd_get_error ()));
1772       free (stabs);
1773       free (strtab);
1774       return false;
1775     }
1776
1777   return true;
1778 }
1779
1780 /* Stabs entries use a 12 byte format:
1781      4 byte string table index
1782      1 byte stab type
1783      1 byte stab other field
1784      2 byte stab desc field
1785      4 byte stab value
1786    FIXME: This will have to change for a 64 bit object format.  */
1787
1788 #define STRDXOFF (0)
1789 #define TYPEOFF (4)
1790 #define OTHEROFF (5)
1791 #define DESCOFF (6)
1792 #define VALOFF (8)
1793 #define STABSIZE (12)
1794
1795 /* Print ABFD's stabs section STABSECT_NAME (in `stabs'),
1796    using string table section STRSECT_NAME (in `strtab').  */
1797
1798 static void
1799 print_section_stabs (abfd, stabsect_name, strsect_name)
1800      bfd *abfd;
1801      const char *stabsect_name;
1802      const char *strsect_name;
1803 {
1804   int i;
1805   unsigned file_string_table_offset = 0, next_file_string_table_offset = 0;
1806   bfd_byte *stabp, *stabs_end;
1807
1808   stabp = stabs;
1809   stabs_end = stabp + stab_size;
1810
1811   printf ("Contents of %s section:\n\n", stabsect_name);
1812   printf ("Symnum n_type n_othr n_desc n_value  n_strx String\n");
1813
1814   /* Loop through all symbols and print them.
1815
1816      We start the index at -1 because there is a dummy symbol on
1817      the front of stabs-in-{coff,elf} sections that supplies sizes.  */
1818
1819   for (i = -1; stabp < stabs_end; stabp += STABSIZE, i++)
1820     {
1821       const char *name;
1822       unsigned long strx;
1823       unsigned char type, other;
1824       unsigned short desc;
1825       bfd_vma value;
1826
1827       strx = bfd_h_get_32 (abfd, stabp + STRDXOFF);
1828       type = bfd_h_get_8 (abfd, stabp + TYPEOFF);
1829       other = bfd_h_get_8 (abfd, stabp + OTHEROFF);
1830       desc = bfd_h_get_16 (abfd, stabp + DESCOFF);
1831       value = bfd_h_get_32 (abfd, stabp + VALOFF);
1832
1833       printf ("\n%-6d ", i);
1834       /* Either print the stab name, or, if unnamed, print its number
1835          again (makes consistent formatting for tools like awk). */
1836       name = bfd_get_stab_name (type);
1837       if (name != NULL)
1838         printf ("%-6s", name);
1839       else if (type == N_UNDF)
1840         printf ("HdrSym");
1841       else
1842         printf ("%-6d", type);
1843       printf (" %-6d %-6d ", other, desc);
1844       printf_vma (value);
1845       printf (" %-6lu", strx);
1846
1847       /* Symbols with type == 0 (N_UNDF) specify the length of the
1848          string table associated with this file.  We use that info
1849          to know how to relocate the *next* file's string table indices.  */
1850
1851       if (type == N_UNDF)
1852         {
1853           file_string_table_offset = next_file_string_table_offset;
1854           next_file_string_table_offset += value;
1855         }
1856       else
1857         {
1858           /* Using the (possibly updated) string table offset, print the
1859              string (if any) associated with this symbol.  */
1860
1861           if ((strx + file_string_table_offset) < stabstr_size)
1862             printf (" %s", &strtab[strx + file_string_table_offset]);
1863           else
1864             printf (" *");
1865         }
1866     }
1867   printf ("\n\n");
1868 }
1869
1870 static void
1871 dump_section_stabs (abfd, stabsect_name, strsect_name)
1872      bfd *abfd;
1873      char *stabsect_name;
1874      char *strsect_name;
1875 {
1876   asection *s;
1877
1878   /* Check for section names for which stabsect_name is a prefix, to
1879      handle .stab0, etc.  */
1880   for (s = abfd->sections;
1881        s != NULL;
1882        s = s->next)
1883     {
1884       int len;
1885
1886       len = strlen (stabsect_name);
1887
1888 /* If the prefix matches, and the files section name ends with a nul or a digit,
1889    then we match.  Ie: we want either an exact match or a a section followed by 
1890    a number.  */
1891       if (strncmp (stabsect_name, s->name, len) == 0
1892           && (s->name[len] == '\000' || isdigit (s->name[len])))
1893         {
1894           if (read_section_stabs (abfd, s->name, strsect_name))
1895             {
1896               print_section_stabs (abfd, s->name, strsect_name);
1897               free (stabs);
1898               free (strtab);
1899             }
1900         }
1901     }
1902 }
1903 \f
1904 static void
1905 dump_bfd_header (abfd)
1906      bfd *abfd;
1907 {
1908   char *comma = "";
1909
1910   printf ("architecture: %s, ",
1911           bfd_printable_arch_mach (bfd_get_arch (abfd),
1912                                    bfd_get_mach (abfd)));
1913   printf ("flags 0x%08x:\n", abfd->flags);
1914
1915 #define PF(x, y)    if (abfd->flags & x) {printf("%s%s", comma, y); comma=", ";}
1916   PF (HAS_RELOC, "HAS_RELOC");
1917   PF (EXEC_P, "EXEC_P");
1918   PF (HAS_LINENO, "HAS_LINENO");
1919   PF (HAS_DEBUG, "HAS_DEBUG");
1920   PF (HAS_SYMS, "HAS_SYMS");
1921   PF (HAS_LOCALS, "HAS_LOCALS");
1922   PF (DYNAMIC, "DYNAMIC");
1923   PF (WP_TEXT, "WP_TEXT");
1924   PF (D_PAGED, "D_PAGED");
1925   PF (BFD_IS_RELAXABLE, "BFD_IS_RELAXABLE");
1926   printf ("\nstart address 0x");
1927   printf_vma (abfd->start_address);
1928   printf ("\n");
1929 }
1930 \f
1931 static void
1932 dump_bfd_private_header (abfd)
1933 bfd *abfd;
1934 {
1935   bfd_print_private_bfd_data (abfd, stdout);
1936 }
1937
1938 static void
1939 display_bfd (abfd)
1940      bfd *abfd;
1941 {
1942   char **matching;
1943
1944   if (!bfd_check_format_matches (abfd, bfd_object, &matching))
1945     {
1946       bfd_nonfatal (bfd_get_filename (abfd));
1947       if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1948         {
1949           list_matching_formats (matching);
1950           free (matching);
1951         }
1952       return;
1953     }
1954
1955   /* If we are adjusting section VMA's, change them all now.  Changing
1956      the BFD information is a hack.  However, we must do it, or
1957      bfd_find_nearest_line will not do the right thing.  */
1958   if (adjust_section_vma != 0)
1959     {
1960       asection *s;
1961
1962       for (s = abfd->sections; s != NULL; s = s->next)
1963         {
1964           s->vma += adjust_section_vma;
1965           s->lma += adjust_section_vma;
1966         }
1967     }
1968
1969   printf ("\n%s:     file format %s\n", bfd_get_filename (abfd),
1970           abfd->xvec->name);
1971   if (dump_ar_hdrs)
1972     print_arelt_descr (stdout, abfd, true);
1973   if (dump_file_header)
1974     dump_bfd_header (abfd);
1975   if (dump_private_headers)
1976     dump_bfd_private_header (abfd);
1977   putchar ('\n');
1978   if (dump_section_headers)
1979     dump_headers (abfd);
1980   if (dump_symtab || dump_reloc_info || disassemble || dump_debugging)
1981     {
1982       syms = slurp_symtab (abfd);
1983     }
1984   if (dump_dynamic_symtab || dump_dynamic_reloc_info)
1985     {
1986       dynsyms = slurp_dynamic_symtab (abfd);
1987     }
1988   if (dump_symtab)
1989     dump_symbols (abfd, false);
1990   if (dump_dynamic_symtab)
1991     dump_symbols (abfd, true);
1992   if (dump_stab_section_info)
1993     dump_stabs (abfd);
1994   if (dump_reloc_info && ! disassemble)
1995     dump_relocs (abfd);
1996   if (dump_dynamic_reloc_info)
1997     dump_dynamic_relocs (abfd);
1998   if (dump_section_contents)
1999     dump_data (abfd);
2000   if (disassemble)
2001     disassemble_data (abfd);
2002   if (dump_debugging)
2003     {
2004       PTR dhandle;
2005
2006       dhandle = read_debugging_info (abfd, syms, symcount);
2007       if (dhandle != NULL)
2008         {
2009           if (! print_debugging_info (stdout, dhandle))
2010             fprintf (stderr, "%s: printing debugging information failed\n",
2011                      bfd_get_filename (abfd));
2012         }
2013     }
2014   if (syms)
2015     {
2016       free (syms);
2017       syms = NULL;
2018     }
2019   if (dynsyms)
2020     {
2021       free (dynsyms);
2022       dynsyms = NULL;
2023     }
2024 }
2025
2026 static void
2027 display_file (filename, target)
2028      char *filename;
2029      char *target;
2030 {
2031   bfd *file, *arfile = (bfd *) NULL;
2032
2033   file = bfd_openr (filename, target);
2034   if (file == NULL)
2035     {
2036       bfd_nonfatal (filename);
2037       return;
2038     }
2039
2040   if (bfd_check_format (file, bfd_archive) == true)
2041     {
2042       bfd *last_arfile = NULL;
2043
2044       printf ("In archive %s:\n", bfd_get_filename (file));
2045       for (;;)
2046         {
2047           bfd_set_error (bfd_error_no_error);
2048
2049           arfile = bfd_openr_next_archived_file (file, arfile);
2050           if (arfile == NULL)
2051             {
2052               if (bfd_get_error () != bfd_error_no_more_archived_files)
2053                 {
2054                   bfd_nonfatal (bfd_get_filename (file));
2055                 }
2056               break;
2057             }
2058
2059           display_bfd (arfile);
2060
2061           if (last_arfile != NULL)
2062             bfd_close (last_arfile);
2063           last_arfile = arfile;
2064         }
2065
2066       if (last_arfile != NULL)
2067         bfd_close (last_arfile);
2068     }
2069   else
2070     display_bfd (file);
2071
2072   bfd_close (file);
2073 }
2074 \f
2075 /* Actually display the various requested regions */
2076
2077 static void
2078 dump_data (abfd)
2079      bfd *abfd;
2080 {
2081   asection *section;
2082   bfd_byte *data = 0;
2083   bfd_size_type datasize = 0;
2084   bfd_size_type i;
2085   bfd_size_type start, stop;
2086
2087   for (section = abfd->sections; section != NULL; section =
2088        section->next)
2089     {
2090       int onaline = 16;
2091
2092       if (only == (char *) NULL ||
2093           strcmp (only, section->name) == 0)
2094         {
2095           if (section->flags & SEC_HAS_CONTENTS)
2096             {
2097               printf ("Contents of section %s:\n", section->name);
2098
2099               if (bfd_section_size (abfd, section) == 0)
2100                 continue;
2101               data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
2102               datasize = bfd_section_size (abfd, section);
2103
2104
2105               bfd_get_section_contents (abfd, section, (PTR) data, 0, bfd_section_size (abfd, section));
2106
2107               if (start_address == (bfd_vma) -1
2108                   || start_address < section->vma)
2109                 start = 0;
2110               else
2111                 start = start_address - section->vma;
2112               if (stop_address == (bfd_vma) -1)
2113                 stop = bfd_section_size (abfd, section);
2114               else
2115                 {
2116                   if (stop_address < section->vma)
2117                     stop = 0;
2118                   else
2119                     stop = stop_address - section->vma;
2120                   if (stop > bfd_section_size (abfd, section))
2121                     stop = bfd_section_size (abfd, section);
2122                 }
2123               for (i = start; i < stop; i += onaline)
2124                 {
2125                   bfd_size_type j;
2126
2127                   printf (" %04lx ", (unsigned long int) (i + section->vma));
2128                   for (j = i; j < i + onaline; j++)
2129                     {
2130                       if (j < stop)
2131                         printf ("%02x", (unsigned) (data[j]));
2132                       else
2133                         printf ("  ");
2134                       if ((j & 3) == 3)
2135                         printf (" ");
2136                     }
2137
2138                   printf (" ");
2139                   for (j = i; j < i + onaline; j++)
2140                     {
2141                       if (j >= stop)
2142                         printf (" ");
2143                       else
2144                         printf ("%c", isprint (data[j]) ? data[j] : '.');
2145                     }
2146                   putchar ('\n');
2147                 }
2148               free (data);
2149             }
2150         }
2151     }
2152 }
2153
2154 /* Should perhaps share code and display with nm? */
2155 static void
2156 dump_symbols (abfd, dynamic)
2157      bfd *abfd;
2158      boolean dynamic;
2159 {
2160   asymbol **current;
2161   long max;
2162   long count;
2163
2164   if (dynamic)
2165     {
2166       current = dynsyms;
2167       max = dynsymcount;
2168       if (max == 0)
2169         return;
2170       printf ("DYNAMIC SYMBOL TABLE:\n");
2171     }
2172   else
2173     {
2174       current = syms;
2175       max = symcount;
2176       if (max == 0)
2177         return;
2178       printf ("SYMBOL TABLE:\n");
2179     }
2180
2181   for (count = 0; count < max; count++)
2182     {
2183       if (*current)
2184         {
2185           bfd *cur_bfd = bfd_asymbol_bfd (*current);
2186
2187           if (cur_bfd != NULL)
2188             {
2189               const char *name;
2190               char *alloc;
2191
2192               name = bfd_asymbol_name (*current);
2193               alloc = NULL;
2194               if (do_demangle && name != NULL && *name != '\0')
2195                 {
2196                   const char *n;
2197
2198                   /* If we want to demangle the name, we demangle it
2199                      here, and temporarily clobber it while calling
2200                      bfd_print_symbol.  FIXME: This is a gross hack.  */
2201
2202                   n = name;
2203                   if (bfd_get_symbol_leading_char (cur_bfd) == *n)
2204                     ++n;
2205                   alloc = cplus_demangle (n, DMGL_ANSI | DMGL_PARAMS);
2206                   if (alloc != NULL)
2207                     (*current)->name = alloc;
2208                   else
2209                     (*current)->name = n;
2210                 }
2211
2212               bfd_print_symbol (cur_bfd, stdout, *current,
2213                                 bfd_print_symbol_all);
2214
2215               (*current)->name = name;
2216               if (alloc != NULL)
2217                 free (alloc);
2218
2219               printf ("\n");
2220             }
2221         }
2222       current++;
2223     }
2224   printf ("\n");
2225   printf ("\n");
2226 }
2227
2228 static void
2229 dump_relocs (abfd)
2230      bfd *abfd;
2231 {
2232   arelent **relpp;
2233   long relcount;
2234   asection *a;
2235
2236   for (a = abfd->sections; a != (asection *) NULL; a = a->next)
2237     {
2238       long relsize;
2239
2240       if (bfd_is_abs_section (a))
2241         continue;
2242       if (bfd_is_und_section (a))
2243         continue;
2244       if (bfd_is_com_section (a))
2245         continue;
2246
2247       if (only)
2248         {
2249           if (strcmp (only, a->name))
2250             continue;
2251         }
2252       else if ((a->flags & SEC_RELOC) == 0)
2253         continue;
2254
2255       relsize = bfd_get_reloc_upper_bound (abfd, a);
2256       if (relsize < 0)
2257         bfd_fatal (bfd_get_filename (abfd));
2258
2259       printf ("RELOCATION RECORDS FOR [%s]:", a->name);
2260
2261       if (relsize == 0)
2262         {
2263           printf (" (none)\n\n");
2264         }
2265       else
2266         {
2267           relpp = (arelent **) xmalloc (relsize);
2268           relcount = bfd_canonicalize_reloc (abfd, a, relpp, syms);
2269           if (relcount < 0)
2270             bfd_fatal (bfd_get_filename (abfd));
2271           else if (relcount == 0)
2272             {
2273               printf (" (none)\n\n");
2274             }
2275           else
2276             {
2277               printf ("\n");
2278               dump_reloc_set (abfd, a, relpp, relcount);
2279               printf ("\n\n");
2280             }
2281           free (relpp);
2282         }
2283     }
2284 }
2285
2286 static void
2287 dump_dynamic_relocs (abfd)
2288      bfd *abfd;
2289 {
2290   long relsize;
2291   arelent **relpp;
2292   long relcount;
2293
2294   relsize = bfd_get_dynamic_reloc_upper_bound (abfd);
2295   if (relsize < 0)
2296     bfd_fatal (bfd_get_filename (abfd));
2297
2298   printf ("DYNAMIC RELOCATION RECORDS");
2299
2300   if (relsize == 0)
2301     {
2302       printf (" (none)\n\n");
2303     }
2304   else
2305     {
2306       relpp = (arelent **) xmalloc (relsize);
2307       relcount = bfd_canonicalize_dynamic_reloc (abfd, relpp, dynsyms);
2308       if (relcount < 0)
2309         bfd_fatal (bfd_get_filename (abfd));
2310       else if (relcount == 0)
2311         {
2312           printf (" (none)\n\n");
2313         }
2314       else
2315         {
2316           printf ("\n");
2317           dump_reloc_set (abfd, (asection *) NULL, relpp, relcount);
2318           printf ("\n\n");
2319         }
2320       free (relpp);
2321     }
2322 }
2323
2324 static void
2325 dump_reloc_set (abfd, sec, relpp, relcount)
2326      bfd *abfd;
2327      asection *sec;
2328      arelent **relpp;
2329      long relcount;
2330 {
2331   arelent **p;
2332   char *last_filename, *last_functionname;
2333   unsigned int last_line;
2334
2335   /* Get column headers lined up reasonably.  */
2336   {
2337     static int width;
2338     if (width == 0)
2339       {
2340         char buf[30];
2341         sprintf_vma (buf, (bfd_vma) -1);
2342         width = strlen (buf) - 7;
2343       }
2344     printf ("OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
2345   }
2346
2347   last_filename = NULL;
2348   last_functionname = NULL;
2349   last_line = 0;
2350
2351   for (p = relpp; relcount && *p != (arelent *) NULL; p++, relcount--)
2352     {
2353       arelent *q = *p;
2354       const char *filename, *functionname;
2355       unsigned int line;
2356       const char *sym_name;
2357       const char *section_name;
2358
2359       if (start_address != (bfd_vma) -1
2360           && q->address < start_address)
2361         continue;
2362       if (stop_address != (bfd_vma) -1
2363           && q->address > stop_address)
2364         continue;
2365
2366       if (with_line_numbers
2367           && sec != NULL
2368           && bfd_find_nearest_line (abfd, sec, syms, q->address,
2369                                     &filename, &functionname, &line))
2370         {
2371           if (functionname != NULL
2372               && (last_functionname == NULL
2373                   || strcmp (functionname, last_functionname) != 0))
2374             {
2375               printf ("%s():\n", functionname);
2376               if (last_functionname != NULL)
2377                 free (last_functionname);
2378               last_functionname = xstrdup (functionname);
2379             }
2380           if (line > 0
2381               && (line != last_line
2382                   || (filename != NULL
2383                       && last_filename != NULL
2384                       && strcmp (filename, last_filename) != 0)))
2385             {
2386               printf ("%s:%u\n", filename == NULL ? "???" : filename, line);
2387               last_line = line;
2388               if (last_filename != NULL)
2389                 free (last_filename);
2390               if (filename == NULL)
2391                 last_filename = NULL;
2392               else
2393                 last_filename = xstrdup (filename);
2394             }
2395         }
2396
2397       if (q->sym_ptr_ptr && *q->sym_ptr_ptr)
2398         {
2399           sym_name = (*(q->sym_ptr_ptr))->name;
2400           section_name = (*(q->sym_ptr_ptr))->section->name;
2401         }
2402       else
2403         {
2404           sym_name = NULL;
2405           section_name = NULL;
2406         }
2407       if (sym_name)
2408         {
2409           printf_vma (q->address);
2410           printf (" %-16s  ", q->howto->name);
2411           objdump_print_symname (abfd, (struct disassemble_info *) NULL,
2412                                  *q->sym_ptr_ptr);
2413         }
2414       else
2415         {
2416           if (section_name == (CONST char *) NULL)
2417             section_name = "*unknown*";
2418           printf_vma (q->address);
2419           printf (" %-16s  [%s]",
2420                   q->howto->name,
2421                   section_name);
2422         }
2423       if (q->addend)
2424         {
2425           printf ("+0x");
2426           printf_vma (q->addend);
2427         }
2428       printf ("\n");
2429     }
2430 }
2431 \f
2432 /* The length of the longest architecture name + 1.  */
2433 #define LONGEST_ARCH sizeof("rs6000:6000")
2434
2435 static const char *
2436 endian_string (endian)
2437      enum bfd_endian endian;
2438 {
2439   if (endian == BFD_ENDIAN_BIG)
2440     return "big endian";
2441   else if (endian == BFD_ENDIAN_LITTLE)
2442     return "little endian";
2443   else
2444     return "endianness unknown";
2445 }
2446
2447 /* List the targets that BFD is configured to support, each followed
2448    by its endianness and the architectures it supports.  */
2449
2450 static void
2451 display_target_list ()
2452 {
2453   extern bfd_target *bfd_target_vector[];
2454   char *dummy_name;
2455   int t;
2456
2457   dummy_name = choose_temp_base ();
2458   for (t = 0; bfd_target_vector[t]; t++)
2459     {
2460       bfd_target *p = bfd_target_vector[t];
2461       bfd *abfd = bfd_openw (dummy_name, p->name);
2462       int a;
2463
2464       printf ("%s\n (header %s, data %s)\n", p->name,
2465               endian_string (p->header_byteorder),
2466               endian_string (p->byteorder));
2467
2468       if (abfd == NULL)
2469         {
2470           bfd_nonfatal (dummy_name);
2471           continue;
2472         }
2473
2474       if (! bfd_set_format (abfd, bfd_object))
2475         {
2476           if (bfd_get_error () != bfd_error_invalid_operation)
2477             bfd_nonfatal (p->name);
2478           continue;
2479         }
2480
2481       for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2482         if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
2483           printf ("  %s\n",
2484                   bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
2485     }
2486   unlink (dummy_name);
2487   free (dummy_name);
2488 }
2489
2490 /* Print a table showing which architectures are supported for entries
2491    FIRST through LAST-1 of bfd_target_vector (targets across,
2492    architectures down).  */
2493
2494 static void
2495 display_info_table (first, last)
2496      int first;
2497      int last;
2498 {
2499   extern bfd_target *bfd_target_vector[];
2500   int t, a;
2501   char *dummy_name;
2502
2503   /* Print heading of target names.  */
2504   printf ("\n%*s", (int) LONGEST_ARCH, " ");
2505   for (t = first; t < last && bfd_target_vector[t]; t++)
2506     printf ("%s ", bfd_target_vector[t]->name);
2507   putchar ('\n');
2508
2509   dummy_name = choose_temp_base ();
2510   for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
2511     if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
2512       {
2513         printf ("%*s ", (int) LONGEST_ARCH - 1,
2514                 bfd_printable_arch_mach (a, 0));
2515         for (t = first; t < last && bfd_target_vector[t]; t++)
2516           {
2517             bfd_target *p = bfd_target_vector[t];
2518             boolean ok = true;
2519             bfd *abfd = bfd_openw (dummy_name, p->name);
2520
2521             if (abfd == NULL)
2522               {
2523                 bfd_nonfatal (p->name);
2524                 ok = false;
2525               }
2526
2527             if (ok)
2528               {
2529                 if (! bfd_set_format (abfd, bfd_object))
2530                   {
2531                     if (bfd_get_error () != bfd_error_invalid_operation)
2532                       bfd_nonfatal (p->name);
2533                     ok = false;
2534                   }
2535               }
2536
2537             if (ok)
2538               {
2539                 if (! bfd_set_arch_mach (abfd, a, 0))
2540                   ok = false;
2541               }
2542
2543             if (ok)
2544               printf ("%s ", p->name);
2545             else
2546               {
2547                 int l = strlen (p->name);
2548                 while (l--)
2549                   putchar ('-');
2550                 putchar (' ');
2551               }
2552           }
2553         putchar ('\n');
2554       }
2555   unlink (dummy_name);
2556   free (dummy_name);
2557 }
2558
2559 /* Print tables of all the target-architecture combinations that
2560    BFD has been configured to support.  */
2561
2562 static void
2563 display_target_tables ()
2564 {
2565   int t, columns;
2566   extern bfd_target *bfd_target_vector[];
2567   char *colum;
2568
2569   columns = 0;
2570   colum = getenv ("COLUMNS");
2571   if (colum != NULL)
2572     columns = atoi (colum);
2573   if (columns == 0)
2574     columns = 80;
2575
2576   t = 0;
2577   while (bfd_target_vector[t] != NULL)
2578     {
2579       int oldt = t, wid;
2580
2581       wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
2582       ++t;
2583       while (wid < columns && bfd_target_vector[t] != NULL)
2584         {
2585           int newwid;
2586
2587           newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
2588           if (newwid >= columns)
2589             break;
2590           wid = newwid;
2591           ++t;
2592         }
2593       display_info_table (oldt, t);
2594     }
2595 }
2596
2597 static void
2598 display_info ()
2599 {
2600   printf ("BFD header file version %s\n", BFD_VERSION);
2601   display_target_list ();
2602   display_target_tables ();
2603 }
2604
2605 int
2606 main (argc, argv)
2607      int argc;
2608      char **argv;
2609 {
2610   int c;
2611   char *target = default_target;
2612   boolean seenflag = false;
2613
2614   program_name = *argv;
2615   xmalloc_set_program_name (program_name);
2616
2617   START_PROGRESS (program_name, 0);
2618
2619   bfd_init ();
2620   set_default_bfd_target ();
2621
2622   while ((c = getopt_long (argc, argv, "pib:m:VCdDlfahrRtTxsSj:wE:",
2623                            long_options, (int *) 0))
2624          != EOF)
2625     {
2626       if (c != 'l' && c != OPTION_START_ADDRESS && c != OPTION_STOP_ADDRESS)
2627         seenflag = true;
2628       switch (c)
2629         {
2630         case 0:
2631           break;                /* we've been given a long option */
2632         case 'm':
2633           machine = optarg;
2634           break;
2635         case 'j':
2636           only = optarg;
2637           break;
2638         case 'l':
2639           with_line_numbers = 1;
2640           break;
2641         case 'b':
2642           target = optarg;
2643           break;
2644         case 'f':
2645           dump_file_header = true;
2646           break;
2647         case 'i':
2648           formats_info = true;
2649           break;
2650         case 'p':
2651           dump_private_headers = 1;
2652           break;
2653         case 'x':
2654           dump_private_headers = 1;
2655           dump_symtab = 1;
2656           dump_reloc_info = 1;
2657           dump_file_header = true;
2658           dump_ar_hdrs = 1;
2659           dump_section_headers = 1;
2660           break;
2661         case 't':
2662           dump_symtab = 1;
2663           break;
2664         case 'T':
2665           dump_dynamic_symtab = 1;
2666           break;
2667         case 'C':
2668           do_demangle = 1;
2669           break;
2670         case 'd':
2671           disassemble = true;
2672           break;
2673         case 'D':
2674           disassemble = disassemble_all = true;
2675           break;
2676         case 'S':
2677           disassemble = true;
2678           with_source_code = true;
2679           break;
2680         case 's':
2681           dump_section_contents = 1;
2682           break;
2683         case 'r':
2684           dump_reloc_info = 1;
2685           break;
2686         case 'R':
2687           dump_dynamic_reloc_info = 1;
2688           break;
2689         case 'a':
2690           dump_ar_hdrs = 1;
2691           break;
2692         case 'h':
2693           dump_section_headers = 1;
2694           break;
2695         case 'H':
2696           usage (stdout, 0);
2697         case 'V':
2698           show_version = 1;
2699           break;
2700         case 'w':
2701           wide_output = 1;
2702           break;
2703         case OPTION_ADJUST_VMA:
2704           adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2705           break;
2706         case OPTION_START_ADDRESS:
2707           start_address = parse_vma (optarg, "--start-address");
2708           break;
2709         case OPTION_STOP_ADDRESS:
2710           stop_address = parse_vma (optarg, "--stop-address");
2711           break;
2712         case 'E':
2713           if (strcmp (optarg, "B") == 0)
2714             endian = BFD_ENDIAN_BIG;
2715           else if (strcmp (optarg, "L") == 0)
2716             endian = BFD_ENDIAN_LITTLE;
2717           else
2718             {
2719               fprintf (stderr, "%s: unrecognized -E option\n", program_name);
2720               usage (stderr, 1);
2721             }
2722           break;
2723         case OPTION_ENDIAN:
2724           if (strncmp (optarg, "big", strlen (optarg)) == 0)
2725             endian = BFD_ENDIAN_BIG;
2726           else if (strncmp (optarg, "little", strlen (optarg)) == 0)
2727             endian = BFD_ENDIAN_LITTLE;
2728           else
2729             {
2730               fprintf (stderr, "%s: unrecognized --endian type `%s'\n",
2731                       program_name, optarg);
2732               usage (stderr, 1);
2733             }
2734           break;
2735         default:
2736           usage (stderr, 1);
2737         }
2738     }
2739
2740   if (show_version)
2741     print_version ("objdump");
2742
2743   if (seenflag == false)
2744     usage (stderr, 1);
2745
2746   if (formats_info)
2747     {
2748       display_info ();
2749     }
2750   else
2751     {
2752       if (optind == argc)
2753         display_file ("a.out", target);
2754       else
2755         for (; optind < argc;)
2756           display_file (argv[optind++], target);
2757     }
2758
2759   END_PROGRESS (program_name);
2760
2761   return 0;
2762 }