Valgrind for ARM 和 Linaro 工具链需要 libc6-dbg 和 Buildroot

Posted

技术标签:

【中文标题】Valgrind for ARM 和 Linaro 工具链需要 libc6-dbg 和 Buildroot【英文标题】:Valgrind for ARM with Linaro Toolchain requiring libc6-dbg with Buildroot 【发布时间】:2012-11-05 07:43:30 【问题描述】:

我在我的 Ubuntu 10.04 主机上使用以下命令和 Linaro 工具链为 ARM 交叉编译了 Valgrind (http://valgrind.org/downloads/valgrind-3.8.1.tar.bz2)(我使用的是 Buildroot):

export PATH=$PATH:/home/user/toolchain/linaro/bin
CC=arm-linux-gnueabi-gcc CFLAGS=-I/home/user/toolchain/linaro/arm-linux-gnueabi/libc/usr/include LDFLAGS=-L/home/user/toolchain/linaro/arm-linux-gnueabi/libc/usr/lib ./configure --prefix=/opt/valgrind --host=armv7-none-linux-gnueabi --target=arm-none-linux-gnueabi --build=i386-ubuntu-linux
make
sudo make install

当我将二进制文件复制到我的 ARM 目标板时,我收到以下错误:

==413== Memcheck, a memory error detector
==413== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==413== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==413== Command: /home/user/testApp
==413== 

valgrind:  Fatal error at startup: a function redirection
valgrind:  which is mandatory for this platform-tool combination
valgrind:  cannot be set up.  Details of the redirection are:
valgrind:  
valgrind:  A must-be-redirected function
valgrind:  whose name matches the pattern:      memcpy
valgrind:  in an object with soname matching:   ld-linux.so.3
valgrind:  was not found whilst processing
valgrind:  symbols from the object with soname: ld-linux.so.3
valgrind:  
valgrind:  Possible fixes: (1, short term): install glibc's debuginfo
valgrind:  package on this machine.  (2, longer term): ask the packagers
valgrind:  for your Linux distribution to please in future ship a non-
valgrind:  stripped ld.so (or whatever the dynamic linker .so is called)
valgrind:  that exports the above-named function using the standard
valgrind:  calling conventions for this platform.  The package you need
valgrind:  to install for fix (1) is called
valgrind:  
valgrind:    On Debian, Ubuntu:                 libc6-dbg
valgrind:    On SuSE, openSuSE, Fedora, RHEL:   glibc-debuginfo
valgrind:  
valgrind:  Cannot continue -- exiting now.  Sorry.

我的 Linaro 工具链版本是:

gcc version 4.7.1 20120402 (prerelease) (crosstool-NG linaro-1.13.1-2012.04-20120426 - Linaro GCC 2012.04) 

我在 Google 上四处搜索,但找不到解决方案。如何让 Valgrind 在我的目标板上工作?我使用 Buildroot 来构建我的系统,但 libc6-dbg 不是我可以在构建系统中找到的包。我需要从工具链 sysroot 复制一些目录或文件吗?谢谢 -

我用来运行 Valgrind 的命令如下所示:

# which valgrind
/usr/bin/valgrind
# valgrind /home/user/MyQtApp
==216== Memcheck, a memory error detector
...
...

【问题讨论】:

您能否指定使用哪个命令在目标上运行 Valgrind,以便我们可以尝试重现该问题?谢谢。 Thomas,我已将我的命令附加到上面的帖子中 - 谢谢。 嗨,Thomas,你能重现这个吗?我的 Buildroot Valgrind 安装仍然存在这个问题。谢谢! 【参考方案1】:

我遇到了同样的问题,并找到了解决方案。 因此,如果有人也面临它,这就是我使事情发生的方式: Valgrind 无法调试应用程序的原因是 C 库中缺少符号。 在使用外部工具链 (Linaro) 构建 buildroot 时,我们可以在 Linaro 树中找到未剥离的 C 库。 在 arm-linux-gnueabihf\libc\lib\arm-linux-gnueabihf 文件夹中,您将找到未剥离的库。 只需复制目标上的非剥离文件..就是这样。 希望这对其他人有帮助。

【讨论】:

您是如何将未剥离的文件复制到目标的?当我将它们复制过来时,它会破坏操作系统。还是要将它们复制到单独的位置并更改 LD_LIBRARY_PATH? @Fred 您必须分两步执行此操作。首先将ld-2.19-2014.08.solibc-2.19-2014.08.so(我系统的版本)上传到另一个地方。然后移动它们,覆盖旧的。就我而言,它奏效了。【参考方案2】:

所以你使用 Buildroot 或 OpenEmbedded 来构建你的 Libc?

如果是 OE,那么您应该在本地存储库 (TMPDIR/deploy/ipk) 中提供 libc6-dbg 软件包。或者将“dbg-pkgs”添加到 IMAGE_FEATURES 并重建您的图像。

Glibc 2.12 显示您使用的是旧版本的 OpenEmbedded。但即使这样也应该给你 libc6-dbg 包。

无法帮助 Buildroot,因为从未使用过它。

【讨论】:

感谢您的回答 - 我实际上正在使用 Buildroot 并编辑了我的问题以明确这一点。希望您的回答能帮助其他人解决这个问题。【参考方案3】:

您需要在目标中未剥离的库。

两种方法。

在您的 buildroot 配置中:

1- 制作一个未剥离的系统:BR2_STRIP_none=y 它会制作一个非常大的目标图像

2- 仅取消剥离 librairie 文件夹。 BR2_STRIP_EXCLUDE_DIRS="lib"

【讨论】:

我正在使用外部工具链 (Linaro),如果我尝试关闭我板上的 ld-*.so,我会在重新启动时出现内核崩溃。 Buildroot 没有构建我的工具链,因此我无法使用此方法使兼容的 /lib 二进制文件启动。【参考方案4】:

对不起,我给你一个我自己没有使用的包的链接,但希望它会起作用:

https://launchpad.net/ubuntu-leb/oneiric/armel/libc6-dbg

【讨论】:

感谢您的建议 - 我下载了 .deb 并将其内容提取到目标板上的 /lib 目录中。但是,我的电路板现在无法启动。我看着 TeraTerm 和内核启动,但它只是在加载内核后挂起。这里一定有某种不兼容。 你确定只提取包就足够了吗?可能会有一些安装脚本执行一些必要的设置等...

以上是关于Valgrind for ARM 和 Linaro 工具链需要 libc6-dbg 和 Buildroot的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 交叉编译( gcc-linaro-arm-linux-gnueabihf)环境搭建

gcc-linaro-arm-linux-gnueabihf交叉编译器配置

ERROR: GCC Linaro tool chain does not exist at /sdk/tools/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gn

安装ARM交叉编译器

下载安装ARM交叉编译器

下载安装ARM交叉编译器