On Thu, 2003-03-13 at 18:05, Marcel Moolenaar wrote: > On Thu, Mar 13, 2003 at 03:18:52PM -0500, Joe Marcus Clarke wrote: > > I've noticed something I think is strange with gcc, the -shared flag, > > and -pthread on -STABLE. I'm hoping someone can enlighten me as to why > > this happens or if it's a bug. If I compile something with the > > following command, I do not see libc_r.so linked in the resulting > > object: > > > > cc -shared -pthread -o xxx.so xxx.c > > > > However, if I replace -pthread with -lc_r, it works. Also, if I change > > the command to: > > > > cc -Wl,-shared -pthread -o xxx.so xxx.c > > > > I also see libc_r.so linked in. Is this expected behavior? libtool > > seems to like the former -shared syntax which is causing some problems > > with some GTK themes. Thanks. > > The -shared option tells the compiler driver that you're trying to > create a shared object. In that case -lc_r is not added to the link > line. Adding -lc_r explicitly is dangerous, because now the linker > will construct a shared object that has code linked in from an > archive library that has not been compiled with PIC. Consequently, > some architectures (eg ia64) may barf when you try to link against > this shared object because it may contain invalid relocations. > > Using -Wl,-shared tricks the compiler driver in thinking you are > creating an executable. It will therefore make sure dependencies > are correct by adding -lc_r on the link line. You tell the linker > however that you're creating a shared object, but now it also has > -lc_r explicitly. Again, this can result in a bad shared object.
Thanks for the explanation. After I sent the email, I looked at the
FreeBSD spec header for GCC. I saw that -lc_r is only passed to the
linker if -shared is not specified.
I'm still a bit confused because for ports, ${PTHREAD_LIBS} is set to
-lc_r in -CURRENT which will result in shared objects having a libc_r.so
link. However, in -STABLE, ${PTHREAD_LIBS} is set to -pthread. If one
specifies -pthread in -CURRENT, they will get the -STABLE linking
behavior. So, all -CURRENT users won't see the undefined symbol problem
I'm seeing in -STABLE. Is this inconsistency by design? Since ia64 is
a -CURRENT only architecture, your explanation makes me think using
-lc_r explicitly in -CURRENT is still a bad idea.
Joe
>
> I don't think there's a bug.
--
PGP Key : http://www.marcuscom.com/pgp.asc
signature.asc
Description: This is a digitally signed message part

