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.so
和libc-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