+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>
PR 29072
-*- 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
servers when following links.
+
* objcopy --weaken, --weaken-symbol, and --weaken-symbols now make ELF
STB_GNU_UNIQUE symbols weak.
[@option{-u}|@option{--undefined-only}]
[@option{-U}|@option{--defined-only}]
[@option{-V}|@option{--version}]
+ [@option{-W}|@option{--no-weak}]
[@option{-X 32_64}]
[@option{--no-demangle}]
[@option{--no-recurse-limit}|@option{--recurse-limit}]]
output device). The colouring is intended to draw attention to the
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 --without-symbol-versions
Enables or disables the display of symbol version information. The
static int do_demangle = 0; /* Pretty print C++ symbol names. */
static int external_only = 0; /* Print external 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 print_debug_syms = 0;/* Print debugger-only symbols too. */
static int print_armap = 0; /* Describe __.SYMDEF data in archive files. */
{"undefined-only", no_argument, 0, 'u'},
{"unicode", required_argument, NULL, OPTION_UNICODE},
{"version", no_argument, &show_version, 1},
+ {"no-weak", no_argument, 0, 'W'},
{"with-symbol-versions", no_argument, &with_symbol_versions, 1},
{"without-symbol-versions", no_argument, &with_symbol_versions, 0},
{0, no_argument, 0, 0}
fprintf (stream, _("\
--unicode={default|show|invalid|hex|escape|highlight}\n\
Specify how to treat UTF-8 encoded unicode characters\n"));
+ fprintf (stream, _("\
+ -W, --no-weak Ignore weak symbols\n"));
fprintf (stream, _("\
--with-symbol-versions Display version strings after symbol names\n"));
fprintf (stream, _("\
| BSF_GNU_UNIQUE)) != 0
|| bfd_is_und_section (sym->section)
|| bfd_is_com_section (sym->section));
+ else if (non_weak)
+ keep = ((sym->flags & BSF_WEAK) == 0);
else
keep = 1;
fatal (_("fatal error: libbfd ABI mismatch"));
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)
{
switch (c)
case 'V':
show_version = 1;
break;
+ case 'W':
+ non_weak = 1;
+ break;
case 'X':
/* Ignored for (partial) AIX compatibility. On AIX, the
argument has values 32, 64, or 32_64, and specifies that
}
}
-
+ 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.
--- /dev/null
+ .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
+
+