Add a --no-weak option to nm.

PR 29135
	* nm.c (non_weak): New variable.
	(filter_symbols): When non-weak is true, ignore weak symbols.
	(long_options): Add --no-weak.
	(usage): Mention --no-weak.
	(main): Handle -W/--no-weak.
	* doc/binutils.texi: Document new feature.
	* NEWS: Mention the new feature.
	* testsuite/binutils-all/nm.exp: Add test of new feature.
	* testsuite/binutils-all/no-weak.s: New test source file.
This commit is contained in:
Nick Clifton
2022-05-18 13:15:22 +01:00
parent c76d61da4a
commit 2c3cc81e06
6 changed files with 74 additions and 2 deletions

View File

@ -1,3 +1,16 @@
2022-05-18 Nick Clifton <nickc@redhat.com>
PR 29135
* nm.c (non_weak): New variable.
(filter_symbols): When non-weak is true, ignore weak symbols.
(long_options): Add --no-weak.
(usage): Mention --no-weak.
(main): Handle -W/--no-weak.
* doc/binutils.texi: Document new feature.
* NEWS: Mention the new feature.
* testsuite/binutils-all/nm.exp: Add test of new feature.
* testsuite/binutils-all/no-weak.s: New test source file.
2022-04-25 Nick Clifton <nickc@redhat.com> 2022-04-25 Nick Clifton <nickc@redhat.com>
PR 29072 PR 29072

View File

@ -1,7 +1,9 @@
-*- text -*- -*- text -*-
* Add --no-weak/-W option to nm to make it ignore weak symbols.
* Add an option to objdump and readelf to prevent attempts to access debuginfod * Add an option to objdump and readelf to prevent attempts to access debuginfod
servers when following links. servers when following links.
* objcopy --weaken, --weaken-symbol, and --weaken-symbols now make ELF * objcopy --weaken, --weaken-symbol, and --weaken-symbols now make ELF
STB_GNU_UNIQUE symbols weak. STB_GNU_UNIQUE symbols weak.

View File

@ -819,6 +819,7 @@ nm [@option{-A}|@option{-o}|@option{--print-file-name}]
[@option{-u}|@option{--undefined-only}] [@option{-u}|@option{--undefined-only}]
[@option{-U}|@option{--defined-only}] [@option{-U}|@option{--defined-only}]
[@option{-V}|@option{--version}] [@option{-V}|@option{--version}]
[@option{-W}|@option{--no-weak}]
[@option{-X 32_64}] [@option{-X 32_64}]
[@option{--no-demangle}] [@option{--no-demangle}]
[@option{--no-recurse-limit}|@option{--recurse-limit}]] [@option{--no-recurse-limit}|@option{--recurse-limit}]]
@ -1213,6 +1214,10 @@ them as escape sequences highlighted in red (if supported by the
output device). The colouring is intended to draw attention to the output device). The colouring is intended to draw attention to the
presence of unicode sequences where they might not be expected. presence of unicode sequences where they might not be expected.
@item -W
@itemx --no-weak
Do not display weak symbols.
@item --with-symbol-versions @item --with-symbol-versions
@item --without-symbol-versions @item --without-symbol-versions
Enables or disables the display of symbol version information. The Enables or disables the display of symbol version information. The

View File

