gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:26:47 25 4
gpt4 key购买 nike

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

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

并且 lib_extra_function 被添加到库的版本 2 中。

如果使用 lib_extra_function 的应用程序是在安装了库版本 2 的系统上构建的,然后在仅提供版本 1 的系统上运行,“符号查找错误:./main : undefined symbol: lib_extra_function"一旦调用 lib_extra_function 就会引发动态链接器错误。

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

voif f()
{
if(lib_runtime_version() >= 2) {
lib_extra_function();
} else {
// try some workaround
}
}

现在,是否有任何标准强制要求这种行为?如果不是,它是否特定于 Linux?其他系统(OSX、BSD)中的链接器如何运行?

最佳答案

Now, is this behavior mandated by any standard?

没有。

If not, is it specific to Linux?

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

通常你应该避免这样做:

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

有几个原因:

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

相反,如果可选地提供了一个函数,则使用 dlsym 来查明它是否可用:

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

关于c - 使用 C 在运行时处理符号查找错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23321483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com