aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2021-03-15 10:55:49 +0000
committerNick Clifton <nickc@redhat.com>2021-03-15 10:55:49 +0000
commit1996d0f12cd57391e01e0eebe32e44510e6ec17d (patch)
tree9c5ae8fdf4eb04328ff41b4459d571b4f8a7f7fb
parent8d624a9d8050ca96e154215c7858ac5c2d8b0b19 (diff)
downloadfsf-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.
-rw-r--r--binutils/ChangeLog17
-rw-r--r--binutils/NEWS4
-rw-r--r--binutils/doc/binutils.texi45
-rw-r--r--binutils/nm.c109
4 files changed, 137 insertions, 38 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 37460e7..62f98b4 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,20 @@
+2021-03-15 Nick Clifton <nickc@redhat.com>
+
+ 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.
+
2021-03-12 Clément Chigot <clement.chigot@atos.net>
* od-xcoff.c: Replace RTB by TRL entry.
diff --git a/binutils/NEWS b/binutils/NEWS
index a4d7a61..c035f52 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,5 +1,9 @@
-*- text -*-
+* A new format has been added to the nm program. Specifying
+ --format=just-symbols (or just using -j) will tell the program to only
+ display symbol names and nothing else.
+
* A new command line --keep-section-symbols has been added to objcopy and
strip. This stops the removal of unused section symbols when the file is
copied. Removing these symbols saves space, but sometimes they are needed by
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index a9d1dd3..292f711 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -793,23 +793,37 @@ The @sc{gnu} linker @command{ld} is now described in a separate manual.
@smallexample
@c man begin SYNOPSIS nm
-nm [@option{-A}|@option{-o}|@option{--print-file-name}] [@option{-a}|@option{--debug-syms}]
- [@option{-B}|@option{--format=bsd}] [@option{-C}|@option{--demangle}[=@var{style}]]
- [@option{-D}|@option{--dynamic}] [@option{-f}@var{format}|@option{--format=}@var{format}]
- [@option{-g}|@option{--extern-only}] [@option{-h}|@option{--help}]
+nm [@option{-A}|@option{-o}|@option{--print-file-name}]
+ [@option{-a}|@option{--debug-syms}]
+ [@option{-B}|@option{--format=bsd}]
+ [@option{-C}|@option{--demangle}[=@var{style}]]
+ [@option{-D}|@option{--dynamic}]
+ [@option{-f}@var{format}|@option{--format=}@var{format}]
+ [@option{-g}|@option{--extern-only}]
+ [@option{-h}|@option{--help}]
[@option{--ifunc-chars=@var{CHARS}}]
+ [@option{-j}|@option{--format=just-symbols}]
[@option{-l}|@option{--line-numbers}] [@option{--inlines}]
[@option{-n}|@option{-v}|@option{--numeric-sort}]
- [@option{-P}|@option{--portability}] [@option{-p}|@option{--no-sort}]
- [@option{-r}|@option{--reverse-sort}] [@option{-S}|@option{--print-size}]
- [@option{-s}|@option{--print-armap}] [@option{-t} @var{radix}|@option{--radix=}@var{radix}]
- [@option{-u}|@option{--undefined-only}] [@option{-V}|@option{--version}]
- [@option{-X 32_64}] [@option{--defined-only}] [@option{--no-demangle}]
- [@option{--plugin} @var{name}]
+ [@option{-P}|@option{--portability}]
+ [@option{-p}|@option{--no-sort}]
+ [@option{-r}|@option{--reverse-sort}]
+ [@option{-S}|@option{--print-size}]
+ [@option{-s}|@option{--print-armap}]
+ [@option{-t} @var{radix}|@option{--radix=}@var{radix}]
+ [@option{-u}|@option{--undefined-only}]
+ [@option{-V}|@option{--version}]
+ [@option{-X 32_64}]
+ [@option{--defined-only}]
+ [@option{--no-demangle}]
[@option{--no-recurse-limit}|@option{--recurse-limit}]]
- [@option{--size-sort}] [@option{--special-syms}]
- [@option{--synthetic}] [@option{--with-symbol-versions}]
- [@option{--without-symbol-versions}] [@option{--target=}@var{bfdname}]
+ [@option{--plugin} @var{name}]
+ [@option{--size-sort}]
+ [@option{--special-syms}]
+ [@option{--synthetic}]
+ [@option{--target=}@var{bfdname}]
+ [@option{--with-symbol-versions}]
+ [@option{--without-symbol-versions}]
[@var{objfile}@dots{}]
@c man end
@end smallexample
@@ -1027,7 +1041,7 @@ libraries.
@cindex @command{nm} format
@cindex @command{nm} compatibility
Use the output format @var{format}, which can be @code{bsd},
-@code{sysv}, or @code{posix}. The default is @code{bsd}.
+@code{sysv}, @code{posix} or @code{just-symbols}. The default is @code{bsd}.
Only the first character of @var{format} is significant; it can be
either upper or lower case.
@@ -1049,6 +1063,9 @@ first character will be used for global indirect function symbols and
the second character, if present, will be used for local indirect
function symbols.
+@item j
+The same as @option{--format=just-symbols}.
+
@item -l
@itemx --line-numbers
@cindex symbol line numbers
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;