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)
72 PARAMS ((FILE *, int));
73 static void set_print_radix
75 static void set_output_format
77 static void display_archive
79 static bfd_boolean display_file
81 static void display_rel_file
82 PARAMS ((bfd
*, bfd
*));
83 static long filter_symbols
84 PARAMS ((bfd
*, bfd_boolean
, PTR
, long, unsigned int));
85 static long sort_symbols_by_size
86 PARAMS ((bfd
*, bfd_boolean
, PTR
, long, unsigned int, struct size_sym
**));
87 static void print_symbols
88 PARAMS ((bfd
*, bfd_boolean
, PTR
, long, unsigned int, bfd
*));
89 static void print_size_symbols
90 PARAMS ((bfd
*, bfd_boolean
, struct size_sym
*, long, bfd
*));
91 static void print_symname
92 PARAMS ((const char *, const char *, bfd
*));
93 static void print_symbol
94 PARAMS ((bfd
*, asymbol
*, bfd_vma ssize
, bfd
*));
95 static void print_symdef_entry
98 /* The sorting functions. */
99 static int numeric_forward
100 PARAMS ((const PTR
, const PTR
));
101 static int numeric_reverse
102 PARAMS ((const PTR
, const PTR
));
103 static int non_numeric_forward
104 PARAMS ((const PTR
, const PTR
));
105 static int non_numeric_reverse
106 PARAMS ((const PTR
, const PTR
));
107 static int size_forward1
108 PARAMS ((const PTR
, const PTR
));
109 static int size_forward2
110 PARAMS ((const PTR
, const PTR
));
112 /* The output formatting functions. */
113 static void print_object_filename_bsd
115 static void print_object_filename_sysv
117 static void print_object_filename_posix
119 static void print_archive_filename_bsd
121 static void print_archive_filename_sysv
123 static void print_archive_filename_posix
125 static void print_archive_member_bsd
126 PARAMS ((char *, const char *));
127 static void print_archive_member_sysv
128 PARAMS ((char *, const char *));
129 static void print_archive_member_posix
130 PARAMS ((char *, const char *));
131 static void print_symbol_filename_bsd
132 PARAMS ((bfd
*, bfd
*));
133 static void print_symbol_filename_sysv
134 PARAMS ((bfd
*, bfd
*));
135 static void print_symbol_filename_posix
136 PARAMS ((bfd
*, bfd
*));
137 static void print_value
138 PARAMS ((bfd
*, bfd_vma
));
139 static void print_symbol_info_bsd
140 PARAMS ((struct extended_symbol_info
*, bfd
*));
141 static void print_symbol_info_sysv
142 PARAMS ((struct extended_symbol_info
*, bfd
*));
143 static void print_symbol_info_posix
144 PARAMS ((struct extended_symbol_info
*, bfd
*));
145 static void get_relocs
146 PARAMS ((bfd
*, asection
*, PTR
));
147 static const char * get_symbol_type
148 PARAMS ((unsigned int));
150 /* Support for different output formats. */
153 /* Print the name of an object file given on the command line. */
154 void (*print_object_filename
) PARAMS ((char *));
156 /* Print the name of an archive file given on the command line. */
157 void (*print_archive_filename
) PARAMS ((char *));
159 /* Print the name of an archive member file. */
160 void (*print_archive_member
) PARAMS ((char *, const char *));
162 /* Print the name of the file (and archive, if there is one)
163 containing a symbol. */
164 void (*print_symbol_filename
) PARAMS ((bfd
*, bfd
*));
166 /* Print a line of information about a symbol. */
167 void (*print_symbol_info
) PARAMS ((struct extended_symbol_info
*, bfd
*));
170 static struct output_fns formats
[] =
172 {print_object_filename_bsd
,
173 print_archive_filename_bsd
,
174 print_archive_member_bsd
,
175 print_symbol_filename_bsd
,
176 print_symbol_info_bsd
},
177 {print_object_filename_sysv
,
178 print_archive_filename_sysv
,
179 print_archive_member_sysv
,
180 print_symbol_filename_sysv
,
181 print_symbol_info_sysv
},
182 {print_object_filename_posix
,
183 print_archive_filename_posix
,
184 print_archive_member_posix
,
185 print_symbol_filename_posix
,
186 print_symbol_info_posix
}
189 /* Indices in `formats'. */
191 #define FORMAT_SYSV 1
192 #define FORMAT_POSIX 2
193 #define FORMAT_DEFAULT FORMAT_BSD
195 /* The output format to use. */
196 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
198 /* Command options. */
200 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
201 static int external_only
= 0; /* Print external symbols only. */
202 static int defined_only
= 0; /* Print defined symbols only. */
203 static int no_sort
= 0; /* Don't sort; print syms in order found. */
204 static int print_debug_syms
= 0;/* Print debugger-only symbols too. */
205 static int print_armap
= 0; /* Describe __.SYMDEF data in archive files. */
206 static int print_size
= 0; /* Print size of defined symbols. */
207 static int reverse_sort
= 0; /* Sort in downward(alpha or numeric) order. */
208 static int sort_numerically
= 0;/* Sort in numeric rather than alpha order. */
209 static int sort_by_size
= 0; /* Sort by size of symbol. */
210 static int undefined_only
= 0; /* Print undefined symbols only. */
211 static int dynamic
= 0; /* Print dynamic symbols. */
212 static int show_version
= 0; /* Show the version number. */
213 static int show_stats
= 0; /* Show statistics. */
214 static int line_numbers
= 0; /* Print line numbers for symbols. */
216 /* When to print the names of files. Not mutually exclusive in SYSV format. */
217 static int filename_per_file
= 0; /* Once per file, on its own line. */
218 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
220 /* Print formats for printing a symbol value. */
222 static char value_format
[] = "%08lx";
224 #if BFD_HOST_64BIT_LONG
225 static char value_format
[] = "%016lx";
227 /* We don't use value_format for this case. */
231 static int print_width
= 16;
233 static int print_width
= 8;
235 static int print_radix
= 16;
236 /* Print formats for printing stab info. */
237 static char other_format
[] = "%02x";
238 static char desc_format
[] = "%04x";
240 static char *target
= NULL
;
242 /* Used to cache the line numbers for a BFD. */
243 static bfd
*lineno_cache_bfd
;
244 static bfd
*lineno_cache_rel_bfd
;
246 #define OPTION_TARGET 200
248 static struct option long_options
[] =
250 {"debug-syms", no_argument
, &print_debug_syms
, 1},
251 {"demangle", optional_argument
, 0, 'C'},
252 {"dynamic", no_argument
, &dynamic
, 1},
253 {"extern-only", no_argument
, &external_only
, 1},
254 {"format", required_argument
, 0, 'f'},
255 {"help", no_argument
, 0, 'h'},
256 {"line-numbers", no_argument
, 0, 'l'},
257 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
258 {"no-demangle", no_argument
, &do_demangle
, 0},
259 {"no-sort", no_argument
, &no_sort
, 1},
260 {"numeric-sort", no_argument
, &sort_numerically
, 1},
261 {"portability", no_argument
, 0, 'P'},
262 {"print-armap", no_argument
, &print_armap
, 1},
263 {"print-file-name", no_argument
, 0, 'o'},
264 {"print-size", no_argument
, 0, 'S'},
265 {"radix", required_argument
, 0, 't'},
266 {"reverse-sort", no_argument
, &reverse_sort
, 1},
267 {"size-sort", no_argument
, &sort_by_size
, 1},
268 {"stats", no_argument
, &show_stats
, 1},
269 {"target", required_argument
, 0, OPTION_TARGET
},
270 {"defined-only", no_argument
, &defined_only
, 1},
271 {"undefined-only", no_argument
, &undefined_only
, 1},
272 {"version", no_argument
, &show_version
, 1},
273 {0, no_argument
, 0, 0}
276 /* Some error-reporting functions. */
279 usage (stream
, status
)
283 fprintf (stream
, _("Usage: %s [option(s)] [file(s)]\n"), program_name
);
284 fprintf (stream
, _(" List symbols in [file(s)] (a.out by default).\n"));
285 fprintf (stream
, _(" The options are:\n\
286 -a, --debug-syms Display debugger-only symbols\n\
287 -A, --print-file-name Print name of the input file before every symbol\n\
288 -B Same as --format=bsd\n\
289 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
290 The STYLE, if specified, can be `auto' (the default),\n\
291 `gnu', 'lucid', 'arm', 'hp', 'edg' or 'gnu-v3'\n\
292 --no-demangle Do not demangle low-level symbol names\n\
293 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
294 --defined-only Display only defined symbols\n\
296 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
297 `sysv' or `posix'. The default is `bsd'\n\
298 -g, --extern-only Display only external symbols\n\
299 -l, --line-numbers Use debugging information to find a filename and\n\
300 line number for each symbol\n\
301 -n, --numeric-sort Sort symbols numerically by address\n\
303 -p, --no-sort Do not sort the symbols\n\
304 -P, --portability Same as --format=posix\n\
305 -r, --reverse-sort Reverse the sense of the sort\n\
306 -S, --print-size Print size of defined symbols\n\
307 -s, --print-armap Include index for symbols from archive members\n\
308 --size-sort Sort symbols by size\n\
309 -t, --radix=RADIX Use RADIX for printing symbol values\n\
310 --target=BFDNAME Specify the target object format as BFDNAME\n\
311 -u, --undefined-only Display only undefined symbols\n\
312 -X 32_64 (ignored)\n\
313 -h, --help Display this information\n\
314 -V, --version Display this program's version number\n\
316 list_supported_targets (program_name
, stream
);
318 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
322 /* Set the radix for the symbol value and size according to RADIX. */
325 set_print_radix (radix
)
339 value_format
[4] = *radix
;
341 #if BFD_HOST_64BIT_LONG
342 value_format
[5] = *radix
;
344 /* This case requires special handling for octal and decimal
348 other_format
[3] = desc_format
[3] = *radix
;
351 fatal (_("%s: invalid radix"), radix
);
356 set_output_format (f
)
376 fatal (_("%s: invalid output format"), f
);
378 format
= &formats
[i
];
381 int main
PARAMS ((int, char **));
391 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
392 setlocale (LC_MESSAGES
, "");
394 #if defined (HAVE_SETLOCALE)
395 setlocale (LC_CTYPE
, "");
396 setlocale (LC_COLLATE
, "");
398 bindtextdomain (PACKAGE
, LOCALEDIR
);
399 textdomain (PACKAGE
);
401 program_name
= *argv
;
402 xmalloc_set_program_name (program_name
);
404 START_PROGRESS (program_name
, 0);
407 set_default_bfd_target ();
409 while ((c
= getopt_long (argc
, argv
, "aABCDef:gHhlnopPrSst:uvVvX:",
410 long_options
, (int *) 0)) != EOF
)
415 print_debug_syms
= 1;
419 filename_per_symbol
= 1;
421 case 'B': /* For MIPS compatibility. */
422 set_output_format ("bsd");
428 enum demangling_styles style
;
430 style
= cplus_demangle_name_to_style (optarg
);
431 if (style
== unknown_demangling
)
432 fatal (_("unknown demangling style `%s'"),
435 cplus_demangle_set_style (style
);
442 /* Ignored for HP/UX compatibility. */
445 set_output_format (optarg
);
458 sort_numerically
= 1;
464 set_output_format ("posix");
476 set_print_radix (optarg
);
485 /* Ignored for (partial) AIX compatibility. On AIX, the
486 argument has values 32, 64, or 32_64, and specfies that
487 only 32-bit, only 64-bit, or both kinds of objects should
488 be examined. The default is 32. So plain AIX nm on a
489 library archive with both kinds of objects will ignore
490 the 64-bit ones. For GNU nm, the default is and always
491 has been -X 32_64, and other options are not supported. */
492 if (strcmp (optarg
, "32_64") != 0)
493 fatal (_("Only -X 32_64 is supported"));
496 case OPTION_TARGET
: /* --target */
500 case 0: /* A long option that just sets a flag. */
509 print_version ("nm");
511 /* OK, all options now parsed. If no filename specified, do a.out. */
513 return !display_file ("a.out");
517 if (argc
- optind
> 1)
518 filename_per_file
= 1;
520 /* We were given several filenames to do. */
521 while (optind
< argc
)
524 if (!display_file (argv
[optind
++]))
528 END_PROGRESS (program_name
);
533 char *lim
= (char *) sbrk (0);
535 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));
544 get_symbol_type (type
)
547 static char buff
[32];
551 case STT_NOTYPE
: return "NOTYPE";
552 case STT_OBJECT
: return "OBJECT";
553 case STT_FUNC
: return "FUNC";
554 case STT_SECTION
: return "SECTION";
555 case STT_FILE
: return "FILE";
556 case STT_COMMON
: return "COMMON";
557 case STT_TLS
: return "TLS";
559 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
560 sprintf (buff
, _("<processor specific>: %d"), type
);
561 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
562 sprintf (buff
, _("<OS specific>: %d"), type
);
564 sprintf (buff
, _("<unknown>: %d"), type
);
570 display_archive (file
)
574 bfd
*last_arfile
= NULL
;
577 (*format
->print_archive_filename
) (bfd_get_filename (file
));
580 print_symdef_entry (file
);
586 arfile
= bfd_openr_next_archived_file (file
, arfile
);
590 if (bfd_get_error () != bfd_error_no_more_archived_files
)
591 bfd_fatal (bfd_get_filename (file
));
595 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
599 bfd_sprintf_vma (arfile
, buf
, (bfd_vma
) -1);
600 print_width
= strlen (buf
);
601 (*format
->print_archive_member
) (bfd_get_filename (file
),
602 bfd_get_filename (arfile
));
603 display_rel_file (arfile
, file
);
607 bfd_nonfatal (bfd_get_filename (arfile
));
608 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
610 list_matching_formats (matching
);
615 if (last_arfile
!= NULL
)
617 bfd_close (last_arfile
);
618 lineno_cache_bfd
= NULL
;
619 lineno_cache_rel_bfd
= NULL
;
621 last_arfile
= arfile
;
624 if (last_arfile
!= NULL
)
626 bfd_close (last_arfile
);
627 lineno_cache_bfd
= NULL
;
628 lineno_cache_rel_bfd
= NULL
;
633 display_file (filename
)
636 bfd_boolean retval
= TRUE
;
640 file
= bfd_openr (filename
, target
);
643 bfd_nonfatal (filename
);
647 if (bfd_check_format (file
, bfd_archive
))
649 display_archive (file
);
651 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
655 bfd_sprintf_vma (file
, buf
, (bfd_vma
) -1);
656 print_width
= strlen (buf
);
657 (*format
->print_object_filename
) (filename
);
658 display_rel_file (file
, NULL
);
662 bfd_nonfatal (filename
);
663 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
665 list_matching_formats (matching
);
671 if (!bfd_close (file
))
672 bfd_fatal (filename
);
674 lineno_cache_bfd
= NULL
;
675 lineno_cache_rel_bfd
= NULL
;
680 /* These globals are used to pass information into the sorting
682 static bfd
*sort_bfd
;
683 static bfd_boolean sort_dynamic
;
684 static asymbol
*sort_x
;
685 static asymbol
*sort_y
;
687 /* Symbol-sorting predicates */
688 #define valueof(x) ((x)->section->vma + (x)->value)
690 /* Numeric sorts. Undefined symbols are always considered "less than"
691 defined symbols with zero values. Common symbols are not treated
692 specially -- i.e., their sizes are used as their "values". */
695 numeric_forward (P_x
, P_y
)
702 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
703 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
704 if (x
== NULL
|| y
== NULL
)
705 bfd_fatal (bfd_get_filename (sort_bfd
));
707 xs
= bfd_get_section (x
);
708 ys
= bfd_get_section (y
);
710 if (bfd_is_und_section (xs
))
712 if (! bfd_is_und_section (ys
))
715 else if (bfd_is_und_section (ys
))
717 else if (valueof (x
) != valueof (y
))
718 return valueof (x
) < valueof (y
) ? -1 : 1;
720 return non_numeric_forward (P_x
, P_y
);
724 numeric_reverse (x
, y
)
728 return - numeric_forward (x
, y
);
732 non_numeric_forward (P_x
, P_y
)
739 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
740 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
741 if (x
== NULL
|| y
== NULL
)
742 bfd_fatal (bfd_get_filename (sort_bfd
));
744 xn
= bfd_asymbol_name (x
);
745 yn
= bfd_asymbol_name (y
);
753 /* Solaris 2.5 has a bug in strcoll.
754 strcoll returns invalid values when confronted with empty strings. */
760 return strcoll (xn
, yn
);
762 return strcmp (xn
, yn
);
767 non_numeric_reverse (x
, y
)
771 return - non_numeric_forward (x
, y
);
774 static int (*(sorters
[2][2])) PARAMS ((const PTR
, const PTR
)) =
776 { non_numeric_forward
, non_numeric_reverse
},
777 { numeric_forward
, numeric_reverse
}
780 /* This sort routine is used by sort_symbols_by_size. It is similar
781 to numeric_forward, but when symbols have the same value it sorts
782 by section VMA. This simplifies the sort_symbols_by_size code
783 which handles symbols at the end of sections. Also, this routine
784 tries to sort file names before other symbols with the same value.
785 That will make the file name have a zero size, which will make
786 sort_symbols_by_size choose the non file name symbol, leading to
787 more meaningful output. For similar reasons, this code sorts
788 gnu_compiled_* and gcc2_compiled before other symbols with the same
792 size_forward1 (P_x
, P_y
)
802 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
803 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
804 if (x
== NULL
|| y
== NULL
)
805 bfd_fatal (bfd_get_filename (sort_bfd
));
807 xs
= bfd_get_section (x
);
808 ys
= bfd_get_section (y
);
810 if (bfd_is_und_section (xs
))
812 if (bfd_is_und_section (ys
))
815 if (valueof (x
) != valueof (y
))
816 return valueof (x
) < valueof (y
) ? -1 : 1;
818 if (xs
->vma
!= ys
->vma
)
819 return xs
->vma
< ys
->vma
? -1 : 1;
821 xn
= bfd_asymbol_name (x
);
822 yn
= bfd_asymbol_name (y
);
826 /* The symbols gnu_compiled and gcc2_compiled convey even less
827 information than the file name, so sort them out first. */
829 xf
= (strstr (xn
, "gnu_compiled") != NULL
830 || strstr (xn
, "gcc2_compiled") != NULL
);
831 yf
= (strstr (yn
, "gnu_compiled") != NULL
832 || strstr (yn
, "gcc2_compiled") != NULL
);
839 /* We use a heuristic for the file name. It may not work on non
840 Unix systems, but it doesn't really matter; the only difference
841 is precisely which symbol names get printed. */
843 #define file_symbol(s, sn, snl) \
844 (((s)->flags & BSF_FILE) != 0 \
845 || ((sn)[(snl) - 2] == '.' \
846 && ((sn)[(snl) - 1] == 'o' \
847 || (sn)[(snl) - 1] == 'a')))
849 xf
= file_symbol (x
, xn
, xnl
);
850 yf
= file_symbol (y
, yn
, ynl
);
857 return non_numeric_forward (P_x
, P_y
);
860 /* This sort routine is used by sort_symbols_by_size. It is sorting
861 an array of size_sym structures into size order. */
864 size_forward2 (P_x
, P_y
)
868 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
869 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
871 if (x
->size
< y
->size
)
872 return reverse_sort
? 1 : -1;
873 else if (x
->size
> y
->size
)
874 return reverse_sort
? -1 : 1;
876 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
879 /* Sort the symbols by size. ELF provides a size but for other formats
880 we have to make a guess by assuming that the difference between the
881 address of a symbol and the address of the next higher symbol is the
885 sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
, size
, symsizesp
)
891 struct size_sym
**symsizesp
;
893 struct size_sym
*symsizes
;
894 bfd_byte
*from
, *fromend
;
896 asymbol
*store_sym
, *store_next
;
898 qsort (minisyms
, symcount
, size
, size_forward1
);
900 /* We are going to return a special set of symbols and sizes to
902 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
903 *symsizesp
= symsizes
;
905 /* Note that filter_symbols has already removed all absolute and
906 undefined symbols. Here we remove all symbols whose size winds
908 from
= (bfd_byte
*) minisyms
;
909 fromend
= from
+ symcount
* size
;
916 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
,
919 bfd_fatal (bfd_get_filename (abfd
));
922 for (; from
< fromend
; from
+= size
)
929 if (from
+ size
< fromend
)
931 next
= bfd_minisymbol_to_symbol (abfd
,
933 (const PTR
) (from
+ size
),
936 bfd_fatal (bfd_get_filename (abfd
));
941 sec
= bfd_get_section (sym
);
943 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
944 sz
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
945 else if (bfd_is_com_section (sec
))
949 if (from
+ size
< fromend
950 && sec
== bfd_get_section (next
))
951 sz
= valueof (next
) - valueof (sym
);
953 sz
= (bfd_get_section_vma (abfd
, sec
)
954 + bfd_section_size (abfd
, sec
)
960 symsizes
->minisym
= (const PTR
) from
;
968 store_sym
= store_next
;
972 symcount
= symsizes
- *symsizesp
;
974 /* We must now sort again by size. */
975 qsort ((PTR
) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
980 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
983 display_rel_file (abfd
, archive_bfd
)
990 struct size_sym
*symsizes
;
994 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
996 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1001 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
1003 bfd_fatal (bfd_get_filename (abfd
));
1007 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1011 /* Discard the symbols we don't want to print.
1012 It's OK to do this in place; we'll free the storage anyway
1013 (after printing). */
1015 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
1021 sort_dynamic
= dynamic
;
1022 sort_x
= bfd_make_empty_symbol (abfd
);
1023 sort_y
= bfd_make_empty_symbol (abfd
);
1024 if (sort_x
== NULL
|| sort_y
== NULL
)
1025 bfd_fatal (bfd_get_filename (abfd
));
1028 qsort (minisyms
, symcount
, size
,
1029 sorters
[sort_numerically
][reverse_sort
]);
1031 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
1036 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1038 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1043 /* Choose which symbol entries to print;
1044 compact them downward to get rid of the rest.
1045 Return the number of symbols to be printed. */
1048 filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
)
1050 bfd_boolean dynamic
;
1055 bfd_byte
*from
, *fromend
, *to
;
1058 store
= bfd_make_empty_symbol (abfd
);
1060 bfd_fatal (bfd_get_filename (abfd
));
1062 from
= (bfd_byte
*) minisyms
;
1063 fromend
= from
+ symcount
* size
;
1064 to
= (bfd_byte
*) minisyms
;
1066 for (; from
< fromend
; from
+= size
)
1073 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, (const PTR
) from
, store
);
1075 bfd_fatal (bfd_get_filename (abfd
));
1078 keep
= bfd_is_und_section (sym
->section
);
1079 else if (external_only
)
1080 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
1081 || (sym
->flags
& BSF_WEAK
) != 0
1082 || bfd_is_und_section (sym
->section
)
1083 || bfd_is_com_section (sym
->section
));
1088 && ! print_debug_syms
1089 && (sym
->flags
& BSF_DEBUGGING
) != 0)
1094 && (bfd_is_abs_section (sym
->section
)
1095 || bfd_is_und_section (sym
->section
)))
1101 if (bfd_is_und_section (sym
->section
))
1107 memcpy (to
, from
, size
);
1112 return (to
- (bfd_byte
*) minisyms
) / size
;
1115 /* Print symbol name NAME, read from ABFD, with printf format FORMAT,
1116 demangling it if requested. */
1119 print_symname (format
, name
, abfd
)
1124 if (do_demangle
&& *name
)
1126 char *res
= demangle (abfd
, name
);
1128 printf (format
, res
);
1133 printf (format
, name
);
1136 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
1140 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
)
1142 bfd_boolean dynamic
;
1149 bfd_byte
*from
, *fromend
;
1151 store
= bfd_make_empty_symbol (abfd
);
1153 bfd_fatal (bfd_get_filename (abfd
));
1155 from
= (bfd_byte
*) minisyms
;
1156 fromend
= from
+ symcount
* size
;
1157 for (; from
< fromend
; from
+= size
)
1161 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
, store
);
1163 bfd_fatal (bfd_get_filename (abfd
));
1165 print_symbol (abfd
, sym
, (bfd_vma
) 0, archive_bfd
);
1169 /* Print the symbols when sorting by size. */
1172 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
)
1174 bfd_boolean dynamic
;
1175 struct size_sym
*symsizes
;
1180 struct size_sym
*from
, *fromend
;
1182 store
= bfd_make_empty_symbol (abfd
);
1184 bfd_fatal (bfd_get_filename (abfd
));
1187 fromend
= from
+ symcount
;
1188 for (; from
< fromend
; from
++)
1193 sym
= bfd_minisymbol_to_symbol (abfd
, dynamic
, from
->minisym
, store
);
1195 bfd_fatal (bfd_get_filename (abfd
));
1197 /* For elf we have already computed the correct symbol size. */
1198 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
1201 ssize
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
1203 print_symbol (abfd
, sym
, ssize
, archive_bfd
);
1207 /* Print a single symbol. */
1210 print_symbol (abfd
, sym
, ssize
, archive_bfd
)
1218 (*format
->print_symbol_filename
) (archive_bfd
, abfd
);
1222 if (bfd_is_und_section (bfd_get_section (sym
)))
1223 print_symname ("%s", bfd_asymbol_name (sym
), abfd
);
1227 symbol_info syminfo
;
1228 struct extended_symbol_info info
;
1230 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
1231 info
.sinfo
= &syminfo
;
1233 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
1234 info
.elfinfo
= (elf_symbol_type
*) sym
;
1236 info
.elfinfo
= NULL
;
1237 (*format
->print_symbol_info
) (&info
, abfd
);
1242 static asymbol
**syms
;
1243 static long symcount
;
1244 const char *filename
, *functionname
;
1245 unsigned int lineno
;
1247 /* We need to get the canonical symbols in order to call
1248 bfd_find_nearest_line. This is inefficient, but, then, you
1249 don't have to use --line-numbers. */
1250 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
1259 symsize
= bfd_get_symtab_upper_bound (abfd
);
1261 bfd_fatal (bfd_get_filename (abfd
));
1262 syms
= (asymbol
**) xmalloc (symsize
);
1263 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
1265 bfd_fatal (bfd_get_filename (abfd
));
1266 lineno_cache_bfd
= abfd
;
1269 if (bfd_is_und_section (bfd_get_section (sym
)))
1271 static asection
**secs
;
1272 static arelent
***relocs
;
1273 static long *relcount
;
1274 static unsigned int seccount
;
1276 const char *symname
;
1278 /* For an undefined symbol, we try to find a reloc for the
1279 symbol, and print the line number of the reloc. */
1280 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
1282 for (i
= 0; i
< seccount
; i
++)
1283 if (relocs
[i
] != NULL
)
1295 struct get_relocs_info info
;
1297 seccount
= bfd_count_sections (abfd
);
1299 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
1300 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
1301 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
1304 info
.relocs
= relocs
;
1305 info
.relcount
= relcount
;
1307 bfd_map_over_sections (abfd
, get_relocs
, (PTR
) &info
);
1308 lineno_cache_rel_bfd
= abfd
;
1311 symname
= bfd_asymbol_name (sym
);
1312 for (i
= 0; i
< seccount
; i
++)
1316 for (j
= 0; j
< relcount
[i
]; j
++)
1321 if (r
->sym_ptr_ptr
!= NULL
1322 && (*r
->sym_ptr_ptr
)->section
== sym
->section
1323 && (*r
->sym_ptr_ptr
)->value
== sym
->value
1325 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
1326 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
1327 r
->address
, &filename
,
1328 &functionname
, &lineno
)
1329 && filename
!= NULL
)
1331 /* We only print the first one we find. */
1332 printf ("\t%s:%u", filename
, lineno
);
1339 else if (bfd_get_section (sym
)->owner
== abfd
)
1341 if (bfd_find_nearest_line (abfd
, bfd_get_section (sym
), syms
,
1342 sym
->value
, &filename
, &functionname
,
1347 printf ("\t%s:%u", filename
, lineno
);
1355 /* The following 3 groups of functions are called unconditionally,
1356 once at the start of processing each file of the appropriate type.
1357 They should check `filename_per_file' and `filename_per_symbol',
1358 as appropriate for their output format, to determine whether to
1361 /* Print the name of an object file given on the command line. */
1364 print_object_filename_bsd (filename
)
1367 if (filename_per_file
&& !filename_per_symbol
)
1368 printf ("\n%s:\n", filename
);
1372 print_object_filename_sysv (filename
)
1376 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1378 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1379 if (print_width
== 8)
1381 Name Value Class Type Size Line Section\n\n"));
1384 Name Value Class Type Size Line Section\n\n"));
1388 print_object_filename_posix (filename
)
1391 if (filename_per_file
&& !filename_per_symbol
)
1392 printf ("%s:\n", filename
);
1395 /* Print the name of an archive file given on the command line. */
1398 print_archive_filename_bsd (filename
)
1401 if (filename_per_file
)
1402 printf ("\n%s:\n", filename
);
1406 print_archive_filename_sysv (filename
)
1407 char *filename ATTRIBUTE_UNUSED
;
1412 print_archive_filename_posix (filename
)
1413 char *filename ATTRIBUTE_UNUSED
;
1417 /* Print the name of an archive member file. */
1420 print_archive_member_bsd (archive
, filename
)
1421 char *archive ATTRIBUTE_UNUSED
;
1422 const char *filename
;
1424 if (!filename_per_symbol
)
1425 printf ("\n%s:\n", filename
);
1429 print_archive_member_sysv (archive
, filename
)
1431 const char *filename
;
1434 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1436 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1437 if (print_width
== 8)
1439 Name Value Class Type Size Line Section\n\n"));
1442 Name Value Class Type Size Line Section\n\n"));
1446 print_archive_member_posix (archive
, filename
)
1448 const char *filename
;
1450 if (!filename_per_symbol
)
1451 printf ("%s[%s]:\n", archive
, filename
);
1454 /* Print the name of the file (and archive, if there is one)
1455 containing a symbol. */
1458 print_symbol_filename_bsd (archive_bfd
, abfd
)
1459 bfd
*archive_bfd
, *abfd
;
1461 if (filename_per_symbol
)
1464 printf ("%s:", bfd_get_filename (archive_bfd
));
1465 printf ("%s:", bfd_get_filename (abfd
));
1470 print_symbol_filename_sysv (archive_bfd
, abfd
)
1471 bfd
*archive_bfd
, *abfd
;
1473 if (filename_per_symbol
)
1476 printf ("%s:", bfd_get_filename (archive_bfd
));
1477 printf ("%s:", bfd_get_filename (abfd
));
1482 print_symbol_filename_posix (archive_bfd
, abfd
)
1483 bfd
*archive_bfd
, *abfd
;
1485 if (filename_per_symbol
)
1488 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1489 bfd_get_filename (abfd
));
1491 printf ("%s: ", bfd_get_filename (abfd
));
1495 /* Print a symbol value. */
1498 print_value (abfd
, val
)
1499 bfd
*abfd ATTRIBUTE_UNUSED
;
1502 #if ! defined (BFD64) || BFD_HOST_64BIT_LONG
1503 printf (value_format
, val
);
1505 /* We have a 64 bit value to print, but the host is only 32 bit. */
1506 if (print_radix
== 16)
1507 bfd_fprintf_vma (abfd
, stdout
, val
);
1513 s
= buf
+ sizeof buf
;
1517 *--s
= (val
% print_radix
) + '0';
1520 while ((buf
+ sizeof buf
- 1) - s
< 16)
1527 /* Print a line of information about a symbol. */
1530 print_symbol_info_bsd (info
, abfd
)
1531 struct extended_symbol_info
*info
;
1534 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1536 if (print_width
== 16)
1542 print_value (abfd
, SYM_VALUE (info
));
1544 if (print_size
&& SYM_SIZE (info
))
1547 print_value (abfd
, SYM_SIZE (info
));
1551 printf (" %c", SYM_TYPE (info
));
1553 if (SYM_TYPE (info
) == '-')
1557 printf (other_format
, SYM_STAB_OTHER (info
));
1559 printf (desc_format
, SYM_STAB_DESC (info
));
1560 printf (" %5s", SYM_STAB_NAME (info
));
1562 print_symname (" %s", SYM_NAME (info
), abfd
);
1566 print_symbol_info_sysv (info
, abfd
)
1567 struct extended_symbol_info
*info
;
1570 print_symname ("%-20s|", SYM_NAME (info
), abfd
);
1572 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1574 if (print_width
== 8)
1580 print_value (abfd
, SYM_VALUE (info
));
1582 printf ("| %c |", SYM_TYPE (info
));
1584 if (SYM_TYPE (info
) == '-')
1587 printf ("%18s| ", SYM_STAB_NAME (info
)); /* (C) Type */
1588 printf (desc_format
, SYM_STAB_DESC (info
)); /* Size */
1589 printf ("| |"); /* Line, Section */
1593 /* Type, Size, Line, Section */
1596 get_symbol_type (ELF_ST_TYPE (info
->elfinfo
->internal_elf_sym
.st_info
)));
1600 if (SYM_SIZE (info
))
1601 print_value (abfd
, SYM_SIZE (info
));
1604 if (print_width
== 8)
1611 printf("| |%s", info
->elfinfo
->symbol
.section
->name
);
1618 print_symbol_info_posix (info
, abfd
)
1619 struct extended_symbol_info
*info
;
1622 print_symname ("%s ", SYM_NAME (info
), abfd
);
1623 printf ("%c ", SYM_TYPE (info
));
1625 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1629 print_value (abfd
, SYM_VALUE (info
));
1631 if (SYM_SIZE (info
))
1632 print_value (abfd
, SYM_SIZE (info
));
1637 print_symdef_entry (abfd
)
1640 symindex idx
= BFD_NO_MORE_SYMBOLS
;
1642 bfd_boolean everprinted
= FALSE
;
1644 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
1645 idx
!= BFD_NO_MORE_SYMBOLS
;
1646 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
1651 printf (_("\nArchive index:\n"));
1654 elt
= bfd_get_elt_at_index (abfd
, idx
);
1656 bfd_fatal ("bfd_get_elt_at_index");
1657 if (thesym
->name
!= (char *) NULL
)
1659 print_symname ("%s", thesym
->name
, abfd
);
1660 printf (" in %s\n", bfd_get_filename (elt
));
1665 /* This function is used to get the relocs for a particular section.
1666 It is called via bfd_map_over_sections. */
1669 get_relocs (abfd
, sec
, dataarg
)
1674 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
1678 if ((sec
->flags
& SEC_RELOC
) == 0)
1680 *data
->relocs
= NULL
;
1681 *data
->relcount
= 0;
1687 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
1689 bfd_fatal (bfd_get_filename (abfd
));
1691 *data
->relocs
= (arelent
**) xmalloc (relsize
);
1692 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
1694 if (*data
->relcount
< 0)
1695 bfd_fatal (bfd_get_filename (abfd
));