Multiple definition of static constexpr data member with C++11 and 17

Florian Weimer fweimer@redhat.com
Mon Aug 16 12:47:07 GMT 2021


* Jonathan Wakely:

> On Mon, 16 Aug 2021 at 10:59, Florian Weimer wrote:
>>
>> * Jonathan Wakely via Gcc-help:
>>
>> > I'm not sure if GCC should change, or if the linker should be changed
>> > to permit a single non-weak non-UNIQUE definition to be merged with
>> > zero or more UNIQUE definitions. As a workaround you can compile the
>> > C++17 code with -fno-gnu-unique so that GCC uses a weak symbol, but
>> > that isn't a good solution in general (the unique binding exists for
>> > good reasons).
>>
>> What are those reasons, exactly?
>
> I think it was added to ensure uniqueness of static objects across
> libraries opened with RTLD_LOCAL.

Hmm, that makes some sense.  The glibc implementation is not really
structured in such a way that it is obvious that this is the goal.
(glibc knows what it has loaded, so it could search just that, and not
construct a separate hash table.)

>> I've been trying to find a rationale and specification of
>> STB_GNU_UNIQUE, but have not been successful.
>>
>> The glibc implementation does not handle symbol versions, it ignores
>> them.  It's not entirely clear to me if this is a bug.
>
> Does anybody use it with more than one symbol version though?

libstdc++?

> Using symbol versioning on a STB_GNU_UNIQUE symbol would seem to
> violate its uniqueness.
>
>> Furthermore, I haven't seen a case yet which would require
>> STB_GNU_UNIQUE and could not have been handled equally well via symbol
>> interposition.
>
> Does that work for RTLD_LOCAL though?

No, I don't think so.

Thanks,
Florian



More information about the Gcc-help mailing list