On Sat, May 08, 2021 at 07:26:32AM +0200, Sebastien Marie wrote: > 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 >
This is very interesting! Since Arch Linux's version of Mesa is indeed build with glvnd enabled: https://github.com/archlinux/svntogit-packages/blob/packages/mesa/trunk/PKGBUILD#L53 it avoids this issue. So, it seems the main problem is in iris_dri.so. > > > 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 > Thanks! I found some of these as well while searching for related issues on Linux. So it seems this is not OpenBSD specific, as I suspected. > > -- > Sebastien Marie Regards, Anindya