aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Nilsson <brainbomb@gmail.com>2024-06-29 23:01:56 +0200
committerAlan Modra <amodra@gmail.com>2024-07-01 07:19:47 +0930
commitebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f (patch)
treed3ae815acb42c96da719cb094afafe14300c5f14
parent01a8854406356b6ecfed3a81028d9d552bf18905 (diff)
downloadgdb-ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f.zip
gdb-ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f.tar.gz
gdb-ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f.tar.bz2
objcopy: Allow making symbol global and weak on same invocation
Previously objcopy had to be run twice in order to make a local symbol weak, first once to globalize it, and once again to mark it as weak. * objcopy.c (filter_symbols): Weaken symbols after making local/global changes. * testsuite/binutils-all/symbols-5.d, * testsuite/binutils-all/symbols-5.s: New test.
-rw-r--r--binutils/objcopy.c31
-rw-r--r--binutils/testsuite/binutils-all/symbols-5.d8
-rw-r--r--binutils/testsuite/binutils-all/symbols-5.s3
3 files changed, 27 insertions, 15 deletions
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 26f9d4a..f54ae73 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -1730,14 +1730,6 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
if (keep)
{
- if (((flags & (BSF_GLOBAL | BSF_GNU_UNIQUE))
- || undefined)
- && (weaken || is_specified_symbol (name, weaken_specific_htab)))
- {
- sym->flags &= ~ (BSF_GLOBAL | BSF_GNU_UNIQUE);
- sym->flags |= BSF_WEAK;
- }
-
if (!undefined
&& (flags & (BSF_GLOBAL | BSF_WEAK))
&& (is_specified_symbol (name, localize_specific_htab)
@@ -1745,18 +1737,27 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
&& ! is_specified_symbol (name, keepglobal_specific_htab))
|| (localize_hidden && is_hidden_symbol (sym))))
{
- sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
- sym->flags |= BSF_LOCAL;
+ flags &= ~(BSF_GLOBAL | BSF_WEAK);
+ flags |= BSF_LOCAL;
}
- if (!undefined
- && (flags & BSF_LOCAL)
- && is_specified_symbol (name, globalize_specific_htab))
+ else if (!undefined
+ && (flags & BSF_LOCAL)
+ && is_specified_symbol (name, globalize_specific_htab))
+ {
+ flags &= ~BSF_LOCAL;
+ flags |= BSF_GLOBAL;
+ }
+
+ if (((flags & (BSF_GLOBAL | BSF_GNU_UNIQUE))
+ || undefined)
+ && (weaken || is_specified_symbol (name, weaken_specific_htab)))
{
- sym->flags &= ~ BSF_LOCAL;
- sym->flags |= BSF_GLOBAL;
+ flags &= ~(BSF_GLOBAL | BSF_GNU_UNIQUE);
+ flags |= BSF_WEAK;
}
+ sym->flags = flags;
to[dst_count++] = sym;
}
}
diff --git a/binutils/testsuite/binutils-all/symbols-5.d b/binutils/testsuite/binutils-all/symbols-5.d
new file mode 100644
index 0000000..ffaa950
--- /dev/null
+++ b/binutils/testsuite/binutils-all/symbols-5.d
@@ -0,0 +1,8 @@
+#name: globalize and weaken 'foo'
+#PROG: objcopy
+#objcopy: --globalize-symbol foo -W foo
+#source: symbols-5.s
+#nm: -n
+
+#...
+0+ [VW] foo
diff --git a/binutils/testsuite/binutils-all/symbols-5.s b/binutils/testsuite/binutils-all/symbols-5.s
new file mode 100644
index 0000000..aa01b9e
--- /dev/null
+++ b/binutils/testsuite/binutils-all/symbols-5.s
@@ -0,0 +1,3 @@
+ .text
+foo:
+ .word 0x0