Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 08 Feb 2001 11:44:06 +0200
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        ports@FreeBSD.org
Subject:   Re: Strange problems with dynamic linking of libGL.so.1 from   XFree86-4.0.2_5
Message-ID:  <3A826A65.3436847B@FreeBSD.org>
References:  <3A6C3D19.E1F56291@FreeBSD.org> <3A755D84.266A80E7@FreeBSD.org> <86vgqn7vj4.wl@cheerful.com> <3A8188ED.FC2A6241@FreeBSD.org> <200102080052.f180qxH02749@vashon.polstra.com>

next in thread | previous in thread | raw e-mail | index | archive | help
John Polstra wrote:

> In article <3A8188ED.FC2A6241@FreeBSD.org>,
> Maxim Sobolev  <sobomax@FreeBSD.ORG> wrote:
> > FUJISHIMA Satsuki wrote:
> >
> > > As libc_r does not have libc feature now, there's no reason to avoid
> > > linking -lc_r against shared libraries, I think.
> > >
> > > Index: contrib/gcc.295/config/freebsd.h
> > > ===================================================================
> > > RCS file: /home/ncvs/src/contrib/gcc.295/config/freebsd.h,v
> > > retrieving revision 1.31
> > > diff -u -r1.31 freebsd.h
> > > --- contrib/gcc.295/config/freebsd.h    2001/01/25 18:57:13     1.31
> > > +++ contrib/gcc.295/config/freebsd.h    2001/02/06 08:54:23
> > > @@ -76,10 +76,8 @@
> > >     (like the default, except no -lg, and no -p).  */
> > >  #undef  LIB_SPEC
> > >  #define LIB_SPEC "\
> > > -  %{!shared: \
> > > -    %{!pg: %{pthread:-lc_r} -lc} \
> > > -    %{pg:  %{pthread:-lc_r_p} -lc_p} \
> > > -  }"
> > > +  %{!pg: %{pthread:-lc_r} %{!shared:-lc}} \
> > > +  %{pg:  %{pthread:-lc_r_p} %{!shared:-lc_p}}"
> > >
> > >
> > >  /************************[  Target stuff  ]***********************************/
> >
> > David, John what do you think about this patch?
>
> I think it would be a mistake to implement this.
>
> If the patch above were used then the shared library would contain
> a dependency on a specific version of libc_r -- say libc_r.so.4.
> But that version of libc_r is intimately tied to a specific version
> of libc.  Now if the application were run on a later version of
> FreeBSD, it might get a newer libc which would be incompatible with
> libc_r.so.4.

Why not link against both libc_r and libc? Then the library would contain dependency to
the particular libc_r/libc pair and all should be OK.

#define LIB_SPEC "\
-  %{!shared: \
-    %{!pg: %{pthread:-lc_r} -lc} \
-    %{pg:  %{pthread:-lc_r_p} -lc_p} \
-  }"
+  %{!pg: %{pthread:-lc_r} -lc} \
+  %{pg:  %{pthread:-lc_r_p} -lc_p}"

> I think we need to view both libc and libc_r as basic low-level
> system libraries which are to be linked once and only once into
> the application.  Other shared libraries should not have explicit
> dependencies on them.  If an application uses a library that requires
> threads then the application itself should be linked with -lc_r or
> -pthread.

But that makes dlopen()ing a shared module linked against libc_r by the program that not
linked against libc_r impossible. Also this makes life harder when linking against such
libraries, for example if the shared library (GL in my example) requires libc_r then all
programs that want to link against it should explicitly use -pthread or -lc_r.

-Maxim



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A826A65.3436847B>