You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用自定义下载的glibc运行程序触发段错误求助

自定义Glibc编译程序后段错误问题

我下载了自定义Glibc 2.28,用命令g++ dt.cpp -std=c++11 -Wl,-rpath "/opt/glibc-2.28/lib"编译程序后,运行出现段错误。

程序代码

#include <iostream>
#include <ctime>

int main()
{
  std::tm tm = {};
  char* result = strptime ("2024-11-07", "%Y-%m-%d", &tm);

  if(result)
  printf("Result: *%d*\n", tm.tm_mday);

  time_t time_ = std::mktime (&tm);
  std::cout << "mytime: " << time_ << std::endl;
}

二进制文件的ldd输出

linux-vdso.so.1 (0x00007ffc073f9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f85cda5e000)
libc.so.6 => /opt/glibc-2.28/lib/libc.so.6 (0x00007f85cd6a7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f85cd309000)
/lib64/ld-linux-x86-64.so.2 (0x00007f85ce0c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f85cd0e6000)

问题根源

从ldd输出能明确看到问题:程序混合链接了不同版本的Glibc组件——libc.so.6用的是自定义2.28版本,但libm.so.6和动态链接器ld-linux-x86-64.so.2都是系统默认版本。

std::mktime会调用libm中的底层函数,不同版本Glibc的libm与libc之间内部接口、符号实现存在差异,这种版本不匹配会直接导致内存访问错误,触发段错误。

修复方案

1. 强制使用全套自定义Glibc组件

编译时必须同时指定自定义的动态链接器,确保rpath覆盖所有Glibc相关库路径:

g++ dt.cpp -std=c++11 -Wl,-rpath="/opt/glibc-2.28/lib" -Wl,--dynamic-linker="/opt/glibc-2.28/lib/ld-linux-x86-64.so.2"

这样程序会完全依赖自定义Glibc的所有库文件,避免版本混合。

2. 验证链接结果

编译完成后重新运行ldd检查输出,确保libm.so.6和动态链接器都指向/opt/glibc-2.28/lib路径:

ldd ./a.out

正常情况下,所有Glibc衍生库都应该来自自定义路径。

3. 确认自定义Glibc的完整性

如果问题仍存在,检查自定义Glibc的编译过程是否正常,确认/opt/glibc-2.28/lib下是否存在完整的libm.so.6和ld-linux-x86-64.so.2文件,且文件权限正确。

内容的提问来源于stack exchange,提问作者cryptickey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:42:20