11RC5: any EGL app (X11) crashes on exit with SIGSEGV - dlopen/atexit strikes again

Henryk Paluch <[email protected]> Sat, 4 Jul 2026 22:06:19 +0200
Newsgroups gmane.os.netbsd.general
Message-ID <[email protected]>
Hello!

Had found that specific X11 applications (fastfetch from latest pkgsrc) 
crashes on exit with SIGSEGV. It is same class of problem as reported 
earlier with Mesa applications - see 
https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=60025 but 
this time it is in different place.

How to reproduce:
* have NetBSD 11.0_RC5 installed with X11
* run application that uses libEGL - tested "fastfetch" from pkgsrc
* it will SIGSEGV on exit - because of atexit(3) call inside libEGL.so 
library loaded via dlopen(3) - which is not supported on NetBSD.


Details in GDB session:
gdb /usr/pkg/bin/fastfetch.

+break main
Breakpoint 1 at 0x2bf57: file 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/fastfetch.c, 
line 831.
+run
Starting program: /usr/pkg/bin/fastfetch

Breakpoint 1, main (argc=1, argv=0x7f7fff6f39f8) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/fastfetch.c:831
831	int main(int argc, char** argv) {
+break dlopen
Breakpoint 2 at 0x7adb3ee1b2f0: dlopen. (2 locations)
+c
Continuing.

Breakpoint 2.2, dlopen (name=name@entry=0x7f7fff6f2b70 
"nss_compat.so.0", mode=mode@entry=513) at 
/usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+break atexit
Breakpoint 3 at 0x7adb3ef1164b: file /usr/src/lib/libc/stdlib/atexit.c, 
line 265.
+c
Continuing.

Breakpoint 2.2, dlopen (name=name@entry=0x7f7fff6f2b70 "nss_nis.so.0", 
mode=mode@entry=513) at /usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 2.2, dlopen (name=name@entry=0x7f7fff6f2b70 "nss_files.so.0", 
mode=mode@entry=513) at /usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 2.2, dlopen (name=name@entry=0x7f7fff6f2b70 "nss_dns.so.0", 
mode=mode@entry=513) at /usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 3, atexit (func=0xe76dda <ffDestroyInstance>) at 
/usr/src/lib/libc/stdlib/atexit.c:265
265		return (__cxa_atexit_internal((void (*)(void *))func, NULL, NULL));
+bt
#0  atexit (func=0xe76dda <ffDestroyInstance>) at 
/usr/src/lib/libc/stdlib/atexit.c:265
#1  0x0000000000e6df7b in main (argc=1, argv=0x7f7fff6f39f8) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/fastfetch.c:833
+c
Continuing.

Breakpoint 2.2, dlopen (name=0x11b02d5 "libxcb-randr.so", mode=1) at 
/usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 2.2, dlopen (name=0x11b0f6b "libXrandr.so", mode=1) at 
/usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 2.2, dlopen (name=0x11af6b4 "libdrm.so", mode=1) at 
/usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 2.2, dlopen (name=0x114afd1 "libEGL.so", mode=1) at 
/usr/src/libexec/ld.elf_so/rtld.c:1090
1090	{
+c
Continuing.

Breakpoint 3, atexit (func=func@entry=0x7adb3ea9be60 <_eglAtExit>) at 
/usr/src/lib/libc/stdlib/atexit.c:265
265		return (__cxa_atexit_internal((void (*)(void *))func, NULL, NULL));

+bt
#0  atexit (func=func@entry=0x7adb3ea9be60 <_eglAtExit>) at 
/usr/src/lib/libc/stdlib/atexit.c:265
#1  0x00007adb3ea9bf33 in _eglAddAtExitCall 
(func=func@entry=0x7adb3eaa9f7c <_eglFiniTSD>) at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c:142
#2  0x00007adb3eaaa05a in _eglInitTSD () at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglcurrent.c:94
#3  _eglCheckedGetTSD () at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglcurrent.c:151
#4  _eglGetCurrentThread () at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglcurrent.c:170
#5  0x00007adb3ea9d7cb in _eglSetFuncName (object=0x0, objectType=12344, 
disp=0x0, funcName=0x7adb3eab0f70 <__func__.42> "eglGetProcAddress") at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglapi.c:270
#6  eglGetProcAddress (procname=0x114af30 "glGetString") at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglapi.c:2732
#7  0x0000000000e93ff1 in eglHandleData (result=0x7f7fff6f3130, 
data=0x7f7fff6f3030) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/detection/opengl/opengl_shared.c:137
#8  0x0000000000e943f8 in ffOpenGLDetectByEGL (result=0x7f7fff6f3130) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/detection/opengl/opengl_shared.c:206
#9  0x0000000001069c9b in ffDetectOpenGL (options=0x7f7fff6f3180, 
result=0x7f7fff6f3130) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/detection/opengl/opengl_linux.c:183
#10 0x0000000000e9151c in detectByOpenGL (gpus=0x7f7fff6f3290) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/detection/gpu/gpu.c:92
#11 0x0000000000e919cd in ffDetectGPU (options=0x7f7fff6f35e0, 
result=0x7f7fff6f3290) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/detection/gpu/gpu.c:197
#12 0x0000000000f12119 in ffPrintGPU (options=0x7f7fff6f35e0) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/modules/gpu/gpu.c:169
#13 0x0000000000e71a80 in parseStructureCommand (data=0x7f7fff6f3950, 
line=0x7adb3ed4527d "GPU", fn=0xe70be3 <genJsonResult>) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/common/impl/commandoption.c:183
#14 0x0000000000e72969 in ffPrintCommandOption (data=0x7f7fff6f3950) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/common/impl/commandoption.c:218
#15 0x0000000000e6d5c1 in run (data=0x7f7fff6f3950) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/fastfetch.c:764
#16 0x0000000000e6e08b in main (argc=1, argv=0x7f7fff6f39f8) at 
/home/ansible/pkgsrc/sysutils/fastfetch/work/fastfetch-2.64.2/src/fastfetch.c:854

+frame 1
#1  0x00007adb3ea9bf33 in _eglAddAtExitCall 
(func=func@entry=0x7adb3eaa9f7c <_eglFiniTSD>) at 
/usr/xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c:142
142	         atexit(_eglAtExit);

+l
137	
138	#if defined(HAVE_NOATEXIT)
139	      registered = EGL_TRUE;
140	#else
141	      if (!registered) {
142	         atexit(_eglAtExit);
143	         registered = EGL_TRUE;
144	      }
145	#endif
146	


To me it looks like error that macro HAVE_NOATEXIT is not actually 
defined (but should be) - so atexit(3) is called accidentally.

References:
* 
https://cvsweb.netbsd.org/bsdweb.cgi/xsrc/external/mit/MesaLib/dist/src/egl/main/eglglobals.c.diff?r1=1.7;r2=1.8;f=h
* https://marc.info/?t=176604443000001&r=1&w=2
* https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=60025

Best regards
   --Henryk Paluch