一、前言
最近由于项目的需要,要交叉编译Valgrind到板子上使用,在这个过程中遇到了一些坑,在此记录一下,别人遇到的话也可以看看
二、步骤
配置编译过程
整体上的步骤和网络上的方法是一样的,我一开始也是在网络上搜索来进行的,最开始的找到一篇文章添加链接描述
遇到的问题:这篇文章中使用的Valgrind是3.12.0版本的,这个版本下的configure支持的架构比较少,而且也没有文中说的修改armv7的地方,一开始在这个地方耽搁了一些时间,在网络上寻找方法,最终也是无果。
于是下载了最新的版本valgrind-3.19.0再次进行
导入交叉编译工具链的路径
export PATH=$PATH:/book/9-project/rel-j5-cs-v1.0-LNX5.10_REL_CS_PL3.0_2022081004/platform_sdk/prebuilts/host/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin
这里再次遇到一个问题,就是配置不对,错误的配置如下
./configure --host=armv7-linux CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ AR=aarch64-linux-gnu-ar --prefix=/opt/valgrind-3.19.0
网络上大部分的方式都是这样来配置的,这样执行configure是可以成功的,但是配置之后进行编译的时候就会出现问题,如下
在make的时候出现如上的问题,不懂这个是什么意思,于是在网上寻找答案,大概意思是说无法进行交叉编译,但是没有有用的解决方法
无奈,继续寻找新的解决思路,终于看到一篇文章,给了一种新的配置方式
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CPP=${CROSS_COMPILE}cpp
export CXX=${CROSS_COMPILE}g++
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar
./configure --target=aarch64-linu --host=aarch64-linux --prefix=/opt/valgrind-3.19.0
区别就是在于设置target不再是"armv7-linux"了,而是设置成和交叉编译工具链一样的平台了。
可以成功进行配置,神奇的是make也不再报错了,终于看到希望了!
运行过程
但是,不出意外的是意外还是出现了,make install之后,在配置的时候的路径下面生成了编译的结果,于是把它拷贝到板子上运行,出现
valgrind: failed to start tool 'memcheck' for platform 'arm64-linux': No such file or directory
解决方案有两种:
1、按照上述编译期间环境配置中的 --prefix 的路径保证目标板上的路径一致,如果不确定可以打开 valgrind//lib/pkgconfig/valgrind.pc 文件查看,
第一行的 prefix= 为编译安装后的路径
2、在目标板上设置 valgrind 的环境变量:export VALGRIND_LIB=/mnt/valgrind/lib/valgrind(根据自己存放的 valgrind 路径修改)
重点看第二种方法,其实就是这个路径不对,导致运行出错
这里很坑的地方就是Valgrind运行依赖另一个程序,这个程序就是memcheck-arm64-linux,这个程序所在的路径也必须要指明才行
在上传的文件夹里寻找这个文件,
root@xxx# find . -name memcheck-arm64-linux
./valgrind-3.19.0/libexec/valgrind/memcheck-arm64-linux
果然是有的,于是按照说明指定它的路径
export VALGRIND_LIB=$PATH:/userdata/valgrind-3.19.0/libexec/valgrind/memcheck-arm64-linux
这样就可以了