This is another instance of the visibility stuff being broken. This time because a function isn't emitted, but called in a way as if it was. This code: --------------------------------- struct A { virtual bool operator== (const A &a) const; virtual bool operator!= (const A &a) const; }; inline bool A::operator!= ( const A &a) const { return !(*this == a); } bool breakme(const A& newPath, A &b) { return A(newPath) != b; } --------------------------------- Compile with (4.0.2 pre): % g++ -fPIC -DPIC -I/usr/lib/qt3/include -fvisibility=hidden \ -fvisibility-inlines-hidden -Wall -O2 -o libbla.so -shared testcase.ii ld: /tmp/ccWAn1go.o: relocation R_X86_64_PC32 against `A::operator!=(A const&) const' can not be used when making a shared object; recompile with -fPIC The chain of events goes like so: 1) the operator is virtual, hence initially the call is through the vtable 2) inlining happens before that is optimized, hence the operator call is not inlined 3) the virtual call is optimized to a direct call of the operator!=, because of the explicit copy operation GCC knows the final type of the object on which it is called (namely "A"), and hence can transform the indirect to a direct call 4) the call is emitted such that it expects a local (hidden) definition of the function in the DSO (i.e. not over PLT but direct call) 5) But no copy of that function is emitted in this DSO, because the out-of-line copies of such inline function are generated only in the .o file which contains the key method of the class (the first virtual func in this case). So nothing can be made hidden, and it anyway wouldn't work even if, as there simply is nothing to call in this DSO. I believe this is a different error from all the other visibility problems like bug 19664 or bug 20218. I don't know what GCC should do here. It either needs to emit an out-of-line copy of this operator, or generate the call over a PLT. The first solution would be better, but could mean that we need to emit such out-of-line copies in every .o file where they are referenced. The second solution might even not work at all, as probably the main library (containing the key method and hence the out-of-line versions) is also compiled with -fvisibility-inlines-hidden, and hence wouldn't even export those function which a call over PLT could resolve to. So, it seems that cgraph needs to be changed somehow to emit this function if referenced. Hence CCing Honza.
-- Summary: -fvisibility-inlines-hidden broken differently Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: normal Priority: P2 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: matz at suse dot de CC: gcc-bugs at gcc dot gnu dot org,jh at suse dot cz GCC host triplet: x86_64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22592