对C库dlsym的包装,根据符号查找函数
void *snd_dlsym(void *handle, const char *name, const char *version)
{
int err;
#ifndef PIC
if (handle == &snd_dlsym_start) {
/* it's the funny part: */
/* we are looking for a symbol in a static library */
struct snd_dlsym_link *link = snd_dlsym_start;
while (link) {
if (!strcmp(name, link->dlsym_name))
return (void *)link->dlsym_ptr;
link = link->next;
}
return NULL;
}
#endif
#ifdef HAVE_LIBDL
#ifdef VERSIONED_SYMBOLS
//如果定义了版本要验证版本
if (version) {
err = snd_dlsym_verify(handle, name, version);
if (err < 0)
return NULL;
}
#endif
//最终通过dlsym返回函数句柄
return dlsym(handle, name);
#else
return NULL;
#endif
}
函数通过配置文件拼接并查找到_snd_pcm_plug_open函数,之后执行,
看似一个普通的函数执行,实际是个非常重要的函数入口,从此打开的alsa的插件系统。
露出了插件系统的冰山一角。
后续的文章会继续对插件的加载做详细分析