【问题标题】:Check if a symbol is available, to prevent dlopen lazy binding failure检查符号是否可用,以防止 dlopen 延迟绑定失败
【发布时间】:2017-05-24 06:00:38
【问题描述】:
我使用dlopen() 加载.so 库。库调用myfunc()。该功能在加载程序的1.0 版本中可用。所以调用myfunc() 有效。但是在0.9 版本中,没有myfunc(),并且libdl 显示有关延迟绑定失败的错误。
我可以在so. 库中检查myfunc() 是否存在,然后才调用该函数吗?该函数不是强制性的,并不重要,如果 loader 的版本为0.9 或更低版本,我可以安全地跳过调用它。
【问题讨论】:
标签:
symbols
dlopen
dynamic-library
undefined-symbol
【解决方案1】:
在和ELF平台上,你可以使用weak unresolved reference来达到你的目的:
// libfoo.c
extern int myfunc() __attribute__((weak));
int foo()
{
if (&myfunc == NULL) {
printf("myfunc is not defined\n");
} else {
// myfunc is available, call it
printf ("myfunc returns %d\n", myfunc());
}
}