NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: 11.0_BETA: glxinfo crashes with Segmentation fault



On Thu, 18 Dec 2025, Henryk Paluch wrote:

When I run just "glxinfo" on any machine (both virtual and bare metal) on 11.0_BETA - it appears to work but crashes on exit with Signal 11:
[...]
[1]   Segmentation fault (core dumped) glxinfo

What is even more puzzling that I'm unable to get decent stack-trace (have installed all sets including debug).

$ gdb glxinfo glxinfo.core

Reading symbols from glxinfo...
Reading symbols from /usr/libdata/debug//usr/X11R7/bin/glxinfo.debug...
[New process 1979]
Core was generated by `glxinfo'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007b60f1d01eb3 in ?? ()
+bt
#0  0x00007b60f1d01eb3 in ?? ()
#1 0x00007b60f6b1795f in __cxa_finalize (dso=dso@entry=0x0) at /usr/src/lib/libc/stdlib/atexit.c:222 #2 0x00007b60f6b1753b in exit (status=0) at /usr/src/lib/libc/stdlib/exit.c:60 #3 0x0000000000b696d2 in ___start (cleanup=<optimized out>, ps_strings=0x7f7fff6dcfe0) at /usr/src/lib/csu/common/crt0-common.c:375
#4  0x00007f7ff77f08a8 in ?? () from /usr/libexec/ld.elf_so
#5  0x0000000000000001 in ?? ()
#6  0x00007f7fff6dc120 in ?? ()
#7  0x0000000000000000 in ?? ()
+q


Frame 0 crashing and gdb(1) not being able to find the function name for it
has the same cause: it's inside a .so file which's been unmapped by dlclose().

dlclose(), on amd64, calls _fini() in the shared object; which calls
__do_global_dtors_aux(); which calls __cxa_finalize(); this calls the handler
registered by the shared object using atexit(3). __cxa_finalize() will then
NULL the handler so that main() doesn't call it again when _it_ does the final
atexit(3) processing.

But, for some reason, __cxa_finalize() in the shared object never gets called
(and the atexit handlers don't run, of course) and main() then run the atexit
handlers in the _unmapped_ object.

Try the test code below. File a PR too!

Run the program in gdb(1), then when it crashes, compared the address against:

(gdb) info proc mappings

-RVP

---START---
==> Makefile <==
dl-atexit: dl-atexit.c libfoo.so
	cc -o dl-atexit dl-atexit.c -Wl,-rpath=$$(pwd)

libfoo.so: libfoo.c
	cc -shared -fPIC -o libfoo.so libfoo.c

run: dl-atexit
	./dl-atexit

clean:
	rm -f dl-atexit *.so *.core

==> dl-atexit.c <==
#include <dlfcn.h>
#include <stdio.h>

int
main(void)
{
	void *h = dlopen("libfoo.so", RTLD_LOCAL | RTLD_LAZY);
	if (h == NULL) {
		fprintf(stderr, "dlopen(): %s\n", dlerror());
		return 1;
	}
	void (*foo)(void) = dlsym(h, "foo");
	if (foo == NULL) {
		fprintf(stderr, "dlsym(foo): %s\n", dlerror());
		return 1;
	}
	printf("%s: calling foo()\n", __func__);
	foo();
	printf("%s: calling dlclose()\n", __func__);
	dlclose(h);
	printf("%s: exiting...\n", __func__);
	return 0;
}

==> libfoo.c <==
#include <stdio.h>
#include <stdlib.h>

static void
die(void)
{
	printf("%s: atexit handler\n", __func__);
}

void
foo(void)
{
	atexit(die);
	printf("%s: atexit handler die() @ %p\n", __func__, die);
}
---END---


Home | Main Index | Thread Index | Old Index