1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include "aout/stab_gnu.h"
27 #include "aout/ranlib.h"
29 #include "libiberty.h"
31 /* When sorting by size, we use this structure to hold the size and a
32 pointer to the minisymbol. */
40 /* When fetching relocs, we use this structure to pass information to
43 struct get_relocs_info
52 usage
PARAMS ((FILE *, int));
55 set_print_radix
PARAMS ((char *));
58 set_output_format
PARAMS ((char *));
61 display_archive
PARAMS ((bfd
*));
64 display_file
PARAMS ((char *filename
));
67 display_rel_file
PARAMS ((bfd
* file
, bfd
* archive
));
70 filter_symbols
PARAMS ((bfd
*, boolean
, PTR
, long, unsigned int));
73 sort_symbols_by_size
PARAMS ((bfd
*, boolean
, PTR
, long, unsigned int,
77 print_symbols
PARAMS ((bfd
*, boolean
, PTR
, long, unsigned int, bfd
*));
80 print_size_symbols
PARAMS ((bfd
*, boolean
, struct size_sym
*, long, bfd
*));
83 print_symname
PARAMS ((const char *, const char *, bfd
*));
86 print_symbol
PARAMS ((bfd
*, asymbol
*, bfd
*));
89 print_symdef_entry
PARAMS ((bfd
* abfd
));
91 /* The sorting functions. */
94 numeric_forward
PARAMS ((const PTR
, const PTR
));
97 numeric_reverse
PARAMS ((const PTR
, const PTR
));
100 non_numeric_forward
PARAMS ((const PTR
, const PTR
));
103 non_numeric_reverse
PARAMS ((const PTR
, const PTR
));
106 size_forward1
PARAMS ((const PTR
, const PTR
));
109 size_forward2
PARAMS ((const PTR
, const PTR
));
111 /* The output formatting functions. */
114 print_object_filename_bsd
PARAMS ((char *filename
));
117 print_object_filename_sysv
PARAMS ((char *filename
));
120 print_object_filename_posix
PARAMS ((char *filename
));
124 print_archive_filename_bsd
PARAMS ((char *filename
));
127 print_archive_filename_sysv
PARAMS ((char *filename
));
130 print_archive_filename_posix
PARAMS ((char *filename
));
134 print_archive_member_bsd
PARAMS ((char *archive
, CONST
char *filename
));
137 print_archive_member_sysv
PARAMS ((char *archive
, CONST
char *filename
));
140 print_archive_member_posix
PARAMS ((char *archive
, CONST
char *filename
));
144 print_symbol_filename_bsd
PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
147 print_symbol_filename_sysv
PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
150 print_symbol_filename_posix
PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
154 print_value
PARAMS ((bfd_vma
));
157 print_symbol_info_bsd
PARAMS ((symbol_info
* info
, bfd
* abfd
));
160 print_symbol_info_sysv
PARAMS ((symbol_info
* info
, bfd
* abfd
));
163 print_symbol_info_posix
PARAMS ((symbol_info
* info
, bfd
* abfd
));
166 get_relocs
PARAMS ((bfd
*, asection
*, PTR
));
168 /* Support for different output formats. */
171 /* Print the name of an object file given on the command line. */
172 void (*print_object_filename
) PARAMS ((char *filename
));
174 /* Print the name of an archive file given on the command line. */
175 void (*print_archive_filename
) PARAMS ((char *filename
));
177 /* Print the name of an archive member file. */
178 void (*print_archive_member
) PARAMS ((char *archive
, CONST
char *filename
));
180 /* Print the name of the file (and archive, if there is one)
181 containing a symbol. */
182 void (*print_symbol_filename
) PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
184 /* Print a line of information about a symbol. */
185 void (*print_symbol_info
) PARAMS ((symbol_info
* info
, bfd
* abfd
));
187 static struct output_fns formats
[] =
189 {print_object_filename_bsd
,
190 print_archive_filename_bsd
,
191 print_archive_member_bsd
,
192 print_symbol_filename_bsd
,
193 print_symbol_info_bsd
},
194 {print_object_filename_sysv
,
195 print_archive_filename_sysv
,
196 print_archive_member_sysv
,
197 print_symbol_filename_sysv
,
198 print_symbol_info_sysv
},
199 {print_object_filename_posix
,
200 print_archive_filename_posix
,
201 print_archive_member_posix
,
202 print_symbol_filename_posix
,
203 print_symbol_info_posix
}
206 /* Indices in `formats'. */
208 #define FORMAT_SYSV 1
209 #define FORMAT_POSIX 2
210 #define FORMAT_DEFAULT FORMAT_BSD
212 /* The output format to use. */
213 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
216 /* Command options. */
218 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
219 static int external_only
= 0; /* print external symbols only */
220 static int defined_only
= 0; /* Print defined symbols only */
221 static int no_sort
= 0; /* don't sort; print syms in order found */
222 static int print_debug_syms
= 0; /* print debugger-only symbols too */
223 static int print_armap
= 0; /* describe __.SYMDEF data in archive files. */
224 static int reverse_sort
= 0; /* sort in downward(alpha or numeric) order */
225 static int sort_numerically
= 0; /* sort in numeric rather than alpha order */
226 static int sort_by_size
= 0; /* sort by size of symbol */
227 static int undefined_only
= 0; /* print undefined symbols only */
228 static int dynamic
= 0; /* print dynamic symbols. */
229 static int show_version
= 0; /* show the version number */
230 static int show_stats
= 0; /* show statistics */
231 static int line_numbers
= 0; /* print line numbers for symbols */
233 /* When to print the names of files. Not mutually exclusive in SYSV format. */
234 static int filename_per_file
= 0; /* Once per file, on its own line. */
235 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
237 /* Print formats for printing a symbol value. */
239 static char value_format
[] = "%08lx";
241 #if BFD_HOST_64BIT_LONG
242 static char value_format
[] = "%016lx";
244 /* We don't use value_format for this case. */
247 static int print_radix
= 16;
248 /* Print formats for printing stab info. */
249 static char other_format
[] = "%02x";
250 static char desc_format
[] = "%04x";
252 static char *target
= NULL
;
254 /* Used to cache the line numbers for a BFD. */
255 static bfd
*lineno_cache_bfd
;
256 static bfd
*lineno_cache_rel_bfd
;
258 static struct option long_options
[] =
260 {"debug-syms", no_argument
, &print_debug_syms
, 1},
261 {"demangle", no_argument
, &do_demangle
, 1},
262 {"dynamic", no_argument
, &dynamic
, 1},
263 {"extern-only", no_argument
, &external_only
, 1},
264 {"format", required_argument
, 0, 'f'},
265 {"help", no_argument
, 0, 'h'},
266 {"line-numbers", no_argument
, 0, 'l'},
267 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
268 {"no-demangle", no_argument
, &do_demangle
, 0},
269 {"no-sort", no_argument
, &no_sort
, 1},
270 {"numeric-sort", no_argument
, &sort_numerically
, 1},
271 {"portability", no_argument
, 0, 'P'},
272 {"print-armap", no_argument
, &print_armap
, 1},
273 {"print-file-name", no_argument
, 0, 'o'},
274 {"radix", required_argument
, 0, 't'},
275 {"reverse-sort", no_argument
, &reverse_sort
, 1},
276 {"size-sort", no_argument
, &sort_by_size
, 1},
277 {"stats", no_argument
, &show_stats
, 1},
278 {"target", required_argument
, 0, 200},
279 {"defined-only", no_argument
, &defined_only
, 1},
280 {"undefined-only", no_argument
, &undefined_only
, 1},
281 {"version", no_argument
, &show_version
, 1},
282 {0, no_argument
, 0, 0}
285 /* Some error-reporting functions */
288 usage (stream
, status
)
292 fprintf (stream
, _("\
293 Usage: %s [-aABCDglnopPrsuvV] [-t radix] [--radix=radix] [--target=bfdname]\n\
294 [--debug-syms] [--extern-only] [--print-armap] [--print-file-name]\n\
295 [--numeric-sort] [--no-sort] [--reverse-sort] [--size-sort]\n\
296 [--undefined-only] [--portability] [-f {bsd,sysv,posix}]\n\
297 [--format={bsd,sysv,posix}] [--demangle] [--no-demangle] [--dynamic]\n\
298 [--defined-only] [--line-numbers]\n\
299 [--version] [--help]\n\
302 list_supported_targets (program_name
, stream
);
304 fprintf (stream
, _("Report bugs to bug-gnu-utils@gnu.org\n"));
308 /* Set the radix for the symbol value and size according to RADIX. */
311 set_print_radix (radix
)
325 value_format
[4] = *radix
;
327 #if BFD_HOST_64BIT_LONG
328 value_format
[5] = *radix
;
330 /* This case requires special handling for octal and decimal
334 other_format
[3] = desc_format
[3] = *radix
;
337 fprintf (stderr
, _("%s: %s: invalid radix\n"), program_name
, radix
);
343 set_output_format (f
)
363 fprintf (stderr
, _("%s: %s: invalid output format\n"), program_name
, f
);
366 format
= &formats
[i
];
377 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
378 setlocale (LC_MESSAGES
, "");
380 bindtextdomain (PACKAGE
, LOCALEDIR
);
381 textdomain (PACKAGE
);
383 program_name
= *argv
;
384 xmalloc_set_program_name (program_name
);
386 START_PROGRESS (program_name
, 0);
389 set_default_bfd_target ();
391 while ((c
= getopt_long (argc
, argv
, "aABCDef:glnopPrst:uvV", long_options
, (int *) 0)) != EOF
)
396 print_debug_syms
= 1;
400 filename_per_symbol
= 1;
402 case 'B': /* For MIPS compatibility. */
403 set_output_format ("bsd");
412 /* Ignored for HP/UX compatibility. */
415 set_output_format (optarg
);
427 sort_numerically
= 1;
433 set_output_format ("posix");
442 set_print_radix (optarg
);
451 case 200: /* --target */
455 case 0: /* A long option that just sets a flag. */
464 print_version ("nm");
466 /* OK, all options now parsed. If no filename specified, do a.out. */
468 return !display_file ("a.out");
472 if (argc
- optind
> 1)
473 filename_per_file
= 1;
475 /* We were given several filenames to do. */
476 while (optind
< argc
)
479 if (!display_file (argv
[optind
++]))
483 END_PROGRESS (program_name
);
488 char *lim
= (char *) sbrk (0);
490 fprintf (stderr
, _("%s: data size %ld\n"), program_name
,
491 (long) (lim
- (char *) &environ
));
500 display_archive (file
)
504 bfd
*last_arfile
= NULL
;
507 (*format
->print_archive_filename
) (bfd_get_filename (file
));
510 print_symdef_entry (file
);
516 arfile
= bfd_openr_next_archived_file (file
, arfile
);
520 if (bfd_get_error () != bfd_error_no_more_archived_files
)
521 bfd_fatal (bfd_get_filename (file
));
525 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
527 (*format
->print_archive_member
) (bfd_get_filename (file
),
528 bfd_get_filename (arfile
));
529 display_rel_file (arfile
, file
);
533 bfd_nonfatal (bfd_get_filename (arfile
));
534 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
536 list_matching_formats (matching
);
541 if (last_arfile
!= NULL
)
543 bfd_close (last_arfile
);
544 lineno_cache_bfd
= NULL
;
545 lineno_cache_rel_bfd
= NULL
;
547 last_arfile
= arfile
;
550 if (last_arfile
!= NULL
)
552 bfd_close (last_arfile
);
553 lineno_cache_bfd
= NULL
;
554 lineno_cache_rel_bfd
= NULL
;
559 display_file (filename
)
562 boolean retval
= true;
566 file
= bfd_openr (filename
, target
);
569 bfd_nonfatal (filename
);
573 if (bfd_check_format (file
, bfd_archive
))
575 display_archive (file
);
577 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
579 (*format
->print_object_filename
) (filename
);
580 display_rel_file (file
, NULL
);
584 bfd_nonfatal (filename
);
585 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
587 list_matching_formats (matching
);
593 if (bfd_close (file
) == false)
594 bfd_fatal (filename
);
596 lineno_cache_bfd
= NULL
;
597 lineno_cache_rel_bfd
= NULL
;
602 /* These globals are used to pass information into the sorting
604 static bfd
*sort_bfd
;
605 static boolean sort_dynamic
;
606 static asymbol
*sort_x
;
607 static asymbol
*sort_y
;
609 /* Symbol-sorting predicates */
610 #define valueof(x) ((x)->section->vma + (x)->value)
612 /* Numeric sorts. Undefined symbols are always considered "less than"
613 defined symbols with zero values. Common symbols are not treated
614 specially -- i.e., their sizes are used as their "values". */
617 numeric_forward (P_x
, P_y
)
624 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
625 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
626 if (x
== NULL
|| y
== NULL
)
627 bfd_fatal (bfd_get_filename (sort_bfd
));
629 xs
= bfd_get_section (x
);
630 ys
= bfd_get_section (y
);
632 if (bfd_is_und_section (xs
))
634 if (! bfd_is_und_section (ys
))
637 else if (bfd_is_und_section (ys
))
639 else if (valueof (x
) != valueof (y
))
640 return valueof (x
) < valueof (y
) ? -1 : 1;
642 return non_numeric_forward (P_x
, P_y
);
646 numeric_reverse (x
, y
)
650 return - numeric_forward (x
, y
);
654 non_numeric_forward (P_x
, P_y
)
661 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
662 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
663 if (x
== NULL
|| y
== NULL
)
664 bfd_fatal (bfd_get_filename (sort_bfd
));
666 xn
= bfd_asymbol_name (x
);
667 yn
= bfd_asymbol_name (y
);
669 return ((xn
== NULL
) ? ((yn
== NULL
) ? 0 : -1) :
670 ((yn
== NULL
) ? 1 : strcmp (xn
, yn
)));
674 non_numeric_reverse (x
, y
)
678 return - non_numeric_forward (x
, y
);
681 static int (*(sorters
[2][2])) PARAMS ((const PTR
, const PTR
)) =
683 { non_numeric_forward
, non_numeric_reverse
},
684 { numeric_forward
, numeric_reverse
}
687 /* This sort routine is used by sort_symbols_by_size. It is similar
688 to numeric_forward, but when symbols have the same value it sorts
689 by section VMA. This simplifies the sort_symbols_by_size code
690 which handles symbols at the end of sections. Also, this routine
691 tries to sort file names before other symbols with the same value.
692 That will make the file name have a zero size, which will make
693 sort_symbols_by_size choose the non file name symbol, leading to
694 more meaningful output. For similar reasons, this code sorts
695 gnu_compiled_* and gcc2_compiled before other symbols with the same
699 size_forward1 (P_x
, P_y
)
709 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
710 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
711 if (x
== NULL
|| y
== NULL
)
712 bfd_fatal (bfd_get_filename (sort_bfd
));
714 xs
= bfd_get_section (x
);
715 ys
= bfd_get_section (y
);
717 if (bfd_is_und_section (xs
))
719 if (bfd_is_und_section (ys
))
722 if (valueof (x
) != valueof (y
))
723 return valueof (x
) < valueof (y
) ? -1 : 1;
725 if (xs
->vma
!= ys
->vma
)
726 return xs
->vma
< ys
->vma
? -1 : 1;
728 xn
= bfd_asymbol_name (x
);
729 yn
= bfd_asymbol_name (y
);
733 /* The symbols gnu_compiled and gcc2_compiled convey even less
734 information than the file name, so sort them out first. */
736 xf
= (strstr (xn
, "gnu_compiled") != NULL
737 || strstr (xn
, "gcc2_compiled") != NULL
);
738 yf
= (strstr (yn
, "gnu_compiled") != NULL
739 || strstr (yn
, "gcc2_compiled") != NULL
);
746 /* We use a heuristic for the file name. It may not work on non
747 Unix systems, but it doesn't really matter; the only difference
748 is precisely which symbol names get printed. */
750 #define file_symbol(s, sn, snl) \
751 (((s)->flags & BSF_FILE) != 0 \
752 || ((sn)[(snl) - 2] == '.' \
753 && ((sn)[(snl) - 1] == 'o' \
754 || (sn)[(snl) - 1] == 'a')))
756 xf
= file_symbol (x
, xn
, xnl
);
757 yf
= file_symbol (y
, yn
, ynl
);
764 return non_numeric_forward (P_x
, P_y
);
767 /* This sort routine is used by sort_symbols_by_size. It is sorting
768 an array of size_sym structures into size order. */
771 size_forward2 (P_x
, P_y
)
775 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
776 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
778 if (x
->size
< y
->size
)
779 return reverse_sort
? 1 : -1;
780 else if (x
->size
> y
->size
)
781 return reverse_sort
? -1 : 1;
783 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
786 /* Sort the symbols by size. We guess the size by assuming that the
787 difference between the address of a symbol and the address of the
788 next higher symbol is the size. FIXME: ELF actually stores a size
789 with each symbol. We should use it. */
792 sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
, size
, symsizesp
)
798 struct size_sym
**symsizesp
;
800 struct size_sym
*symsizes
;
801 bfd_byte
*from
, *fromend
;
803 asymbol
*store_sym
, *store_next
;
805 qsort (minisyms
, symcount
, size
, size_forward1
);
807 /* We are going to return a special set of symbols and sizes to
809 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
810 *symsizesp
= symsizes
;
812 /* Note that filter_symbols has already removed all absolute and
813 undefined symbols. Here we remove all symbols whose size winds
816 from
= (bfd_byte
*) minisyms
;
817 fromend
= from
+ symcount
* size
;
824 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
,
827 bfd_fatal (bfd_get_filename (abfd
));
830 for (; from
< fromend
; from
+= size
)
837 if (from
+ size
< fromend
)
839 next
= bfd_minisymbol_to_symbol (abfd
,
841 (const PTR
) (from
+ size
),
844 bfd_fatal (bfd_get_filename (abfd
));
849 sec
= bfd_get_section (sym
);
851 if (bfd_is_com_section (sec
))
855 if (from
+ size
< fromend
856 && sec
== bfd_get_section (next
))
857 sz
= valueof (next
) - valueof (sym
);
859 sz
= (bfd_get_section_vma (abfd
, sec
)
860 + bfd_section_size (abfd
, sec
)
866 symsizes
->minisym
= (const PTR
) from
;
874 store_sym
= store_next
;
878 symcount
= symsizes
- *symsizesp
;
880 /* We must now sort again by size. */
881 qsort ((PTR
) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
886 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
889 display_rel_file (abfd
, archive_bfd
)
896 struct size_sym
*symsizes
;
900 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
902 fprintf (stderr
, _("%s: no symbols\n"), bfd_get_filename (abfd
));
907 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
909 bfd_fatal (bfd_get_filename (abfd
));
913 fprintf (stderr
, _("%s: no symbols\n"), bfd_get_filename (abfd
));
917 /* Discard the symbols we don't want to print.
918 It's OK to do this in place; we'll free the storage anyway
921 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
927 sort_dynamic
= dynamic
;
928 sort_x
= bfd_make_empty_symbol (abfd
);
929 sort_y
= bfd_make_empty_symbol (abfd
);
930 if (sort_x
== NULL
|| sort_y
== NULL
)
931 bfd_fatal (bfd_get_filename (abfd
));
934 qsort (minisyms
, symcount
, size
,
935 sorters
[sort_numerically
][reverse_sort
]);
937 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
942 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
944 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
949 /* Choose which symbol entries to print;
950 compact them downward to get rid of the rest.
951 Return the number of symbols to be printed. */
954 filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
)
961 bfd_byte
*from
, *fromend
, *to
;
964 store
= bfd_make_empty_symbol (abfd
);
966 bfd_fatal (bfd_get_filename (abfd
));
968 from
= (bfd_byte
*) minisyms
;
969 fromend
= from
+ symcount
* size
;
970 to
= (bfd_byte
*) minisyms
;
972 for (; from
< fromend
; from
+= size
)
979 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
, store
);
981 bfd_fatal (bfd_get_filename (abfd
));
984 keep
= bfd_is_und_section (sym
->section
);
985 else if (external_only
)
986 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
987 || (sym
->flags
& BSF_WEAK
) != 0
988 || bfd_is_und_section (sym
->section
)
989 || bfd_is_com_section (sym
->section
));
994 && ! print_debug_syms
995 && (sym
->flags
& BSF_DEBUGGING
) != 0)
1000 && (bfd_is_abs_section (sym
->section
)
1001 || bfd_is_und_section (sym
->section
)))
1007 if (bfd_is_und_section (sym
->section
))
1013 memcpy (to
, from
, size
);
1018 return (to
- (bfd_byte
*) minisyms
) / size
;
1021 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1022 demangling it if requested. */
1025 print_symname (format
, name
, abfd
)
1030 if (do_demangle
&& *name
)
1034 /* In this mode, give a user-level view of the symbol name
1035 even if it's not mangled; strip off any leading
1037 if (bfd_get_symbol_leading_char (abfd
) == name
[0])
1040 res
= cplus_demangle (name
, DMGL_ANSI
| DMGL_PARAMS
);
1043 printf (format
, res
);
1049 printf (format
, name
);
1052 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1056 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
)
1065 bfd_byte
*from
, *fromend
;
1067 store
= bfd_make_empty_symbol (abfd
);
1069 bfd_fatal (bfd_get_filename (abfd
));
1071 from
= (bfd_byte
*) minisyms
;
1072 fromend
= from
+ symcount
* size
;
1073 for (; from
< fromend
; from
+= size
)
1077 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
1079 bfd_fatal (bfd_get_filename (abfd
));
1081 print_symbol (abfd
, sym
, archive_bfd
);
1085 /* Print the symbols when sorting by size. */
1088 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
)
1091 struct size_sym
*symsizes
;
1096 struct size_sym
*from
, *fromend
;
1098 store
= bfd_make_empty_symbol (abfd
);
1100 bfd_fatal (bfd_get_filename (abfd
));
1103 fromend
= from
+ symcount
;
1104 for (; from
< fromend
; from
++)
1108 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
1110 bfd_fatal (bfd_get_filename (abfd
));
1112 /* Set the symbol value so that we actually display the symbol
1114 sym
->value
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
1116 print_symbol (abfd
, sym
, archive_bfd
);
1120 /* Print a single symbol. */
1123 print_symbol (abfd
, sym
, archive_bfd
)
1130 (*format
->print_symbol_filename
) (archive_bfd
, abfd
);
1134 if (bfd_is_und_section (bfd_get_section (sym
)))
1135 print_symname ("%s", bfd_asymbol_name (sym
), abfd
);
1139 symbol_info syminfo
;
1141 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1142 (*format
->print_symbol_info
) (&syminfo
, abfd
);
1147 static asymbol
**syms
;
1148 static long symcount
;
1149 const char *filename
, *functionname
;
1150 unsigned int lineno
;
1152 /* We need to get the canonical symbols in order to call
1153 bfd_find_nearest_line. This is inefficient, but, then, you
1154 don't have to use --line-numbers. */
1155 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
1164 symsize
= bfd_get_symtab_upper_bound (abfd
);
1166 bfd_fatal (bfd_get_filename (abfd
));
1167 syms
= (asymbol
**) xmalloc (symsize
);
1168 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
1170 bfd_fatal (bfd_get_filename (abfd
));
1171 lineno_cache_bfd
= abfd
;
1174 if (bfd_is_und_section (bfd_get_section (sym
)))
1176 static asection
**secs
;
1177 static arelent
***relocs
;
1178 static long *relcount
;
1179 static unsigned int seccount
;
1181 const char *symname
;
1183 /* For an undefined symbol, we try to find a reloc for the
1184 symbol, and print the line number of the reloc. */
1186 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
1188 for (i
= 0; i
< seccount
; i
++)
1189 if (relocs
[i
] != NULL
)
1201 struct get_relocs_info info
;
1203 seccount
= bfd_count_sections (abfd
);
1205 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
1206 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
1207 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
1210 info
.relocs
= relocs
;
1211 info
.relcount
= relcount
;
1213 bfd_map_over_sections (abfd
, get_relocs
, (PTR
) &info
);
1214 lineno_cache_rel_bfd
= abfd
;
1217 symname
= bfd_asymbol_name (sym
);
1218 for (i
= 0; i
< seccount
; i
++)
1222 for (j
= 0; j
< relcount
[i
]; j
++)
1227 if (r
->sym_ptr_ptr
!= NULL
1228 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1229 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1231 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1232 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
1233 r
->address
, &filename
,
1234 &functionname
, &lineno
))
1236 /* We only print the first one we find. */
1237 printf ("\t%s:%u", filename
, lineno
);
1244 else if (bfd_get_section (sym
)->owner
== abfd
)
1246 if (bfd_find_nearest_line (abfd
, bfd_get_section (sym
), syms
,
1247 sym
->value
, &filename
, &functionname
,
1252 printf ("\t%s:%u", filename
, lineno
);
1260 /* The following 3 groups of functions are called unconditionally,
1261 once at the start of processing each file of the appropriate type.
1262 They should check `filename_per_file' and `filename_per_symbol',
1263 as appropriate for their output format, to determine whether to
1266 /* Print the name of an object file given on the command line. */
1269 print_object_filename_bsd (filename
)
1272 if (filename_per_file
&& !filename_per_symbol
)
1273 printf ("\n%s:\n", filename
);
1277 print_object_filename_sysv (filename
)
1281 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1283 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1285 Name Value Class Type Size Line Section\n\n"));
1289 print_object_filename_posix (filename
)
1292 if (filename_per_file
&& !filename_per_symbol
)
1293 printf ("%s:\n", filename
);
1296 /* Print the name of an archive file given on the command line. */
1299 print_archive_filename_bsd (filename
)
1302 if (filename_per_file
)
1303 printf ("\n%s:\n", filename
);
1307 print_archive_filename_sysv (filename
)
1313 print_archive_filename_posix (filename
)
1318 /* Print the name of an archive member file. */
1321 print_archive_member_bsd (archive
, filename
)
1323 CONST
char *filename
;
1325 if (!filename_per_symbol
)
1326 printf ("\n%s:\n", filename
);
1330 print_archive_member_sysv (archive
, filename
)
1332 CONST
char *filename
;
1335 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1337 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1339 Name Value Class Type Size Line Section\n\n"));
1343 print_archive_member_posix (archive
, filename
)
1345 CONST
char *filename
;
1347 if (!filename_per_symbol
)
1348 printf ("%s[%s]:\n", archive
, filename
);
1351 /* Print the name of the file (and archive, if there is one)
1352 containing a symbol. */
1355 print_symbol_filename_bsd (archive_bfd
, abfd
)
1356 bfd
*archive_bfd
, *abfd
;
1358 if (filename_per_symbol
)
1361 printf ("%s:", bfd_get_filename (archive_bfd
));
1362 printf ("%s:", bfd_get_filename (abfd
));
1367 print_symbol_filename_sysv (archive_bfd
, abfd
)
1368 bfd
*archive_bfd
, *abfd
;
1370 if (filename_per_symbol
)
1373 printf ("%s:", bfd_get_filename (archive_bfd
));
1374 printf ("%s:", bfd_get_filename (abfd
));
1379 print_symbol_filename_posix (archive_bfd
, abfd
)
1380 bfd
*archive_bfd
, *abfd
;
1382 if (filename_per_symbol
)
1385 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1386 bfd_get_filename (abfd
));
1388 printf ("%s: ", bfd_get_filename (abfd
));
1392 /* Print a symbol value. */
1398 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1399 printf (value_format
, val
);
1401 /* We have a 64 bit value to print, but the host is only 32 bit. */
1402 if (print_radix
== 16)
1403 fprintf_vma (stdout
, val
);
1409 s
= buf
+ sizeof buf
;
1413 *--s
= (val
% print_radix
) + '0';
1416 while ((buf
+ sizeof buf
- 1) - s
< 16)
1423 /* Print a line of information about a symbol. */
1426 print_symbol_info_bsd (info
, abfd
)
1430 if (info
->type
== 'U')
1441 print_value (info
->value
);
1442 printf (" %c", info
->type
);
1443 if (info
->type
== '-')
1447 printf (other_format
, info
->stab_other
);
1449 printf (desc_format
, info
->stab_desc
);
1450 printf (" %5s", info
->stab_name
);
1452 print_symname (" %s", info
->name
, abfd
);
1456 print_symbol_info_sysv (info
, abfd
)
1460 print_symname ("%-20s|", info
->name
, abfd
); /* Name */
1461 if (info
->type
== 'U')
1462 printf (" "); /* Value */
1464 print_value (info
->value
);
1465 printf ("| %c |", info
->type
); /* Class */
1466 if (info
->type
== '-')
1469 printf ("%18s| ", info
->stab_name
); /* (C) Type */
1470 printf (desc_format
, info
->stab_desc
); /* Size */
1471 printf ("| |"); /* Line, Section */
1474 printf (" | | |"); /* Type, Size, Line, Section */
1478 print_symbol_info_posix (info
, abfd
)
1482 print_symname ("%s ", info
->name
, abfd
);
1483 printf ("%c ", info
->type
);
1484 if (info
->type
== 'U')
1487 print_value (info
->value
);
1488 /* POSIX.2 wants the symbol size printed here, when applicable;
1489 BFD currently doesn't provide it, so we take the easy way out by
1490 considering it to never be applicable. */
1494 print_symdef_entry (abfd
)
1497 symindex idx
= BFD_NO_MORE_SYMBOLS
;
1499 boolean everprinted
= false;
1501 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
1502 idx
!= BFD_NO_MORE_SYMBOLS
;
1503 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
1508 printf (_("\nArchive index:\n"));
1511 elt
= bfd_get_elt_at_index (abfd
, idx
);
1513 bfd_fatal ("bfd_get_elt_at_index");
1514 if (thesym
->name
!= (char *) NULL
)
1516 print_symname ("%s", thesym
->name
, abfd
);
1517 printf (" in %s\n", bfd_get_filename (elt
));
1522 /* This function is used to get the relocs for a particular section.
1523 It is called via bfd_map_over_sections. */
1526 get_relocs (abfd
, sec
, dataarg
)
1531 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
1535 if ((sec
->flags
& SEC_RELOC
) == 0)
1537 *data
->relocs
= NULL
;
1538 *data
->relcount
= 0;
1544 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1546 bfd_fatal (bfd_get_filename (abfd
));
1548 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1549 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1551 if (*data
->relcount
< 0)
1552 bfd_fatal (bfd_get_filename (abfd
));