1 /* nm.c -- Describe symbol table of a rel file.
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
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 3 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., 51 Franklin Street - Fifth Floor, Boston, MA
27 #include "aout/stab_gnu.h"
28 #include "aout/ranlib.h"
30 #include "libiberty.h"
32 #include "elf/common.h"
36 /* When sorting by size, we use this structure to hold the size and a
37 pointer to the minisymbol. */
45 /* When fetching relocs, we use this structure to pass information to
48 struct get_relocs_info
56 struct extended_symbol_info
60 elf_symbol_type
*elfinfo
;
61 /* FIXME: We should add more fields for Type, Line, Section. */
63 #define SYM_NAME(sym) (sym->sinfo->name)
64 #define SYM_VALUE(sym) (sym->sinfo->value)
65 #define SYM_TYPE(sym) (sym->sinfo->type)
66 #define SYM_STAB_NAME(sym) (sym->sinfo->stab_name)
67 #define SYM_STAB_DESC(sym) (sym->sinfo->stab_desc)
68 #define SYM_STAB_OTHER(sym) (sym->sinfo->stab_other)
69 #define SYM_SIZE(sym) \
70 (sym->elfinfo ? sym->elfinfo->internal_elf_sym.st_size: sym->ssize)
72 /* The output formatting functions. */
73 static void print_object_filename_bsd (char *);
74 static void print_object_filename_sysv (char *);
75 static void print_object_filename_posix (char *);
76 static void print_archive_filename_bsd (char *);
77 static void print_archive_filename_sysv (char *);
78 static void print_archive_filename_posix (char *);
79 static void print_archive_member_bsd (char *, const char *);
80 static void print_archive_member_sysv (char *, const char *);
81 static void print_archive_member_posix (char *, const char *);
82 static void print_symbol_filename_bsd (bfd
*, bfd
*);
83 static void print_symbol_filename_sysv (bfd
*, bfd
*);
84 static void print_symbol_filename_posix (bfd
*, bfd
*);
85 static void print_value (bfd
*, bfd_vma
);
86 static void print_symbol_info_bsd (struct extended_symbol_info
*, bfd
*);
87 static void print_symbol_info_sysv (struct extended_symbol_info
*, bfd
*);
88 static void print_symbol_info_posix (struct extended_symbol_info
*, bfd
*);
90 /* Support for different output formats. */
93 /* Print the name of an object file given on the command line. */
94 void (*print_object_filename
) (char *);
96 /* Print the name of an archive file given on the command line. */
97 void (*print_archive_filename
) (char *);
99 /* Print the name of an archive member file. */
100 void (*print_archive_member
) (char *, const char *);
102 /* Print the name of the file (and archive, if there is one)
103 containing a symbol. */
104 void (*print_symbol_filename
) (bfd
*, bfd
*);
106 /* Print a line of information about a symbol. */
107 void (*print_symbol_info
) (struct extended_symbol_info
*, bfd
*);
110 static struct output_fns formats
[] =
112 {print_object_filename_bsd
,
113 print_archive_filename_bsd
,
114 print_archive_member_bsd
,
115 print_symbol_filename_bsd
,
116 print_symbol_info_bsd
},
117 {print_object_filename_sysv
,
118 print_archive_filename_sysv
,
119 print_archive_member_sysv
,
120 print_symbol_filename_sysv
,
121 print_symbol_info_sysv
},
122 {print_object_filename_posix
,
123 print_archive_filename_posix
,
124 print_archive_member_posix
,
125 print_symbol_filename_posix
,
126 print_symbol_info_posix
}
129 /* Indices in `formats'. */
131 #define FORMAT_SYSV 1
132 #define FORMAT_POSIX 2
133 #define FORMAT_DEFAULT FORMAT_BSD
135 /* The output format to use. */
136 static struct output_fns
*format
= &formats
[FORMAT_DEFAULT
];
138 /* Command options. */
140 static int do_demangle
= 0; /* Pretty print C++ symbol names. */
141 static int external_only
= 0; /* Print external symbols only. */
142 static int defined_only
= 0; /* Print defined symbols only. */
143 static int no_sort
= 0; /* Don't sort; print syms in order found. */
144 static int print_debug_syms
= 0;/* Print debugger-only symbols too. */
145 static int print_armap
= 0; /* Describe __.SYMDEF data in archive files. */
146 static int print_size
= 0; /* Print size of defined symbols. */
147 static int reverse_sort
= 0; /* Sort in downward(alpha or numeric) order. */
148 static int sort_numerically
= 0;/* Sort in numeric rather than alpha order. */
149 static int sort_by_size
= 0; /* Sort by size of symbol. */
150 static int undefined_only
= 0; /* Print undefined symbols only. */
151 static int dynamic
= 0; /* Print dynamic symbols. */
152 static int show_version
= 0; /* Show the version number. */
153 static int show_stats
= 0; /* Show statistics. */
154 static int show_synthetic
= 0; /* Display synthesized symbols too. */
155 static int line_numbers
= 0; /* Print line numbers for symbols. */
156 static int allow_special_symbols
= 0; /* Allow special symbols. */
158 /* When to print the names of files. Not mutually exclusive in SYSV format. */
159 static int filename_per_file
= 0; /* Once per file, on its own line. */
160 static int filename_per_symbol
= 0; /* Once per symbol, at start of line. */
162 /* Print formats for printing a symbol value. */
163 static char value_format_32bit
[] = "%08lx";
164 #if BFD_HOST_64BIT_LONG
165 static char value_format_64bit
[] = "%016lx";
166 #elif BFD_HOST_64BIT_LONG_LONG
167 static char value_format_64bit
[] = "%016llx";
169 static int print_width
= 0;
170 static int print_radix
= 16;
171 /* Print formats for printing stab info. */
172 static char other_format
[] = "%02x";
173 static char desc_format
[] = "%04x";
175 static char *target
= NULL
;
177 /* Used to cache the line numbers for a BFD. */
178 static bfd
*lineno_cache_bfd
;
179 static bfd
*lineno_cache_rel_bfd
;
181 #define OPTION_TARGET 200
182 #define OPTION_PLUGIN 201
184 static struct option long_options
[] =
186 {"debug-syms", no_argument
, &print_debug_syms
, 1},
187 {"demangle", optional_argument
, 0, 'C'},
188 {"dynamic", no_argument
, &dynamic
, 1},
189 {"extern-only", no_argument
, &external_only
, 1},
190 {"format", required_argument
, 0, 'f'},
191 {"help", no_argument
, 0, 'h'},
192 {"line-numbers", no_argument
, 0, 'l'},
193 {"no-cplus", no_argument
, &do_demangle
, 0}, /* Linux compatibility. */
194 {"no-demangle", no_argument
, &do_demangle
, 0},
195 {"no-sort", no_argument
, &no_sort
, 1},
196 {"numeric-sort", no_argument
, &sort_numerically
, 1},
197 {"plugin", required_argument
, 0, OPTION_PLUGIN
},
198 {"portability", no_argument
, 0, 'P'},
199 {"print-armap", no_argument
, &print_armap
, 1},
200 {"print-file-name", no_argument
, 0, 'o'},
201 {"print-size", no_argument
, 0, 'S'},
202 {"radix", required_argument
, 0, 't'},
203 {"reverse-sort", no_argument
, &reverse_sort
, 1},
204 {"size-sort", no_argument
, &sort_by_size
, 1},
205 {"special-syms", no_argument
, &allow_special_symbols
, 1},
206 {"stats", no_argument
, &show_stats
, 1},
207 {"synthetic", no_argument
, &show_synthetic
, 1},
208 {"target", required_argument
, 0, OPTION_TARGET
},
209 {"defined-only", no_argument
, &defined_only
, 1},
210 {"undefined-only", no_argument
, &undefined_only
, 1},
211 {"version", no_argument
, &show_version
, 1},
212 {0, no_argument
, 0, 0}
215 /* Some error-reporting functions. */
218 usage (FILE *stream
, int status
)
220 fprintf (stream
, _("Usage: %s [option(s)] [file(s)]\n"), program_name
);
221 fprintf (stream
, _(" List symbols in [file(s)] (a.out by default).\n"));
222 fprintf (stream
, _(" The options are:\n\
223 -a, --debug-syms Display debugger-only symbols\n\
224 -A, --print-file-name Print name of the input file before every symbol\n\
225 -B Same as --format=bsd\n\
226 -C, --demangle[=STYLE] Decode low-level symbol names into user-level names\n\
227 The STYLE, if specified, can be `auto' (the default),\n\
228 `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
230 --no-demangle Do not demangle low-level symbol names\n\
231 -D, --dynamic Display dynamic symbols instead of normal symbols\n\
232 --defined-only Display only defined symbols\n\
234 -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\
235 `sysv' or `posix'. The default is `bsd'\n\
236 -g, --extern-only Display only external symbols\n\
237 -l, --line-numbers Use debugging information to find a filename and\n\
238 line number for each symbol\n\
239 -n, --numeric-sort Sort symbols numerically by address\n\
241 -p, --no-sort Do not sort the symbols\n\
242 -P, --portability Same as --format=posix\n\
243 -r, --reverse-sort Reverse the sense of the sort\n"));
244 #if BFD_SUPPORTS_PLUGINS
245 fprintf (stream
, _("\
246 --plugin NAME Load the specified plugin\n"));
248 fprintf (stream
, _("\
249 -S, --print-size Print size of defined symbols\n\
250 -s, --print-armap Include index for symbols from archive members\n\
251 --size-sort Sort symbols by size\n\
252 --special-syms Include special symbols in the output\n\
253 --synthetic Display synthetic symbols as well\n\
254 -t, --radix=RADIX Use RADIX for printing symbol values\n\
255 --target=BFDNAME Specify the target object format as BFDNAME\n\
256 -u, --undefined-only Display only undefined symbols\n\
257 -X 32_64 (ignored)\n\
258 @FILE Read options from FILE\n\
259 -h, --help Display this information\n\
260 -V, --version Display this program's version number\n\
262 list_supported_targets (program_name
, stream
);
263 if (REPORT_BUGS_TO
[0] && status
== 0)
264 fprintf (stream
, _("Report bugs to %s.\n"), REPORT_BUGS_TO
);
268 /* Set the radix for the symbol value and size according to RADIX. */
271 set_print_radix (char *radix
)
283 value_format_32bit
[4] = *radix
;
284 #if BFD_HOST_64BIT_LONG
285 value_format_64bit
[5] = *radix
;
286 #elif BFD_HOST_64BIT_LONG_LONG
287 value_format_64bit
[6] = *radix
;
289 other_format
[3] = desc_format
[3] = *radix
;
292 fatal (_("%s: invalid radix"), radix
);
297 set_output_format (char *f
)
316 fatal (_("%s: invalid output format"), f
);
318 format
= &formats
[i
];
322 get_symbol_type (unsigned int type
)
324 static char buff
[32];
328 case STT_NOTYPE
: return "NOTYPE";
329 case STT_OBJECT
: return "OBJECT";
330 case STT_FUNC
: return "FUNC";
331 case STT_SECTION
: return "SECTION";
332 case STT_FILE
: return "FILE";
333 case STT_COMMON
: return "COMMON";
334 case STT_TLS
: return "TLS";
336 if (type
>= STT_LOPROC
&& type
<= STT_HIPROC
)
337 sprintf (buff
, _("<processor specific>: %d"), type
);
338 else if (type
>= STT_LOOS
&& type
<= STT_HIOS
)
339 sprintf (buff
, _("<OS specific>: %d"), type
);
341 sprintf (buff
, _("<unknown>: %d"), type
);
346 /* Print symbol name NAME, read from ABFD, with printf format FORM,
347 demangling it if requested. */
350 print_symname (const char *form
, const char *name
, bfd
*abfd
)
352 if (do_demangle
&& *name
)
354 char *res
= bfd_demangle (abfd
, name
, DMGL_ANSI
| DMGL_PARAMS
);
368 print_symdef_entry (bfd
*abfd
)
370 symindex idx
= BFD_NO_MORE_SYMBOLS
;
372 bfd_boolean everprinted
= FALSE
;
374 for (idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
);
375 idx
!= BFD_NO_MORE_SYMBOLS
;
376 idx
= bfd_get_next_mapent (abfd
, idx
, &thesym
))
381 printf (_("\nArchive index:\n"));
384 elt
= bfd_get_elt_at_index (abfd
, idx
);
386 bfd_fatal ("bfd_get_elt_at_index");
387 if (thesym
->name
!= (char *) NULL
)
389 print_symname ("%s", thesym
->name
, abfd
);
390 printf (" in %s\n", bfd_get_filename (elt
));
395 /* Choose which symbol entries to print;
396 compact them downward to get rid of the rest.
397 Return the number of symbols to be printed. */
400 filter_symbols (bfd
*abfd
, bfd_boolean is_dynamic
, void *minisyms
,
401 long symcount
, unsigned int size
)
403 bfd_byte
*from
, *fromend
, *to
;
406 store
= bfd_make_empty_symbol (abfd
);
408 bfd_fatal (bfd_get_filename (abfd
));
410 from
= (bfd_byte
*) minisyms
;
411 fromend
= from
+ symcount
* size
;
412 to
= (bfd_byte
*) minisyms
;
414 for (; from
< fromend
; from
+= size
)
421 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, (const void *) from
, store
);
423 bfd_fatal (bfd_get_filename (abfd
));
426 keep
= bfd_is_und_section (sym
->section
);
427 else if (external_only
)
428 keep
= ((sym
->flags
& BSF_GLOBAL
) != 0
429 || (sym
->flags
& BSF_WEAK
) != 0
430 || bfd_is_und_section (sym
->section
)
431 || bfd_is_com_section (sym
->section
));
436 && ! print_debug_syms
437 && (sym
->flags
& BSF_DEBUGGING
) != 0)
442 && (bfd_is_abs_section (sym
->section
)
443 || bfd_is_und_section (sym
->section
)))
449 if (bfd_is_und_section (sym
->section
))
454 && bfd_is_target_special_symbol (abfd
, sym
)
455 && ! allow_special_symbols
)
461 memcpy (to
, from
, size
);
466 return (to
- (bfd_byte
*) minisyms
) / size
;
469 /* These globals are used to pass information into the sorting
471 static bfd
*sort_bfd
;
472 static bfd_boolean sort_dynamic
;
473 static asymbol
*sort_x
;
474 static asymbol
*sort_y
;
476 /* Symbol-sorting predicates */
477 #define valueof(x) ((x)->section->vma + (x)->value)
479 /* Numeric sorts. Undefined symbols are always considered "less than"
480 defined symbols with zero values. Common symbols are not treated
481 specially -- i.e., their sizes are used as their "values". */
484 non_numeric_forward (const void *P_x
, const void *P_y
)
489 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
490 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
491 if (x
== NULL
|| y
== NULL
)
492 bfd_fatal (bfd_get_filename (sort_bfd
));
494 xn
= bfd_asymbol_name (x
);
495 yn
= bfd_asymbol_name (y
);
503 /* Solaris 2.5 has a bug in strcoll.
504 strcoll returns invalid values when confronted with empty strings. */
510 return strcoll (xn
, yn
);
512 return strcmp (xn
, yn
);
517 non_numeric_reverse (const void *x
, const void *y
)
519 return - non_numeric_forward (x
, y
);
523 numeric_forward (const void *P_x
, const void *P_y
)
528 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
529 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
530 if (x
== NULL
|| y
== NULL
)
531 bfd_fatal (bfd_get_filename (sort_bfd
));
533 xs
= bfd_get_section (x
);
534 ys
= bfd_get_section (y
);
536 if (bfd_is_und_section (xs
))
538 if (! bfd_is_und_section (ys
))
541 else if (bfd_is_und_section (ys
))
543 else if (valueof (x
) != valueof (y
))
544 return valueof (x
) < valueof (y
) ? -1 : 1;
546 return non_numeric_forward (P_x
, P_y
);
550 numeric_reverse (const void *x
, const void *y
)
552 return - numeric_forward (x
, y
);
555 static int (*(sorters
[2][2])) (const void *, const void *) =
557 { non_numeric_forward
, non_numeric_reverse
},
558 { numeric_forward
, numeric_reverse
}
561 /* This sort routine is used by sort_symbols_by_size. It is similar
562 to numeric_forward, but when symbols have the same value it sorts
563 by section VMA. This simplifies the sort_symbols_by_size code
564 which handles symbols at the end of sections. Also, this routine
565 tries to sort file names before other symbols with the same value.
566 That will make the file name have a zero size, which will make
567 sort_symbols_by_size choose the non file name symbol, leading to
568 more meaningful output. For similar reasons, this code sorts
569 gnu_compiled_* and gcc2_compiled before other symbols with the same
573 size_forward1 (const void *P_x
, const void *P_y
)
581 x
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_x
, sort_x
);
582 y
= bfd_minisymbol_to_symbol (sort_bfd
, sort_dynamic
, P_y
, sort_y
);
583 if (x
== NULL
|| y
== NULL
)
584 bfd_fatal (bfd_get_filename (sort_bfd
));
586 xs
= bfd_get_section (x
);
587 ys
= bfd_get_section (y
);
589 if (bfd_is_und_section (xs
))
591 if (bfd_is_und_section (ys
))
594 if (valueof (x
) != valueof (y
))
595 return valueof (x
) < valueof (y
) ? -1 : 1;
597 if (xs
->vma
!= ys
->vma
)
598 return xs
->vma
< ys
->vma
? -1 : 1;
600 xn
= bfd_asymbol_name (x
);
601 yn
= bfd_asymbol_name (y
);
605 /* The symbols gnu_compiled and gcc2_compiled convey even less
606 information than the file name, so sort them out first. */
608 xf
= (strstr (xn
, "gnu_compiled") != NULL
609 || strstr (xn
, "gcc2_compiled") != NULL
);
610 yf
= (strstr (yn
, "gnu_compiled") != NULL
611 || strstr (yn
, "gcc2_compiled") != NULL
);
618 /* We use a heuristic for the file name. It may not work on non
619 Unix systems, but it doesn't really matter; the only difference
620 is precisely which symbol names get printed. */
622 #define file_symbol(s, sn, snl) \
623 (((s)->flags & BSF_FILE) != 0 \
624 || ((sn)[(snl) - 2] == '.' \
625 && ((sn)[(snl) - 1] == 'o' \
626 || (sn)[(snl) - 1] == 'a')))
628 xf
= file_symbol (x
, xn
, xnl
);
629 yf
= file_symbol (y
, yn
, ynl
);
636 return non_numeric_forward (P_x
, P_y
);
639 /* This sort routine is used by sort_symbols_by_size. It is sorting
640 an array of size_sym structures into size order. */
643 size_forward2 (const void *P_x
, const void *P_y
)
645 const struct size_sym
*x
= (const struct size_sym
*) P_x
;
646 const struct size_sym
*y
= (const struct size_sym
*) P_y
;
648 if (x
->size
< y
->size
)
649 return reverse_sort
? 1 : -1;
650 else if (x
->size
> y
->size
)
651 return reverse_sort
? -1 : 1;
653 return sorters
[0][reverse_sort
] (x
->minisym
, y
->minisym
);
656 /* Sort the symbols by size. ELF provides a size but for other formats
657 we have to make a guess by assuming that the difference between the
658 address of a symbol and the address of the next higher symbol is the
662 sort_symbols_by_size (bfd
*abfd
, bfd_boolean is_dynamic
, void *minisyms
,
663 long symcount
, unsigned int size
,
664 struct size_sym
**symsizesp
)
666 struct size_sym
*symsizes
;
667 bfd_byte
*from
, *fromend
;
669 asymbol
*store_sym
, *store_next
;
671 qsort (minisyms
, symcount
, size
, size_forward1
);
673 /* We are going to return a special set of symbols and sizes to
675 symsizes
= (struct size_sym
*) xmalloc (symcount
* sizeof (struct size_sym
));
676 *symsizesp
= symsizes
;
678 /* Note that filter_symbols has already removed all absolute and
679 undefined symbols. Here we remove all symbols whose size winds
681 from
= (bfd_byte
*) minisyms
;
682 fromend
= from
+ symcount
* size
;
689 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, (const void *) from
,
692 bfd_fatal (bfd_get_filename (abfd
));
695 for (; from
< fromend
; from
+= size
)
702 if (from
+ size
< fromend
)
704 next
= bfd_minisymbol_to_symbol (abfd
,
706 (const void *) (from
+ size
),
709 bfd_fatal (bfd_get_filename (abfd
));
714 sec
= bfd_get_section (sym
);
716 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
717 sz
= ((elf_symbol_type
*) sym
)->internal_elf_sym
.st_size
;
718 else if (bfd_is_com_section (sec
))
722 if (from
+ size
< fromend
723 && sec
== bfd_get_section (next
))
724 sz
= valueof (next
) - valueof (sym
);
726 sz
= (bfd_get_section_vma (abfd
, sec
)
727 + bfd_section_size (abfd
, sec
)
733 symsizes
->minisym
= (const void *) from
;
741 store_sym
= store_next
;
745 symcount
= symsizes
- *symsizesp
;
747 /* We must now sort again by size. */
748 qsort ((void *) *symsizesp
, symcount
, sizeof (struct size_sym
), size_forward2
);
753 /* This function is used to get the relocs for a particular section.
754 It is called via bfd_map_over_sections. */
757 get_relocs (bfd
*abfd
, asection
*sec
, void *dataarg
)
759 struct get_relocs_info
*data
= (struct get_relocs_info
*) dataarg
;
763 if ((sec
->flags
& SEC_RELOC
) == 0)
765 *data
->relocs
= NULL
;
772 relsize
= bfd_get_reloc_upper_bound (abfd
, sec
);
774 bfd_fatal (bfd_get_filename (abfd
));
776 *data
->relocs
= (arelent
**) xmalloc (relsize
);
777 *data
->relcount
= bfd_canonicalize_reloc (abfd
, sec
, *data
->relocs
,
779 if (*data
->relcount
< 0)
780 bfd_fatal (bfd_get_filename (abfd
));
788 /* Print a single symbol. */
791 print_symbol (bfd
*abfd
, asymbol
*sym
, bfd_vma ssize
, bfd
*archive_bfd
)
794 struct extended_symbol_info info
;
798 format
->print_symbol_filename (archive_bfd
, abfd
);
800 bfd_get_symbol_info (abfd
, sym
, &syminfo
);
801 info
.sinfo
= &syminfo
;
803 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
804 info
.elfinfo
= (elf_symbol_type
*) sym
;
807 format
->print_symbol_info (&info
, abfd
);
811 static asymbol
**syms
;
812 static long symcount
;
813 const char *filename
, *functionname
;
816 /* We need to get the canonical symbols in order to call
817 bfd_find_nearest_line. This is inefficient, but, then, you
818 don't have to use --line-numbers. */
819 if (abfd
!= lineno_cache_bfd
&& syms
!= NULL
)
828 symsize
= bfd_get_symtab_upper_bound (abfd
);
830 bfd_fatal (bfd_get_filename (abfd
));
831 syms
= (asymbol
**) xmalloc (symsize
);
832 symcount
= bfd_canonicalize_symtab (abfd
, syms
);
834 bfd_fatal (bfd_get_filename (abfd
));
835 lineno_cache_bfd
= abfd
;
838 if (bfd_is_und_section (bfd_get_section (sym
)))
840 static asection
**secs
;
841 static arelent
***relocs
;
842 static long *relcount
;
843 static unsigned int seccount
;
847 /* For an undefined symbol, we try to find a reloc for the
848 symbol, and print the line number of the reloc. */
849 if (abfd
!= lineno_cache_rel_bfd
&& relocs
!= NULL
)
851 for (i
= 0; i
< seccount
; i
++)
852 if (relocs
[i
] != NULL
)
864 struct get_relocs_info rinfo
;
866 seccount
= bfd_count_sections (abfd
);
868 secs
= (asection
**) xmalloc (seccount
* sizeof *secs
);
869 relocs
= (arelent
***) xmalloc (seccount
* sizeof *relocs
);
870 relcount
= (long *) xmalloc (seccount
* sizeof *relcount
);
873 rinfo
.relocs
= relocs
;
874 rinfo
.relcount
= relcount
;
876 bfd_map_over_sections (abfd
, get_relocs
, (void *) &rinfo
);
877 lineno_cache_rel_bfd
= abfd
;
880 symname
= bfd_asymbol_name (sym
);
881 for (i
= 0; i
< seccount
; i
++)
885 for (j
= 0; j
< relcount
[i
]; j
++)
890 if (r
->sym_ptr_ptr
!= NULL
891 && (*r
->sym_ptr_ptr
)->section
== sym
->section
892 && (*r
->sym_ptr_ptr
)->value
== sym
->value
894 bfd_asymbol_name (*r
->sym_ptr_ptr
)) == 0
895 && bfd_find_nearest_line (abfd
, secs
[i
], syms
,
896 r
->address
, &filename
,
897 &functionname
, &lineno
)
900 /* We only print the first one we find. */
901 printf ("\t%s:%u", filename
, lineno
);
908 else if (bfd_get_section (sym
)->owner
== abfd
)
910 if ((bfd_find_line (abfd
, syms
, sym
, &filename
, &lineno
)
911 || bfd_find_nearest_line (abfd
, bfd_get_section (sym
),
912 syms
, sym
->value
, &filename
,
913 &functionname
, &lineno
))
916 printf ("\t%s:%u", filename
, lineno
);
923 /* Print the symbols when sorting by size. */
926 print_size_symbols (bfd
*abfd
, bfd_boolean is_dynamic
,
927 struct size_sym
*symsizes
, long symcount
,
931 struct size_sym
*from
, *fromend
;
933 store
= bfd_make_empty_symbol (abfd
);
935 bfd_fatal (bfd_get_filename (abfd
));
938 fromend
= from
+ symcount
;
939 for (; from
< fromend
; from
++)
944 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
->minisym
, store
);
946 bfd_fatal (bfd_get_filename (abfd
));
948 /* For elf we have already computed the correct symbol size. */
949 if (bfd_get_flavour (abfd
) == bfd_target_elf_flavour
)
952 ssize
= from
->size
- bfd_section_vma (abfd
, bfd_get_section (sym
));
954 print_symbol (abfd
, sym
, ssize
, archive_bfd
);
959 /* Print the symbols. If ARCHIVE_BFD is non-NULL, it is the archive
963 print_symbols (bfd
*abfd
, bfd_boolean is_dynamic
, void *minisyms
, long symcount
,
964 unsigned int size
, bfd
*archive_bfd
)
967 bfd_byte
*from
, *fromend
;
969 store
= bfd_make_empty_symbol (abfd
);
971 bfd_fatal (bfd_get_filename (abfd
));
973 from
= (bfd_byte
*) minisyms
;
974 fromend
= from
+ symcount
* size
;
975 for (; from
< fromend
; from
+= size
)
979 sym
= bfd_minisymbol_to_symbol (abfd
, is_dynamic
, from
, store
);
981 bfd_fatal (bfd_get_filename (abfd
));
983 print_symbol (abfd
, sym
, (bfd_vma
) 0, archive_bfd
);
987 /* If ARCHIVE_BFD is non-NULL, it is the archive containing ABFD. */
990 display_rel_file (bfd
*abfd
, bfd
*archive_bfd
)
995 struct size_sym
*symsizes
;
999 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
1001 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1006 symcount
= bfd_read_minisymbols (abfd
, dynamic
, &minisyms
, &size
);
1008 bfd_fatal (bfd_get_filename (abfd
));
1012 non_fatal (_("%s: no symbols"), bfd_get_filename (abfd
));
1016 if (show_synthetic
&& size
== sizeof (asymbol
*))
1020 asymbol
**static_syms
= NULL
;
1021 asymbol
**dyn_syms
= NULL
;
1022 long static_count
= 0;
1027 dyn_count
= symcount
;
1028 dyn_syms
= (asymbol
**) minisyms
;
1032 long storage
= bfd_get_dynamic_symtab_upper_bound (abfd
);
1034 static_count
= symcount
;
1035 static_syms
= (asymbol
**) minisyms
;
1039 dyn_syms
= (asymbol
**) xmalloc (storage
);
1040 dyn_count
= bfd_canonicalize_dynamic_symtab (abfd
, dyn_syms
);
1042 bfd_fatal (bfd_get_filename (abfd
));
1045 synth_count
= bfd_get_synthetic_symtab (abfd
, static_count
, static_syms
,
1046 dyn_count
, dyn_syms
, &synthsyms
);
1047 if (synth_count
> 0)
1053 new_mini
= xmalloc ((symcount
+ synth_count
+ 1) * sizeof (*symp
));
1054 symp
= (asymbol
**) new_mini
;
1055 memcpy (symp
, minisyms
, symcount
* sizeof (*symp
));
1057 for (i
= 0; i
< synth_count
; i
++)
1058 *symp
++ = synthsyms
+ i
;
1060 minisyms
= new_mini
;
1061 symcount
+= synth_count
;
1065 /* Discard the symbols we don't want to print.
1066 It's OK to do this in place; we'll free the storage anyway
1067 (after printing). */
1069 symcount
= filter_symbols (abfd
, dynamic
, minisyms
, symcount
, size
);
1075 sort_dynamic
= dynamic
;
1076 sort_x
= bfd_make_empty_symbol (abfd
);
1077 sort_y
= bfd_make_empty_symbol (abfd
);
1078 if (sort_x
== NULL
|| sort_y
== NULL
)
1079 bfd_fatal (bfd_get_filename (abfd
));
1082 qsort (minisyms
, symcount
, size
,
1083 sorters
[sort_numerically
][reverse_sort
]);
1085 symcount
= sort_symbols_by_size (abfd
, dynamic
, minisyms
, symcount
,
1090 print_symbols (abfd
, dynamic
, minisyms
, symcount
, size
, archive_bfd
);
1092 print_size_symbols (abfd
, dynamic
, symsizes
, symcount
, archive_bfd
);
1098 set_print_width (bfd
*file
)
1100 print_width
= bfd_get_arch_size (file
);
1102 if (print_width
== -1)
1105 Guess the target's bitsize based on its name.
1106 We assume here than any 64-bit format will include
1107 "64" somewhere in its name. The only known exception
1108 is the MMO object file format. */
1109 if (strstr (bfd_get_target (file
), "64") != NULL
1110 || strcmp (bfd_get_target (file
), "mmo") == 0)
1118 display_archive (bfd
*file
)
1121 bfd
*last_arfile
= NULL
;
1124 format
->print_archive_filename (bfd_get_filename (file
));
1127 print_symdef_entry (file
);
1133 arfile
= bfd_openr_next_archived_file (file
, arfile
);
1137 if (bfd_get_error () != bfd_error_no_more_archived_files
)
1138 bfd_fatal (bfd_get_filename (file
));
1142 if (bfd_check_format_matches (arfile
, bfd_object
, &matching
))
1144 set_print_width (arfile
);
1145 format
->print_archive_member (bfd_get_filename (file
),
1146 bfd_get_filename (arfile
));
1147 display_rel_file (arfile
, file
);
1151 bfd_nonfatal (bfd_get_filename (arfile
));
1152 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1154 list_matching_formats (matching
);
1159 if (last_arfile
!= NULL
)
1161 bfd_close (last_arfile
);
1162 lineno_cache_bfd
= NULL
;
1163 lineno_cache_rel_bfd
= NULL
;
1165 last_arfile
= arfile
;
1168 if (last_arfile
!= NULL
)
1170 bfd_close (last_arfile
);
1171 lineno_cache_bfd
= NULL
;
1172 lineno_cache_rel_bfd
= NULL
;
1177 display_file (char *filename
)
1179 bfd_boolean retval
= TRUE
;
1183 if (get_file_size (filename
) < 1)
1186 file
= bfd_openr (filename
, target
);
1189 bfd_nonfatal (filename
);
1193 if (bfd_check_format (file
, bfd_archive
))
1195 display_archive (file
);
1197 else if (bfd_check_format_matches (file
, bfd_object
, &matching
))
1199 set_print_width (file
);
1200 format
->print_object_filename (filename
);
1201 display_rel_file (file
, NULL
);
1205 bfd_nonfatal (filename
);
1206 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1208 list_matching_formats (matching
);
1214 if (!bfd_close (file
))
1215 bfd_fatal (filename
);
1217 lineno_cache_bfd
= NULL
;
1218 lineno_cache_rel_bfd
= NULL
;
1223 /* The following 3 groups of functions are called unconditionally,
1224 once at the start of processing each file of the appropriate type.
1225 They should check `filename_per_file' and `filename_per_symbol',
1226 as appropriate for their output format, to determine whether to
1229 /* Print the name of an object file given on the command line. */
1232 print_object_filename_bsd (char *filename
)
1234 if (filename_per_file
&& !filename_per_symbol
)
1235 printf ("\n%s:\n", filename
);
1239 print_object_filename_sysv (char *filename
)
1242 printf (_("\n\nUndefined symbols from %s:\n\n"), filename
);
1244 printf (_("\n\nSymbols from %s:\n\n"), filename
);
1245 if (print_width
== 32)
1247 Name Value Class Type Size Line Section\n\n"));
1250 Name Value Class Type Size Line Section\n\n"));
1254 print_object_filename_posix (char *filename
)
1256 if (filename_per_file
&& !filename_per_symbol
)
1257 printf ("%s:\n", filename
);
1260 /* Print the name of an archive file given on the command line. */
1263 print_archive_filename_bsd (char *filename
)
1265 if (filename_per_file
)
1266 printf ("\n%s:\n", filename
);
1270 print_archive_filename_sysv (char *filename ATTRIBUTE_UNUSED
)
1275 print_archive_filename_posix (char *filename ATTRIBUTE_UNUSED
)
1279 /* Print the name of an archive member file. */
1282 print_archive_member_bsd (char *archive ATTRIBUTE_UNUSED
,
1283 const char *filename
)
1285 if (!filename_per_symbol
)
1286 printf ("\n%s:\n", filename
);
1290 print_archive_member_sysv (char *archive
, const char *filename
)
1293 printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive
, filename
);
1295 printf (_("\n\nSymbols from %s[%s]:\n\n"), archive
, filename
);
1296 if (print_width
== 32)
1298 Name Value Class Type Size Line Section\n\n"));
1301 Name Value Class Type Size Line Section\n\n"));
1305 print_archive_member_posix (char *archive
, const char *filename
)
1307 if (!filename_per_symbol
)
1308 printf ("%s[%s]:\n", archive
, filename
);
1311 /* Print the name of the file (and archive, if there is one)
1312 containing a symbol. */
1315 print_symbol_filename_bsd (bfd
*archive_bfd
, bfd
*abfd
)
1317 if (filename_per_symbol
)
1320 printf ("%s:", bfd_get_filename (archive_bfd
));
1321 printf ("%s:", bfd_get_filename (abfd
));
1326 print_symbol_filename_sysv (bfd
*archive_bfd
, bfd
*abfd
)
1328 if (filename_per_symbol
)
1331 printf ("%s:", bfd_get_filename (archive_bfd
));
1332 printf ("%s:", bfd_get_filename (abfd
));
1337 print_symbol_filename_posix (bfd
*archive_bfd
, bfd
*abfd
)
1339 if (filename_per_symbol
)
1342 printf ("%s[%s]: ", bfd_get_filename (archive_bfd
),
1343 bfd_get_filename (abfd
));
1345 printf ("%s: ", bfd_get_filename (abfd
));
1349 /* Print a symbol value. */
1352 print_value (bfd
*abfd ATTRIBUTE_UNUSED
, bfd_vma val
)
1354 switch (print_width
)
1357 printf (value_format_32bit
, (unsigned long) val
);
1361 #if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
1362 printf (value_format_64bit
, val
);
1364 /* We have a 64 bit value to print, but the host is only 32 bit. */
1365 if (print_radix
== 16)
1366 bfd_fprintf_vma (abfd
, stdout
, val
);
1372 s
= buf
+ sizeof buf
;
1376 *--s
= (val
% print_radix
) + '0';
1379 while ((buf
+ sizeof buf
- 1) - s
< 16)
1387 fatal (_("Print width has not been initialized (%d)"), print_width
);
1392 /* Print a line of information about a symbol. */
1395 print_symbol_info_bsd (struct extended_symbol_info
*info
, bfd
*abfd
)
1397 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1399 if (print_width
== 64)
1405 /* Normally we print the value of the symbol. If we are printing the
1406 size or sorting by size then we print its size, except for the
1407 (weird) special case where both flags are defined, in which case we
1408 print both values. This conforms to documented behaviour. */
1409 if (sort_by_size
&& !print_size
)
1410 print_value (abfd
, SYM_SIZE (info
));
1412 print_value (abfd
, SYM_VALUE (info
));
1414 if (print_size
&& SYM_SIZE (info
))
1417 print_value (abfd
, SYM_SIZE (info
));
1421 printf (" %c", SYM_TYPE (info
));
1423 if (SYM_TYPE (info
) == '-')
1427 printf (other_format
, SYM_STAB_OTHER (info
));
1429 printf (desc_format
, SYM_STAB_DESC (info
));
1430 printf (" %5s", SYM_STAB_NAME (info
));
1432 print_symname (" %s", SYM_NAME (info
), abfd
);
1436 print_symbol_info_sysv (struct extended_symbol_info
*info
, bfd
*abfd
)
1438 print_symname ("%-20s|", SYM_NAME (info
), abfd
);
1440 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1442 if (print_width
== 32)
1448 print_value (abfd
, SYM_VALUE (info
));
1450 printf ("| %c |", SYM_TYPE (info
));
1452 if (SYM_TYPE (info
) == '-')
1455 printf ("%18s| ", SYM_STAB_NAME (info
)); /* (C) Type. */
1456 printf (desc_format
, SYM_STAB_DESC (info
)); /* Size. */
1457 printf ("| |"); /* Line, Section. */
1461 /* Type, Size, Line, Section */
1464 get_symbol_type (ELF_ST_TYPE (info
->elfinfo
->internal_elf_sym
.st_info
)));
1468 if (SYM_SIZE (info
))
1469 print_value (abfd
, SYM_SIZE (info
));
1472 if (print_width
== 32)
1479 printf("| |%s", info
->elfinfo
->symbol
.section
->name
);
1486 print_symbol_info_posix (struct extended_symbol_info
*info
, bfd
*abfd
)
1488 print_symname ("%s ", SYM_NAME (info
), abfd
);
1489 printf ("%c ", SYM_TYPE (info
));
1491 if (bfd_is_undefined_symclass (SYM_TYPE (info
)))
1495 print_value (abfd
, SYM_VALUE (info
));
1497 if (SYM_SIZE (info
))
1498 print_value (abfd
, SYM_SIZE (info
));
1503 main (int argc
, char **argv
)
1508 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1509 setlocale (LC_MESSAGES
, "");
1511 #if defined (HAVE_SETLOCALE)
1512 setlocale (LC_CTYPE
, "");
1513 setlocale (LC_COLLATE
, "");
1515 bindtextdomain (PACKAGE
, LOCALEDIR
);
1516 textdomain (PACKAGE
);
1518 program_name
= *argv
;
1519 xmalloc_set_program_name (program_name
);
1520 #if BFD_SUPPORTS_PLUGINS
1521 bfd_plugin_set_program_name (program_name
);
1524 START_PROGRESS (program_name
, 0);
1526 expandargv (&argc
, &argv
);
1529 set_default_bfd_target ();
1531 while ((c
= getopt_long (argc
, argv
, "aABCDef:gHhlnopPrSst:uvVvX:",
1532 long_options
, (int *) 0)) != EOF
)
1537 print_debug_syms
= 1;
1541 filename_per_symbol
= 1;
1543 case 'B': /* For MIPS compatibility. */
1544 set_output_format ("bsd");
1550 enum demangling_styles style
;
1552 style
= cplus_demangle_name_to_style (optarg
);
1553 if (style
== unknown_demangling
)
1554 fatal (_("unknown demangling style `%s'"),
1557 cplus_demangle_set_style (style
);
1564 /* Ignored for HP/UX compatibility. */
1567 set_output_format (optarg
);
1580 sort_numerically
= 1;
1586 set_output_format ("posix");
1598 set_print_radix (optarg
);
1607 /* Ignored for (partial) AIX compatibility. On AIX, the
1608 argument has values 32, 64, or 32_64, and specifies that
1609 only 32-bit, only 64-bit, or both kinds of objects should
1610 be examined. The default is 32. So plain AIX nm on a
1611 library archive with both kinds of objects will ignore
1612 the 64-bit ones. For GNU nm, the default is and always
1613 has been -X 32_64, and other options are not supported. */
1614 if (strcmp (optarg
, "32_64") != 0)
1615 fatal (_("Only -X 32_64 is supported"));
1618 case OPTION_TARGET
: /* --target */
1622 case OPTION_PLUGIN
: /* --plugin */
1623 #if BFD_SUPPORTS_PLUGINS
1624 bfd_plugin_set_plugin (optarg
);
1626 fatal (_("sorry - this program has been built without plugin support\n"));
1630 case 0: /* A long option that just sets a flag. */
1639 print_version ("nm");
1641 if (sort_by_size
&& undefined_only
)
1643 non_fatal (_("Using the --size-sort and --undefined-only options together"));
1644 non_fatal (_("will produce no output, since undefined symbols have no size."));
1648 /* OK, all options now parsed. If no filename specified, do a.out. */
1650 return !display_file ("a.out");
1654 if (argc
- optind
> 1)
1655 filename_per_file
= 1;
1657 /* We were given several filenames to do. */
1658 while (optind
< argc
)
1661 if (!display_file (argv
[optind
++]))
1665 END_PROGRESS (program_name
);
1670 char *lim
= (char *) sbrk (0);
1672 non_fatal (_("data size %ld"), (long) (lim
- (char *) &environ
));