]> git.alsa-project.org Git - alsa-lib.git/commitdiff
snd_dlsym: only do versioning checks if built --with-versioning
authorJohn Spencer <maillist-alsa@barfooze.de>
Sat, 15 Nov 2014 12:41:00 +0000 (13:41 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sun, 16 Nov 2014 08:41:17 +0000 (09:41 +0100)
a combination of some of the following garbage collecting LD/CFLAGS
-Os -g0 -fdata-sections -ffunction-sections -s -Wl,--gc-sections
-fno-unwind-tables -fno-asynchronous-unwind-tables
causes the symbol versioning marker symbols to be removed from BSS
since they're otherwise unreferenced. this causes dlsym failing to
find them which results in runtime breakage:

$ alsamixer
ALSA lib dlmisc.c:142:(snd_dlsym_verify) unable to verify version for symbol snd_config_hook_load
ALSA lib conf.c:3328:(snd_config_hooks_call) symbol snd_config_hook_load is not defined inside (null)
ALSA lib conf.c:3788:(snd_config_update_r) hooks failed, removing configuration
cannot open mixer: No such device or address

correct DSO:
$ objdump -T libasound.so.2.strip | grep _snd_config_hook_load_dlsym_config_hook_001
001196bc g    DO .bss   00000001 _snd_config_hook_load_dlsym_config_hook_001

incorrect DSO:
$ objdump -T libs/libasound.so.2 | grep _snd_config_hook_load_dlsym_config_hook_001
00000000 g    DO *ABS*  00000001 _snd_config_hook_load_dlsym_config_hook_001

since alsa was built with --without-versioning, doing those versioning
checks at all is unnecessary and harmful and thus now disabled in this case.

Signed-off-by: John Spencer <maillist-alsa@barfooze.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/dlmisc.c

index 4b8a02cd89f63b7207da0c825564045a4c76717f..62f7047149ff75881019668895099760918f3b20 100644 (file)
@@ -177,11 +177,13 @@ void *snd_dlsym(void *handle, const char *name, const char *version)
        }
 #endif
 #ifdef HAVE_LIBDL
+#ifdef VERSIONED_SYMBOLS
        if (version) {
                err = snd_dlsym_verify(handle, name, version);
                if (err < 0)
                        return NULL;
        }
+#endif
        return dlsym(handle, name);
 #else
        return NULL;