From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1062) id 83D54382DB13; Sun, 30 Jun 2024 22:23:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 83D54382DB13 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1719786211; bh=agGR+5I2fDPwQApg8MEMhXz/uh+u74gCZkSKm05Pn3E=; h=From:To:Subject:Date:From; b=WMIzBZHO1HU6qCB4JWz/qHzMGN1Zt6mznD1ky0PIpsSrmg7PGLhe/k4AFJW+liONU /xcqQILwmyaPmSTIg9j2jnYD86fgzmxaLq8g4VTalKw0YtZbOOMqXKD1R4zOTZ2E1Y cAO61klmQpFGspADEuaoZaj8zRBggcbvcrgt4QN4= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Alan Modra To: binutils-cvs@sourceware.org Subject: [binutils-gdb] objcopy: Allow making symbol global and weak on same invocation X-Act-Checkin: binutils-gdb X-Git-Author: Marcus Nilsson X-Git-Refname: refs/heads/master X-Git-Oldrev: 01a8854406356b6ecfed3a81028d9d552bf18905 X-Git-Newrev: ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f Message-Id: <20240630222331.83D54382DB13@sourceware.org> Date: Sun, 30 Jun 2024 22:23:31 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Debe3f6d0f185= 05e3f6a1800d3a3ee4b3403d726f commit ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f Author: Marcus Nilsson Date: Sat Jun 29 23:01:56 2024 +0200 objcopy: Allow making symbol global and weak on same invocation =20 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. =20 * 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. Diff: --- binutils/objcopy.c | 31 +++++++++++++++----------= ---- binutils/testsuite/binutils-all/symbols-5.d | 8 ++++++++ binutils/testsuite/binutils-all/symbols-5.s | 3 +++ 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 26f9d4a0f26..f54ae734198 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1730,14 +1730,6 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osym= s, =20 if (keep) { - if (((flags & (BSF_GLOBAL | BSF_GNU_UNIQUE)) - || undefined) - && (weaken || is_specified_symbol (name, weaken_specific_htab))) - { - sym->flags &=3D ~ (BSF_GLOBAL | BSF_GNU_UNIQUE); - sym->flags |=3D 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 **osy= ms, && ! is_specified_symbol (name, keepglobal_specific_htab)) || (localize_hidden && is_hidden_symbol (sym)))) { - sym->flags &=3D ~ (BSF_GLOBAL | BSF_WEAK); - sym->flags |=3D BSF_LOCAL; + flags &=3D ~(BSF_GLOBAL | BSF_WEAK); + flags |=3D BSF_LOCAL; } =20 - 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 &=3D ~BSF_LOCAL; + flags |=3D BSF_GLOBAL; + } + + if (((flags & (BSF_GLOBAL | BSF_GNU_UNIQUE)) + || undefined) + && (weaken || is_specified_symbol (name, weaken_specific_htab))) { - sym->flags &=3D ~ BSF_LOCAL; - sym->flags |=3D BSF_GLOBAL; + flags &=3D ~(BSF_GLOBAL | BSF_GNU_UNIQUE); + flags |=3D BSF_WEAK; } =20 + sym->flags =3D flags; to[dst_count++] =3D sym; } } diff --git a/binutils/testsuite/binutils-all/symbols-5.d b/binutils/testsui= te/binutils-all/symbols-5.d new file mode 100644 index 00000000000..ffaa950fc5b --- /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/testsui= te/binutils-all/symbols-5.s new file mode 100644 index 00000000000..aa01b9e4a60 --- /dev/null +++ b/binutils/testsuite/binutils-all/symbols-5.s @@ -0,0 +1,3 @@ + .text +foo: + .word 0x0