[gst-devel] Undefined symbols

Julio M. Merino Vidal jmmv at menta.net
Tue Apr 6 03:35:22 CEST 2004


For the record, I've finally found the problem:

glib2's configure script has a check to see if RTLD_GLOBAL works or not.
This check fails under NetBSD; the reason is that the test program tries
to dlopen() libpthread, while the program is not linked against it.  Then,
it crashes, because that (loading a threaded library from a non-threaded
program) doesn't work ATM in NetBSD.

So, after that, glib2 will always ignore requests to globally bind symbols,
causing the problems exposed by gst-plugins (and probably other programs).

Thanks to everybody who helped! (and sorry, because this was not exactly
a gstreamer problem...)



On Mon, 5 Apr 2004 14:32:18 -0700
David Schleef <ds at schleef.org> wrote:

> On Mon, Apr 05, 2004 at 10:37:32PM +0200, Julio M. Merino Vidal wrote:
> > So, if I understood it correctly, here is what's going on when I do
> > 'gst-inspect esdsink':
> > 
> > 1) gst-inspect finds and opens the esdsink plugin, which is the libgstesd.so
> >    shared file.
> > 2) It searches for the plugin_init function and calls it.
> 
> Actually, it looks for gst_plugin_desc, which is a structure that
> almost always contains a pointer to a function called plugin_init,
> for historical reasons.
> 
> > 3) plugin_init from libgstesd.so does a gst_library_load to load the
> >    libgstaudio.so plugin, so that it can later call its functions.
> > 4) esdsink calls a function from libgstaudio, and should work because the
> >    library has been loaded.  But instead, it fails.
> > 
> > Am I right?
> 
> Yes.
> 
> > If so, I've prepared a simple testcase that tries to simulate
> > this behavior (w/o using any of the gst/glib code, just plain calls to
> > dlopen and other functions).  You can find it here (less than 1kb):
> > 
> > 	ftp://ftp.NetBSD.org/pub/NetBSD/misc/jmmv/plugins-tc.tar.gz
> > 
> > This fails under NetBSD, as seen below:
> 
> It also fails under Linux.  Patch below.  I'm not entirely certain
> how to interpret the POSIX spec in this case.
> 
> (Have I mentioned that I really dislike dlopen()?)
> 
> 
> 
> dave...
> 
> 
> diff -u plugins-tc/Makefile plugins-tc-ds/Makefile
> --- plugins-tc/Makefile	2004-04-05 13:25:52.000000000 -0700
> +++ plugins-tc-ds/Makefile	2004-04-05 14:15:32.000000000 -0700
> @@ -1,7 +1,7 @@
>  all: main plugin1.so plugin2.so
>  
>  main: main.c
> -	cc -o main main.c
> +	cc -o main main.c -ldl
>  
>  plugin1.so: plugin1.c
>  	cc -shared -Wl,--export-dynamic -fPIC -DPIC -o plugin1.so plugin1.c -ldl
> diff -u plugins-tc/main.c plugins-tc-ds/main.c
> --- plugins-tc/main.c	2004-04-05 13:25:40.000000000 -0700
> +++ plugins-tc-ds/main.c	2004-04-05 14:15:12.000000000 -0700
> @@ -2,7 +2,7 @@
>  #include <stdio.h>
>  
>  #if defined(__NetBSD__)
> -#define RTDL_LAZY DL_LAZY
> +#define RTLD_LAZY DL_LAZY
>  #endif
>  
>  int
> @@ -12,7 +12,7 @@
>  	void (*plugin_init)(void);
>  	void (*plugin_func)(void);
>  
> -	if ((handle = dlopen("./plugin1.so", RTDL_LAZY)) == NULL)
> +	if ((handle = dlopen("./plugin1.so", RTLD_LAZY)) == NULL)
>  		dlerror();
>  
>  	plugin_init = dlsym(handle, "plugin1_init");
> diff -u plugins-tc/plugin1.c plugins-tc-ds/plugin1.c
> --- plugins-tc/plugin1.c	2004-04-05 13:25:34.000000000 -0700
> +++ plugins-tc-ds/plugin1.c	2004-04-05 14:16:48.000000000 -0700
> @@ -2,13 +2,13 @@
>  #include <stdio.h>
>  
>  #if defined(__NetBSD__)
> -#define RTDL_LAZY DL_LAZY
> +#define RTLD_LAZY DL_LAZY
>  #endif
>  
>  void
>  plugin1_init(void)
>  {
> -	if (dlopen("./plugin2.so", RTDL_LAZY) == NULL)
> +	if (dlopen("./plugin2.so", RTLD_LAZY | RTLD_GLOBAL) == NULL)
>  		dlerror();
>  	(void)printf("plugin1 initialized\n");
>  }
> 
> 
> 
> dave...
> 


-- 
Julio M. Merino Vidal <jmmv at menta.net>
The NetBSD Project - http://www.NetBSD.org/




More information about the gstreamer-devel mailing list