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. */
248 static int print_radix
= 16;
249 /* Print formats for printing stab info. */
250 static char other_format
[] = "%02x";
251 static char desc_format
[] = "%04x";
253 static char *target
= NULL
;
255 /* Used to cache the line numbers for a BFD. */
256 static bfd
*lineno_cache_bfd
;
257 static bfd
*lineno_cache_rel_bfd
;
259 #define OPTION_TARGET 200
261 static struct option long_options
[] =
263 {"debug-syms", no_argument
, &print_debug_syms
, 1},
264 {"demangle", optional_argument
, 0, 'C'},
265 {"dynamic", no_argument
, &dynamic
, 1},
266 {"extern-only", no_argument
, &external_only
, 1},
267 {"format", required_argument
, 0, 'f'},
268 {"help", no_argument
, 0, 'h'},
269 {"line-numbers", no_argument
, 0, 'l'},
270 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
271 {"no-demangle", no_argument
, &do_demangle
, 0},
272 {"no-sort", no_argument
, &no_sort
, 1},
273 {"numeric-sort", no_argument
, &sort_numerically
, 1},
274 {"portability", no_argument
, 0, 'P'},
275 {"print-armap", no_argument
, &print_armap
, 1},
276 {"print-file-name", no_argument
, 0, 'o'},
277 {"radix", required_argument
, 0, 't'},
278 {"reverse-sort", no_argument
, &reverse_sort
, 1},
279 {"size-sort", no_argument
, &sort_by_size
, 1},
280 {"stats", no_argument
, &show_stats
, 1},
281 {"target", required_argument
, 0, OPTION_TARGET
},
282 {"defined-only", no_argument
, &defined_only
, 1},
283 {"undefined-only", no_argument
, &undefined_only
, 1},
284 {"version", no_argument
, &show_version
, 1},
285 {0, no_argument
, 0, 0}
288 /* Some error-reporting functions */
291 usage (stream
, status
)
295 fprintf (stream
, _("Usage: %s [OPTION]... [FILE]...\n"), program_name
);
296 fprintf (stream
, _("List symbols from FILEs (a.out by default).\n"));
297 fprintf (stream
, _("\n\
298 -a, --debug-syms Display debugger-only symbols\n\
299 -A, --print-file-name Print name of the input file before every symbol\n\
300 -B Same as --format=bsd\n\
301 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
302 The STYLE, if specified, can be `auto' (the default),\n\
303 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-new-abi'\n\
304 --no-demangle Do not demangle low-level symbol names\n\
305 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
306 --defined-only Display only defined symbols\n\
308 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
309 `sysv' or `posix'. The default is `bsd'\n\
310 -g, --extern-only Display only external symbols\n\
311 -h, --help Display this information\n\
312 -l, --line-numbers Use debugging information to find a filename and\n\
313 line number for each symbol\n\
314 -n, --numeric-sort Sort symbols numerically by address\n\
316 -p, --no-sort Do not sort the symbols\n\
317 -P, --portability Same as --format=posix\n\
318 -r, --reverse-sort Reverse the sense of the sort\n\
319 -s, --print-armap Include index for symbols from archive members\n\
320 --size-sort Sort symbols by size\n\
321 -t, --radix=RADIX Use RADIX for printing symbol values\n\
322 --target=BFDNAME Specify the target object format as BFDNAME\n\
323 -u, --undefined-only Display only undefined symbols\n\
324 -V, --version Display this program's version number\n\
325 -X 32_64 (ignored)\n\
327 list_supported_targets (program_name
, stream
);
329 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
333 /* Set the radix for the symbol value and size according to RADIX. */
336 set_print_radix (radix
)
350 value_format
[4] = *radix
;
352 #if BFD_HOST_64BIT_LONG
353 value_format
[5] = *radix
;
355 /* This case requires special handling for octal and decimal
359 other_format
[3] = desc_format
[3] = *radix
;
362 fatal (_("%s: invalid radix"), radix
);
367 set_output_format (f
)
387 fatal (_("%s: invalid output format"), f
);
389 format
= &formats
[i
];
400 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
401 setlocale (LC_MESSAGES
, "");
403 bindtextdomain (PACKAGE
, LOCALEDIR
);
404 textdomain (PACKAGE
);
406 program_name
= *argv
;
407 xmalloc_set_program_name (program_name
);
409 START_PROGRESS (program_name
, 0);
412 set_default_bfd_target ();
414 while ((c
= getopt_long (argc
, argv
, "aABCDef:glnopPrst:uvVX:",
415 long_options
, (int *) 0)) != EOF
)
420 print_debug_syms
= 1;
424 filename_per_symbol
= 1;
426 case 'B': /* For MIPS compatibility. */
427 set_output_format ("bsd");
433 enum demangling_styles style
;
435 style
= cplus_demangle_name_to_style (optarg
);
436 if (style
== unknown_demangling
)
437 fatal (_("unknown demangling style `%s'"),
440 cplus_demangle_set_style (style
);
447 /* Ignored for HP/UX compatibility. */
450 set_output_format (optarg
);
462 sort_numerically
= 1;
468 set_output_format ("posix");
477 set_print_radix (optarg
);
486 /* Ignored for (partial) AIX compatibility. On AIX, the
487 argument has values 32, 64, or 32_64, and specfies that
488 only 32-bit, only 64-bit, or both kinds of objects should
489 be examined. The default is 32. So plain AIX nm on a
490 library archive with both kinds of objects will ignore
491 the 64-bit ones. For GNU nm, the default is and always
492 has been -X 32_64, and other options are not supported. */
493 if (strcmp (optarg
, "32_64") != 0)
494 fatal (_("Only -X 32_64 is supported"));
497 case OPTION_TARGET
: /* --target */
501 case 0: /* A long option that just sets a flag. */
510 print_version ("nm");
512 /* OK, all options now parsed. If no filename specified, do a.out. */
514 return !display_file ("a.out");
518 if (argc
- optind
> 1)
519 filename_per_file
= 1;
521 /* We were given several filenames to do. */
522 while (optind
< argc
)
525 if (!display_file (argv
[optind
++]))
529 END_PROGRESS (program_name
);
534 char *lim
= (char *) sbrk (0);
536 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));
545 display_archive (file
)
549 bfd
*last_arfile
= NULL
;
552 (*format
->print_archive_filename
) (bfd_get_filename (file
));
555 print_symdef_entry (file
);
561 arfile
= bfd_openr_next_archived_file (file
, arfile
);
565 if (bfd_get_error () != bfd_error_no_more_archived_files
)
566 bfd_fatal (bfd_get_filename (file
));
570 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
572 (*format
->print_archive_member
) (bfd_get_filename (file
),
573 bfd_get_filename (arfile
));
574 display_rel_file (arfile
, file
);
578 bfd_nonfatal (bfd_get_filename (arfile
));
579 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
581 list_matching_formats (matching
);
586 if (last_arfile
!= NULL
)
588 bfd_close (last_arfile
);
589 lineno_cache_bfd
= NULL
;
590 lineno_cache_rel_bfd
= NULL
;
592 last_arfile
= arfile
;
595 if (last_arfile
!= NULL
)
597 bfd_close (last_arfile
);
598 lineno_cache_bfd
= NULL
;
599 lineno_cache_rel_bfd
= NULL
;
604 display_file (filename
)
607 boolean retval
= true;
611 file
= bfd_openr (filename
, target
);
614 bfd_nonfatal (filename
);
618 if (bfd_check_format (file
, bfd_archive
))
620 display_archive (file
);
622 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
624 (*format
->print_object_filename
) (filename
);
625 display_rel_file (file
, NULL
);
629 bfd_nonfatal (filename
);
630 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
632 list_matching_formats (matching
);
638 if (bfd_close (file
) == false)
639 bfd_fatal (filename
);
641 lineno_cache_bfd
= NULL
;
642 lineno_cache_rel_bfd
= NULL
;
647 /* These globals are used to pass information into the sorting
649 static bfd
*sort_bfd
;
650 static boolean sort_dynamic
;
651 static asymbol
*sort_x
;
652 static asymbol
*sort_y
;
654 /* Symbol-sorting predicates */
655 #define valueof(x) ((x)->section->vma + (x)->value)
657 /* Numeric sorts. Undefined symbols are always considered "less than"
658 defined symbols with zero values. Common symbols are not treated
659 specially -- i.e., their sizes are used as their "values". */
662 numeric_forward (P_x
, P_y
)
669 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
670 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
671 if (x
== NULL
|| y
== NULL
)
672 bfd_fatal (bfd_get_filename (sort_bfd
));
674 xs
= bfd_get_section (x
);
675 ys
= bfd_get_section (y
);
677 if (bfd_is_und_section (xs
))
679 if (! bfd_is_und_section (ys
))
682 else if (bfd_is_und_section (ys
))
684 else if (valueof (x
) != valueof (y
))
685 return valueof (x
) < valueof (y
) ? -1 : 1;
687 return non_numeric_forward (P_x
, P_y
);
691 numeric_reverse (x
, y
)
695 return - numeric_forward (x
, y
);
699 non_numeric_forward (P_x
, P_y
)
706 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
707 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
708 if (x
== NULL
|| y
== NULL
)
709 bfd_fatal (bfd_get_filename (sort_bfd
));
711 xn
= bfd_asymbol_name (x
);
712 yn
= bfd_asymbol_name (y
);
714 return ((xn
== NULL
) ? ((yn
== NULL
) ? 0 : -1) :
715 ((yn
== NULL
) ? 1 : strcmp (xn
, yn
)));
719 non_numeric_reverse (x
, y
)
723 return - non_numeric_forward (x
, y
);
726 static int (*(sorters
[2][2])) PARAMS ((const PTR
, const PTR
)) =
728 { non_numeric_forward
, non_numeric_reverse
},
729 { numeric_forward
, numeric_reverse
}
732 /* This sort routine is used by sort_symbols_by_size. It is similar
733 to numeric_forward, but when symbols have the same value it sorts
734 by section VMA. This simplifies the sort_symbols_by_size code
735 which handles symbols at the end of sections. Also, this routine
736 tries to sort file names before other symbols with the same value.
737 That will make the file name have a zero size, which will make
738 sort_symbols_by_size choose the non file name symbol, leading to
739 more meaningful output. For similar reasons, this code sorts
740 gnu_compiled_* and gcc2_compiled before other symbols with the same
744 size_forward1 (P_x
, P_y
)
754 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
755 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
756 if (x
== NULL
|| y
== NULL
)
757 bfd_fatal (bfd_get_filename (sort_bfd
));
759 xs
= bfd_get_section (x
);
760 ys
= bfd_get_section (y
);
762 if (bfd_is_und_section (xs
))
764 if (bfd_is_und_section (ys
))
767 if (valueof (x
) != valueof (y
))
768 return valueof (x
) < valueof (y
) ? -1 : 1;
770 if (xs
->vma
!= ys
->vma
)
771 return xs
->vma
< ys
->vma
? -1 : 1;
773 xn
= bfd_asymbol_name (x
);
774 yn
= bfd_asymbol_name (y
);
778 /* The symbols gnu_compiled and gcc2_compiled convey even less
779 information than the file name, so sort them out first. */
781 xf
= (strstr (xn
, "gnu_compiled") != NULL
782 || strstr (xn
, "gcc2_compiled") != NULL
);
783 yf
= (strstr (yn
, "gnu_compiled") != NULL
784 || strstr (yn
, "gcc2_compiled") != NULL
);
791 /* We use a heuristic for the file name. It may not work on non
792 Unix systems, but it doesn't really matter; the only difference
793 is precisely which symbol names get printed. */
795 #define file_symbol(s, sn, snl) \
796 (((s)->flags & BSF_FILE) != 0 \
797 || ((sn)[(snl) - 2] == '.' \
798 && ((sn)[(snl) - 1] == 'o' \
799 || (sn)[(snl) - 1] == 'a')))
801 xf
= file_symbol (x
, xn
, xnl
);
802 yf
= file_symbol (y
, yn
, ynl
);
809 return non_numeric_forward (P_x
, P_y
);
812 /* This sort routine is used by sort_symbols_by_size. It is sorting
813 an array of size_sym structures into size order. */
816 size_forward2 (P_x
, P_y
)
820 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
821 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
823 if (x
->size
< y
->size
)
824 return reverse_sort
? 1 : -1;
825 else if (x
->size
> y
->size
)
826 return reverse_sort
? -1 : 1;
828 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
831 /* Sort the symbols by size. We guess the size by assuming that the
832 difference between the address of a symbol and the address of the
833 next higher symbol is the size. FIXME: ELF actually stores a size
834 with each symbol. We should use it. */
837 sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
, size
, symsizesp
)
843 struct size_sym
**symsizesp
;
845 struct size_sym
*symsizes
;
846 bfd_byte
*from
, *fromend
;
848 asymbol
*store_sym
, *store_next
;
850 qsort (minisyms
, symcount
, size
, size_forward1
);
852 /* We are going to return a special set of symbols and sizes to
854 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
855 *symsizesp
= symsizes
;
857 /* Note that filter_symbols has already removed all absolute and
858 undefined symbols. Here we remove all symbols whose size winds
861 from
= (bfd_byte
*) minisyms
;
862 fromend
= from
+ symcount
* size
;
869 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
,
872 bfd_fatal (bfd_get_filename (abfd
));
875 for (; from
< fromend
; from
+= size
)
882 if (from
+ size
< fromend
)
884 next
= bfd_minisymbol_to_symbol (abfd
,
886 (const PTR
) (from
+ size
),
889 bfd_fatal (bfd_get_filename (abfd
));
894 sec
= bfd_get_section (sym
);
896 if (bfd_is_com_section (sec
))
900 if (from
+ size
< fromend
901 && sec
== bfd_get_section (next
))
902 sz
= valueof (next
) - valueof (sym
);
904 sz
= (bfd_get_section_vma (abfd
, sec
)
905 + bfd_section_size (abfd
, sec
)
911 symsizes
->minisym
= (const PTR
) from
;
919 store_sym
= store_next
;
923 symcount
= symsizes
- *symsizesp
;
925 /* We must now sort again by size. */
926 qsort ((PTR
) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
931 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
934 display_rel_file (abfd
, archive_bfd
)
941 struct size_sym
*symsizes
;
945 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
947 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
952 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
954 bfd_fatal (bfd_get_filename (abfd
));
958 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
962 /* Discard the symbols we don't want to print.
963 It's OK to do this in place; we'll free the storage anyway
966 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
972 sort_dynamic
= dynamic
;
973 sort_x
= bfd_make_empty_symbol (abfd
);
974 sort_y
= bfd_make_empty_symbol (abfd
);
975 if (sort_x
== NULL
|| sort_y
== NULL
)
976 bfd_fatal (bfd_get_filename (abfd
));
979 qsort (minisyms
, symcount
, size
,
980 sorters
[sort_numerically
][reverse_sort
]);
982 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
987 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
989 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
994 /* Choose which symbol entries to print;
995 compact them downward to get rid of the rest.
996 Return the number of symbols to be printed. */
999 filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
)
1006 bfd_byte
*from
, *fromend
, *to
;
1009 store
= bfd_make_empty_symbol (abfd
);
1011 bfd_fatal (bfd_get_filename (abfd
));
1013 from
= (bfd_byte
*) minisyms
;
1014 fromend
= from
+ symcount
* size
;
1015 to
= (bfd_byte
*) minisyms
;
1017 for (; from
< fromend
; from
+= size
)
1024 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
, store
);
1026 bfd_fatal (bfd_get_filename (abfd
));
1029 keep
= bfd_is_und_section (sym
->section
);
1030 else if (external_only
)
1031 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
1032 || (sym
->flags
& BSF_WEAK
) != 0
1033 || bfd_is_und_section (sym
->section
)
1034 || bfd_is_com_section (sym
->section
));
1039 && ! print_debug_syms
1040 && (sym
->flags
& BSF_DEBUGGING
) != 0)
1045 && (bfd_is_abs_section (sym
->section
)
1046 || bfd_is_und_section (sym
->section
)))
1052 if (bfd_is_und_section (sym
->section
))
1058 memcpy (to
, from
, size
);
1063 return (to
- (bfd_byte
*) minisyms
) / size
;
1066 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1067 demangling it if requested. */
1070 print_symname (format
, name
, abfd
)
1075 if (do_demangle
&& *name
)
1079 /* In this mode, give a user-level view of the symbol name
1080 even if it's not mangled; strip off any leading
1082 if (bfd_get_symbol_leading_char (abfd
) == name
[0])
1085 res
= cplus_demangle (name
, DMGL_ANSI
| DMGL_PARAMS
);
1088 printf (format
, res
);
1094 printf (format
, name
);
1097 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1101 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
)
1110 bfd_byte
*from
, *fromend
;
1112 store
= bfd_make_empty_symbol (abfd
);
1114 bfd_fatal (bfd_get_filename (abfd
));
1116 from
= (bfd_byte
*) minisyms
;
1117 fromend
= from
+ symcount
* size
;
1118 for (; from
< fromend
; from
+= size
)
1122 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
1124 bfd_fatal (bfd_get_filename (abfd
));
1126 print_symbol (abfd
, sym
, archive_bfd
);
1130 /* Print the symbols when sorting by size. */
1133 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
)
1136 struct size_sym
*symsizes
;
1141 struct size_sym
*from
, *fromend
;
1143 store
= bfd_make_empty_symbol (abfd
);
1145 bfd_fatal (bfd_get_filename (abfd
));
1148 fromend
= from
+ symcount
;
1149 for (; from
< fromend
; from
++)
1153 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
1155 bfd_fatal (bfd_get_filename (abfd
));
1157 /* Set the symbol value so that we actually display the symbol
1159 sym
->value
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
1161 print_symbol (abfd
, sym
, archive_bfd
);
1165 /* Print a single symbol. */
1168 print_symbol (abfd
, sym
, archive_bfd
)
1175 (*format
->print_symbol_filename
) (archive_bfd
, abfd
);
1179 if (bfd_is_und_section (bfd_get_section (sym
)))
1180 print_symname ("%s", bfd_asymbol_name (sym
), abfd
);
1184 symbol_info syminfo
;
1186 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1187 (*format
->print_symbol_info
) (&syminfo
, abfd
);
1192 static asymbol
**syms
;
1193 static long symcount
;
1194 const char *filename
, *functionname
;
1195 unsigned int lineno
;
1197 /* We need to get the canonical symbols in order to call
1198 bfd_find_nearest_line. This is inefficient, but, then, you
1199 don't have to use --line-numbers. */
1200 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
1209 symsize
= bfd_get_symtab_upper_bound (abfd
);
1211 bfd_fatal (bfd_get_filename (abfd
));
1212 syms
= (asymbol
**) xmalloc (symsize
);
1213 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
1215 bfd_fatal (bfd_get_filename (abfd
));
1216 lineno_cache_bfd
= abfd
;
1219 if (bfd_is_und_section (bfd_get_section (sym
)))
1221 static asection
**secs
;
1222 static arelent
***relocs
;
1223 static long *relcount
;
1224 static unsigned int seccount
;
1226 const char *symname
;
1228 /* For an undefined symbol, we try to find a reloc for the
1229 symbol, and print the line number of the reloc. */
1231 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
1233 for (i
= 0; i
< seccount
; i
++)
1234 if (relocs
[i
] != NULL
)
1246 struct get_relocs_info info
;
1248 seccount
= bfd_count_sections (abfd
);
1250 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
1251 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
1252 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
1255 info
.relocs
= relocs
;
1256 info
.relcount
= relcount
;
1258 bfd_map_over_sections (abfd
, get_relocs
, (PTR
) &info
);
1259 lineno_cache_rel_bfd
= abfd
;
1262 symname
= bfd_asymbol_name (sym
);
1263 for (i
= 0; i
< seccount
; i
++)
1267 for (j
= 0; j
< relcount
[i
]; j
++)
1272 if (r
->sym_ptr_ptr
!= NULL
1273 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1274 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1276 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1277 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
1278 r
->address
, &filename
,
1279 &functionname
, &lineno
))
1281 /* We only print the first one we find. */
1282 printf ("\t%s:%u", filename
, lineno
);
1289 else if (bfd_get_section (sym
)->owner
== abfd
)
1291 if (bfd_find_nearest_line (abfd
, bfd_get_section (sym
), syms
,
1292 sym
->value
, &filename
, &functionname
,
1297 printf ("\t%s:%u", filename
, lineno
);
1305 /* The following 3 groups of functions are called unconditionally,
1306 once at the start of processing each file of the appropriate type.
1307 They should check `filename_per_file' and `filename_per_symbol',
1308 as appropriate for their output format, to determine whether to
1311 /* Print the name of an object file given on the command line. */
1314 print_object_filename_bsd (filename
)
1317 if (filename_per_file
&& !filename_per_symbol
)
1318 printf ("\n%s:\n", filename
);
1322 print_object_filename_sysv (filename
)
1326 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1328 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1330 Name Value Class Type Size Line Section\n\n"));
1334 print_object_filename_posix (filename
)
1337 if (filename_per_file
&& !filename_per_symbol
)
1338 printf ("%s:\n", filename
);
1341 /* Print the name of an archive file given on the command line. */
1344 print_archive_filename_bsd (filename
)
1347 if (filename_per_file
)
1348 printf ("\n%s:\n", filename
);
1352 print_archive_filename_sysv (filename
)
1353 char *filename ATTRIBUTE_UNUSED
;
1358 print_archive_filename_posix (filename
)
1359 char *filename ATTRIBUTE_UNUSED
;
1363 /* Print the name of an archive member file. */
1366 print_archive_member_bsd (archive
, filename
)
1367 char *archive ATTRIBUTE_UNUSED
;
1368 CONST
char *filename
;
1370 if (!filename_per_symbol
)
1371 printf ("\n%s:\n", filename
);
1375 print_archive_member_sysv (archive
, filename
)
1377 CONST
char *filename
;
1380 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1382 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1384 Name Value Class Type Size Line Section\n\n"));
1388 print_archive_member_posix (archive
, filename
)
1390 CONST
char *filename
;
1392 if (!filename_per_symbol
)
1393 printf ("%s[%s]:\n", archive
, filename
);
1396 /* Print the name of the file (and archive, if there is one)
1397 containing a symbol. */
1400 print_symbol_filename_bsd (archive_bfd
, abfd
)
1401 bfd
*archive_bfd
, *abfd
;
1403 if (filename_per_symbol
)
1406 printf ("%s:", bfd_get_filename (archive_bfd
));
1407 printf ("%s:", bfd_get_filename (abfd
));
1412 print_symbol_filename_sysv (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_posix (archive_bfd
, abfd
)
1425 bfd
*archive_bfd
, *abfd
;
1427 if (filename_per_symbol
)
1430 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1431 bfd_get_filename (abfd
));
1433 printf ("%s: ", bfd_get_filename (abfd
));
1437 /* Print a symbol value. */
1440 print_value (abfd
, val
)
1444 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1445 printf (value_format
, val
);
1447 /* We have a 64 bit value to print, but the host is only 32 bit. */
1448 if (print_radix
== 16)
1449 bfd_fprintf_vma (abfd
, stdout
, val
);
1455 s
= buf
+ sizeof buf
;
1459 *--s
= (val
% print_radix
) + '0';
1462 while ((buf
+ sizeof buf
- 1) - s
< 16)
1469 /* Print a line of information about a symbol. */
1472 print_symbol_info_bsd (info
, abfd
)
1476 if (bfd_is_undefined_symclass (info
->type
))
1484 print_value (abfd
, info
->value
);
1485 printf (" %c", info
->type
);
1486 if (info
->type
== '-')
1490 printf (other_format
, info
->stab_other
);
1492 printf (desc_format
, info
->stab_desc
);
1493 printf (" %5s", info
->stab_name
);
1495 print_symname (" %s", info
->name
, abfd
);
1499 print_symbol_info_sysv (info
, abfd
)
1503 print_symname ("%-20s|", info
->name
, abfd
); /* Name */
1504 if (bfd_is_undefined_symclass (info
->type
))
1505 printf (" "); /* Value */
1507 print_value (abfd
, info
->value
);
1508 printf ("| %c |", info
->type
); /* Class */
1509 if (info
->type
== '-')
1512 printf ("%18s| ", info
->stab_name
); /* (C) Type */
1513 printf (desc_format
, info
->stab_desc
); /* Size */
1514 printf ("| |"); /* Line, Section */
1517 printf (" | | |"); /* Type, Size, Line, Section */
1521 print_symbol_info_posix (info
, abfd
)
1525 print_symname ("%s ", info
->name
, abfd
);
1526 printf ("%c ", info
->type
);
1527 if (bfd_is_undefined_symclass (info
->type
))
1530 print_value (abfd
, info
->value
);
1531 /* POSIX.2 wants the symbol size printed here, when applicable;
1532 BFD currently doesn't provide it, so we take the easy way out by
1533 considering it to never be applicable. */
1537 print_symdef_entry (abfd
)
1540 symindex idx
= BFD_NO_MORE_SYMBOLS
;
1542 boolean everprinted
= false;
1544 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
1545 idx
!= BFD_NO_MORE_SYMBOLS
;
1546 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
1551 printf (_("\nArchive index:\n"));
1554 elt
= bfd_get_elt_at_index (abfd
, idx
);
1556 bfd_fatal ("bfd_get_elt_at_index");
1557 if (thesym
->name
!= (char *) NULL
)
1559 print_symname ("%s", thesym
->name
, abfd
);
1560 printf (" in %s\n", bfd_get_filename (elt
));
1565 /* This function is used to get the relocs for a particular section.
1566 It is called via bfd_map_over_sections. */
1569 get_relocs (abfd
, sec
, dataarg
)
1574 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
1578 if ((sec
->flags
& SEC_RELOC
) == 0)
1580 *data
->relocs
= NULL
;
1581 *data
->relcount
= 0;
1587 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1589 bfd_fatal (bfd_get_filename (abfd
));
1591 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1592 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1594 if (*data
->relcount
< 0)
1595 bfd_fatal (bfd_get_filename (abfd
));