【问题标题】:How to achieve symbol versioning如何实现符号版本控制
【发布时间】:2011-06-28 06:33:00
【问题描述】:
我想实现以下目标:
我有多个版本的库。我使用 dlopen() 动态加载最新版本的库。然后我想查看该版本中是否存在特定函数(以及类似的返回类型和参数列表)。如果是,则打开它,否则回退到以前的版本进行检查。
我看过一些关于“版本脚本”的帖子,但我无法使用它。另外我认为搜索符号表不是一个解决方案,因为它只检查那里的函数名。
【问题讨论】:
标签:
linker
versioning
shared-libraries
dlopen
name-mangling
【解决方案1】:
符号版本控制的很好解释是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"。