Change to DSO-linking semantics of the compiler
Jakub Jelinek
jakub at redhat.com
Wed Jan 13 17:23:22 UTC 2010
On Wed, Jan 13, 2010 at 12:10:06PM -0500, Adam Jackson wrote:
> On Wed, 2010-01-13 at 16:24 +0000, Nick Clifton wrote:
> > >> $ g++ -o string string.o -ldb
> > >> /usr/bin/ld.bfd: string.11980.test: undefined reference to symbol
> > >> 'pthread_cancel@@GLIBC_2.2.5'
> > >> /usr/bin/ld.bfd: note: 'pthread_cancel@@GLIBC_2.2.5' is defined in DSO
> > >> /lib64/libpthread.so.0 so try adding it to the linker command line
> >
> > But, you have added an explicit dependency upon libdb to your executable
> > by mentioning -ldb on the gcc command line. Therefore libdb will be
> > loaded at execution start-up. But libdb has a dependency upon
> > libpthread, so that library will also be loaded at execution start-up.
> > Hence when you run 'string' the pthread_cancel symbol will be resolved
> > and so 'string' really does now have a resolved reference to
> > pthread_cancel. Hence the linker is correct in complaining that you
> > have a reference to a symbol that is defined in a library which have not
> > included on the linker command line.
> >
> > At least that is how I see it at the moment.
>
> This is the whole point of weak references though. They go to 0 with no
> error if they are not defined in the runtime image. In other words,
> they're explicitly _not_ required; the object with the weak reference is
> saying "I know how to behave even if this symbol isn't defined".
Yeah, string will work well even when -ldb stops being linked against
-lpthread, therefore forcing it to require -lpthread is a bad idea.
And it will even pessimize it. The whole point why gthr.h uses these weak
references is that compiled code is thread safe when -lpthread is loaded,
but does not require it and is actually quite cheaper if -lpthread is not
loaded.
Jakub
More information about the devel
mailing list