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
28 #include "aout/stab_gnu.h"
29 #include "aout/ranlib.h"
31 #include "libiberty.h"
33 #include "elf/common.h"
35 /* When sorting by size, we use this structure to hold the size and a
36 pointer to the minisymbol. */
44 /* When fetching relocs, we use this structure to pass information to
47 struct get_relocs_info
55 struct extended_symbol_info
59 elf_symbol_type
*elfinfo
;
60 /* FIXME: We should add more fields for Type, Line, Section. */
62 #define SYM_NAME(sym) (sym->sinfo->name)
63 #define SYM_VALUE(sym) (sym->sinfo->value)
64 #define SYM_TYPE(sym) (sym->sinfo->type)
65 #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
66 #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
67 #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
68 #define SYM_SIZE(sym) \
69 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
71 static void usage (FILE *, int);
72 static void set_print_radix (char *);
73 static void set_output_format (char *);
74 static void display_archive (bfd
*);
75 static bfd_boolean
display_file (char *);
76 static void display_rel_file (bfd
*, bfd
*);
77 static long filter_symbols (bfd
*, bfd_boolean
, void *, long, unsigned int);
78 static long sort_symbols_by_size
79 (bfd
*, bfd_boolean
, void *, long, unsigned int, struct size_sym
**);
80 static void print_symbols
81 (bfd
*, bfd_boolean
, void *, long, unsigned int, bfd
*);
82 static void print_size_symbols
83 (bfd
*, bfd_boolean
, struct size_sym
*, long, bfd
*);
84 static void print_symname (const char *, const char *, bfd
*);
85 static void print_symbol (bfd
*, asymbol
*, bfd_vma ssize
, bfd
*);
86 static void print_symdef_entry (bfd
*);
88 /* The sorting functions. */
89 static int numeric_forward (const void *, const void *);
90 static int numeric_reverse (const void *, const void *);
91 static int non_numeric_forward (const void *, const void *);
92 static int non_numeric_reverse (const void *, const void *);
93 static int size_forward1 (const void *, const void *);
94 static int size_forward2 (const void *, const void *);
96 /* The output formatting functions. */
97 static void print_object_filename_bsd (char *);
98 static void print_object_filename_sysv (char *);
99 static void print_object_filename_posix (char *);
100 static void print_archive_filename_bsd (char *);
101 static void print_archive_filename_sysv (char *);
102 static void print_archive_filename_posix (char *);
103 static void print_archive_member_bsd (char *, const char *);
104 static void print_archive_member_sysv (char *, const char *);
105 static void print_archive_member_posix (char *, const char *);
106 static void print_symbol_filename_bsd (bfd
*, bfd
*);
107 static void print_symbol_filename_sysv (bfd
*, bfd
*);
108 static void print_symbol_filename_posix (bfd
*, bfd
*);
109 static void print_value (bfd
*, bfd_vma
);
110 static void print_symbol_info_bsd (struct extended_symbol_info
*, bfd
*);
111 static void print_symbol_info_sysv (struct extended_symbol_info
*, bfd
*);
112 static void print_symbol_info_posix (struct extended_symbol_info
*, bfd
*);
113 static void get_relocs (bfd
*, asection
*, void *);
114 static const char * get_symbol_type (unsigned int);
116 /* Support for different output formats. */
119 /* Print the name of an object file given on the command line. */
120 void (*print_object_filename
) (char *);
122 /* Print the name of an archive file given on the command line. */
123 void (*print_archive_filename
) (char *);
125 /* Print the name of an archive member file. */
126 void (*print_archive_member
) (char *, const char *);
128 /* Print the name of the file (and archive, if there is one)
129 containing a symbol. */
130 void (*print_symbol_filename
) (bfd
*, bfd
*);
132 /* Print a line of information about a symbol. */
133 void (*print_symbol_info
) (struct extended_symbol_info
*, bfd
*);
136 static struct output_fns formats
[] =
138 {print_object_filename_bsd
,
139 print_archive_filename_bsd
,
140 print_archive_member_bsd
,
141 print_symbol_filename_bsd
,
142 print_symbol_info_bsd
},
143 {print_object_filename_sysv
,
144 print_archive_filename_sysv
,
145 print_archive_member_sysv
,
146 print_symbol_filename_sysv
,
147 print_symbol_info_sysv
},
148 {print_object_filename_posix
,
149 print_archive_filename_posix
,
150 print_archive_member_posix
,
151 print_symbol_filename_posix
,
152 print_symbol_info_posix
}
155 /* Indices in `formats'. */
157 #define FORMAT_SYSV 1
158 #define FORMAT_POSIX 2
159 #define FORMAT_DEFAULT FORMAT_BSD
161 /* The output format to use. */
162 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
164 /* Command options. */
166 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
167 static int external_only
= 0; /* Print external symbols only. */
168 static int defined_only
= 0; /* Print defined symbols only. */
169 static int no_sort
= 0; /* Don't sort; print syms in order found. */
170 static int print_debug_syms
= 0;/* Print debugger-only symbols too. */
171 static int print_armap
= 0; /* Describe __.SYMDEF data in archive files. */
172 static int print_size
= 0; /* Print size of defined symbols. */
173 static int reverse_sort
= 0; /* Sort in downward(alpha or numeric) order. */
174 static int sort_numerically
= 0;/* Sort in numeric rather than alpha order. */
175 static int sort_by_size
= 0; /* Sort by size of symbol. */
176 static int undefined_only
= 0; /* Print undefined symbols only. */
177 static int dynamic
= 0; /* Print dynamic symbols. */
178 static int show_version
= 0; /* Show the version number. */
179 static int show_stats
= 0; /* Show statistics. */
180 static int show_synthetic
= 0; /* Display synthesized symbols too. */
181 static int line_numbers
= 0; /* Print line numbers for symbols. */
183 /* When to print the names of files. Not mutually exclusive in SYSV format. */
184 static int filename_per_file
= 0; /* Once per file, on its own line. */
185 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
187 /* Print formats for printing a symbol value. */
189 static char value_format
[] = "%08lx";
191 #if BFD_HOST_64BIT_LONG
192 static char value_format
[] = "%016lx";
194 /* We don't use value_format for this case. */
198 static int print_width
= 16;
200 static int print_width
= 8;
202 static int print_radix
= 16;
203 /* Print formats for printing stab info. */
204 static char other_format
[] = "%02x";
205 static char desc_format
[] = "%04x";
207 static char *target
= NULL
;
209 /* Used to cache the line numbers for a BFD. */
210 static bfd
*lineno_cache_bfd
;
211 static bfd
*lineno_cache_rel_bfd
;
213 #define OPTION_TARGET 200
215 static struct option long_options
[] =
217 {"debug-syms", no_argument
, &print_debug_syms
, 1},
218 {"demangle", optional_argument
, 0, 'C'},
219 {"dynamic", no_argument
, &dynamic
, 1},
220 {"extern-only", no_argument
, &external_only
, 1},
221 {"format", required_argument
, 0, 'f'},
222 {"help", no_argument
, 0, 'h'},
223 {"line-numbers", no_argument
, 0, 'l'},
224 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
225 {"no-demangle", no_argument
, &do_demangle
, 0},
226 {"no-sort", no_argument
, &no_sort
, 1},
227 {"numeric-sort", no_argument
, &sort_numerically
, 1},
228 {"portability", no_argument
, 0, 'P'},
229 {"print-armap", no_argument
, &print_armap
, 1},
230 {"print-file-name", no_argument
, 0, 'o'},
231 {"print-size", no_argument
, 0, 'S'},
232 {"radix", required_argument
, 0, 't'},
233 {"reverse-sort", no_argument
, &reverse_sort
, 1},
234 {"size-sort", no_argument
, &sort_by_size
, 1},
235 {"stats", no_argument
, &show_stats
, 1},
236 {"synthetic", no_argument
, &show_synthetic
, 1},
237 {"target", required_argument
, 0, OPTION_TARGET
},
238 {"defined-only", no_argument
, &defined_only
, 1},
239 {"undefined-only", no_argument
, &undefined_only
, 1},
240 {"version", no_argument
, &show_version
, 1},
241 {0, no_argument
, 0, 0}
244 /* Some error-reporting functions. */
247 usage (FILE *stream
, int status
)
249 fprintf (stream
, _("Usage: %s [option(s)] [file(s)]\n"), program_name
);
250 fprintf (stream
, _(" List symbols in [file(s)] (a.out by default).\n"));
251 fprintf (stream
, _(" The options are:\n\
252 -a, --debug-syms Display debugger-only symbols\n\
253 -A, --print-file-name Print name of the input file before every symbol\n\
254 -B Same as --format=bsd\n\
255 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
256 The STYLE, if specified, can be `auto' (the default),\n\
257 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
259 --no-demangle Do not demangle low-level symbol names\n\
260 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
261 --defined-only Display only defined symbols\n\
263 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
264 `sysv' or `posix'. The default is `bsd'\n\
265 -g, --extern-only Display only external symbols\n\
266 -l, --line-numbers Use debugging information to find a filename and\n\
267 line number for each symbol\n\
268 -n, --numeric-sort Sort symbols numerically by address\n\
270 -p, --no-sort Do not sort the symbols\n\
271 -P, --portability Same as --format=posix\n\
272 -r, --reverse-sort Reverse the sense of the sort\n\
273 -S, --print-size Print size of defined symbols\n\
274 -s, --print-armap Include index for symbols from archive members\n\
275 --size-sort Sort symbols by size\n\
276 --synthetic Display synthetic symbols as well\n\
277 -t, --radix=RADIX Use RADIX for printing symbol values\n\
278 --target=BFDNAME Specify the target object format as BFDNAME\n\
279 -u, --undefined-only Display only undefined symbols\n\
280 -X 32_64 (ignored)\n\
281 -h, --help Display this information\n\
282 -V, --version Display this program's version number\n\
284 list_supported_targets (program_name
, stream
);
286 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
290 /* Set the radix for the symbol value and size according to RADIX. */
293 set_print_radix (char *radix
)
306 value_format
[4] = *radix
;
308 #if BFD_HOST_64BIT_LONG
309 value_format
[5] = *radix
;
311 /* This case requires special handling for octal and decimal
315 other_format
[3] = desc_format
[3] = *radix
;
318 fatal (_("%s: invalid radix"), radix
);
323 set_output_format (char *f
)
342 fatal (_("%s: invalid output format"), f
);
344 format
= &formats
[i
];
347 int main (int, char **);
350 main (int argc
, char **argv
)
355 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
356 setlocale (LC_MESSAGES
, "");
358 #if defined (HAVE_SETLOCALE)
359 setlocale (LC_CTYPE
, "");
360 setlocale (LC_COLLATE
, "");
362 bindtextdomain (PACKAGE
, LOCALEDIR
);
363 textdomain (PACKAGE
);
365 program_name
= *argv
;
366 xmalloc_set_program_name (program_name
);
368 START_PROGRESS (program_name
, 0);
371 set_default_bfd_target ();
373 while ((c
= getopt_long (argc
, argv
, "aABCDef:gHhlnopPrSst:uvVvX:",
374 long_options
, (int *) 0)) != EOF
)
379 print_debug_syms
= 1;
383 filename_per_symbol
= 1;
385 case 'B': /* For MIPS compatibility. */
386 set_output_format ("bsd");
392 enum demangling_styles style
;
394 style
= cplus_demangle_name_to_style (optarg
);
395 if (style
== unknown_demangling
)
396 fatal (_("unknown demangling style `%s'"),
399 cplus_demangle_set_style (style
);
406 /* Ignored for HP/UX compatibility. */
409 set_output_format (optarg
);
422 sort_numerically
= 1;
428 set_output_format ("posix");
440 set_print_radix (optarg
);
449 /* Ignored for (partial) AIX compatibility. On AIX, the
450 argument has values 32, 64, or 32_64, and specifies that
451 only 32-bit, only 64-bit, or both kinds of objects should
452 be examined. The default is 32. So plain AIX nm on a
453 library archive with both kinds of objects will ignore
454 the 64-bit ones. For GNU nm, the default is and always
455 has been -X 32_64, and other options are not supported. */
456 if (strcmp (optarg
, "32_64") != 0)
457 fatal (_("Only -X 32_64 is supported"));
460 case OPTION_TARGET
: /* --target */
464 case 0: /* A long option that just sets a flag. */
473 print_version ("nm");
475 if (sort_by_size
&& undefined_only
)
477 non_fatal (_("Using the --size-sort and --undefined-only options together"));
478 non_fatal (_("will produce no output, since undefined symbols have no size."));
482 /* OK, all options now parsed. If no filename specified, do a.out. */
484 return !display_file ("a.out");
488 if (argc
- optind
> 1)
489 filename_per_file
= 1;
491 /* We were given several filenames to do. */
492 while (optind
< argc
)
495 if (!display_file (argv
[optind
++]))
499 END_PROGRESS (program_name
);
504 char *lim
= (char *) sbrk (0);
506 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));
515 get_symbol_type (unsigned int type
)
517 static char buff
[32];
521 case STT_NOTYPE
: return "NOTYPE";
522 case STT_OBJECT
: return "OBJECT";
523 case STT_FUNC
: return "FUNC";
524 case STT_SECTION
: return "SECTION";
525 case STT_FILE
: return "FILE";
526 case STT_COMMON
: return "COMMON";
527 case STT_TLS
: return "TLS";
529 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
530 sprintf (buff
, _("<processor specific>: %d"), type
);
531 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
532 sprintf (buff
, _("<OS specific>: %d"), type
);
534 sprintf (buff
, _("<unknown>: %d"), type
);
540 display_archive (bfd
*file
)
543 bfd
*last_arfile
= NULL
;
546 (*format
->print_archive_filename
) (bfd_get_filename (file
));
549 print_symdef_entry (file
);
555 arfile
= bfd_openr_next_archived_file (file
, arfile
);
559 if (bfd_get_error () != bfd_error_no_more_archived_files
)
560 bfd_fatal (bfd_get_filename (file
));
564 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
568 bfd_sprintf_vma (arfile
, buf
, (bfd_vma
) -1);
569 print_width
= strlen (buf
);
570 (*format
->print_archive_member
) (bfd_get_filename (file
),
571 bfd_get_filename (arfile
));
572 display_rel_file (arfile
, file
);
576 bfd_nonfatal (bfd_get_filename (arfile
));
577 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
579 list_matching_formats (matching
);
584 if (last_arfile
!= NULL
)
586 bfd_close (last_arfile
);
587 lineno_cache_bfd
= NULL
;
588 lineno_cache_rel_bfd
= NULL
;
590 last_arfile
= arfile
;
593 if (last_arfile
!= NULL
)
595 bfd_close (last_arfile
);
596 lineno_cache_bfd
= NULL
;
597 lineno_cache_rel_bfd
= NULL
;
602 display_file (char *filename
)
604 bfd_boolean retval
= TRUE
;
608 if (get_file_size (filename
) < 1)
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
))
626 bfd_sprintf_vma (file
, buf
, (bfd_vma
) -1);
627 print_width
= strlen (buf
);
628 (*format
->print_object_filename
) (filename
);
629 display_rel_file (file
, NULL
);
633 bfd_nonfatal (filename
);
634 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
636 list_matching_formats (matching
);
642 if (!bfd_close (file
))
643 bfd_fatal (filename
);
645 lineno_cache_bfd
= NULL
;
646 lineno_cache_rel_bfd
= NULL
;
651 /* These globals are used to pass information into the sorting
653 static bfd
*sort_bfd
;
654 static bfd_boolean sort_dynamic
;
655 static asymbol
*sort_x
;
656 static asymbol
*sort_y
;
658 /* Symbol-sorting predicates */
659 #define valueof(x) ((x)->section->vma + (x)->value)
661 /* Numeric sorts. Undefined symbols are always considered "less than"
662 defined symbols with zero values. Common symbols are not treated
663 specially -- i.e., their sizes are used as their "values". */
666 numeric_forward (const void *P_x
, const void *P_y
)
671 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
672 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
673 if (x
== NULL
|| y
== NULL
)
674 bfd_fatal (bfd_get_filename (sort_bfd
));
676 xs
= bfd_get_section (x
);
677 ys
= bfd_get_section (y
);
679 if (bfd_is_und_section (xs
))
681 if (! bfd_is_und_section (ys
))
684 else if (bfd_is_und_section (ys
))
686 else if (valueof (x
) != valueof (y
))
687 return valueof (x
) < valueof (y
) ? -1 : 1;
689 return non_numeric_forward (P_x
, P_y
);
693 numeric_reverse (const void *x
, const void *y
)
695 return - numeric_forward (x
, y
);
699 non_numeric_forward (const void *P_x
, const void *P_y
)
704 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
705 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
706 if (x
== NULL
|| y
== NULL
)
707 bfd_fatal (bfd_get_filename (sort_bfd
));
709 xn
= bfd_asymbol_name (x
);
710 yn
= bfd_asymbol_name (y
);
718 /* Solaris 2.5 has a bug in strcoll.
719 strcoll returns invalid values when confronted with empty strings. */
725 return strcoll (xn
, yn
);
727 return strcmp (xn
, yn
);
732 non_numeric_reverse (const void *x
, const void *y
)
734 return - non_numeric_forward (x
, y
);
737 static int (*(sorters
[2][2])) (const void *, const void *) =
739 { non_numeric_forward
, non_numeric_reverse
},
740 { numeric_forward
, numeric_reverse
}
743 /* This sort routine is used by sort_symbols_by_size. It is similar
744 to numeric_forward, but when symbols have the same value it sorts
745 by section VMA. This simplifies the sort_symbols_by_size code
746 which handles symbols at the end of sections. Also, this routine
747 tries to sort file names before other symbols with the same value.
748 That will make the file name have a zero size, which will make
749 sort_symbols_by_size choose the non file name symbol, leading to
750 more meaningful output. For similar reasons, this code sorts
751 gnu_compiled_* and gcc2_compiled before other symbols with the same
755 size_forward1 (const void *P_x
, const void *P_y
)
763 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
764 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
765 if (x
== NULL
|| y
== NULL
)
766 bfd_fatal (bfd_get_filename (sort_bfd
));
768 xs
= bfd_get_section (x
);
769 ys
= bfd_get_section (y
);
771 if (bfd_is_und_section (xs
))
773 if (bfd_is_und_section (ys
))
776 if (valueof (x
) != valueof (y
))
777 return valueof (x
) < valueof (y
) ? -1 : 1;
779 if (xs
->vma
!= ys
->vma
)
780 return xs
->vma
< ys
->vma
? -1 : 1;
782 xn
= bfd_asymbol_name (x
);
783 yn
= bfd_asymbol_name (y
);
787 /* The symbols gnu_compiled and gcc2_compiled convey even less
788 information than the file name, so sort them out first. */
790 xf
= (strstr (xn
, "gnu_compiled") != NULL
791 || strstr (xn
, "gcc2_compiled") != NULL
);
792 yf
= (strstr (yn
, "gnu_compiled") != NULL
793 || strstr (yn
, "gcc2_compiled") != NULL
);
800 /* We use a heuristic for the file name. It may not work on non
801 Unix systems, but it doesn't really matter; the only difference
802 is precisely which symbol names get printed. */
804 #define file_symbol(s, sn, snl) \
805 (((s)->flags & BSF_FILE) != 0 \
806 || ((sn)[(snl) - 2] == '.' \
807 && ((sn)[(snl) - 1] == 'o' \
808 || (sn)[(snl) - 1] == 'a')))
810 xf
= file_symbol (x
, xn
, xnl
);
811 yf
= file_symbol (y
, yn
, ynl
);
818 return non_numeric_forward (P_x
, P_y
);
821 /* This sort routine is used by sort_symbols_by_size. It is sorting
822 an array of size_sym structures into size order. */
825 size_forward2 (const void *P_x
, const void *P_y
)
827 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
828 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
830 if (x
->size
< y
->size
)
831 return reverse_sort
? 1 : -1;
832 else if (x
->size
> y
->size
)
833 return reverse_sort
? -1 : 1;
835 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
838 /* Sort the symbols by size. ELF provides a size but for other formats
839 we have to make a guess by assuming that the difference between the
840 address of a symbol and the address of the next higher symbol is the
844 sort_symbols_by_size (bfd
*abfd
, bfd_boolean dynamic
, void *minisyms
,
845 long symcount
, unsigned int size
,
846 struct size_sym
**symsizesp
)
848 struct size_sym
*symsizes
;
849 bfd_byte
*from
, *fromend
;
851 asymbol
*store_sym
, *store_next
;
853 qsort (minisyms
, symcount
, size
, size_forward1
);
855 /* We are going to return a special set of symbols and sizes to
857 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
858 *symsizesp
= symsizes
;
860 /* Note that filter_symbols has already removed all absolute and
861 undefined symbols. Here we remove all symbols whose size winds
863 from
= (bfd_byte
*) minisyms
;
864 fromend
= from
+ symcount
* size
;
871 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const void *) from
,
874 bfd_fatal (bfd_get_filename (abfd
));
877 for (; from
< fromend
; from
+= size
)
884 if (from
+ size
< fromend
)
886 next
= bfd_minisymbol_to_symbol (abfd
,
888 (const void *) (from
+ size
),
891 bfd_fatal (bfd_get_filename (abfd
));
896 sec
= bfd_get_section (sym
);
898 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
899 sz
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
900 else if (bfd_is_com_section (sec
))
904 if (from
+ size
< fromend
905 && sec
== bfd_get_section (next
))
906 sz
= valueof (next
) - valueof (sym
);
908 sz
= (bfd_get_section_vma (abfd
, sec
)
909 + bfd_section_size (abfd
, sec
)
915 symsizes
->minisym
= (const void *) from
;
923 store_sym
= store_next
;
927 symcount
= symsizes
- *symsizesp
;
929 /* We must now sort again by size. */
930 qsort ((void *) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
935 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
938 display_rel_file (bfd
*abfd
, bfd
*archive_bfd
)
943 struct size_sym
*symsizes
;
947 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
949 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
954 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
956 bfd_fatal (bfd_get_filename (abfd
));
960 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
964 if (show_synthetic
&& size
== sizeof (asymbol
*))
968 asymbol
**static_syms
= NULL
;
969 asymbol
**dyn_syms
= NULL
;
970 long static_count
= 0;
975 dyn_count
= symcount
;
980 static_count
= symcount
;
981 static_syms
= minisyms
;
983 synth_count
= bfd_get_synthetic_symtab (abfd
, static_count
, static_syms
,
984 dyn_count
, dyn_syms
, &synthsyms
);
991 new_mini
= xmalloc ((symcount
+ synth_count
+ 1) * sizeof (*symp
));
993 memcpy (symp
, minisyms
, symcount
* sizeof (*symp
));
995 for (i
= 0; i
< synth_count
; i
++)
996 *symp
++ = synthsyms
+ i
;
999 symcount
+= synth_count
;
1003 /* Discard the symbols we don't want to print.
1004 It's OK to do this in place; we'll free the storage anyway
1005 (after printing). */
1007 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
1013 sort_dynamic
= dynamic
;
1014 sort_x
= bfd_make_empty_symbol (abfd
);
1015 sort_y
= bfd_make_empty_symbol (abfd
);
1016 if (sort_x
== NULL
|| sort_y
== NULL
)
1017 bfd_fatal (bfd_get_filename (abfd
));
1020 qsort (minisyms
, symcount
, size
,
1021 sorters
[sort_numerically
][reverse_sort
]);
1023 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
1028 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1030 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1035 /* Choose which symbol entries to print;
1036 compact them downward to get rid of the rest.
1037 Return the number of symbols to be printed. */
1040 filter_symbols (bfd
*abfd
, bfd_boolean dynamic
, void *minisyms
,
1041 long symcount
, unsigned int size
)
1043 bfd_byte
*from
, *fromend
, *to
;
1046 store
= bfd_make_empty_symbol (abfd
);
1048 bfd_fatal (bfd_get_filename (abfd
));
1050 from
= (bfd_byte
*) minisyms
;
1051 fromend
= from
+ symcount
* size
;
1052 to
= (bfd_byte
*) minisyms
;
1054 for (; from
< fromend
; from
+= size
)
1061 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const void *) from
, store
);
1063 bfd_fatal (bfd_get_filename (abfd
));
1066 keep
= bfd_is_und_section (sym
->section
);
1067 else if (external_only
)
1068 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
1069 || (sym
->flags
& BSF_WEAK
) != 0
1070 || bfd_is_und_section (sym
->section
)
1071 || bfd_is_com_section (sym
->section
));
1076 && ! print_debug_syms
1077 && (sym
->flags
& BSF_DEBUGGING
) != 0)
1082 && (bfd_is_abs_section (sym
->section
)
1083 || bfd_is_und_section (sym
->section
)))
1089 if (bfd_is_und_section (sym
->section
))
1095 memcpy (to
, from
, size
);
1100 return (to
- (bfd_byte
*) minisyms
) / size
;
1103 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1104 demangling it if requested. */
1107 print_symname (const char *format
, const char *name
, bfd
*abfd
)
1109 if (do_demangle
&& *name
)
1111 char *res
= demangle (abfd
, name
);
1113 printf (format
, res
);
1118 printf (format
, name
);
1121 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1125 print_symbols (bfd
*abfd
, bfd_boolean dynamic
, void *minisyms
, long symcount
,
1126 unsigned int size
, bfd
*archive_bfd
)
1129 bfd_byte
*from
, *fromend
;
1131 store
= bfd_make_empty_symbol (abfd
);
1133 bfd_fatal (bfd_get_filename (abfd
));
1135 from
= (bfd_byte
*) minisyms
;
1136 fromend
= from
+ symcount
* size
;
1137 for (; from
< fromend
; from
+= size
)
1141 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
1143 bfd_fatal (bfd_get_filename (abfd
));
1145 print_symbol (abfd
, sym
, (bfd_vma
) 0, archive_bfd
);
1149 /* Print the symbols when sorting by size. */
1152 print_size_symbols (bfd
*abfd
, bfd_boolean dynamic
,
1153 struct size_sym
*symsizes
, long symcount
,
1157 struct size_sym
*from
, *fromend
;
1159 store
= bfd_make_empty_symbol (abfd
);
1161 bfd_fatal (bfd_get_filename (abfd
));
1164 fromend
= from
+ symcount
;
1165 for (; from
< fromend
; from
++)
1170 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
1172 bfd_fatal (bfd_get_filename (abfd
));
1174 /* For elf we have already computed the correct symbol size. */
1175 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
1178 ssize
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
1180 print_symbol (abfd
, sym
, ssize
, archive_bfd
);
1184 /* Print a single symbol. */
1187 print_symbol (bfd
*abfd
, asymbol
*sym
, bfd_vma ssize
, bfd
*archive_bfd
)
1189 symbol_info syminfo
;
1190 struct extended_symbol_info info
;
1194 (*format
->print_symbol_filename
) (archive_bfd
, abfd
);
1196 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1197 info
.sinfo
= &syminfo
;
1199 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
1200 info
.elfinfo
= (elf_symbol_type
*) sym
;
1202 info
.elfinfo
= NULL
;
1203 (*format
->print_symbol_info
) (&info
, abfd
);
1207 static asymbol
**syms
;
1208 static long symcount
;
1209 const char *filename
, *functionname
;
1210 unsigned int lineno
;
1212 /* We need to get the canonical symbols in order to call
1213 bfd_find_nearest_line. This is inefficient, but, then, you
1214 don't have to use --line-numbers. */
1215 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
1224 symsize
= bfd_get_symtab_upper_bound (abfd
);
1226 bfd_fatal (bfd_get_filename (abfd
));
1227 syms
= (asymbol
**) xmalloc (symsize
);
1228 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
1230 bfd_fatal (bfd_get_filename (abfd
));
1231 lineno_cache_bfd
= abfd
;
1234 if (bfd_is_und_section (bfd_get_section (sym
)))
1236 static asection
**secs
;
1237 static arelent
***relocs
;
1238 static long *relcount
;
1239 static unsigned int seccount
;
1241 const char *symname
;
1243 /* For an undefined symbol, we try to find a reloc for the
1244 symbol, and print the line number of the reloc. */
1245 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
1247 for (i
= 0; i
< seccount
; i
++)
1248 if (relocs
[i
] != NULL
)
1260 struct get_relocs_info info
;
1262 seccount
= bfd_count_sections (abfd
);
1264 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
1265 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
1266 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
1269 info
.relocs
= relocs
;
1270 info
.relcount
= relcount
;
1272 bfd_map_over_sections (abfd
, get_relocs
, (void *) &info
);
1273 lineno_cache_rel_bfd
= abfd
;
1276 symname
= bfd_asymbol_name (sym
);
1277 for (i
= 0; i
< seccount
; i
++)
1281 for (j
= 0; j
< relcount
[i
]; j
++)
1286 if (r
->sym_ptr_ptr
!= NULL
1287 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1288 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1290 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1291 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
1292 r
->address
, &filename
,
1293 &functionname
, &lineno
)
1294 && filename
!= NULL
)
1296 /* We only print the first one we find. */
1297 printf ("\t%s:%u", filename
, lineno
);
1304 else if (bfd_get_section (sym
)->owner
== abfd
)
1306 if (bfd_find_nearest_line (abfd
, bfd_get_section (sym
), syms
,
1307 sym
->value
, &filename
, &functionname
,
1312 printf ("\t%s:%u", filename
, lineno
);
1320 /* The following 3 groups of functions are called unconditionally,
1321 once at the start of processing each file of the appropriate type.
1322 They should check `filename_per_file' and `filename_per_symbol',
1323 as appropriate for their output format, to determine whether to
1326 /* Print the name of an object file given on the command line. */
1329 print_object_filename_bsd (char *filename
)
1331 if (filename_per_file
&& !filename_per_symbol
)
1332 printf ("\n%s:\n", filename
);
1336 print_object_filename_sysv (char *filename
)
1339 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1341 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1342 if (print_width
== 8)
1344 Name Value Class Type Size Line Section\n\n"));
1347 Name Value Class Type Size Line Section\n\n"));
1351 print_object_filename_posix (char *filename
)
1353 if (filename_per_file
&& !filename_per_symbol
)
1354 printf ("%s:\n", filename
);
1357 /* Print the name of an archive file given on the command line. */
1360 print_archive_filename_bsd (char *filename
)
1362 if (filename_per_file
)
1363 printf ("\n%s:\n", filename
);
1367 print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED
)
1372 print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED
)
1376 /* Print the name of an archive member file. */
1379 print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED
,
1380 const char *filename
)
1382 if (!filename_per_symbol
)
1383 printf ("\n%s:\n", filename
);
1387 print_archive_member_sysv (char *archive
, const char *filename
)
1390 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1392 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1393 if (print_width
== 8)
1395 Name Value Class Type Size Line Section\n\n"));
1398 Name Value Class Type Size Line Section\n\n"));
1402 print_archive_member_posix (char *archive
, 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 (bfd
*archive_bfd
, 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_sysv (bfd
*archive_bfd
, bfd
*abfd
)
1425 if (filename_per_symbol
)
1428 printf ("%s:", bfd_get_filename (archive_bfd
));
1429 printf ("%s:", bfd_get_filename (abfd
));
1434 print_symbol_filename_posix (bfd
*archive_bfd
, bfd
*abfd
)
1436 if (filename_per_symbol
)
1439 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1440 bfd_get_filename (abfd
));
1442 printf ("%s: ", bfd_get_filename (abfd
));
1446 /* Print a symbol value. */
1449 print_value (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_vma val
)
1451 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1452 printf (value_format
, val
);
1454 /* We have a 64 bit value to print, but the host is only 32 bit. */
1455 if (print_radix
== 16)
1456 bfd_fprintf_vma (abfd
, stdout
, val
);
1462 s
= buf
+ sizeof buf
;
1466 *--s
= (val
% print_radix
) + '0';
1469 while ((buf
+ sizeof buf
- 1) - s
< 16)
1476 /* Print a line of information about a symbol. */
1479 print_symbol_info_bsd (struct extended_symbol_info
*info
, bfd
*abfd
)
1481 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1483 if (print_width
== 16)
1489 /* Normally we print the value of the symbol. If we are printing the
1490 size or sorting by size then we print its size, except for the
1491 (weird) special case where both flags are defined, in which case we
1492 print both values. This conforms to documented behaviour. */
1493 if (sort_by_size
&& !print_size
)
1494 print_value (abfd
, SYM_SIZE (info
));
1496 print_value (abfd
, SYM_VALUE (info
));
1498 if (print_size
&& SYM_SIZE (info
))
1501 print_value (abfd
, SYM_SIZE (info
));
1505 printf (" %c", SYM_TYPE (info
));
1507 if (SYM_TYPE (info
) == '-')
1511 printf (other_format
, SYM_STAB_OTHER (info
));
1513 printf (desc_format
, SYM_STAB_DESC (info
));
1514 printf (" %5s", SYM_STAB_NAME (info
));
1516 print_symname (" %s", SYM_NAME (info
), abfd
);
1520 print_symbol_info_sysv (struct extended_symbol_info
*info
, bfd
*abfd
)
1522 print_symname ("%-20s|", SYM_NAME (info
), abfd
);
1524 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1526 if (print_width
== 8)
1532 print_value (abfd
, SYM_VALUE (info
));
1534 printf ("| %c |", SYM_TYPE (info
));
1536 if (SYM_TYPE (info
) == '-')
1539 printf ("%18s| ", SYM_STAB_NAME (info
)); /* (C) Type. */
1540 printf (desc_format
, SYM_STAB_DESC (info
)); /* Size. */
1541 printf ("| |"); /* Line, Section. */
1545 /* Type, Size, Line, Section */
1548 get_symbol_type (ELF_ST_TYPE (info
->elfinfo
->internal_elf_sym
.st_info
)));
1552 if (SYM_SIZE (info
))
1553 print_value (abfd
, SYM_SIZE (info
));
1556 if (print_width
== 8)
1563 printf("| |%s", info
->elfinfo
->symbol
.section
->name
);
1570 print_symbol_info_posix (struct extended_symbol_info
*info
, bfd
*abfd
)
1572 print_symname ("%s ", SYM_NAME (info
), abfd
);
1573 printf ("%c ", SYM_TYPE (info
));
1575 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1579 print_value (abfd
, SYM_VALUE (info
));
1581 if (SYM_SIZE (info
))
1582 print_value (abfd
, SYM_SIZE (info
));
1587 print_symdef_entry (bfd
*abfd
)
1589 symindex idx
= BFD_NO_MORE_SYMBOLS
;
1591 bfd_boolean everprinted
= FALSE
;
1593 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
1594 idx
!= BFD_NO_MORE_SYMBOLS
;
1595 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
1600 printf (_("\nArchive index:\n"));
1603 elt
= bfd_get_elt_at_index (abfd
, idx
);
1605 bfd_fatal ("bfd_get_elt_at_index");
1606 if (thesym
->name
!= (char *) NULL
)
1608 print_symname ("%s", thesym
->name
, abfd
);
1609 printf (" in %s\n", bfd_get_filename (elt
));
1614 /* This function is used to get the relocs for a particular section.
1615 It is called via bfd_map_over_sections. */
1618 get_relocs (bfd
*abfd
, asection
*sec
, void *dataarg
)
1620 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
1624 if ((sec
->flags
& SEC_RELOC
) == 0)
1626 *data
->relocs
= NULL
;
1627 *data
->relcount
= 0;
1633 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1635 bfd_fatal (bfd_get_filename (abfd
));
1637 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1638 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1640 if (*data
->relcount
< 0)
1641 bfd_fatal (bfd_get_filename (abfd
));