运行Gem5模拟器遇symbol lookup error且nm/ldd链接正常的解决方法
解决Gem5模拟器运行时的libstdc++符号查找错误
我之前也碰到过类似的Gem5符号查找问题,结合你提供的环境信息(Gem5提交哈希c5ca3ef6b9ff967722b07bc160fa9068e0d9e39c、gcc 5.4.0构建),给你几个针对性的解决思路:
核心原因分析
这个错误本质是构建Gem5时使用的gcc/libstdc版本,和运行时系统加载的libstdc版本不匹配,导致Gem5编译时依赖的C标准库符号在系统当前的libstdc.so.6中找不到。
1. 确保构建与运行环境的gcc版本完全一致
有时候系统会安装多个gcc版本,你构建时用了gcc5.4.0,但运行时默认调用的是其他版本的libstdc++,可以这么操作:
- 先确认当前终端的gcc版本:
确保输出是gcc --version && g++ --version5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) - 如果版本不符,用
update-alternatives切换到gcc5.4.0:sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100 - 或者临时指定运行时的库路径,直接运行Gem5:
export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5:$LD_LIBRARY_PATH ./build/X86/gem5.opt ./configs/example/se.py <test program> <configs>
2. 重新构建Gem5,强制绑定gcc5.4.0
之前的构建可能因为系统默认编译器切换导致链接了不匹配的库,建议清理后重新构建:
- 先清理旧构建文件:
scons -c - 明确指定gcc和g++版本重新构建:
这里scons build/X86/gem5.opt -j$(nproc) CC=gcc-5 CXX=g++-5-j$(nproc)是用所有CPU核心加速构建,你也可以改成具体数字比如-j4。
3. 检查并更新系统的libstdc++6
你的Ubuntu 16.04默认的libstdc++版本可能比较旧,缺少gcc5.4.0编译时需要的符号:
- 先查看当前libstdc++支持的版本:
确保能看到strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXXGLIBCXX_3.4.21(gcc5.4.0对应的版本) - 如果没有,更新libstdc++6包:
sudo apt-get update && sudo apt-get install --only-upgrade libstdc++6
4. 精准定位缺失的符号
如果上面的方法都没用,可以进一步排查具体符号:
- 把报错里的完整符号(比如
_ZNKSt9t...)替换到下面的命令,查看系统库是否真的没有这个符号:nm -D /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep _ZNKSt9<完整符号> - 同时查看Gem5二进制文件依赖的该符号:
对比两者的输出,就能确定是系统库缺失还是构建时的链接问题。readelf -Ws build/X86/gem5.opt | grep _ZNKSt9<完整符号>
内容的提问来源于stack exchange,提问作者Daniel Carvalho
相关产品推荐
相关产品推荐

