pkgsrc-Bugs archive

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

Re: pkg/57445: firefox crashes on startup



The following reply was made to PR pkg/57445; it has been noted by GNATS.

From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: Martin Husemann <martin%NetBSD.org@localhost>
Cc: gnats-bugs%NetBSD.org@localhost, joerg%NetBSD.org@localhost, tnn%NetBSD.org@localhost
Subject: Re: pkg/57445: firefox crashes on startup
Date: Thu, 1 Jun 2023 12:46:25 +0000

 Here's a reproducer.  I think I got everything relevant here, but the
 excerpts I asked martin for don't tell me the exact order or arguments
 of dlopens that firefox issues, so I guessed.
 
 So, I think the massive kludge of `just define the symbol in multiple
 libraries without extern' probably never actually worked, but maybe
 did paper over the symptoms in the past.
 
 
 $ head -40 glapi.c GL.c swrast_dri.c firefox.c
 =3D=3D> glapi.c <=3D=3D
 __thread int _glapi_tls_Context __attribute__((tls_model("initial-exec"))) =
 =3D 0;
 
 int *glapi_context(void);
 int *
 glapi_context(void)
 {
 	return &_glapi_tls_Context;
 }
 
 =3D=3D> GL.c <=3D=3D
 __thread int _glapi_tls_Context __attribute__((tls_model("initial-exec"))) =
 =3D 0;
 
 int *GL_context(void);
 int *
 GL_context(void)
 {
 	return &_glapi_tls_Context;
 }
 
 =3D=3D> swrast_dri.c <=3D=3D
 extern __thread int _glapi_tls_Context __attribute__((tls_model("initial-ex=
 ec")));
 
 int *dri_context(void);
 int *
 dri_context(void)
 {
 	return &_glapi_tls_Context;
 }
 
 =3D=3D> firefox.c <=3D=3D
 #include <dlfcn.h>
 #include <err.h>
 #include <stdio.h>
 
 int *GL_context(void);
 int *glapi_context(void);
 int *dri_context(void);
 
 #define	DL(x)	do							      \
 {									      \
 	if ((x) =3D=3D NULL)						      \
 		errx(1, "%s: %s", #x, dlerror());			      \
 } while (0)
 
 int
 main(void)
 {
 	void *GL =3D NULL;
 	void *dri =3D NULL;
 	int *(*GL_context)(void);
 	int *(*GL_glapi_context)(void);
 	int *(*dri_context)(void);
 	int *(*dri_glapi_context)(void);
 
 	DL(GL =3D dlopen("./libGL.so", 0));
 	DL(dri =3D dlopen("./swrast_dri.so", 0));
 
 	DL(GL_context =3D dlsym(GL, "GL_context"));
 	DL(GL_glapi_context =3D dlsym(GL, "glapi_context"));
 	DL(dri_context =3D dlsym(dri, "dri_context"));
 	DL(dri_glapi_context =3D dlsym(dri, "glapi_context"));
 
 	printf("GL %p\n", GL_context());
 	printf("GL glapi %p\n", GL_glapi_context());
 	printf("dri %p\n", dri_context());
 	printf("dri glapi %p\n", dri_glapi_context());
 	fflush(stdout);
 	return ferror(stdout);
 }
 $ make
 cc -fPIC   -c firefox.c
 cc -o firefox firefox.o -L. -Wl,-R$(pwd)
 cc -fPIC   -c GL.c
 cc -fPIC   -c glapi.c
 cc -o libglapi.so -shared glapi.o -L. -Wl,-R$(pwd)
 cc -o libGL.so -shared GL.o -L. -Wl,-R$(pwd) -lglapi
 cc -fPIC   -c swrast_dri.c
 cc -o swrast_dri.so -shared swrast_dri.o -L. -Wl,-R$(pwd) -lglapi
 $ ./firefox
 GL 0x794c549be044
 GL glapi 0x794c549be044
 dri 0x794c549bf850
 dri glapi 0x794c549be044
 $ LD_PRELOAD=3D$(pwd)/libGL.so ./firefox
 GL 0x74f852ef885c
 GL glapi 0x74f852ef885c
 dri 0x74f852ef885c
 dri glapi 0x74f852ef885c
 $=20
 


Home | Main Index | Thread Index | Old Index