Android框架下用Valgrind检测.so文件遇链接错误,如何解决?
Android下Valgrind检测/vendor二进制文件的链接错误解决方法
错误信息翻译
==11442== Memcheck,内存错误检测器 ==11442== 版权所有 (C) 2002-2024,遵循GNU GPL协议,由Julian Seward等人开发 ==11442== 使用Valgrind-3.23.0和LibVEX;重新运行时加-h参数可查看版权信息 ==11442== 命令:/vendor/bin/BINARYFILE ==11442== 无法链接可执行文件"/vendor/bin/BINARYFILE":"/vendor/bin/BINARYFILE"所需或动态打开的库"/data/valgrind/libexec/valgrind/vgpreload_core-amd64-linux.so"对命名空间"(default)"不可访问 ==11442== ==11442== 堆内存摘要: ==11442== 退出时仍在使用:0字节,0块 ==11442== 堆内存总使用情况:0次分配,0次释放,0字节已分配 ==11442== ==11442== 所有堆块均已释放——无内存泄漏可能 ==11442== ==11442== 如需查看检测到的错误和已抑制错误的列表,请使用-s参数重新运行 ==11442== 错误摘要:0个上下文产生0个错误(已抑制:0个来自0个)
问题根源
/vendor目录下的二进制默认运行在受限的SELinux上下文和命名空间中,无法直接访问/data目录下的Valgrind预加载库,导致链接失败。
解决方法
1. 复制Valgrind库到/vendor目录
把Valgrind的预加载库移到/vendor下,让目标二进制能正常访问:
# 创建对应目录 mkdir -p /vendor/libexec/valgrind/ # 复制所需的预加载库 cp /data/valgrind/libexec/valgrind/vgpreload_core-amd64-linux.so /vendor/libexec/valgrind/ cp /data/valgrind/libexec/valgrind/vgpreload_memcheck-amd64-linux.so /vendor/libexec/valgrind/ # 设置正确权限 chmod 644 /vendor/libexec/valgrind/*.so # 指定库路径重新运行Valgrind valgrind --leak-check=full --tool=memcheck --library-path=/vendor/libexec/valgrind/ /vendor/bin/BINARYFILE
2. 用unshare突破命名空间限制
如果设备已root,直接让目标二进制在默认命名空间运行:
unshare -m /system/bin/sh -c "valgrind --leak-check=full --tool=memcheck /vendor/bin/BINARYFILE"
或者绑定挂载Valgrind目录到/vendor:
mount --bind /data/valgrind /vendor/valgrind valgrind --leak-check=full --tool=memcheck --library-path=/vendor/valgrind/libexec/valgrind/ /vendor/bin/BINARYFILE
3. 修改SELinux上下文(仅Permissive模式有效)
先临时关闭SELinux强制模式,再修改库的上下文匹配/vendor二进制:
# 临时设置SELinux为Permissive setenforce 0 # 修改Valgrind库的SELinux上下文 chcon -R u:object_r:vendor_exec:s0 /data/valgrind/ # 重新执行Valgrind命令 valgrind --leak-check=full --tool=memcheck /vendor/bin/BINARYFILE
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

