Re: [PATCH 2/3] gas/ELF: warn upon non-default visibility of local symbols

Jan Beulich <[email protected]>
Newsgroups gmane.comp.gnu.binutils
Message-ID <[email protected]>
On 23.06.2026 15:14, Michael Matz wrote:
> On Tue, 23 Jun 2026, Jan Beulich wrote:
> 
>> ... this actual reference, arguably the compiler should also emit a .global
>> directive. It generally gets away without doing so because referenced symbols
>> which aren't otherwise defined are implicitly global (which, seeing how
>> other assemblers behave, can be argued as being a bug, but apparently is
>> "traditional behavior" on UNIXes).
> 
> An assembler isn't a structured programming language environment, I think 
> the quotes are undeserved: its entirely sensible that an assembler that 
> sees a symbol reference for a symbol that at file-end is still undefined 
> assumes that such symbol then obviously must come from a different file 
> and hence be global (binding).

Well, I grew up (in the DOS / Windows / OS/2 world) with assemblers behaving
differently.

>>> ELF spec
>>> doesn't forbid the hidden visibility on a local symbol.  It is just a no-op.
>>
>> You did read
>>
>> "The spec explicitly precludes STB_LOCAL together with STV_PROTECTED (and,
>>  implicity, STV_HIDDEN or STV_INTERNAL), so we better wouldn't entirely
>>  silently write out symbols violating this."
>>
>> in the patch description, didn't you? If you think that's wrong, did you
>> then not consider going back to the ELF spec to find what exactly is said
>> there: "A symbol with STB_LOCAL binding may not have STV_PROTECTED
>> visibility." And then for STV_HIDDEN: "Such a symbol is necessarily
>> protected." I.e. what is said for STV_PROTECTED applies to STV_HIDDEN (and
>> STV_INTERNAL) as well, at least according to my interpretation of that
>> wording.
> 
> I think that's a misinterpretation.  "a symbol is protected" is different 
> from "a symbol has STV_PROTECTED visibility".  The former is defined in 
> the section for the latter: 
> 
>   A symbol defined in the current component is protected if it is visible 
>   in other components but cannot be preempted. Any reference to such a 
>   symbol from within the defining component must be resolved to the 
>   definition in that component, even if there is a definition in another 
>   component that would interpose by the default rules. A symbol with 
>   STB_LOCAL binding will not have STV_PROTECTED visibility.
> 
> and _that definition_ is invoked by STV_HIDDEN:
> 
>   A symbol defined in the current component is hidden if its name is not 
>   visible to other components. Such a symbol is necessarily protected.
> 
> IMHO it's clear that a symbol hence "can be protected" without having its 
> visibility be STV_PROTECTED.  Namely when it is STV_HIDDEN: its then 
> protected _and_ hidden (which is of course redundant, because hidden 
> implies protected, but as we are word-smithing, lets be precise).
> 
> That a STB_LOCAL symbol cannot have STV_PROTECTED visibility doesn't 
> transfer to STV_HIDDEN from this wording, and from nothing else either, 
> conceptually binding and visibility are orthogonal concepts and this 
> specific disallowance for the STB_LOCAL+STV_PROTECTED combination is ... 
> well, specific.  That is the wart, not that STB_LOCAL+STV_HIDDEN was 
> "forgotten" to be disallowed.

IOW what you're suggesting as interpretation is that while STV_PROTECTED
and STB_LOCAL may not combine, the visibility-wise more restricting
STV_HIDDEN may combine with STB_LOCAL? Make no sense to me, I'm afraid.
(And would also make the implementation harder.)

Jan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.