Date: 13 Mar 2003 18:15:37 -0500 From: Joe Marcus Clarke <marcus@marcuscom.com> To: Marcel Moolenaar <marcel@xcllnt.net> Cc: hackers@FreeBSD.ORG Subject: Re: Question on gcc linker and -pthread Message-ID: <1047597337.84063.43.camel@gyros> In-Reply-To: <20030313230538.GA58315@ns1.xcllnt.net> References: <1047586732.84063.10.camel@gyros> <20030313230538.GA58315@ns1.xcllnt.net>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
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
[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (FreeBSD)
iD8DBQA+cREZb2iPiv4Uz4cRAnrhAKCPw9rlrNxrwqeR5goTHPi7XPTAZACfYtM5
NBafwYmV7++y9d7RuX92rcY=
=44zu
-----END PGP SIGNATURE-----
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1047597337.84063.43.camel>
