Linux中valgrind交叉编译嵌入式部署使用

Linux中Valgrind交叉编译嵌入式部署使用

1.下载
2.编译
3.部署
4.编译时的参数配置问题

(1) 准备交叉编译工具链
(2) 下载 Valgrind 源码
(3) 配置编译环境变量
(4) 配置 Valgrind 编译
(5) 编译和安装

1.下载

链接: 官网下载地址
图片[1] - Linux中valgrind交叉编译嵌入式部署使用 - 宋马
解压;

tar -xjvf valgrind-3.25.0.tar.bz2

2.编译

执行shell脚本,这里给到了一个通用的configure的编译脚本,如果有其他的程序需要编译可以使用该脚本,只需修改编译时根据目标平台特点,修改编译器和相关参数即可

#!/bin/bash

# 配置参数(根据实际平台修改)
CROSS_PREFIX="arm-linux-gnueabihf-"  # 交叉编译器前缀
CROSS_PATH="/usr/armhf/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin/"  #交叉编译器的路径
TARGET_ARCH="armv7"                  # 目标架构(如 armv7、aarch64 等)未用到
INSTALL_DIR="/path/to/embedded/"  # 安装到嵌入式设备的根目录路径
SRC_DIR="./valgrind-3.25.0"          # Valgrind 源码目录

# 检查源码目录是否存在
if [ ! -d "$SRC_DIR" ]; then
    echo "错误:Valgrind 源码目录 $SRC_DIR 不存在,请先下载并解压源码"
    exit 1
fi

# 进入源码目录
cd "$SRC_DIR" || exit 1

# 清理之前的构建
make distclean

#-marm
#强制编译器生成 ARM 指令集代码(32 位指令)
#默认情况下,ARMv7 支持 Thumb-2(16/32 位混合指令集)
#使用场景:某些旧版库或特殊硬件要求纯 ARM 指令
#-march
#指定目标架构为 ARMv7-A
#启用该架构支持的所有特性(如 NEON、VFPv3 等)
#影响指令选择和优化策略
MARCH=armv7-a

#-mfloat-abi
#浮点 ABI(应用二进制接口)选项:
#soft:纯软件浮点(不依赖硬件 FPU)
#softfp:使用硬件 FPU,但函数调用仍使用整型寄存器传递浮点参数
#hard:使用硬件 FPU,且直接通过浮点寄存器传递参数
ABI=hard

#需与目标硬件和系统库保持一致
#-mfpu
#指定浮点单元类型:
#vfpv3:ARMv7-A 默认的 VFPv3 浮点单元
#neon:启用 NEON SIMD 浮点单元(支持高级矢量运算)
#vfpv4:ARMv8-A 中的 VFPv4 浮点单元
#需与目标硬件 FPU 类型匹配
FPU=vfp


# 配置编译选项
./configure --host=${
            CROSS_PREFIX%-} --prefix="$INSTALL_DIR" --enable-only32bit CC="${CROSS_PATH}${CROSS_PREFIX}gcc" CXX="${CROSS_PATH}${CROSS_PREFIX}g++" CFLAGS="-marm -mfloat-abi=$ABI -march=$MARCH -mfpu=$FPU" CXXFLAGS="-marm -mfloat-abi=$ABI -march=$MARCH -mfpu=$FPU"

#./configure --host=arm-linux-gnueabihf --prefix=/path/to/embedded/  CC="/usr/armhf/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc"  CXX="/usr/armhf/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++" CFLAGS="-marm -mfloat-abi=hard -march=armv7-a -mfpu=vfp" CXXFLAGS="-marm -mfloat-abi=hard -march=armv7-a -mfpu=vfp"

# 检查配置是否成功
if [ $? -ne 0 ]; then
    echo "配置失败,请检查交叉编译器路径或参数"
    exit 1
fi

# 编译(根据 CPU 核心数调整 -j 参数)
make -j4

# 安装到指定目录
make install

echo "交叉编译完成!Valgrind 已安装到 $INSTALL_DIR"
    

编译完成后

3.部署

直接将embedded压缩后拷贝进去即可,添加引用

ln -svf /home/embedded/bin/valgrind /usr/bin/valgrind
which valgrind

同时需要注意的是需要增加动态库的路径

export VALGRIND_LIB=/home/embedded/libexec/valgrind

执行即可

valgrind –leak-check=full ./myapp

4.编译时的参数配置问题

此处给到一个偷懒的方式,可能实际开发时,第一次接触也不清楚目标平台有什么特点,对于参数也不知道其含义,自己配置的参数对不对,可以先进入目标平台的后台,打印出CPU和系统信息,然后交给大语言模型,让模型给配置一下

uname -a //系统信息
cat /proc/cpuinfo

举例:

以下是大模型给到的回答:
根据你提供的目标平台信息(ARM Cortex-A7,ARMv7-A 架构,支持 VFPv4 和 NEON),下面是为该平台交叉编译 Valgrind 的详细方法:

(1) 准备交叉编译工具链

确保已安装支持硬浮点 ABI 的 ARMv7 交叉编译工具链:

 Ubuntu/Debian系统安装预编译工具链
sudo apt-get install g++-arm-linux-gnueabihf

 或者从Linaro获取最新工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
tar -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

(2) 下载 Valgrind 源码

从官网下载最新稳定版本(当前为 3.21.0):

wget https://sourceware.org/pub/valgrind/valgrind-3.21.0.tar.bz2
tar -xf valgrind-3.21.0.tar.bz2
cd valgrind-3.21.0

(3) 配置编译环境变量

根据目标平台特性设置环境变量:

# 工具链路径
export TOOLCHAIN_PATH="/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin"
export CROSS_COMPILE="arm-linux-gnueabihf-"

# 目标平台编译选项
export CC="${TOOLCHAIN_PATH}/${CROSS_COMPILE}gcc"
export CXX="${TOOLCHAIN_PATH}/${CROSS_COMPILE}g++"
export AR="${TOOLCHAIN_PATH}/${CROSS_COMPILE}ar"
export RANLIB="${TOOLCHAIN_PATH}/${CROSS_COMPILE}ranlib"

# 针对Cortex-A7的优化选项
export CFLAGS="-O2 -march=armv7-a -mtune=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4"
export CXXFLAGS="$CFLAGS"

(4) 配置 Valgrind 编译

运行配置脚本,指定目标平台和特性

./configure 
    --host=arm-linux-gnueabihf 
    --prefix=/usr/local   # 安装路径(将在目标设备上使用)
    --enable-only64bit=no   # 支持32位ARM
    --enable-arm-neon=yes   # 启用NEON支持
    --enable-lto=no   # 禁用链接时优化(可能导致兼容性问题)
    CC="$CC" 
    CXX="$CXX" 
    CFLAGS="$CFLAGS" 
    CXXFLAGS="$CXXFLAGS"

(5) 编译和安装

make -j$(nproc)  # 并行编译
make DESTDIR=$PWD/valgrind_install install  # 安装到临时目录

针对特定平台的调整
如果目标设备内存有限,可在配置时禁用部分功能以减小体积

./configure 
    --host=arm-linux-gnueabihf 
    --disable-nls   # 禁用国际化支持
    --disable-drd   # 禁用数据竞争检测器
    --disable-helgrind   # 禁用线程错误检测器
    ...

通过以上步骤,你可以成功为 ARM Cortex-A7 平台交叉编译 Valgrind,并在目标设备上进行内存和性能分析

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容