aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2022-05-18 13:15:22 +0100
committerNick Clifton <nickc@redhat.com>2022-05-18 13:15:22 +0100
commit2c3cc81e068464b5a3d5bf19a9cf3cf3dd6b7b55 (patch)
tree5d5ae06c550788f2885c324e074395f6f10a971e
parentc76d61da4a65eaadca861bf6c77d579a5cc3f422 (diff)
downloadfsf-binutils-gdb-2c3cc81e068464b5a3d5bf19a9cf3cf3dd6b7b55.zip
fsf-binutils-gdb-2c3cc81e068464b5a3d5bf19a9cf3cf3dd6b7b55.tar.gz
fsf-binutils-gdb-2c3cc81e068464b5a3d5bf19a9cf3cf3dd6b7b55.tar.bz2
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.
-rw-r--r--binutils/ChangeLog13
-rw-r--r--binutils/NEWS2
-rw-r--r--binutils/doc/binutils.texi5
-rw-r--r--binutils/nm.c11
-rw-r--r--binutils/testsuite/binutils-all/nm.exp32
-rw-r--r--binutils/testsuite/binutils-all/no-weak.s13
6 files changed, 74 insertions, 2 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index ab65d20..6697697 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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>
PR 29072
diff --git a/binutils/NEWS b/binutils/NEWS
index c266bb9..3043a7a 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,7 +1,9 @@
-*- 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.
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index 292588c..81be746 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -819,6 +819,7 @@ nm [@option{-A}|@option{-o}|@option{--print-file-name}]
[@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}]]
@@ -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
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
diff --git a/binutils/nm.c b/binutils/nm.c
index 9edaa8d..60e4d85 100644
--- a/binutils/nm.c
+++ b/binutils/nm.c
@@ -176,6 +176,7 @@ static const char *print_format_string = NULL;
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. */
@@ -281,6 +282,7 @@ static struct option long_options[] =
{"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}
@@ -365,6 +367,8 @@ usage (FILE *stream, int status)
--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, _("\
-X 32_64 (ignored)\n"));
@@ -808,6 +812,8 @@ filter_symbols (bfd *abfd, bool is_dynamic, void *minisyms,
| 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;
@@ -2052,7 +2058,7 @@ main (int argc, char **argv)
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)
@@ -2171,6 +2177,9 @@ main (int argc, char **argv)
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
diff --git a/binutils/testsuite/binutils-all/nm.exp b/binutils/testsuite/binutils-all/nm.exp
index 4560df1..1c419df 100644
--- a/binutils/testsuite/binutils-all/nm.exp
+++ b/binutils/testsuite/binutils-all/nm.exp
@@ -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.
diff --git a/binutils/testsuite/binutils-all/no-weak.s b/binutils/testsuite/binutils-all/no-weak.s
new file mode 100644
index 0000000..a25454d
--- /dev/null
+++ b/binutils/testsuite/binutils-all/no-weak.s
@@ -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
+
+