[gnutls-dev] Building GnuTLS 1.6.1 under Mac OS X (fwd)

Simon Josefsson simon at josefsson.org
Wed Jan 31 12:29:09 CET 2007


Rupert Kittinger-Sereinig <rks at mur.at> writes:

> Hi Simon,
>
> I think that the "compiler bug" is described in the link is actually 
> correct behaviour.
>
> the relevant snippet:
>
> MyAbstractClass MyWrapperClass::getClass()
>      {
>          static MyConcreteClass rClass;
>          return rClass;
>      }

Hi Rupert!  My C++ knowledge is too weak to pattern-match that with
the code currently in GnuTLS.  includes/gnutls/gnutlsxx.h has:

class credentials
{
    public:
        credentials(gnutls_credentials_type_t t);
#if defined(__APPLE__) || defined(__MACOS__)
	/* FIXME: This #if is due to a compile bug in Mac OS X.  Give
	   it some time and then remove this cruft.  See also
	   lib/gnutlsxx.cpp. */
	credentials( credentials& c) {
	  type = c.type;
	  set_ptr( c.ptr());
	}
#else
	credentials( credentials& c);
#endif
        virtual ~credentials() { }
        gnutls_credentials_type_t get_type() const;
    protected:
        friend class session;
        virtual void* ptr() const=0;
        virtual void set_ptr(void* ptr)=0;
        gnutls_credentials_type_t type;
};

and lib/gnutlsxx.cpp has:

#if !(defined(__APPLE__) || defined(__MACOS__))
/* FIXME: This #if is due to a compile bug in Mac OS X.  Give it some
   time and then remove this cruft.  See also
   includes/gnutls/gnutlsxx.h. */
credentials::credentials( credentials& c)
{
    this->type = c.type;
    this->set_ptr( c.ptr());
}
#endif

> Note that the return type is MyAbstractClass, but the function tries to 
> return MyConcreteClass. So the return value is implicitely converted to 
> its base class, it is "sliced". (The function being called in a 
> constructor has nothing to do with it.) For virtual functions to work, 
> the object must to acessed via pointer or reference.
>
> I looked up the mail that reported the error, and it seems that the 
> compiler fails to create an instance of the set_ptr() member function
> in the object file. In this case, I would try to uninline set_ptr(). 
> This can hardly be a performance problem and should fix the linker error :-)

I'd really appreciate your help here.  What would your recommendation
be, more specifically?  The old code is the one which is used when the
newly added #if's are not chosen.  I've seen other bug reports too,
such as this failure:

>> verify-elf: ERROR: ./usr/lib/libgnutlsxx.so.13.2.2: undefined symbol: 
>> _ZN6gnutls11credentials7set_ptrEPv

But that may actually be the same, I don't know...

/Simon



More information about the Gnutls-dev mailing list