@ -176,6 +176,7 @@ static const char *print_format_string = NULL;
static int do_demangle = 0; /* Pretty print C++ symbol names. */ static int do_demangle = 0; /* Pretty print C++ symbol names. */
static int external_only = 0; /* Print external symbols only. */ static int external_only = 0; /* Print external symbols only. */
static int defined_only = 0; /* Print defined symbols only. */ static int defined_only = 0; /* Print defined symbols only. */
static int non_weak = 0; /* Ignore weak symbols. */
static int no_sort = 0; /* Don't sort; print syms in order found. */ static int no_sort = 0; /* Don't sort; print syms in order found. */
static int print_debug_syms = 0;/* Print debugger-only symbols too. */ static int print_debug_syms = 0;/* Print debugger-only symbols too. */
static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */ static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */
@ -281,6 +282,7 @@ static struct option long_options[] =
{"undefined-only", no_argument, 0, 'u'}, {"undefined-only", no_argument, 0, 'u'},
{"unicode", required_argument, NULL, OPTION_UNICODE}, {"unicode", required_argument, NULL, OPTION_UNICODE},
{"version", no_argument, &show_version, 1}, {"version", no_argument, &show_version, 1},
{"no-weak", no_argument, 0, 'W'},
{"with-symbol-versions", no_argument, &with_symbol_versions, 1}, {"with-symbol-versions", no_argument, &with_symbol_versions, 1},
{"without-symbol-versions", no_argument, &with_symbol_versions, 0}, {"without-symbol-versions", no_argument, &with_symbol_versions, 0},
{0, no_argument, 0, 0} {0, no_argument, 0, 0}
@ -364,6 +366,8 @@ usage (FILE *stream, int status)
fprintf (stream, _("\ fprintf (stream, _("\
--unicode={default|show|invalid|hex|escape|highlight}\n\ --unicode={default|show|invalid|hex|escape|highlight}\n\
Specify how to treat UTF-8 encoded unicode characters\n")); Specify how to treat UTF-8 encoded unicode characters\n"));
fprintf (stream, _("\
-W, --no-weak Ignore weak symbols\n"));
fprintf (stream, _("\ fprintf (stream, _("\
--with-symbol-versions Display version strings after symbol names\n")); --with-symbol-versions Display version strings after symbol names\n"));
fprintf (stream, _("\ fprintf (stream, _("\
@ -808,6 +812,8 @@ filter_symbols (bfd *abfd, bool is_dynamic, void *minisyms,
| BSF_GNU_UNIQUE)) != 0 | BSF_GNU_UNIQUE)) != 0
|| bfd_is_und_section (sym->section) || bfd_is_und_section (sym->section)
|| bfd_is_com_section (sym->section)); || bfd_is_com_section (sym->section));
else if (non_weak)
keep = ((sym->flags & BSF_WEAK) == 0);
else else
keep = 1; keep = 1;
@ -2052,7 +2058,7 @@ main (int argc, char **argv)
fatal (_("fatal error: libbfd ABI mismatch")); fatal (_("fatal error: libbfd ABI mismatch"));
set_default_bfd_target (); set_default_bfd_target ();
while ((c = getopt_long (argc, argv, "aABCDef:gHhjJlnopPrSst:uU:vVvX:", while ((c = getopt_long (argc, argv, "aABCDef:gHhjJlnopPrSst:uU:vVvWX:",
long_options, (int *) 0)) != EOF) long_options, (int *) 0)) != EOF)
{ {
switch (c) switch (c)
@ -2171,6 +2177,9 @@ main (int argc, char **argv)
case 'V': case 'V':
show_version = 1; show_version = 1;
break; break;
case 'W':
non_weak = 1;
break;
case 'X': case 'X':
/* Ignored for (partial) AIX compatibility. On AIX, the /* Ignored for (partial) AIX compatibility. On AIX, the
argument has values 32, 64, or 32_64, and specifies that argument has values 32, 64, or 32_64, and specifies that

View File

@ -340,7 +340,37 @@ if [is_elf_format] {
} }
} }
set testname "nm --no-weak"
if {![binutils_assemble $srcdir/$subdir/no-weak.s tmpdir/no-weak.o]} then {
fail "$testname (assembly)"
} else {
if [is_remote host] {
set tmpfile [remote_download host tmpdir/no-weak.o]
} else {
set tmpfile tmpdir/no-weak.o
}
set got [binutils_run $NM "$NMFLAGS --no-weak $tmpfile"]
if [regexp "weak_with_default_value" $got] then {
fail "$testname (weak symbol with default value)"
} else {
pass "$testname (weak symbol with default value)"
}
if [regexp "weak_without_default_value" $got] then {
fail "$testname (weak symbol without default value)"
} else {
pass "$testname (weak symbol without default value)"
}
# FIXME: We should re run this test without the --no-weak option
# and verify that the expected symbol names *are* shown...
if { $verbose < 1 } {
remote_file host delete "tmpdir/no0weak.o"
}
}
} }
# There are certainly other tests that could be run. # There are certainly other tests that could be run.

View File

@ -0,0 +1,13 @@
.file "no-weak.c"
.text
.globl weak_with_default_value
.weak weak_with_default_value
weak_with_default_value:
.nop
.data
.weak weak_without_default_value
.dc.a weak_without_default_value