查询链接描述文件的目标?

问题描述 投票:0回答:1

我有一些 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”,以便这不会在源代码中硬编码,要么在构建时评估链接器脚本以找到所需的目标。

c++ gnu ld dlopen linker-scripts
1个回答
0
投票

我要么寻找一种方法来查询数字“6”,这样就不会在源代码中硬编码

在 Linux(或其他基于 GLIBC 的系统)上硬编码这个数字没有任何问题。它在过去 20 年里没有改变,而且不太可能改变。

或者在构建时评估链接器脚本以找到所需的目标。

您可以使用

grep -q 'libm\.so\.6' $(gcc --print-file-name=libm.so)
来测试
libm.so.6
是否是 still 正确的版本,如果不是,则会出错。

附注

g++
默认与
-lm
链接;您的
dlopen
很可能没有任何有用的目的。

© www.soinside.com 2019 - 2024. All rights reserved.