Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux上对共享库的依赖性较弱大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我想让我的可执行文件“可选地依赖”其他共享对象.因此,如果DSO不存在,它将能够在没有某些符号的情况下运行.我可以使用dlopen / dlsym调用来实现这一点,但我必须手动加载每个符号并为它们添加包装器,如下所示:void *my_lib = dlopen('my_lib.so', RTLD_LAZY); if (!my_lib) { //

我想让我的可执行文件“可选地依赖”其他共享对象.因此,如果DSO不存在,它将能够在没有某些符号的情况下运行.

我可以使用dlopen / dlsym调用来实现这一点,但我必须手动加载每个符号并为它们添加包装器,如下所示:

void *my_lib = dlopen("my_lib.so",RTLD_LAZY);  
if (!my_lib)  {
    // ok,I promise not to touch my_lib symbols
} else {
    my_foo_ptr = dlsym(my_lib,"my_foo");
    my_bar_ptr = dlsym(my_lib,"my_bar");
}

... my_foo(...) {
    assert(my_foo_ptr);
    return (*my_foo_ptr)(...);
}

... my_bar(...) {
    assert(my_foo_ptr);
    return (*my_bar_ptr)(...);
}

这是一个愚蠢的代码,它直接依赖于“my_lib.so”ABI,这意味着每次库更新时我都必须更新它.

我正在寻找一些方法来制作ld.so为我这样做.所以理想的是:

void *my_lib = dlopen("my_lib.so",/* bring me all my symbols */);  
if (!my_lib)  {
    // ok,I promise not to touch my_lib symbols
} else {
    // ok,I can directly call symbols from my_lib.so
    my_foo();
    my_bar();
}

但是有两个问题:
1.在app链接阶段如何处理这些符号?如果我显式链接到my_lib.so,应用程序将严格依赖于它,因此无法在没有my_lib.so的情况下启动.如果没有,ld会抱怨未定义的符号.
2.如何强制dlopen()使我的应用程序可以使用所有my_lib.so符号?

Upd:我意识到明确链接共享库而不将其标记为DT_NEEDED可以解决问题.但我不知道如何让ld做到这一点.

最佳答案
编写一个理解程序需求的模块可能更为明智,这个模块可以最大限度地减少程序与该库之间的交互,然后将该代码链接到您的库.想象一下像音乐播放器这样的东西:而不是为每种音频格式做这种舞蹈,创建一个简单的界面,然后为每种音频格式创建一个单独编译的模块,并让每个模块链接到适当的支持库.这样做的好处是,您可以确保模块都具有相同的符号,并且处理它们更简单:加载模块时,使用函数指针创建结构,然后在调用模块时,只检查结构是否为空并且调用函数指针(通过宏可能是明智的).这也意味着您可以轻松添加功能的不同版本(如果需要).

大佬总结

以上是大佬教程为你收集整理的Linux上对共享库的依赖性较弱全部内容,希望文章能够帮你解决Linux上对共享库的依赖性较弱所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: