linux alsa-lib snd_pcm_open函数源码分析(四)-1.2.2 snd_dlsym

时间:2024-11-18 10:43:30

对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的插件系统。
露出了插件系统的冰山一角。

后续的文章会继续对插件的加载做详细分析