假设我有一个导出三个函数的动态库:
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)如何表现?
答案 0 :(得分:3)
现在,这种行为是否符合任何标准?
没有
如果没有,它是否特定于Linux?
没有。这是 lazy 运行时符号解析的系统所支持的行为。
一般来说,你应该避免这样做:
if(lib_runtime_version() >= 2) {
lib_extra_function();
有几个原因:
LD_BIND_NOW
(这是上述特例),它将会爆炸,相反,如果选择提供某个功能,请使用dlsym
查看其是否可用:
p_extra = dlsym(..., "lib_extra_function");
if (p_extra != NULL) {
....