On Thu, May 06, 2021 at 06:23:08PM -0700, Anindya Mukherjee wrote:
> On Thu, May 06, 2021 at 08:00:56AM -0600, Todd C. Miller wrote:
> > On Thu, 06 May 2021 09:32:28 +0200, Sebastien Marie wrote:
> > 
> > > We already take care of such situation with __cxa_thread_atexit_impl
> > > (in libc/stdlib/thread_atexit.c), by keeping an additionnal reference
> > > on object loaded (it makes ld.so aware that it is still used and so
> > > dlclose() doesn't unload it).
> > >
> > > I used the same idiom for pthread_key_create() and used dlctl(3) in
> > > the same way with the destructor address.
> > 
> > This will set STAT_NODELETE so the DSO will never really get unloaded.
> > That's not a problem for atexit() since the process is headed for
> > the exit.
> > 
> > I'm less sure about using it here since we don't have a way to
> > unreference the DSO upon pthread_key_delete().
> > 
> >  - todd
> 
> I did a quick investigation on my Linux machine and there mpv seems to
> be using libEGL_mesa.so instead of iris_dri.so. In this case I am not
> seeing a call to pthread_key_create at the start of video playback
> (there are some other places where pthread_key_create is called from but
> they don't cause a problem). So, not sure what happens in Linux when
> iris_dri.so is used.

libEGL_mesa.so seems to be used when mesa is built with 'with_glvnd'
option. glvnd is "vendor-neutral libGL" :
  https://gitlab.freedesktop.org/glvnd/libglvnd


> However, the Linux implementation of
> pthread_key_create seems to also not increment the refcount when the
> destructor is set so I don't yet see how it's solved there, assuming
> iris_dri.so behaves identically.

glibc seems to have the same problem with pthread_key_create():
  https://sourceware.org/bugzilla/show_bug.cgi?id=21032
and the bugreport reference a simple poc at
  https://github.com/Aaron1011/pthread_dlopen


-- 
Sebastien Marie

Reply via email to