V2 [PATCH] gas: Extend .symver directive
H.J. Lu
hjl.tools@gmail.com
Wed Apr 8 12:53:43 GMT 2020
On Tue, Apr 7, 2020 at 4:58 PM Fangrui Song <i@maskray.me> wrote:
>
> On 2020-04-07, H.J. Lu wrote:
> >On Tue, Apr 7, 2020 at 2:23 PM Fangrui Song <i@maskray.me> wrote:
> >>
> >> On 2020-04-07, H.J. Lu via Binutils wrote:
> >> >On Tue, Apr 7, 2020 at 5:55 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
> >> >>
> >> >> On Apr 07 2020, H.J. Lu wrote:
> >> >>
> >> >> > The optional argument VISIBILITY updates the visibility of
> >> >> > the original symbol. The valid visibilities are 'local', 'hidden', and
> >> >> > 'remove'. The 'local' visibility makes the original symbol a local
> >> >> > symbol (*note Local::). The 'hidden' visibility sets the visibility of
> >> >> > the original symbol to 'hidden' (*note Hidden::). The 'remove'
> >> >> > visibility removes the original symbol from the symbol table. If
> >> >> > visibility isn't specified, the original symbol is unchanged.
> >> >>
> >> >> Looks good.
> >> >
> >> >Here is the updated patch.
> >> >
> >> >--
> >> >H.J.
> >>
> >> Let me summarize the current status:
> >>
> >> @@@ has the renaming semantics. (invented in 2000)
> >> @ and @@ has the copying semantics. The original symbol remains which is usually cumbersome.
> >>
> >> We have received some requests:
> >>
> >> * Have a way to not retain the original symbol
> >> * Have a way to define multiple versions `.symver something,foo@v1; .symver something,foo@v2. symver something,foo@@v3`
> >>
> >>
> >> We have many choices.
> >>
> >> A. make @ @@ similar to @@@
> >> For @@, because of the linking rule (a @@ definition can satisfy a
> >> referenced without a version), there should be no difference.
> >>
> >> For @, this will be a semantic break. Personally I don't think this
> >> matters. I believe 99% projects don't need the original symbol and
> >> will not notice anything. I also checked with FreeBSD developers.
> >
> >The original symbol name is used in glibc to bypass PLT within
> >libc.so.
>
> This does not seem correct. By convention, the hidden aliases are those prefixed with __
> They are called to bypass PLT (STV_HIDDEN implies the non-preemptible property).
> The original symbol does not have the prefix.
>
> When a linker sees memcpy@@GLIBC_2.14 , basically it inserts both "memcpy" and
> "memcpy@GLIBC_2.14" into the symbol table. Both a reference without a version
> "memcpy" and a reference with a version "memcpy@GLIBC_2.14" can be satisfied.
As I said before, the original purpose of .symver is for glibc to
implement symbol
versioning. Given:
---
const int _sys_nerr_internal = 200;
__asm__ (".symver _sys_nerr_internal, sys_nerr@@GLIBC_2.12");
---
_sys_nerr_internal is used internally in glibc:
File: libc_pic.a(_strerror.os)
Relocation section '.rela.text' at offset 0x14e0 contains 17 entries:
Offset Info Type Symbol's
Value Symbol's Name + Addend
000000000000001c 0000001500000002 R_X86_64_PC32
0000000000000000 _sys_nerr_internal - 4
000000000000002c 0000001600000002 R_X86_64_PC32
0000000000000000 _sys_errlist_internal - 4
---
char *
__strerror_r (int errnum, char *buf, size_t buflen)
{
...
return (char *) _(_sys_errlist_internal[errnum]);
}
---
Also with -g, _sys_nerr_internal is also referenced in debug info. We
just can't change .symver to rename.
> If the definition of "memcpy" also exists, I think it is somewhat special cased
> in GNU ld and/or gold. In GNU ld, the actual implementation may be more complex
> with indirect symbol involved. I believe the whole thing can be simplified a
> lot by using renaming semantic. I debugged this area last year and may
> misremember something.
It is OK to extend .symver directive. Change it to rename semantic isn't an
option.
--
H.J.
More information about the Binutils
mailing list