Message ID | 54674D5A.3010500@barfooze.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
At Sat, 15 Nov 2014 13:55:54 +0100, John Spencer wrote: > > From 291553a0132936611d48f41e924601dff8941537 Mon Sep 17 00:00:00 2001 > From: John Spencer <maillist-alsa@barfooze.de> > Date: Sat, 15 Nov 2014 13:41:00 +0100 > Subject: [PATCH] snd_dlsym: only do versioning checks if built > --with-versioning > > 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> Thanks, applied. Takashi
diff --git a/src/dlmisc.c b/src/dlmisc.c index 4b8a02c..62f7047 100644 --- a/src/dlmisc.c +++ b/src/dlmisc.c @@ -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;