diff options
author | Nick Clifton <nickc@redhat.com> | 2021-03-15 10:55:49 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2021-03-15 10:55:49 +0000 |
commit | 1996d0f12cd57391e01e0eebe32e44510e6ec17d (patch) | |
tree | 9c5ae8fdf4eb04328ff41b4459d571b4f8a7f7fb /binutils/nm.c | |
parent | 8d624a9d8050ca96e154215c7858ac5c2d8b0b19 (diff) | |
download | fsf-binutils-gdb-1996d0f12cd57391e01e0eebe32e44510e6ec17d.zip fsf-binutils-gdb-1996d0f12cd57391e01e0eebe32e44510e6ec17d.tar.gz fsf-binutils-gdb-1996d0f12cd57391e01e0eebe32e44510e6ec17d.tar.bz2 |
Add a symbols-only mode to nm.
PR 27487
* nm.c (FORMAT_JUST_SYMBOLS): Define.
(struct optput_fns): Add entry for FORMAT_JUST_SYMBOLS.
(long_options): Add just-symbols.
(set_output_format): Add support for just-symbols.
(get_print_format): Likewise.
(do_not_print_object_filename): New function.
(do_not_print_archive_filename): New function.
(do_not_print_archive_member): New function.
(do_not_print_symbol_filename): New function.
(just_print_symbol_name): New function.
(main): Handle --just-symbols.
* NEWS: Mention the new feature.
* doc/binutils.texi: Document the new feature.
Diffstat (limited to 'binutils/nm.c')
-rw-r--r-- | binutils/nm.c | 109 |
1 files changed, 85 insertions, 24 deletions
diff --git a/binutils/nm.c b/binutils/nm.c index 2637756..119c486 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -79,41 +79,63 @@ struct extended_symbol_info static void print_object_filename_bsd (const char *); static void print_object_filename_sysv (const char *); static void print_object_filename_posix (const char *); +static void do_not_print_object_filename (const char *); + static void print_archive_filename_bsd (const char *); static void print_archive_filename_sysv (const char *); static void print_archive_filename_posix (const char *); +static void do_not_print_archive_filename (const char *); + static void print_archive_member_bsd (const char *, const char *); static void print_archive_member_sysv (const char *, const char *); static void print_archive_member_posix (const char *, const char *); +static void do_not_print_archive_member (const char *, const char *); + static void print_symbol_filename_bsd (bfd *, bfd *); static void print_symbol_filename_sysv (bfd *, bfd *); static void print_symbol_filename_posix (bfd *, bfd *); -static void print_value (bfd *, bfd_vma); +static void do_not_print_symbol_filename (bfd *, bfd *); + static void print_symbol_info_bsd (struct extended_symbol_info *, bfd *); static void print_symbol_info_sysv (struct extended_symbol_info *, bfd *); static void print_symbol_info_posix (struct extended_symbol_info *, bfd *); +static void just_print_symbol_name (struct extended_symbol_info *, bfd *); + +static void print_value (bfd *, bfd_vma); /* Support for different output formats. */ struct output_fns - { - /* Print the name of an object file given on the command line. */ - void (*print_object_filename) (const char *); +{ + /* Print the name of an object file given on the command line. */ + void (*print_object_filename) (const char *); - /* Print the name of an archive file given on the command line. */ - void (*print_archive_filename) (const char *); + /* Print the name of an archive file given on the command line. */ + void (*print_archive_filename) (const char *); - /* Print the name of an archive member file. */ - void (*print_archive_member) (const char *, const char *); + /* Print the name of an archive member file. */ + void (*print_archive_member) (const char *, const char *); - /* Print the name of the file (and archive, if there is one) - containing a symbol. */ - void (*print_symbol_filename) (bfd *, bfd *); + /* Print the name of the file (and archive, if there is one) + containing a symbol. */ + void (*print_symbol_filename) (bfd *, bfd *); - /* Print a line of information about a symbol. */ - void (*print_symbol_info) (struct extended_symbol_info *, bfd *); - }; + /* Print a line of information about a symbol. */ + void (*print_symbol_info) (struct extended_symbol_info *, bfd *); +}; -static struct output_fns formats[] = +/* Indices in `formats'. */ +enum formats +{ + FORMAT_BSD = 0, + FORMAT_SYSV, + FORMAT_POSIX, + FORMAT_JUST_SYMBOLS, + FORMAT_MAX +}; + +#define FORMAT_DEFAULT FORMAT_BSD + +static struct output_fns formats[FORMAT_MAX] = { {print_object_filename_bsd, print_archive_filename_bsd, @@ -129,14 +151,14 @@ static struct output_fns formats[] = print_archive_filename_posix, print_archive_member_posix, print_symbol_filename_posix, - print_symbol_info_posix} + print_symbol_info_posix}, + {do_not_print_object_filename, + do_not_print_archive_filename, + do_not_print_archive_member, + do_not_print_symbol_filename, + just_print_symbol_name} }; -/* Indices in `formats'. */ -#define FORMAT_BSD 0 -#define FORMAT_SYSV 1 -#define FORMAT_POSIX 2 -#define FORMAT_DEFAULT FORMAT_BSD /* The output format to use. */ static struct output_fns *format = &formats[FORMAT_DEFAULT]; @@ -214,6 +236,7 @@ static struct option long_options[] = {"format", required_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, {"ifunc-chars", required_argument, 0, OPTION_IFUNC_CHARS}, + {"just-symbols", no_argument, 0, 'j'}, {"line-numbers", no_argument, 0, 'l'}, {"no-cplus", no_argument, &do_demangle, 0}, /* Linux compatibility. */ {"no-demangle", no_argument, &do_demangle, 0}, @@ -265,9 +288,10 @@ usage (FILE *stream, int status) --defined-only Display only defined symbols\n\ -e (ignored)\n\ -f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',\n\ - `sysv' or `posix'. The default is `bsd'\n\ + `sysv', `posix' or 'just-symbols'. The default is `bsd'\n\ -g, --extern-only Display only external symbols\n\ --ifunc-chars=CHARS Characters to use when displaying ifunc symbols\n\ + -j, --just-symbols Same as --format=just-symbols\n\ -l, --line-numbers Use debugging information to find a filename and\n\ line number for each symbol\n\ -n, --numeric-sort Sort symbols numerically by address\n\ @@ -338,6 +362,10 @@ set_output_format (char *f) case 'S': i = FORMAT_SYSV; break; + case 'j': + case 'J': + i = FORMAT_JUST_SYMBOLS; + break; default: fatal (_("%s: invalid output format"), f); } @@ -1268,7 +1296,7 @@ static const char * get_print_format (void) { const char * padding; - if (print_format == FORMAT_POSIX) + if (print_format == FORMAT_POSIX || print_format == FORMAT_JUST_SYMBOLS) { /* POSIX compatible output does not have any padding. */ padding = ""; @@ -1477,6 +1505,11 @@ print_object_filename_posix (const char *filename) if (filename_per_file && !filename_per_symbol) printf ("%s:\n", filename); } + +static void +do_not_print_object_filename (const char *filename ATTRIBUTE_UNUSED) +{ +} /* Print the name of an archive file given on the command line. */ @@ -1496,6 +1529,11 @@ static void print_archive_filename_posix (const char *filename ATTRIBUTE_UNUSED) { } + +static void +do_not_print_archive_filename (const char *filename ATTRIBUTE_UNUSED) +{ +} /* Print the name of an archive member file. */ @@ -1528,6 +1566,13 @@ print_archive_member_posix (const char *archive, const char *filename) if (!filename_per_symbol) printf ("%s[%s]:\n", archive, filename); } + +static void +do_not_print_archive_member (const char *archive ATTRIBUTE_UNUSED, + const char *filename ATTRIBUTE_UNUSED) +{ +} + /* Print the name of the file (and archive, if there is one) containing a symbol. */ @@ -1566,6 +1611,13 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd) printf ("%s: ", bfd_get_filename (abfd)); } } + +static void +do_not_print_symbol_filename (bfd *archive_bfd ATTRIBUTE_UNUSED, + bfd *abfd ATTRIBUTE_UNUSED) +{ +} + /* Print a symbol value. */ @@ -1723,6 +1775,12 @@ print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd) print_value (abfd, SYM_SIZE (info)); } } + +static void +just_print_symbol_name (struct extended_symbol_info *info, bfd *abfd) +{ + print_symname ("%s", info, NULL, abfd); +} int main (int argc, char **argv) @@ -1755,7 +1813,7 @@ main (int argc, char **argv) fatal (_("fatal error: libbfd ABI mismatch")); set_default_bfd_target (); - while ((c = getopt_long (argc, argv, "aABCDef:gHhlnopPrSst:uvVvX:", + while ((c = getopt_long (argc, argv, "aABCDef:gHhjJlnopPrSst:uvVvX:", long_options, (int *) 0)) != EOF) { switch (c) @@ -1830,6 +1888,9 @@ main (int argc, char **argv) case 'P': set_output_format ("posix"); break; + case 'j': + set_output_format ("just-symbols"); + break; case 'r': reverse_sort = 1; break; |