On Sun, 2 Dec 2001, Kyle Centers wrote:

> Hi!
>
> I've been working with an xmms plugin the last few days, and I seem to
> have found a bug in libasound.so.
>
> Calling snd_pcm_open(...) in a program compiled as an executable
> binary works fine (ie it returns no errors, and doesn't die). But if
> compiled as part of a dynamic library, say an xmms output plugin, it
> dies, with the following error messages:
>
> ALSA lib dlmisc.c:99:(snd_dlsym_verify) unable to verify version for
> symbol and_config_hook_load
>
> ALSA lib conf.c:2287:(snd_config_hooks_call) symbol
> snd_config_hook_load is not defined inside (null)
>
> I am still working on the second one, but I found a solution to the
> first one.
>
> The problem, is in dlmisc.c at line 2278:
>  h = snd_dlopen(lib, RTLD_NOW);
>
> I'm not really sure why, but *lib is null at this point. The result is
> that when dlopen is called, inside snd_dlopen, the filename is null,
> which dlopen takes to mean the main program (according to the man
> page). With a standard binary executable, that's fine,
> because-actually, I'm not sure why that's ok. But I would venture to
> guess it has to do with libasound getting loaded with the binary. But
> when compiling a dynamic library, the main program is something else -
> in this case xmms, which knows nothing about libasound (all the alsa
> stuff in inside the plugin).
>
> I did managed to fix the problem, but my solution is a hack. in the
> call to snd_dlopen, I replaced lib with "/usr/lib/libasound.so",
> explicitly telling it to load the asound library. Now, the error is
> gone (the first one. I havent' gotten to the second, although I
> suspect it is similar). Anyone know how to fix ths properly?

Yes, the xmms engine should add the RTLD_GLOBAL flag to dlopen() call for
external plugins:

/* If the following bit is set in the MODE argument to `dlopen',
   the symbols of the loaded object and its dependencies are made
   visible as if the object were linked directly into the program.  */
#define RTLD_GLOBAL     0x00100

I'm sorry for this, but it really doesn't make any sense to create
another instance of dynamic library when symbol can be already
resolved using existing instances.

                                                Jaroslav

-----
Jaroslav Kysela <[EMAIL PROTECTED]>
SuSE Linux    http://www.suse.com
ALSA Project  http://www.alsa-project.org


_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to