AOSP执行lunch命令报错:ckati未定义符号_ZNSt3__15mutexD1Ev
AOSP lunch命令执行失败(ckati符号缺失)问题排查与解决
问题描述
在AOSP环境中执行以下命令时,lunch命令报错失败:
. ./build/envsetup.shlunch aosp_cf_x86_64-phone-trunk_staging-userdebugm smp-fuzzer
报错信息:
prebuilts/build-tools/linux-x86/bin/ckati: symbol lookup error: prebuilts/build-tools/linux-x86/bin/ckati: undefined symbol: _ZNSt3__15mutexD1Ev
已做排查
- LLVM和clang版本为13.0.1,今年2月
lunch命令可正常执行,仅修改过LD_LIBRARY_PATH;确认无法修改libc代码/libc.so,ckati来自AOSP预编译文件。 - 使用
c++filt解析报错符号,结果为std::__1::mutex::~mutex()(即libc++中std::mutex的析构函数);编写包含std::mutex的简单测试程序,可通过clang编译并正常运行。 printenv LD_LIBRARY_PATH输出结果:
尝试单独设置:/scratch/wjw5351/downloads/klee/build/lib:/scratch/wjw5351/opt/libcxx/libc++-build-130/lib:/scratch/wjw5351/downloads/klee/build/lib:/scratch/wjw5351/opt/libcxx/libc++-build-130/libexport LD_LIBRARY_PATH=/scratch/wjw5351/opt/libcxx/libc++-build-130/lib,问题仍未解决。- 执行
ldd prebuilts/build-tools/linux-x86/bin/ckati,输出如下:linux-vdso.so.1 (0x00007ffddebdb000) libjemalloc5.so => /scratch/wjw5351/aosp_clean/prebuilts/build-tools/linux-x86/bin/../lib64/libjemalloc5.so (0x00007f978bb51000) libc++.so => /scratch/wjw5351/opt/libcxx/libc++-build-130/lib/libc++.so (0x00007f978ba4c000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f978ba3a000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f978ba33000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f978b94c000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f978b947000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f978b927000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f978b6fe000) /lib64/ld-linux-x86-64.so.2 (0x00007f978be2b000) libatomic.so.1 => /lib/x86_64-linux-gnu/libatomic.so.1 (0x00007f978b6f4000)
问题原因及解决方法
原因
AOSP预编译的ckati工具是基于AOSP自带的libc编译的,但你的LD_LIBRARY_PATH强制指定了自定义编译的libc库路径,导致运行ckati时加载了不匹配的libc版本。即使自定义libc也是13.0.1版本,AOSP的libc通常包含项目特定补丁或编译配置,二者符号表存在差异,进而出现缺失std::__1::mutex::~mutex()符号的错误。此外,ckati依赖的libjemalloc5.so也可能与自定义libc存在依赖冲突。
解决方法
临时清空LD_LIBRARY_PATH
在执行AOSP相关命令前,先重置环境变量,让系统优先加载AOSP预编译工具链自带的库:export LD_LIBRARY_PATH= . ./build/envsetup.sh lunch aosp_cf_x86_64-phone-trunk_staging-userdebug用子shell隔离环境
如果需要保留全局的LD_LIBRARY_PATH配置,可以通过子shell单独设置AOSP命令的环境,避免影响全局:(export LD_LIBRARY_PATH=; . ./build/envsetup.sh; lunch aosp_cf_x86_64-phone-trunk_staging-userdebug)验证库加载正确性
执行以下命令确认ckati加载的是AOSP自带的libc++:export LD_LIBRARY_PATH= ldd prebuilts/build-tools/linux-x86/bin/ckati | grep libc++.so正常情况下,输出应指向AOSP预编译目录下的libc++.so,而非自定义路径。
内容的提问来源于stack exchange,提问作者oxyuranus
相关产品推荐
相关产品推荐

