1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000
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 #define OPTION_TARGET 200
260 static struct option long_options
[] =
262 {"debug-syms", no_argument
, &print_debug_syms
, 1},
263 {"demangle", optional_argument
, 0, 'C'},
264 {"dynamic", no_argument
, &dynamic
, 1},
265 {"extern-only", no_argument
, &external_only
, 1},
266 {"format", required_argument
, 0, 'f'},
267 {"help", no_argument
, 0, 'h'},
268 {"line-numbers", no_argument
, 0, 'l'},
269 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
270 {"no-demangle", no_argument
, &do_demangle
, 0},
271 {"no-sort", no_argument
, &no_sort
, 1},
272 {"numeric-sort", no_argument
, &sort_numerically
, 1},
273 {"portability", no_argument
, 0, 'P'},
274 {"print-armap", no_argument
, &print_armap
, 1},
275 {"print-file-name", no_argument
, 0, 'o'},
276 {"radix", required_argument
, 0, 't'},
277 {"reverse-sort", no_argument
, &reverse_sort
, 1},
278 {"size-sort", no_argument
, &sort_by_size
, 1},
279 {"stats", no_argument
, &show_stats
, 1},
280 {"target", required_argument
, 0, OPTION_TARGET
},
281 {"defined-only", no_argument
, &defined_only
, 1},
282 {"undefined-only", no_argument
, &undefined_only
, 1},
283 {"version", no_argument
, &show_version
, 1},
284 {0, no_argument
, 0, 0}
287 /* Some error-reporting functions */
290 usage (stream
, status
)
294 fprintf (stream
, _("Usage: %s [OPTION]... [FILE]...\n"), program_name
);
295 fprintf (stream
, _("List symbols from FILEs (a.out by default).\n"));
296 fprintf (stream
, _("\n\
297 -a, --debug-syms Display debugger-only symbols\n\
298 -A, --print-file-name Print name of the input file before every symbol\n\
299 -B Same as --format=bsd\n\
300 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
301 The STYLE, if specified, can be `auto' (the default),\n\
302 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-new-abi'\n\
303 --no-demangle Do not demangle low-level symbol names\n\
304 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
305 --defined-only Display only defined symbols\n\
307 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
308 `sysv' or `posix'. The default is `bsd'\n\
309 -g, --extern-only Display only external symbols\n\
310 -h, --help Display this information\n\
311 -l, --line-numbers Use debugging information to find a filename and\n\
312 line number for each symbol\n\
313 -n, --numeric-sort Sort symbols numerically by address\n\
315 -p, --no-sort Do not sort the symbols\n\
316 -P, --portability Same as --format=posix\n\
317 -r, --reverse-sort Reverse the sense of the sort\n\
318 -s, --print-armap Include index for symbols from archive members\n\
319 --size-sort Sort symbols by size\n\
320 -t, --radix=RADIX Use RADIX for printing symbol values\n\
321 --target=BFDNAME Specify the target object format as BFDNAME\n\
322 -u, --undefined-only Display only undefined symbols\n\
323 -V, --version Display this program's version number\n\
324 -X 32_64 (ignored)\n\
326 list_supported_targets (program_name
, stream
);
328 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
332 /* Set the radix for the symbol value and size according to RADIX. */
335 set_print_radix (radix
)
349 value_format
[4] = *radix
;
351 #if BFD_HOST_64BIT_LONG
352 value_format
[5] = *radix
;
354 /* This case requires special handling for octal and decimal
358 other_format
[3] = desc_format
[3] = *radix
;
361 fatal (_("%s: invalid radix"), radix
);
366 set_output_format (f
)
386 fatal (_("%s: invalid output format"), f
);
388 format
= &formats
[i
];
399 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
400 setlocale (LC_MESSAGES
, "");
402 bindtextdomain (PACKAGE
, LOCALEDIR
);
403 textdomain (PACKAGE
);
405 program_name
= *argv
;
406 xmalloc_set_program_name (program_name
);
408 START_PROGRESS (program_name
, 0);
411 set_default_bfd_target ();
413 while ((c
= getopt_long (argc
, argv
, "aABCDef:glnopPrst:uvVX:",
414 long_options
, (int *) 0)) != EOF
)
419 print_debug_syms
= 1;
423 filename_per_symbol
= 1;
425 case 'B': /* For MIPS compatibility. */
426 set_output_format ("bsd");
432 enum demangling_styles style
;
434 style
= cplus_demangle_name_to_style (optarg
);
435 if (style
== unknown_demangling
)
436 fatal (_("unknown demangling style `%s'"),
439 cplus_demangle_set_style (style
);
446 /* Ignored for HP/UX compatibility. */
449 set_output_format (optarg
);
461 sort_numerically
= 1;
467 set_output_format ("posix");
476 set_print_radix (optarg
);
485 /* Ignored for (partial) AIX compatibility. On AIX, the
486 argument has values 32, 64, or 32_64, and specfies that
487 only 32-bit, only 64-bit, or both kinds of objects should
488 be examined. The default is 32. So plain AIX nm on a
489 library archive with both kinds of objects will ignore
490 the 64-bit ones. For GNU nm, the default is and always
491 has been -X 32_64, and other options are not supported. */
492 if (strcmp (optarg
, "32_64") != 0)
493 fatal (_("Only -X 32_64 is supported"));
496 case OPTION_TARGET
: /* --target */
500 case 0: /* A long option that just sets a flag. */
509 print_version ("nm");
511 /* OK, all options now parsed. If no filename specified, do a.out. */
513 return !display_file ("a.out");
517 if (argc
- optind
> 1)
518 filename_per_file
= 1;
520 /* We were given several filenames to do. */
521 while (optind
< argc
)
524 if (!display_file (argv
[optind
++]))
528 END_PROGRESS (program_name
);
533 char *lim
= (char *) sbrk (0);
535 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));
544 display_archive (file
)
548 bfd
*last_arfile
= NULL
;
551 (*format
->print_archive_filename
) (bfd_get_filename (file
));
554 print_symdef_entry (file
);
560 arfile
= bfd_openr_next_archived_file (file
, arfile
);
564 if (bfd_get_error () != bfd_error_no_more_archived_files
)
565 bfd_fatal (bfd_get_filename (file
));
569 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
571 (*format
->print_archive_member
) (bfd_get_filename (file
),
572 bfd_get_filename (arfile
));
573 display_rel_file (arfile
, file
);
577 bfd_nonfatal (bfd_get_filename (arfile
));
578 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
580 list_matching_formats (matching
);
585 if (last_arfile
!= NULL
)
587 bfd_close (last_arfile
);
588 lineno_cache_bfd
= NULL
;
589 lineno_cache_rel_bfd
= NULL
;
591 last_arfile
= arfile
;
594 if (last_arfile
!= NULL
)
596 bfd_close (last_arfile
);
597 lineno_cache_bfd
= NULL
;
598 lineno_cache_rel_bfd
= NULL
;
603 display_file (filename
)
606 boolean retval
= true;
610 file
= bfd_openr (filename
, target
);
613 bfd_nonfatal (filename
);
617 if (bfd_check_format (file
, bfd_archive
))
619 display_archive (file
);
621 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
623 (*format
->print_object_filename
) (filename
);
624 display_rel_file (file
, NULL
);
628 bfd_nonfatal (filename
);
629 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
631 list_matching_formats (matching
);
637 if (bfd_close (file
) == false)
638 bfd_fatal (filename
);
640 lineno_cache_bfd
= NULL
;
641 lineno_cache_rel_bfd
= NULL
;
646 /* These globals are used to pass information into the sorting
648 static bfd
*sort_bfd
;
649 static boolean sort_dynamic
;
650 static asymbol
*sort_x
;
651 static asymbol
*sort_y
;
653 /* Symbol-sorting predicates */
654 #define valueof(x) ((x)->section->vma + (x)->value)
656 /* Numeric sorts. Undefined symbols are always considered "less than"
657 defined symbols with zero values. Common symbols are not treated
658 specially -- i.e., their sizes are used as their "values". */
661 numeric_forward (P_x
, P_y
)
668 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
669 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
670 if (x
== NULL
|| y
== NULL
)
671 bfd_fatal (bfd_get_filename (sort_bfd
));
673 xs
= bfd_get_section (x
);
674 ys
= bfd_get_section (y
);
676 if (bfd_is_und_section (xs
))
678 if (! bfd_is_und_section (ys
))
681 else if (bfd_is_und_section (ys
))
683 else if (valueof (x
) != valueof (y
))
684 return valueof (x
) < valueof (y
) ? -1 : 1;
686 return non_numeric_forward (P_x
, P_y
);
690 numeric_reverse (x
, y
)
694 return - numeric_forward (x
, y
);
698 non_numeric_forward (P_x
, P_y
)
705 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
706 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
707 if (x
== NULL
|| y
== NULL
)
708 bfd_fatal (bfd_get_filename (sort_bfd
));
710 xn
= bfd_asymbol_name (x
);
711 yn
= bfd_asymbol_name (y
);
713 return ((xn
== NULL
) ? ((yn
== NULL
) ? 0 : -1) :
714 ((yn
== NULL
) ? 1 : strcmp (xn
, yn
)));
718 non_numeric_reverse (x
, y
)
722 return - non_numeric_forward (x
, y
);
725 static int (*(sorters
[2][2])) PARAMS ((const PTR
, const PTR
)) =
727 { non_numeric_forward
, non_numeric_reverse
},
728 { numeric_forward
, numeric_reverse
}
731 /* This sort routine is used by sort_symbols_by_size. It is similar
732 to numeric_forward, but when symbols have the same value it sorts
733 by section VMA. This simplifies the sort_symbols_by_size code
734 which handles symbols at the end of sections. Also, this routine
735 tries to sort file names before other symbols with the same value.
736 That will make the file name have a zero size, which will make
737 sort_symbols_by_size choose the non file name symbol, leading to
738 more meaningful output. For similar reasons, this code sorts
739 gnu_compiled_* and gcc2_compiled before other symbols with the same
743 size_forward1 (P_x
, P_y
)
753 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
754 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
755 if (x
== NULL
|| y
== NULL
)
756 bfd_fatal (bfd_get_filename (sort_bfd
));
758 xs
= bfd_get_section (x
);
759 ys
= bfd_get_section (y
);
761 if (bfd_is_und_section (xs
))
763 if (bfd_is_und_section (ys
))
766 if (valueof (x
) != valueof (y
))
767 return valueof (x
) < valueof (y
) ? -1 : 1;
769 if (xs
->vma
!= ys
->vma
)
770 return xs
->vma
< ys
->vma
? -1 : 1;
772 xn
= bfd_asymbol_name (x
);
773 yn
= bfd_asymbol_name (y
);
777 /* The symbols gnu_compiled and gcc2_compiled convey even less
778 information than the file name, so sort them out first. */
780 xf
= (strstr (xn
, "gnu_compiled") != NULL
781 || strstr (xn
, "gcc2_compiled") != NULL
);
782 yf
= (strstr (yn
, "gnu_compiled") != NULL
783 || strstr (yn
, "gcc2_compiled") != NULL
);
790 /* We use a heuristic for the file name. It may not work on non
791 Unix systems, but it doesn't really matter; the only difference
792 is precisely which symbol names get printed. */
794 #define file_symbol(s, sn, snl) \
795 (((s)->flags & BSF_FILE) != 0 \
796 || ((sn)[(snl) - 2] == '.' \
797 && ((sn)[(snl) - 1] == 'o' \
798 || (sn)[(snl) - 1] == 'a')))
800 xf
= file_symbol (x
, xn
, xnl
);
801 yf
= file_symbol (y
, yn
, ynl
);
808 return non_numeric_forward (P_x
, P_y
);
811 /* This sort routine is used by sort_symbols_by_size. It is sorting
812 an array of size_sym structures into size order. */
815 size_forward2 (P_x
, P_y
)
819 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
820 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
822 if (x
->size
< y
->size
)
823 return reverse_sort
? 1 : -1;
824 else if (x
->size
> y
->size
)
825 return reverse_sort
? -1 : 1;
827 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
830 /* Sort the symbols by size. We guess the size by assuming that the
831 difference between the address of a symbol and the address of the
832 next higher symbol is the size. FIXME: ELF actually stores a size
833 with each symbol. We should use it. */
836 sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
, size
, symsizesp
)
842 struct size_sym
**symsizesp
;
844 struct size_sym
*symsizes
;
845 bfd_byte
*from
, *fromend
;
847 asymbol
*store_sym
, *store_next
;
849 qsort (minisyms
, symcount
, size
, size_forward1
);
851 /* We are going to return a special set of symbols and sizes to
853 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
854 *symsizesp
= symsizes
;
856 /* Note that filter_symbols has already removed all absolute and
857 undefined symbols. Here we remove all symbols whose size winds
860 from
= (bfd_byte
*) minisyms
;
861 fromend
= from
+ symcount
* size
;
868 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
,
871 bfd_fatal (bfd_get_filename (abfd
));
874 for (; from
< fromend
; from
+= size
)
881 if (from
+ size
< fromend
)
883 next
= bfd_minisymbol_to_symbol (abfd
,
885 (const PTR
) (from
+ size
),
888 bfd_fatal (bfd_get_filename (abfd
));
893 sec
= bfd_get_section (sym
);
895 if (bfd_is_com_section (sec
))
899 if (from
+ size
< fromend
900 && sec
== bfd_get_section (next
))
901 sz
= valueof (next
) - valueof (sym
);
903 sz
= (bfd_get_section_vma (abfd
, sec
)
904 + bfd_section_size (abfd
, sec
)
910 symsizes
->minisym
= (const PTR
) from
;
918 store_sym
= store_next
;
922 symcount
= symsizes
- *symsizesp
;
924 /* We must now sort again by size. */
925 qsort ((PTR
) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
930 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
933 display_rel_file (abfd
, archive_bfd
)
940 struct size_sym
*symsizes
;
944 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
946 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
951 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
953 bfd_fatal (bfd_get_filename (abfd
));
957 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
961 /* Discard the symbols we don't want to print.
962 It's OK to do this in place; we'll free the storage anyway
965 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
971 sort_dynamic
= dynamic
;
972 sort_x
= bfd_make_empty_symbol (abfd
);
973 sort_y
= bfd_make_empty_symbol (abfd
);
974 if (sort_x
== NULL
|| sort_y
== NULL
)
975 bfd_fatal (bfd_get_filename (abfd
));
978 qsort (minisyms
, symcount
, size
,
979 sorters
[sort_numerically
][reverse_sort
]);
981 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
986 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
988 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
993 /* Choose which symbol entries to print;
994 compact them downward to get rid of the rest.
995 Return the number of symbols to be printed. */
998 filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
)
1005 bfd_byte
*from
, *fromend
, *to
;
1008 store
= bfd_make_empty_symbol (abfd
);
1010 bfd_fatal (bfd_get_filename (abfd
));
1012 from
= (bfd_byte
*) minisyms
;
1013 fromend
= from
+ symcount
* size
;
1014 to
= (bfd_byte
*) minisyms
;
1016 for (; from
< fromend
; from
+= size
)
1023 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
, store
);
1025 bfd_fatal (bfd_get_filename (abfd
));
1028 keep
= bfd_is_und_section (sym
->section
);
1029 else if (external_only
)
1030 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
1031 || (sym
->flags
& BSF_WEAK
) != 0
1032 || bfd_is_und_section (sym
->section
)
1033 || bfd_is_com_section (sym
->section
));
1038 && ! print_debug_syms
1039 && (sym
->flags
& BSF_DEBUGGING
) != 0)
1044 && (bfd_is_abs_section (sym
->section
)
1045 || bfd_is_und_section (sym
->section
)))
1051 if (bfd_is_und_section (sym
->section
))
1057 memcpy (to
, from
, size
);
1062 return (to
- (bfd_byte
*) minisyms
) / size
;
1065 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1066 demangling it if requested. */
1069 print_symname (format
, name
, abfd
)
1074 if (do_demangle
&& *name
)
1078 /* In this mode, give a user-level view of the symbol name
1079 even if it's not mangled; strip off any leading
1081 if (bfd_get_symbol_leading_char (abfd
) == name
[0])
1084 res
= cplus_demangle (name
, DMGL_ANSI
| DMGL_PARAMS
);
1087 printf (format
, res
);
1093 printf (format
, name
);
1096 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1100 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
)
1109 bfd_byte
*from
, *fromend
;
1111 store
= bfd_make_empty_symbol (abfd
);
1113 bfd_fatal (bfd_get_filename (abfd
));
1115 from
= (bfd_byte
*) minisyms
;
1116 fromend
= from
+ symcount
* size
;
1117 for (; from
< fromend
; from
+= size
)
1121 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
1123 bfd_fatal (bfd_get_filename (abfd
));
1125 print_symbol (abfd
, sym
, archive_bfd
);
1129 /* Print the symbols when sorting by size. */
1132 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
)
1135 struct size_sym
*symsizes
;
1140 struct size_sym
*from
, *fromend
;
1142 store
= bfd_make_empty_symbol (abfd
);
1144 bfd_fatal (bfd_get_filename (abfd
));
1147 fromend
= from
+ symcount
;
1148 for (; from
< fromend
; from
++)
1152 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
1154 bfd_fatal (bfd_get_filename (abfd
));
1156 /* Set the symbol value so that we actually display the symbol
1158 sym
->value
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
1160 print_symbol (abfd
, sym
, archive_bfd
);
1164 /* Print a single symbol. */
1167 print_symbol (abfd
, sym
, archive_bfd
)
1174 (*format
->print_symbol_filename
) (archive_bfd
, abfd
);
1178 if (bfd_is_und_section (bfd_get_section (sym
)))
1179 print_symname ("%s", bfd_asymbol_name (sym
), abfd
);
1183 symbol_info syminfo
;
1185 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1186 (*format
->print_symbol_info
) (&syminfo
, abfd
);
1191 static asymbol
**syms
;
1192 static long symcount
;
1193 const char *filename
, *functionname
;
1194 unsigned int lineno
;
1196 /* We need to get the canonical symbols in order to call
1197 bfd_find_nearest_line. This is inefficient, but, then, you
1198 don't have to use --line-numbers. */
1199 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
1208 symsize
= bfd_get_symtab_upper_bound (abfd
);
1210 bfd_fatal (bfd_get_filename (abfd
));
1211 syms
= (asymbol
**) xmalloc (symsize
);
1212 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
1214 bfd_fatal (bfd_get_filename (abfd
));
1215 lineno_cache_bfd
= abfd
;
1218 if (bfd_is_und_section (bfd_get_section (sym
)))
1220 static asection
**secs
;
1221 static arelent
***relocs
;
1222 static long *relcount
;
1223 static unsigned int seccount
;
1225 const char *symname
;
1227 /* For an undefined symbol, we try to find a reloc for the
1228 symbol, and print the line number of the reloc. */
1230 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
1232 for (i
= 0; i
< seccount
; i
++)
1233 if (relocs
[i
] != NULL
)
1245 struct get_relocs_info info
;
1247 seccount
= bfd_count_sections (abfd
);
1249 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
1250 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
1251 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
1254 info
.relocs
= relocs
;
1255 info
.relcount
= relcount
;
1257 bfd_map_over_sections (abfd
, get_relocs
, (PTR
) &info
);
1258 lineno_cache_rel_bfd
= abfd
;
1261 symname
= bfd_asymbol_name (sym
);
1262 for (i
= 0; i
< seccount
; i
++)
1266 for (j
= 0; j
< relcount
[i
]; j
++)
1271 if (r
->sym_ptr_ptr
!= NULL
1272 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1273 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1275 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1276 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
1277 r
->address
, &filename
,
1278 &functionname
, &lineno
))
1280 /* We only print the first one we find. */
1281 printf ("\t%s:%u", filename
, lineno
);
1288 else if (bfd_get_section (sym
)->owner
== abfd
)
1290 if (bfd_find_nearest_line (abfd
, bfd_get_section (sym
), syms
,
1291 sym
->value
, &filename
, &functionname
,
1296 printf ("\t%s:%u", filename
, lineno
);
1304 /* The following 3 groups of functions are called unconditionally,
1305 once at the start of processing each file of the appropriate type.
1306 They should check `filename_per_file' and `filename_per_symbol',
1307 as appropriate for their output format, to determine whether to
1310 /* Print the name of an object file given on the command line. */
1313 print_object_filename_bsd (filename
)
1316 if (filename_per_file
&& !filename_per_symbol
)
1317 printf ("\n%s:\n", filename
);
1321 print_object_filename_sysv (filename
)
1325 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1327 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1329 Name Value Class Type Size Line Section\n\n"));
1333 print_object_filename_posix (filename
)
1336 if (filename_per_file
&& !filename_per_symbol
)
1337 printf ("%s:\n", filename
);
1340 /* Print the name of an archive file given on the command line. */
1343 print_archive_filename_bsd (filename
)
1346 if (filename_per_file
)
1347 printf ("\n%s:\n", filename
);
1351 print_archive_filename_sysv (filename
)
1352 char *filename ATTRIBUTE_UNUSED
;
1357 print_archive_filename_posix (filename
)
1358 char *filename ATTRIBUTE_UNUSED
;
1362 /* Print the name of an archive member file. */
1365 print_archive_member_bsd (archive
, filename
)
1366 char *archive ATTRIBUTE_UNUSED
;
1367 CONST
char *filename
;
1369 if (!filename_per_symbol
)
1370 printf ("\n%s:\n", filename
);
1374 print_archive_member_sysv (archive
, filename
)
1376 CONST
char *filename
;
1379 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1381 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1383 Name Value Class Type Size Line Section\n\n"));
1387 print_archive_member_posix (archive
, filename
)
1389 CONST
char *filename
;
1391 if (!filename_per_symbol
)
1392 printf ("%s[%s]:\n", archive
, filename
);
1395 /* Print the name of the file (and archive, if there is one)
1396 containing a symbol. */
1399 print_symbol_filename_bsd (archive_bfd
, abfd
)
1400 bfd
*archive_bfd
, *abfd
;
1402 if (filename_per_symbol
)
1405 printf ("%s:", bfd_get_filename (archive_bfd
));
1406 printf ("%s:", bfd_get_filename (abfd
));
1411 print_symbol_filename_sysv (archive_bfd
, abfd
)
1412 bfd
*archive_bfd
, *abfd
;
1414 if (filename_per_symbol
)
1417 printf ("%s:", bfd_get_filename (archive_bfd
));
1418 printf ("%s:", bfd_get_filename (abfd
));
1423 print_symbol_filename_posix (archive_bfd
, abfd
)
1424 bfd
*archive_bfd
, *abfd
;
1426 if (filename_per_symbol
)
1429 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1430 bfd_get_filename (abfd
));
1432 printf ("%s: ", bfd_get_filename (abfd
));
1436 /* Print a symbol value. */
1442 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1443 printf (value_format
, val
);
1445 /* We have a 64 bit value to print, but the host is only 32 bit. */
1446 if (print_radix
== 16)
1447 fprintf_vma (stdout
, val
);
1453 s
= buf
+ sizeof buf
;
1457 *--s
= (val
% print_radix
) + '0';
1460 while ((buf
+ sizeof buf
- 1) - s
< 16)
1467 /* Print a line of information about a symbol. */
1470 print_symbol_info_bsd (info
, abfd
)
1474 if (bfd_is_undefined_symclass (info
->type
))
1485 print_value (info
->value
);
1486 printf (" %c", info
->type
);
1487 if (info
->type
== '-')
1491 printf (other_format
, info
->stab_other
);
1493 printf (desc_format
, info
->stab_desc
);
1494 printf (" %5s", info
->stab_name
);
1496 print_symname (" %s", info
->name
, abfd
);
1500 print_symbol_info_sysv (info
, abfd
)
1504 print_symname ("%-20s|", info
->name
, abfd
); /* Name */
1505 if (bfd_is_undefined_symclass (info
->type
))
1506 printf (" "); /* Value */
1508 print_value (info
->value
);
1509 printf ("| %c |", info
->type
); /* Class */
1510 if (info
->type
== '-')
1513 printf ("%18s| ", info
->stab_name
); /* (C) Type */
1514 printf (desc_format
, info
->stab_desc
); /* Size */
1515 printf ("| |"); /* Line, Section */
1518 printf (" | | |"); /* Type, Size, Line, Section */
1522 print_symbol_info_posix (info
, abfd
)
1526 print_symname ("%s ", info
->name
, abfd
);
1527 printf ("%c ", info
->type
);
1528 if (bfd_is_undefined_symclass (info
->type
))
1531 print_value (info
->value
);
1532 /* POSIX.2 wants the symbol size printed here, when applicable;
1533 BFD currently doesn't provide it, so we take the easy way out by
1534 considering it to never be applicable. */
1538 print_symdef_entry (abfd
)
1541 symindex idx
= BFD_NO_MORE_SYMBOLS
;
1543 boolean everprinted
= false;
1545 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
1546 idx
!= BFD_NO_MORE_SYMBOLS
;
1547 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
1552 printf (_("\nArchive index:\n"));
1555 elt
= bfd_get_elt_at_index (abfd
, idx
);
1557 bfd_fatal ("bfd_get_elt_at_index");
1558 if (thesym
->name
!= (char *) NULL
)
1560 print_symname ("%s", thesym
->name
, abfd
);
1561 printf (" in %s\n", bfd_get_filename (elt
));
1566 /* This function is used to get the relocs for a particular section.
1567 It is called via bfd_map_over_sections. */
1570 get_relocs (abfd
, sec
, dataarg
)
1575 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
1579 if ((sec
->flags
& SEC_RELOC
) == 0)
1581 *data
->relocs
= NULL
;
1582 *data
->relcount
= 0;
1588 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1590 bfd_fatal (bfd_get_filename (abfd
));
1592 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1593 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1595 if (*data
->relcount
< 0)
1596 bfd_fatal (bfd_get_filename (abfd
));