diff options
author | Marcus Nilsson <brainbomb@gmail.com> | 2024-06-29 23:01:56 +0200 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2024-07-01 07:19:47 +0930 |
commit | ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f (patch) | |
tree | d3ae815acb42c96da719cb094afafe14300c5f14 /binutils/objcopy.c | |
parent | 01a8854406356b6ecfed3a81028d9d552bf18905 (diff) | |
download | gdb-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.
Diffstat (limited to 'binutils/objcopy.c')
-rw-r--r-- | binutils/objcopy.c | 31 |
1 files changed, 16 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; } } |