如何查询链接器脚本目标?解决dlopen加载libm.so失败问题
dlopen加载libm.so在RHEL9中失败的解决需求
现有一段C++代码通过dlopen加载libm.so库:
dlopen("libm.so", RTLD_GLOBAL | RTLD_NOW);
- 在RHEL7系统中,
libm.so是软链接:libm.so -> libm.so.6 - 在RHEL9系统中,
libm.so变为链接器脚本,执行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", ...),希望找到以下两种替代方案之一:
- 动态查询
libm.so对应的版本号(比如“6”),避免硬编码 - 在构建阶段解析链接器脚本,自动获取实际需要加载的目标库路径
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

