V2 [PATCH] gas: Extend .symver directive

H.J. Lu hjl.tools@gmail.com
Tue Apr 7 23:15:35 GMT 2020


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.

>    However, given the general conservative attitude of the binutils
>    community, I think there might be some objection.
>
>    Reusing the same stem name is very likely a mistake.
>
>    .globl foo_v1
>    .symver foo_v1,foo@v1
>    foo_v1:
>
>    A non-default version can be used to reject static archive linking
>    while keep shared object compatibility. An undefined reference foo
>    without a version cannot be satisfied by the definition.
>
>    Keeping `foo` + .symver foo,foo@v1 will nullify the use case.
>
> B. Add an optional argument to change binding/visibility or remove the
>    original symbol (this patch).
>    I am mostly worried that this makes the .symver semantics even harder
>    to understand / explain in the documentation.
>
>    There seems to make @@@ even more inconsistent with @/@@.
>
>    BTW, have you checked .localentry (which can set the non-visibility
>    bits of st_other)

That is a PPC specific directive.

>    I ask for clarification from GCC developers why some special
>    attributes (local/hidden) are needed, not other general attribute
>    flags.

.symver was designed to be used in assembly codes for glibc.
Only recently GCC is trying to use it.  That is one reason why
it is the way it is.

-- 
H.J.


More information about the Binutils mailing list