【问题标题】:Unable to cross-compile Valgrind for ARM无法为 ARM 交叉编译 Valgrind
【发布时间】:2023-12-09 09:41:02
【问题描述】:

google 上有很多和我类似的问题,我都试过了,但没有一个有效,所以我必须发布这个问题。

我正在尝试使用 Valgrind 检测一些二进制文件的内存泄漏,这些文件是为我的设备编译的(使用处理器:ARM926EJ-S rev 5 (v5l))。

因此,我正在尝试使用我设备的特定工具链交叉编译 Valgrind。

这是我的过程: 我正在使用 Valgrind 3.13.0 和 Ubuntu 16

1/cd Valgrind-3.13.0

2/sed "s/armv7/arm/g" configure(这样它就不会抱怨不受支持的架构师)。

3/./configure --host=arm-none-linux-gnueabi(使用我特定的交叉编译器,而不是 Linux 的默认)

4/make

弹出如下错误:

error: bad value (cortex-a8) for -mcpu= switch

=> 由于我的设备使用 ARM926EJ-S 处理器,我将 Valgrin-3.13.0 文件夹中所有文件的 cortex-a8 替换为 arm926ej-s

再次运行上述步骤,又弹出一个错误:

m_dispatch/dispatch-arm-linux.S: Assembler messages:
m_dispatch/dispatch-arm-linux.S:104: Error: selected processor does not support `movw r1,#47'
m_dispatch/dispatch-arm-linux.S:105: Error: selected processor does not support `movw r2,#0'
m_dispatch/dispatch-arm-linux.S:157: Error: selected processor does not support `movw r1,#:lower16:vgPlain_stats__n_xindirs_32'
m_dispatch/dispatch-arm-linux.S:158: Error: selected processor does not support `movt r1,#:upper16:vgPlain_stats__n_xindirs_32'
m_dispatch/dispatch-arm-linux.S:165: Error: selected processor does not support `movw r1,#(((1<<15))-1)'
m_dispatch/dispatch-arm-linux.S:166: Error: selected processor does not support `movw r4,#:lower16:vgPlain_tt_fast'
m_dispatch/dispatch-arm-linux.S:169: Error: selected processor does not support `movt r4,#:upper16:vgPlain_tt_fast'
m_dispatch/dispatch-arm-linux.S:182: Error: selected processor does not support `movw r1,#:lower16:vgPlain_stats__n_xindir_misses_32'
m_dispatch/dispatch-arm-linux.S:183: Error: selected processor does not support `movt r1,#:upper16:vgPlain_stats__n_xindir_misses_32'
Makefile:3224: recipe for target 'm_dispatch/libcoregrind_arm_linux_a-dispatch-arm-linux.o' failed

我做错了什么?

【问题讨论】:

  • 你还需要交叉编译 Valgrind。我不熟悉这个流程。

标签: arm embedded cross-compiling valgrind embedded-linux


【解决方案1】:

ARM9 使用旧的 ARMv5 指令集。从错误消息中,看起来 Valgrind 的汇编代码需要一个比您的处理器更新的 ARM (ARMv7) 指令集。

因此,您可能不走运,需要将上述汇编程序移植到 ARMv4 以使 valgrind 工作。

【讨论】:

  • 不幸的是,移植汇编程序超出了我的知识范围,可能会花费太多时间。也许我应该找到另一种方式。您能否向我推荐任何其他与 Valgrind 等效的软件(内存泄漏检查)并且能够在 ARM926EJ-S 上运行?
  • 编写自己的内存泄漏检查器。您应该能够编写一个 malloc 挂钩来跟踪所有内存分配和释放。调用堆栈可能有点问题,除非您使用帧指针构建