1

在我的开源项目Artha中,我使用libnotify向用户显示被动桌面通知。

不是静态链接 libnotify,而是在运行时通过 查找共享对象 (.so) 文件dlload,如果在目标机器上可用,Artha 在其 GUI 中公开通知功能。在应用程序上。开始,dlload使用文件名参数 aslibnotify.so.1进行调用,如果它返回一个非空指针,则该功能被公开。

这个模型的一个反复出现的问题是,每次库的版本号被碰撞时,Artha 的代码都需要更新,目前libnotify.so.4是最新的出现这种情况的代码。

是否有 linux 系统调用(无论应用程序在哪个发行版上运行),它可以告诉我特定库的共享对象在运行时是否可用?我知道存在通过从 1 到 10 来枚举库的蛮力选项,我发现解决方案丑陋且不雅。

此外,如果这可以通过autoconf解决,那么该解决方案也很受欢迎,即在构建时,基于目标机器,生成的 configure.h 应该具有可以传递给 .so 的正确名称dlload

PS:我认为好的发行版遵循创建链接的风格,libnotify.so.x以便程序员可以做dlload("libnotify.so", RTLD_LAZY)并且加载正确的版本号 .so ;不幸的是,并非所有发行版都遵循这一点,包括 Ubuntu。

4

1 回答 1

1

答案是:你没有。

dlopen()并非旨在处理此类事情,并且尝试加载您在系统上找到的任何转换只是因为它恰好具有您需要的符号并不是一个好方法。

不同的 soname 有不同的 ABI,不同的 ABI 意味着您可能正在调用相同的符号名称,但需要不同的参数集(或不同的大小),这将导致非常难以调试的崩溃或错误行为。

您应该了解共享对象版本的工作原理以及ABI 是什么

libfoo.so链接用于链接编辑器 ( ld),因此通常与-devel软件包一起安装;它也很可能不是一个链接,而是一个带有链接器脚本的文本文件,通常是为了避免你正在尝试做的事情。

于 2014-07-23T09:14:07.053 回答