使用自定义下载的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
相关产品推荐
相关产品推荐

