1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 #include "aout/stab_gnu.h"
28 #include "aout/ranlib.h"
30 #include "libiberty.h"
32 /* When sorting by size, we use this structure to hold the size and a
33 pointer to the minisymbol. */
41 /* When fetching relocs, we use this structure to pass information to
44 struct get_relocs_info
53 usage
PARAMS ((FILE *, int));
56 set_print_radix
PARAMS ((char *));
59 set_output_format
PARAMS ((char *));
62 display_archive
PARAMS ((bfd
*));
65 display_file
PARAMS ((char *filename
));
68 display_rel_file
PARAMS ((bfd
* file
, bfd
* archive
));
71 filter_symbols
PARAMS ((bfd
*, boolean
, PTR
, long, unsigned int));
74 sort_symbols_by_size
PARAMS ((bfd
*, boolean
, PTR
, long, unsigned int,
78 print_symbols
PARAMS ((bfd
*, boolean
, PTR
, long, unsigned int, bfd
*));
81 print_size_symbols
PARAMS ((bfd
*, boolean
, struct size_sym
*, long, bfd
*));
84 print_symname
PARAMS ((const char *, const char *, bfd
*));
87 print_symbol
PARAMS ((bfd
*, asymbol
*, bfd
*));
90 print_symdef_entry
PARAMS ((bfd
* abfd
));
92 /* The sorting functions. */
95 numeric_forward
PARAMS ((const PTR
, const PTR
));
98 numeric_reverse
PARAMS ((const PTR
, const PTR
));
101 non_numeric_forward
PARAMS ((const PTR
, const PTR
));
104 non_numeric_reverse
PARAMS ((const PTR
, const PTR
));
107 size_forward1
PARAMS ((const PTR
, const PTR
));
110 size_forward2
PARAMS ((const PTR
, const PTR
));
112 /* The output formatting functions. */
115 print_object_filename_bsd
PARAMS ((char *filename
));
118 print_object_filename_sysv
PARAMS ((char *filename
));
121 print_object_filename_posix
PARAMS ((char *filename
));
125 print_archive_filename_bsd
PARAMS ((char *filename
));
128 print_archive_filename_sysv
PARAMS ((char *filename
));
131 print_archive_filename_posix
PARAMS ((char *filename
));
135 print_archive_member_bsd
PARAMS ((char *archive
, CONST
char *filename
));
138 print_archive_member_sysv
PARAMS ((char *archive
, CONST
char *filename
));
141 print_archive_member_posix
PARAMS ((char *archive
, CONST
char *filename
));
145 print_symbol_filename_bsd
PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
148 print_symbol_filename_sysv
PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
151 print_symbol_filename_posix
PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
155 print_value
PARAMS ((bfd
*, bfd_vma
));
158 print_symbol_info_bsd
PARAMS ((symbol_info
* info
, bfd
* abfd
));
161 print_symbol_info_sysv
PARAMS ((symbol_info
* info
, bfd
* abfd
));
164 print_symbol_info_posix
PARAMS ((symbol_info
* info
, bfd
* abfd
));
167 get_relocs
PARAMS ((bfd
*, asection
*, PTR
));
169 /* Support for different output formats. */
172 /* Print the name of an object file given on the command line. */
173 void (*print_object_filename
) PARAMS ((char *filename
));
175 /* Print the name of an archive file given on the command line. */
176 void (*print_archive_filename
) PARAMS ((char *filename
));
178 /* Print the name of an archive member file. */
179 void (*print_archive_member
) PARAMS ((char *archive
, CONST
char *filename
));
181 /* Print the name of the file (and archive, if there is one)
182 containing a symbol. */
183 void (*print_symbol_filename
) PARAMS ((bfd
* archive_bfd
, bfd
* abfd
));
185 /* Print a line of information about a symbol. */
186 void (*print_symbol_info
) PARAMS ((symbol_info
* info
, bfd
* abfd
));
188 static struct output_fns formats
[] =
190 {print_object_filename_bsd
,
191 print_archive_filename_bsd
,
192 print_archive_member_bsd
,
193 print_symbol_filename_bsd
,
194 print_symbol_info_bsd
},
195 {print_object_filename_sysv
,
196 print_archive_filename_sysv
,
197 print_archive_member_sysv
,
198 print_symbol_filename_sysv
,
199 print_symbol_info_sysv
},
200 {print_object_filename_posix
,
201 print_archive_filename_posix
,
202 print_archive_member_posix
,
203 print_symbol_filename_posix
,
204 print_symbol_info_posix
}
207 /* Indices in `formats'. */
209 #define FORMAT_SYSV 1
210 #define FORMAT_POSIX 2
211 #define FORMAT_DEFAULT FORMAT_BSD
213 /* The output format to use. */
214 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
217 /* Command options. */
219 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
220 static int external_only
= 0; /* print external symbols only */
221 static int defined_only
= 0; /* Print defined symbols only */
222 static int no_sort
= 0; /* don't sort; print syms in order found */
223 static int print_debug_syms
= 0; /* print debugger-only symbols too */
224 static int print_armap
= 0; /* describe __.SYMDEF data in archive files. */
225 static int reverse_sort
= 0; /* sort in downward(alpha or numeric) order */
226 static int sort_numerically
= 0; /* sort in numeric rather than alpha order */
227 static int sort_by_size
= 0; /* sort by size of symbol */
228 static int undefined_only
= 0; /* print undefined symbols only */
229 static int dynamic
= 0; /* print dynamic symbols. */
230 static int show_version
= 0; /* show the version number */
231 static int show_stats
= 0; /* show statistics */
232 static int line_numbers
= 0; /* print line numbers for symbols */
234 /* When to print the names of files. Not mutually exclusive in SYSV format. */
235 static int filename_per_file
= 0; /* Once per file, on its own line. */
236 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
238 /* Print formats for printing a symbol value. */
240 static char value_format
[] = "%08lx";
242 #if BFD_HOST_64BIT_LONG
243 static char value_format
[] = "%016lx";
245 /* We don't use value_format for this case. */
249 static int print_width
= 16;
251 static int print_width
= 8;
253 static int print_radix
= 16;
254 /* Print formats for printing stab info. */
255 static char other_format
[] = "%02x";
256 static char desc_format
[] = "%04x";
258 static char *target
= NULL
;
260 /* Used to cache the line numbers for a BFD. */
261 static bfd
*lineno_cache_bfd
;
262 static bfd
*lineno_cache_rel_bfd
;
264 #define OPTION_TARGET 200
266 static struct option long_options
[] =
268 {"debug-syms", no_argument
, &print_debug_syms
, 1},
269 {"demangle", optional_argument
, 0, 'C'},
270 {"dynamic", no_argument
, &dynamic
, 1},
271 {"extern-only", no_argument
, &external_only
, 1},
272 {"format", required_argument
, 0, 'f'},
273 {"help", no_argument
, 0, 'h'},
274 {"line-numbers", no_argument
, 0, 'l'},
275 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
276 {"no-demangle", no_argument
, &do_demangle
, 0},
277 {"no-sort", no_argument
, &no_sort
, 1},
278 {"numeric-sort", no_argument
, &sort_numerically
, 1},
279 {"portability", no_argument
, 0, 'P'},
280 {"print-armap", no_argument
, &print_armap
, 1},
281 {"print-file-name", no_argument
, 0, 'o'},
282 {"radix", required_argument
, 0, 't'},
283 {"reverse-sort", no_argument
, &reverse_sort
, 1},
284 {"size-sort", no_argument
, &sort_by_size
, 1},
285 {"stats", no_argument
, &show_stats
, 1},
286 {"target", required_argument
, 0, OPTION_TARGET
},
287 {"defined-only", no_argument
, &defined_only
, 1},
288 {"undefined-only", no_argument
, &undefined_only
, 1},
289 {"version", no_argument
, &show_version
, 1},
290 {0, no_argument
, 0, 0}
293 /* Some error-reporting functions */
296 usage (stream
, status
)
300 fprintf (stream
, _("Usage: %s [OPTION]... [FILE]...\n"), program_name
);
301 fprintf (stream
, _("List symbols from FILEs (a.out by default).\n"));
302 fprintf (stream
, _("\n\
303 -a, --debug-syms Display debugger-only symbols\n\
304 -A, --print-file-name Print name of the input file before every symbol\n\
305 -B Same as --format=bsd\n\
306 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
307 The STYLE, if specified, can be `auto' (the default),\n\
308 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-new-abi'\n\
309 --no-demangle Do not demangle low-level symbol names\n\
310 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
311 --defined-only Display only defined symbols\n\
313 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
314 `sysv' or `posix'. The default is `bsd'\n\
315 -g, --extern-only Display only external symbols\n\
316 -h, --help Display this information\n\
317 -l, --line-numbers Use debugging information to find a filename and\n\
318 line number for each symbol\n\
319 -n, --numeric-sort Sort symbols numerically by address\n\
321 -p, --no-sort Do not sort the symbols\n\
322 -P, --portability Same as --format=posix\n\
323 -r, --reverse-sort Reverse the sense of the sort\n\
324 -s, --print-armap Include index for symbols from archive members\n\
325 --size-sort Sort symbols by size\n\
326 -t, --radix=RADIX Use RADIX for printing symbol values\n\
327 --target=BFDNAME Specify the target object format as BFDNAME\n\
328 -u, --undefined-only Display only undefined symbols\n\
329 -V, --version Display this program's version number\n\
330 -X 32_64 (ignored)\n\
332 list_supported_targets (program_name
, stream
);
334 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
338 /* Set the radix for the symbol value and size according to RADIX. */
341 set_print_radix (radix
)
355 value_format
[4] = *radix
;
357 #if BFD_HOST_64BIT_LONG
358 value_format
[5] = *radix
;
360 /* This case requires special handling for octal and decimal
364 other_format
[3] = desc_format
[3] = *radix
;
367 fatal (_("%s: invalid radix"), radix
);
372 set_output_format (f
)
392 fatal (_("%s: invalid output format"), f
);
394 format
= &formats
[i
];
405 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
406 setlocale (LC_MESSAGES
, "");
408 #if defined (HAVE_SETLOCALE)
409 setlocale (LC_CTYPE
, "");
411 bindtextdomain (PACKAGE
, LOCALEDIR
);
412 textdomain (PACKAGE
);
414 program_name
= *argv
;
415 xmalloc_set_program_name (program_name
);
417 START_PROGRESS (program_name
, 0);
420 set_default_bfd_target ();
422 while ((c
= getopt_long (argc
, argv
, "aABCDef:glnopPrst:uvVX:",
423 long_options
, (int *) 0)) != EOF
)
428 print_debug_syms
= 1;
432 filename_per_symbol
= 1;
434 case 'B': /* For MIPS compatibility. */
435 set_output_format ("bsd");
441 enum demangling_styles style
;
443 style
= cplus_demangle_name_to_style (optarg
);
444 if (style
== unknown_demangling
)
445 fatal (_("unknown demangling style `%s'"),
448 cplus_demangle_set_style (style
);
455 /* Ignored for HP/UX compatibility. */
458 set_output_format (optarg
);
470 sort_numerically
= 1;
476 set_output_format ("posix");
485 set_print_radix (optarg
);
494 /* Ignored for (partial) AIX compatibility. On AIX, the
495 argument has values 32, 64, or 32_64, and specfies that
496 only 32-bit, only 64-bit, or both kinds of objects should
497 be examined. The default is 32. So plain AIX nm on a
498 library archive with both kinds of objects will ignore
499 the 64-bit ones. For GNU nm, the default is and always
500 has been -X 32_64, and other options are not supported. */
501 if (strcmp (optarg
, "32_64") != 0)
502 fatal (_("Only -X 32_64 is supported"));
505 case OPTION_TARGET
: /* --target */
509 case 0: /* A long option that just sets a flag. */
518 print_version ("nm");
520 /* OK, all options now parsed. If no filename specified, do a.out. */
522 return !display_file ("a.out");
526 if (argc
- optind
> 1)
527 filename_per_file
= 1;
529 /* We were given several filenames to do. */
530 while (optind
< argc
)
533 if (!display_file (argv
[optind
++]))
537 END_PROGRESS (program_name
);
542 char *lim
= (char *) sbrk (0);
544 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));
553 display_archive (file
)
557 bfd
*last_arfile
= NULL
;
560 (*format
->print_archive_filename
) (bfd_get_filename (file
));
563 print_symdef_entry (file
);
569 arfile
= bfd_openr_next_archived_file (file
, arfile
);
573 if (bfd_get_error () != bfd_error_no_more_archived_files
)
574 bfd_fatal (bfd_get_filename (file
));
578 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
580 (*format
->print_archive_member
) (bfd_get_filename (file
),
581 bfd_get_filename (arfile
));
582 display_rel_file (arfile
, file
);
586 bfd_nonfatal (bfd_get_filename (arfile
));
587 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
589 list_matching_formats (matching
);
594 if (last_arfile
!= NULL
)
596 bfd_close (last_arfile
);
597 lineno_cache_bfd
= NULL
;
598 lineno_cache_rel_bfd
= NULL
;
600 last_arfile
= arfile
;
603 if (last_arfile
!= NULL
)
605 bfd_close (last_arfile
);
606 lineno_cache_bfd
= NULL
;
607 lineno_cache_rel_bfd
= NULL
;
612 display_file (filename
)
615 boolean retval
= true;
619 file
= bfd_openr (filename
, target
);
622 bfd_nonfatal (filename
);
626 if (bfd_check_format (file
, bfd_archive
))
628 display_archive (file
);
630 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
632 (*format
->print_object_filename
) (filename
);
633 display_rel_file (file
, NULL
);
637 bfd_nonfatal (filename
);
638 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
640 list_matching_formats (matching
);
646 if (bfd_close (file
) == false)
647 bfd_fatal (filename
);
649 lineno_cache_bfd
= NULL
;
650 lineno_cache_rel_bfd
= NULL
;
655 /* These globals are used to pass information into the sorting
657 static bfd
*sort_bfd
;
658 static boolean sort_dynamic
;
659 static asymbol
*sort_x
;
660 static asymbol
*sort_y
;
662 /* Symbol-sorting predicates */
663 #define valueof(x) ((x)->section->vma + (x)->value)
665 /* Numeric sorts. Undefined symbols are always considered "less than"
666 defined symbols with zero values. Common symbols are not treated
667 specially -- i.e., their sizes are used as their "values". */
670 numeric_forward (P_x
, P_y
)
677 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
678 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
679 if (x
== NULL
|| y
== NULL
)
680 bfd_fatal (bfd_get_filename (sort_bfd
));
682 xs
= bfd_get_section (x
);
683 ys
= bfd_get_section (y
);
685 if (bfd_is_und_section (xs
))
687 if (! bfd_is_und_section (ys
))
690 else if (bfd_is_und_section (ys
))
692 else if (valueof (x
) != valueof (y
))
693 return valueof (x
) < valueof (y
) ? -1 : 1;
695 return non_numeric_forward (P_x
, P_y
);
699 numeric_reverse (x
, y
)
703 return - numeric_forward (x
, y
);
707 non_numeric_forward (P_x
, P_y
)
714 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
715 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
716 if (x
== NULL
|| y
== NULL
)
717 bfd_fatal (bfd_get_filename (sort_bfd
));
719 xn
= bfd_asymbol_name (x
);
720 yn
= bfd_asymbol_name (y
);
722 return ((xn
== NULL
) ? ((yn
== NULL
) ? 0 : -1) :
723 ((yn
== NULL
) ? 1 : strcmp (xn
, yn
)));
727 non_numeric_reverse (x
, y
)
731 return - non_numeric_forward (x
, y
);
734 static int (*(sorters
[2][2])) PARAMS ((const PTR
, const PTR
)) =
736 { non_numeric_forward
, non_numeric_reverse
},
737 { numeric_forward
, numeric_reverse
}
740 /* This sort routine is used by sort_symbols_by_size. It is similar
741 to numeric_forward, but when symbols have the same value it sorts
742 by section VMA. This simplifies the sort_symbols_by_size code
743 which handles symbols at the end of sections. Also, this routine
744 tries to sort file names before other symbols with the same value.
745 That will make the file name have a zero size, which will make
746 sort_symbols_by_size choose the non file name symbol, leading to
747 more meaningful output. For similar reasons, this code sorts
748 gnu_compiled_* and gcc2_compiled before other symbols with the same
752 size_forward1 (P_x
, P_y
)
762 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
763 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
764 if (x
== NULL
|| y
== NULL
)
765 bfd_fatal (bfd_get_filename (sort_bfd
));
767 xs
= bfd_get_section (x
);
768 ys
= bfd_get_section (y
);
770 if (bfd_is_und_section (xs
))
772 if (bfd_is_und_section (ys
))
775 if (valueof (x
) != valueof (y
))
776 return valueof (x
) < valueof (y
) ? -1 : 1;
778 if (xs
->vma
!= ys
->vma
)
779 return xs
->vma
< ys
->vma
? -1 : 1;
781 xn
= bfd_asymbol_name (x
);
782 yn
= bfd_asymbol_name (y
);
786 /* The symbols gnu_compiled and gcc2_compiled convey even less
787 information than the file name, so sort them out first. */
789 xf
= (strstr (xn
, "gnu_compiled") != NULL
790 || strstr (xn
, "gcc2_compiled") != NULL
);
791 yf
= (strstr (yn
, "gnu_compiled") != NULL
792 || strstr (yn
, "gcc2_compiled") != NULL
);
799 /* We use a heuristic for the file name. It may not work on non
800 Unix systems, but it doesn't really matter; the only difference
801 is precisely which symbol names get printed. */
803 #define file_symbol(s, sn, snl) \
804 (((s)->flags & BSF_FILE) != 0 \
805 || ((sn)[(snl) - 2] == '.' \
806 && ((sn)[(snl) - 1] == 'o' \
807 || (sn)[(snl) - 1] == 'a')))
809 xf
= file_symbol (x
, xn
, xnl
);
810 yf
= file_symbol (y
, yn
, ynl
);
817 return non_numeric_forward (P_x
, P_y
);
820 /* This sort routine is used by sort_symbols_by_size. It is sorting
821 an array of size_sym structures into size order. */
824 size_forward2 (P_x
, P_y
)
828 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
829 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
831 if (x
->size
< y
->size
)
832 return reverse_sort
? 1 : -1;
833 else if (x
->size
> y
->size
)
834 return reverse_sort
? -1 : 1;
836 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
839 /* Sort the symbols by size. We guess the size by assuming that the
840 difference between the address of a symbol and the address of the
841 next higher symbol is the size. FIXME: ELF actually stores a size
842 with each symbol. We should use it. */
845 sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
, size
, symsizesp
)
851 struct size_sym
**symsizesp
;
853 struct size_sym
*symsizes
;
854 bfd_byte
*from
, *fromend
;
856 asymbol
*store_sym
, *store_next
;
858 qsort (minisyms
, symcount
, size
, size_forward1
);
860 /* We are going to return a special set of symbols and sizes to
862 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
863 *symsizesp
= symsizes
;
865 /* Note that filter_symbols has already removed all absolute and
866 undefined symbols. Here we remove all symbols whose size winds
869 from
= (bfd_byte
*) minisyms
;
870 fromend
= from
+ symcount
* size
;
877 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
,
880 bfd_fatal (bfd_get_filename (abfd
));
883 for (; from
< fromend
; from
+= size
)
890 if (from
+ size
< fromend
)
892 next
= bfd_minisymbol_to_symbol (abfd
,
894 (const PTR
) (from
+ size
),
897 bfd_fatal (bfd_get_filename (abfd
));
902 sec
= bfd_get_section (sym
);
904 if (bfd_is_com_section (sec
))
908 if (from
+ size
< fromend
909 && sec
== bfd_get_section (next
))
910 sz
= valueof (next
) - valueof (sym
);
912 sz
= (bfd_get_section_vma (abfd
, sec
)
913 + bfd_section_size (abfd
, sec
)
919 symsizes
->minisym
= (const PTR
) from
;
927 store_sym
= store_next
;
931 symcount
= symsizes
- *symsizesp
;
933 /* We must now sort again by size. */
934 qsort ((PTR
) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
939 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
942 display_rel_file (abfd
, archive_bfd
)
949 struct size_sym
*symsizes
;
954 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
956 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
961 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
963 bfd_fatal (bfd_get_filename (abfd
));
967 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
971 bfd_sprintf_vma (abfd
, buf
, (bfd_vma
) -1);
972 print_width
= strlen (buf
);
974 /* Discard the symbols we don't want to print.
975 It's OK to do this in place; we'll free the storage anyway
978 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
984 sort_dynamic
= dynamic
;
985 sort_x
= bfd_make_empty_symbol (abfd
);
986 sort_y
= bfd_make_empty_symbol (abfd
);
987 if (sort_x
== NULL
|| sort_y
== NULL
)
988 bfd_fatal (bfd_get_filename (abfd
));
991 qsort (minisyms
, symcount
, size
,
992 sorters
[sort_numerically
][reverse_sort
]);
994 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
999 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1001 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1006 /* Choose which symbol entries to print;
1007 compact them downward to get rid of the rest.
1008 Return the number of symbols to be printed. */
1011 filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
)
1018 bfd_byte
*from
, *fromend
, *to
;
1021 store
= bfd_make_empty_symbol (abfd
);
1023 bfd_fatal (bfd_get_filename (abfd
));
1025 from
= (bfd_byte
*) minisyms
;
1026 fromend
= from
+ symcount
* size
;
1027 to
= (bfd_byte
*) minisyms
;
1029 for (; from
< fromend
; from
+= size
)
1036 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
, store
);
1038 bfd_fatal (bfd_get_filename (abfd
));
1041 keep
= bfd_is_und_section (sym
->section
);
1042 else if (external_only
)
1043 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
1044 || (sym
->flags
& BSF_WEAK
) != 0
1045 || bfd_is_und_section (sym
->section
)
1046 || bfd_is_com_section (sym
->section
));
1051 && ! print_debug_syms
1052 && (sym
->flags
& BSF_DEBUGGING
) != 0)
1057 && (bfd_is_abs_section (sym
->section
)
1058 || bfd_is_und_section (sym
->section
)))
1064 if (bfd_is_und_section (sym
->section
))
1070 memcpy (to
, from
, size
);
1075 return (to
- (bfd_byte
*) minisyms
) / size
;
1078 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1079 demangling it if requested. */
1082 print_symname (format
, name
, abfd
)
1087 if (do_demangle
&& *name
)
1091 /* In this mode, give a user-level view of the symbol name
1092 even if it's not mangled; strip off any leading
1094 if (bfd_get_symbol_leading_char (abfd
) == name
[0])
1097 res
= cplus_demangle (name
, DMGL_ANSI
| DMGL_PARAMS
);
1100 printf (format
, res
);
1106 printf (format
, name
);
1109 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1113 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
)
1122 bfd_byte
*from
, *fromend
;
1124 store
= bfd_make_empty_symbol (abfd
);
1126 bfd_fatal (bfd_get_filename (abfd
));
1128 from
= (bfd_byte
*) minisyms
;
1129 fromend
= from
+ symcount
* size
;
1130 for (; from
< fromend
; from
+= size
)
1134 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
1136 bfd_fatal (bfd_get_filename (abfd
));
1138 print_symbol (abfd
, sym
, archive_bfd
);
1142 /* Print the symbols when sorting by size. */
1145 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
)
1148 struct size_sym
*symsizes
;
1153 struct size_sym
*from
, *fromend
;
1155 store
= bfd_make_empty_symbol (abfd
);
1157 bfd_fatal (bfd_get_filename (abfd
));
1160 fromend
= from
+ symcount
;
1161 for (; from
< fromend
; from
++)
1165 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
1167 bfd_fatal (bfd_get_filename (abfd
));
1169 /* Set the symbol value so that we actually display the symbol
1171 sym
->value
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
1173 print_symbol (abfd
, sym
, archive_bfd
);
1177 /* Print a single symbol. */
1180 print_symbol (abfd
, sym
, archive_bfd
)
1187 (*format
->print_symbol_filename
) (archive_bfd
, abfd
);
1191 if (bfd_is_und_section (bfd_get_section (sym
)))
1192 print_symname ("%s", bfd_asymbol_name (sym
), abfd
);
1196 symbol_info syminfo
;
1198 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1199 (*format
->print_symbol_info
) (&syminfo
, abfd
);
1204 static asymbol
**syms
;
1205 static long symcount
;
1206 const char *filename
, *functionname
;
1207 unsigned int lineno
;
1209 /* We need to get the canonical symbols in order to call
1210 bfd_find_nearest_line. This is inefficient, but, then, you
1211 don't have to use --line-numbers. */
1212 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
1221 symsize
= bfd_get_symtab_upper_bound (abfd
);
1223 bfd_fatal (bfd_get_filename (abfd
));
1224 syms
= (asymbol
**) xmalloc (symsize
);
1225 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
1227 bfd_fatal (bfd_get_filename (abfd
));
1228 lineno_cache_bfd
= abfd
;
1231 if (bfd_is_und_section (bfd_get_section (sym
)))
1233 static asection
**secs
;
1234 static arelent
***relocs
;
1235 static long *relcount
;
1236 static unsigned int seccount
;
1238 const char *symname
;
1240 /* For an undefined symbol, we try to find a reloc for the
1241 symbol, and print the line number of the reloc. */
1243 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
1245 for (i
= 0; i
< seccount
; i
++)
1246 if (relocs
[i
] != NULL
)
1258 struct get_relocs_info info
;
1260 seccount
= bfd_count_sections (abfd
);
1262 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
1263 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
1264 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
1267 info
.relocs
= relocs
;
1268 info
.relcount
= relcount
;
1270 bfd_map_over_sections (abfd
, get_relocs
, (PTR
) &info
);
1271 lineno_cache_rel_bfd
= abfd
;
1274 symname
= bfd_asymbol_name (sym
);
1275 for (i
= 0; i
< seccount
; i
++)
1279 for (j
= 0; j
< relcount
[i
]; j
++)
1284 if (r
->sym_ptr_ptr
!= NULL
1285 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1286 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1288 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1289 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
1290 r
->address
, &filename
,
1291 &functionname
, &lineno
))
1293 /* We only print the first one we find. */
1294 printf ("\t%s:%u", filename
, lineno
);
1301 else if (bfd_get_section (sym
)->owner
== abfd
)
1303 if (bfd_find_nearest_line (abfd
, bfd_get_section (sym
), syms
,
1304 sym
->value
, &filename
, &functionname
,
1309 printf ("\t%s:%u", filename
, lineno
);
1317 /* The following 3 groups of functions are called unconditionally,
1318 once at the start of processing each file of the appropriate type.
1319 They should check `filename_per_file' and `filename_per_symbol',
1320 as appropriate for their output format, to determine whether to
1323 /* Print the name of an object file given on the command line. */
1326 print_object_filename_bsd (filename
)
1329 if (filename_per_file
&& !filename_per_symbol
)
1330 printf ("\n%s:\n", filename
);
1334 print_object_filename_sysv (filename
)
1338 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1340 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1342 Name Value Class Type Size Line Section\n\n"));
1346 print_object_filename_posix (filename
)
1349 if (filename_per_file
&& !filename_per_symbol
)
1350 printf ("%s:\n", filename
);
1353 /* Print the name of an archive file given on the command line. */
1356 print_archive_filename_bsd (filename
)
1359 if (filename_per_file
)
1360 printf ("\n%s:\n", filename
);
1364 print_archive_filename_sysv (filename
)
1365 char *filename ATTRIBUTE_UNUSED
;
1370 print_archive_filename_posix (filename
)
1371 char *filename ATTRIBUTE_UNUSED
;
1375 /* Print the name of an archive member file. */
1378 print_archive_member_bsd (archive
, filename
)
1379 char *archive ATTRIBUTE_UNUSED
;
1380 CONST
char *filename
;
1382 if (!filename_per_symbol
)
1383 printf ("\n%s:\n", filename
);
1387 print_archive_member_sysv (archive
, filename
)
1389 CONST
char *filename
;
1392 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1394 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1396 Name Value Class Type Size Line Section\n\n"));
1400 print_archive_member_posix (archive
, filename
)
1402 CONST
char *filename
;
1404 if (!filename_per_symbol
)
1405 printf ("%s[%s]:\n", archive
, filename
);
1408 /* Print the name of the file (and archive, if there is one)
1409 containing a symbol. */
1412 print_symbol_filename_bsd (archive_bfd
, abfd
)
1413 bfd
*archive_bfd
, *abfd
;
1415 if (filename_per_symbol
)
1418 printf ("%s:", bfd_get_filename (archive_bfd
));
1419 printf ("%s:", bfd_get_filename (abfd
));
1424 print_symbol_filename_sysv (archive_bfd
, abfd
)
1425 bfd
*archive_bfd
, *abfd
;
1427 if (filename_per_symbol
)
1430 printf ("%s:", bfd_get_filename (archive_bfd
));
1431 printf ("%s:", bfd_get_filename (abfd
));
1436 print_symbol_filename_posix (archive_bfd
, abfd
)
1437 bfd
*archive_bfd
, *abfd
;
1439 if (filename_per_symbol
)
1442 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1443 bfd_get_filename (abfd
));
1445 printf ("%s: ", bfd_get_filename (abfd
));
1449 /* Print a symbol value. */
1452 print_value (abfd
, val
)
1456 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1457 printf (value_format
, val
);
1459 /* We have a 64 bit value to print, but the host is only 32 bit. */
1460 if (print_radix
== 16)
1461 bfd_fprintf_vma (abfd
, stdout
, val
);
1467 s
= buf
+ sizeof buf
;
1471 *--s
= (val
% print_radix
) + '0';
1474 while ((buf
+ sizeof buf
- 1) - s
< 16)
1481 /* Print a line of information about a symbol. */
1484 print_symbol_info_bsd (info
, abfd
)
1488 if (bfd_is_undefined_symclass (info
->type
))
1490 if (print_width
== 16)
1495 print_value (abfd
, info
->value
);
1496 printf (" %c", info
->type
);
1497 if (info
->type
== '-')
1501 printf (other_format
, info
->stab_other
);
1503 printf (desc_format
, info
->stab_desc
);
1504 printf (" %5s", info
->stab_name
);
1506 print_symname (" %s", info
->name
, abfd
);
1510 print_symbol_info_sysv (info
, abfd
)
1514 print_symname ("%-20s|", info
->name
, abfd
); /* Name */
1515 if (bfd_is_undefined_symclass (info
->type
))
1516 printf (" "); /* Value */
1518 print_value (abfd
, info
->value
);
1519 printf ("| %c |", info
->type
); /* Class */
1520 if (info
->type
== '-')
1523 printf ("%18s| ", info
->stab_name
); /* (C) Type */
1524 printf (desc_format
, info
->stab_desc
); /* Size */
1525 printf ("| |"); /* Line, Section */
1528 printf (" | | |"); /* Type, Size, Line, Section */
1532 print_symbol_info_posix (info
, abfd
)
1536 print_symname ("%s ", info
->name
, abfd
);
1537 printf ("%c ", info
->type
);
1538 if (bfd_is_undefined_symclass (info
->type
))
1541 print_value (abfd
, info
->value
);
1542 /* POSIX.2 wants the symbol size printed here, when applicable;
1543 BFD currently doesn't provide it, so we take the easy way out by
1544 considering it to never be applicable. */
1548 print_symdef_entry (abfd
)
1551 symindex idx
= BFD_NO_MORE_SYMBOLS
;
1553 boolean everprinted
= false;
1555 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
1556 idx
!= BFD_NO_MORE_SYMBOLS
;
1557 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
1562 printf (_("\nArchive index:\n"));
1565 elt
= bfd_get_elt_at_index (abfd
, idx
);
1567 bfd_fatal ("bfd_get_elt_at_index");
1568 if (thesym
->name
!= (char *) NULL
)
1570 print_symname ("%s", thesym
->name
, abfd
);
1571 printf (" in %s\n", bfd_get_filename (elt
));
1576 /* This function is used to get the relocs for a particular section.
1577 It is called via bfd_map_over_sections. */
1580 get_relocs (abfd
, sec
, dataarg
)
1585 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
1589 if ((sec
->flags
& SEC_RELOC
) == 0)
1591 *data
->relocs
= NULL
;
1592 *data
->relcount
= 0;
1598 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1600 bfd_fatal (bfd_get_filename (abfd
));
1602 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1603 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1605 if (*data
->relcount
< 0)
1606 bfd_fatal (bfd_get_filename (abfd
));