more symbol binding problems
Sean McNeil
sean at mcneil.com
Mon Jun 7 17:02:59 GMT 2004
On Mon, 2004-06-07 at 09:50, Daniel Eischen wrote:
> On Mon, 7 Jun 2004, Sean McNeil wrote:
>
> > On Mon, 2004-06-07 at 06:25, Daniel Eischen wrote:
> > >
> > > It doesn't work here and I don't believe ever has since libc_r
> > > was split from libc.
> >
> > Many years ago, I was involved with pthreads for Linux. I helped them
> > get things straight using the weak reference trick. I don't remember
> > where I picked it up from, but I it was real slick how they were used to
> > override functions in libc by having stronger references in the
> > threading lib. libc_r and folks don't use this trick anymore? Odd.
> >
> > But the questions for today:
> >
> > Say you have an application that depends on libraries A, B, C, and
> > libc. It then uses dlopen to load D. D depends on E, F, libpthread,
> > and B. Is B considered to be in D's DAG?
> >
> > If so, then when a function within B calls a function that hasn't been
> > bound yet in libpthread then it should bind to the threaded version.
> > There are good arguments either way. IMHO, rtld is acting as though the
> > answer is no and I want it to behave as yes.
>
> I don't know what a DAG is, but I believe I've already explained
> the problem. We don't litter our thread libraries with strong
> references for every thread interface. You must make sure
> references are resolved correctly by linking ordering.
>
> > There is strong evidence to support this. The libreadline trace from
> > bash and the php4 trace from httpd both only make sense if the lazy
> > symbol resolver is not ending up with the threaded version of some call
> > (sigaction and select respectively).
> >
> > Second, to save me some time can someone outline the symbol name
> > mechanism used by libpthread? Here is what I expect:
> >
> > libc provides a sigaction function through a weak reference that points
> > to some internal name (like __sigaction). libpthread provides a strong
> > reference to sigaction thus, when loaded, overrides usage of sigaction.
> > This should happen irregardless of whether libpthread is in the DAG for
> > the caller (IMHO), but I'm sure there are other opinions.
>
> There are no strong references (other than a handful that are
> needed by rtld). We mandate that you link things in the proper
> order.
Then I submit to you that signals are broken in KSE/libpthread at the
very least. libpthread makes the assumption that it will take over
principle control of sigaction and friends. So, if I link with "-lc
-lpthread" I should use the versions in libc and it should work. If I
link with "-lpthread -lc" then I should use the versions in libpthread.
Yet constructors for libpthread will install hooks for signals that
undermines the proper behavior of the original sigaction function.
I also submit to you that FreeBSD is not behaving like any other UNIX
implementation that I have worked with if this is the case. pthread
functions should have precedence over their libc counterparts regardless
of link order.
More information about the freebsd-amd64
mailing list