如何实现符号版本控制

时间:2011-02-16 10:39:05

标签: linker versioning shared-libraries dlopen name-mangling

我想实现以下目标:

我有一个库的多个版本。我使用dlopen()动态加载最新版本的库。然后我想看看该版本中是否存在特定函数(以及类似的返回类型和参数列表)。如果是,那么打开它,否则回到以前的版本检查相同

我在“版本脚本”上看过一些帖子但是无法使用它。另外我认为搜索符号表不是解决方案,因为它只检查那里的函数名称。

1 个答案:

答案 0 :(得分:6)

符号版本控制的良好解释是here。您需要GNU扩展中的 dlvsym()函数来按名称和版本搜索符号:

#define _GNU_SOURCE
#include <dlfcn.h>
void *dlvsym(void *handle, char *symbol, char *version);

函数dlvsym()与dlsym()的作用相同,但是将版本字符串作为附加参数。 注意: C ++符号名称应传递给包含参数列表的mangled form中的dlvsym()。不幸的是,GCC错位名称(与MSVC不同)不包含返回类型。

有关详细信息,请参阅"dlopen(3) - Linux man page"