我遇到了符号解析错误的问题。我的主程序使用 dlopen 加载共享库,并使用 dlsym 加载其中的符号。程序和库都是用 C 编写的。
库代码
int a(int b)
{
return b+1;
}
int c(int d)
{
return a(d)+1;
}
为了使其在64位机器上工作,编译时将-fPIC传递给gcc。
该计划是:
#include <dlfcn.h>
#include <stdio.h>
int (*a)(int b);
int (*c)(int d);
int main()
{
void* lib=dlopen("./libtest.so",RTLD_LAZY);
a=dlsym(lib,"a");
c=dlsym(lib,"c");
int d = c(6);
int b = a(5);
printf("b is %d d is %d\n",b,d);
return 0;
}
如果程序未使用 -fPIC 编译,则一切运行正常,但当使用 -fPIC 编译程序时,则会因分段错误而崩溃。调查发现,崩溃是由于符号a解析错误造成的。崩溃发生在调用 a 时,无论是从库还是主程序(后者是通过注释掉主程序中调用 c() 的行获得的)。
调用c()本身不会出现问题,可能是因为c()不是库本身内部调用的,而a()既是库内部使用的函数,又是库的API函数。
一个简单的解决方法是在编译程序时不使用 -fPIC。但这并不总是可能的,例如当主程序的代码必须位于共享库本身中时。另一个解决方法是将函数 a 的指针重命名为其他名称。但我找不到任何真正的解决方案。
将 RTLD_LAZY 替换为 RTLD_NOW 没有帮助。