使用C在运行时处理符号查找错误

时间:2014-04-27 09:10:19

标签: c linux linker undefined-reference

假设我有一个导出三个函数的动态库:

void lib_function(void);
void lib_extra_function(void);
int  lib_runtime_version(int v);

并且在库的第2版中添加了lib_extra_function

如果使用lib_extra_function的应用程序构建在安装了库版本2的系统上,然后在仅提供版本1的系统上运行,则会引发“symbol lookup error: ./main: undefined symbol: lib_extra_function”动态链接器错误{ {1}}被调用。

但是,如果应用程序尝试使用库提供的版本信息并有条件地调用lib_extra_function,则不会引发错误,即使lib_extra_function仍未定义。

lib_extra_function

现在,这种行为是否符合任何标准?如果没有,它是否特定于Linux?其他系统中的连接器(OSX,BSD)如何表现?

1 个答案:

答案 0 :(得分:3)

  

现在,这种行为是否符合任何标准?

没有

  

如果没有,它是否特定于Linux?

没有。这是 lazy 运行时符号解析的系统所支持的行为。

一般来说,你应该避免这样做:

if(lib_runtime_version() >= 2) {
    lib_extra_function();

有几个原因:

  • 在执行急切符号解析的系统上根本不起作用,
  • 如果最终用户设置LD_BIND_NOW(这是上述特例),它将会爆炸,
  • 违反了DRY principle

相反,如果选择提供某个功能,请使用dlsym查看其是否可用:

p_extra = dlsym(..., "lib_extra_function");
if (p_extra != NULL) {
    ....