PATCH: Fix linkage in libsupc++

Gabriel Dos Reis gdr@integrable-solutions.net
Tue Aug 3 08:13:00 GMT 2004


Mark Mitchell <mark@codesourcery.com> writes:

| Gabriel Dos Reis wrote:
| 
| >Mark Mitchell <mark@codesourcery.com> writes:
| >
| >| With the new symbol visibility patches, we have to be careful not to
| >| get incorrect linkage in the libraries; if the default visibility is
| >| not "default" when we include the headers, things get confused.
| >| Things are even worse for ports that use "hidden" visibility by
| >| default; the ARM/Symbian OS port will be one such.
| > | | A tricky problem here was that this pattern was present in a lot
| > of
| >| the libsupc++ files:
| > | |   // cxxabi.h
| > | |   namespace __cxxabiv1 { |      extern "C" void f();
| >|   }
| > | |   // f.c
| > | |   #include <cxxabi.h>
| > |   |   extern "C" void f() {}
| > | | This is *not* a definition of the function declared in the
| > header;
| >| it's just an overloaded function.  You must write "__cxxabiv1::f" or
| >| put the definition inside the namespace.
| >
| >If the "visibility" patch does something like that, then the
| >
| It's not the visibility patch that causes this; these declarations
| were never being matched up before, either.  It just didn't matter
| before.

I think they did matter and we got many "ambiguous" declarations bug
report in the past.  At some point, someone (Roger, when working on
built-ins?) checked in a patch; I thought that patch addressed the
issue, but apparently it did not.

| I have looked at this part of the standard before, and despite the
| language that you cite, I am not convinced that in my example above
| the compiler should check that the two declarations of "f" match.  For
| example, if the first were "void f(int)" must the compiler issue an
| error?  I think that program is ill-formed, because of the language
| you cite, but I see nothing that would cause name lookup for the
| definition to find the version in the namespace.
| 
| If the committee disagrees with me, then we have a compiler bug.

I think we have a compiler bug.  But a definitive word from the
committe cannot hurt. Do you want me to raise this on -core? 

| Still, the change I made to the library is at worst harmless.

I agree with the explicit setting of the visibility attribute that
your patch made.
I'm just very worried about the overload bits.

| >  At most one function with a particular name can have C language
| >  linkage. Two declarations for a function with C language linkage
| >  with the same function name (ignoring the namespace names that
| >  qualify it) that appear in different namespace scopes refer to the
| >  same function.  | I did not attempt to fix all of the V3 headers;
| > I'm only concerned
| >| with libsupc++ at the moment.  However, similar changes should
| >| probably be made throughout V3.  Otherwise, linkage will be wrong if
| >| people #include (say) <iostream> with a non-default symbol visibility.
| >
| >I'm not convinced by your example and the rationale you gave.  What am
| >I missing?  Most certainly, in your example ::f and __cxxabiv1::f
| >refer to the same function and we should have &::f == &__cxxabiv1::f.
| >
| That's a separate issue.  You still want the visibility #pragmas in
| the V3 headers; otherwise,  for example, copies of the type info for
| iostream in user programs may not be merged with that in the library,
| if the user does:
| 
|   #pragma GCC visibility push(hidden)
|   #include <iostream>

As I said in the previous message, I agree with your patch setting
explicitly the visibility.  
My disagreement is about the "overload" bits.


-- Gaby



More information about the Libstdc++ mailing list