我有一些 C++ 代码正在打开“libm.so”库:
dlopen("libm.so", RTLD_GLOBAL | RTLD_NOW);
在 RHEL7 下,这是一个符号链接:
libm.so -> libm.so.6
在 RHEL9 下,现在这是一个链接器脚本:
> cat libm.so
/* GNU ld script
*/
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libm.so.6 AS_NEEDED ( /lib64/libmvec.so.1 ) )
这意味着 dlopen() 调用失败,因为它无法解析此链接描述文件。
我发现的这个问题的唯一解决方案是将库名称硬编码为
dlopen("libm.so.6", ...")
。我要么寻找一种方法来查询数字“6”,以便这不会在源代码中硬编码,要么在构建时评估链接器脚本以找到所需的目标。
我要么寻找一种方法来查询数字“6”,这样就不会在源代码中硬编码
在 Linux(或其他基于 GLIBC 的系统)上硬编码这个数字没有任何问题。它在过去 20 年里没有改变,而且不太可能改变。
或者在构建时评估链接器脚本以找到所需的目标。
您可以使用
grep -q 'libm\.so\.6' $(gcc --print-file-name=libm.so)
来测试 libm.so.6
是否是 still 正确的版本,如果不是,则会出错。
附注
g++
默认与 -lm
链接;您的 dlopen
很可能没有任何有用的目的。