历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2020年02月09日 | valgrind arm-linux 交叉编译

2020-02-09 来源:eefocus

Valgrind是用于构建动态分析工具的仪器框架。 它附带了一组工具,每个工具都执行某种调试,分析或类似任务,可帮助您改进程序。


Valgrind的架构采用模块化设计,因此可以轻松创建新工具,而不会干扰现有结构。


开始工作前,有两项信息不得不看,那就是平台和工具概述,虽然百度查了一些,但毕竟不如官方的准确:


平台支持,我的 ARM-v7 是支持的


http://valgrind.org/info/platforms.html

工具概述:


http://valgrind.org/info/tools.html

 

标准配置提供了许多有用的工具。


Memcheck是一个内存错误检测器。 它可以帮助您使程序,尤其是那些用C和C ++编写的程序更加正确。


Cachegrind是缓存和分支预测分析器。 它可以帮助您使程序运行得更快。


Callgrind是一个生成缓存分析器的调用图。 它与Cachegrind有一些重叠,但也收集了Cachegrind没有的一些信息。


Helgrind是一个线程错误检测器。 它可以帮助您使多线程程序更正确。


DRD也是线程错误检测器。 它与Helgrind类似,但使用不同的分析技术,因此可能会发现不同的问题。


Massif是一个堆分析器。 它可以帮助您使程序使用更少的内存。


DHAT是一种不同类型的堆分析器。 它可以帮助您了解块寿命,块利用率和布局效率低下的问题。


SGcheck是一种实验工具,可以检测堆栈和全局数组的溢出。 它的功能与Memcheck的功能互补:SGcheck发现Memcheck无法解决的问题,反之亦然。


BBV是一个实验性的SimPoint基本块矢量生成器。 它对进行计算机体系结构研究和开发的人很有用。


其中官方解释到:


Memcheck检测内存管理问题,主要针对C和C ++程序。Memcheck运行程序比正常情况慢大约10-30倍


Cachegrind运行程序比正常情况慢大约20-100倍。


Massif运行程序比正常情况慢20倍


1.下载源码

http://valgrind.org/

 


2 解压后进行配置:

./configure --prefix=/home/sun/share/install --host=arm-buildroot-linux-uclibcgnueabi

配置报错:


checking for a supported CPU... no (arm)

configure: error: Unsupported host architecture. Sorry

查看官方网站首页,发现对 ARM-LINUX 是支持的


 It also includes three experimental tools: a stack/global array overrun detector, a second heap profiler that examines how heap blocks are used, and a SimPoint basic block vector generator. It runs on the following platforms: X86/Linux, AMD64/Linux, ARM/Linux, ARM64/Linux, PPC32/Linux, PPC64/Linux, PPC64LE/Linux, S390X/Linux, MIPS32/Linux, MIPS64/Linux, X86/Solaris, AMD64/Solaris, ARM/Android (2.3.x and later), ARM64/Android, X86/Android (4.0 and later), MIPS32/Android, X86/Darwin and AMD64/Darwin (Mac OS X 10.12).

修改 configure 文件:


将 armv7a* 改为 arm* 再次配置就不会报错了


修改前:

修改后:

3.编译

make -j4

make install

会生成四个目录:bin lib share include


4.我的板子空间非常小,所以需要删除不需要的工具,只留下内存检查工具,

需要删除 lib/valgrind 目录下的文件 以及 整个 share 目录,最后精简到 12M 左右:


sun@machine:~/share/install$ du -sh bin include/ lib/

520K    bin

2.1M    include/

10M    lib/

 

精简后的lib/valgrind 目录下所有文件:


复制代码

32bit-core-valgrind-s1.xml   32bit-sse.xml                arm-with-vfpv3.xml

32bit-core-valgrind-s2.xml   arm-core-valgrind-s1.xml     default.supp

32bit-core.xml               arm-core-valgrind-s2.xml     getoff-arm-linux

32bit-linux-valgrind-s1.xml  arm-core.xml                 memcheck-arm-linux

32bit-linux-valgrind-s2.xml  arm-vfpv3-valgrind-s1.xml    vgpreload_core-arm-linux.so

32bit-linux.xml              arm-vfpv3-valgrind-s2.xml    vgpreload_memcheck-arm-linux.so

32bit-sse-valgrind-s1.xml    arm-vfpv3.xml

32bit-sse-valgrind-s2.xml    arm-with-vfpv3-valgrind.xml

复制代码

文件名含有 ARM-LINUX 字样的文件信息:


sun@machine:~/share/install/lib/valgrind$ file *arm-linux*

getoff-arm-linux:                ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, with debug_info, not stripped

memcheck-arm-linux:              ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped

vgpreload_core-arm-linux.so:     ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, with debug_info, not stripped

vgpreload_memcheck-arm-linux.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, with debug_info, not stripped

5.对于运行环境的要求:

http://valgrind.org/docs/manual/dist.readme-packagers.html

 View Code

里面提到五个重要的事项:


复制代码

1 - 如果您的工具链(编译器,链接器)支持lto,则使用configure 选项--enable-lto = yes将产生更小/更快的valgrind


2 - 不要使用完全剥离的Linux发行版/lib/ld.so。(比如上面的getoff-arm-linux 就链接了 /lib/ld-uClibc.so.0, 那就要求我们的开发板根目录下的  /lib/ld-uClibc.so.0 必须是 not stripped)


3 在开发板上面运行的目录必须与 --prefix = 指定的目录完全一致

 

4 - 不要将调试信息从lib / valgrind / $ platform / vgpreload * .so中删除(比如上面的vgpreload_core-arm-linux.so 和 vgpreload_memcheck-arm-linux.so 必须是 not stripped)


5 - 不要在安装树中从lib / valgrind / *中删除符号。(比如上面的getoff-arm-linux 和 memcheck-arm-linux  必须是 not stripped)

复制代码

第 4、5 两条就要求我们 lib/valgrind/ 目录下的任何文件都必须是 not stripped,这样才能保证程序可靠


将所有精简后的目录放到开发板的指定目录(即--prefix=/home/sun/share/install 这个目录),如果你忘记了当时编译的目录是哪个,请查看 lib/pkgconfig/valgrind.pc


 文件内有绝对路径的说明:如 prefix=/home/sun/share/install 


sun@machine:~/share/install/lib/pkgconfig$ cat valgrind.pc 

prefix=/home/sun/share/install

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

includedir=${prefix}/include/valgrind

arch=arm

os=linux

platform=arm-linux

valt_load_address=0x58000000


Name: Valgrind

Description: A dynamic binary instrumentation framework

Version: 3.14.0

Requires:

Libs: -L${libdir}/valgrind -lcoregrind-arm-linux -lvex-arm-linux -lgcc

Cflags: -I${includedir}

 

一般情况下都可以成功运行,偶尔adb push 进去后不能运行,如果已经确定在开发板上面的路径与prefix 指定的路径完全一致了,但依然报以下错误:


valgrind: failed to start tool 'memcheck' for platform 'arm-linux': No such file or directory


那就需要指定库的路径了:


VALGRIND_LIB=/home/sun/share/install/lib ./valgrind/home/sun/share/install/bin/valgrind --help

 


如果可以正常运行,那就设置到环境变量,只在当前终端有效,如果开启另一个终端,则需要再次设置,如果终端关闭或板子重启,同样需要再次设置:


export VALGRIND_LIB=/home/test/valgrind/lib/valgrind

 


设置后就可以直接运行了 ./valgrind/home/sun/share/install/bin/valgrind --help 可以成功运行


./valgrind/home/sun/share/install/bin/valgrind ls 报错


错误信息是:内部错误,valgrind 段错误退出了


来来回回折腾了好几天,交叉工具链都重新制作了,用新版本的uclibc,依然报错


替换内核版本后 依然报错


换成几个旧版本的valgrind 依然报错


最后又重新查看 valgrind 对平台的CPU架构的支持,才发现一开始就由于疏忽错过了重要信息


当前


Valgrind支持以下平台:


x86 / Linux:最高可包括SSSE3,但不高 - 没有SSE4,AVX,AVX2。 此目标现在处于维护模式..

AMD64 / Linux:包括AVX2在内。 这是主要的开发目标,并且往往得到很好的支持。

PPC32 / Linux,PPC64 / Linux,PPC64LE / Linux:包括Power8在内。

S390X / Linux:支持。

ARM / Linux:自ARMv7起支持。

ARM64 / Linux: ARMv8支持。

MIPS32 / Linux,MIPS64 / Linux:支持。

X86 / Solaris,AMD64 / Solaris,X86 / illumos,AMD64 / illumos :自Solaris 11以来受支持。

X86 / Darwin(10.10,10.11),AMD64 / Darwin(10.10,10.11):支持。

ARM / Android,ARM64 / Android,MIPS32 / Android,X86 / Android:支持。

 


在Linux上,您必须运行内核3.0或更高版本,以及glibc 2.5.X或更高版本。 在Mac OS X上,您必须运行10.9.x或更高版本。


移植计划

Valgrind 3.X拥有支持多平台的基础设施。 平台是特定的(CPU,OS)配对,例如x86 / Linux或AMD64 / Linux。


维护每个端口需要付出很多努力,比大多数其他程序要多。 Valgrind很脆弱,因为它的作用很低级。 此外,每个平台端口都有特定于CPU的代码,特定于操作系统的代码和特定于平台的代码,并且难以测试所有组合。


因此,我们只能证明支持广泛使用的平台。 与NetBSD或GCC不同,我们对Valgrind在已知领域的每个平台上工作都不感兴趣:维护负担过高。 因此,将Valgrind移植到不同的平台并不仅仅是一项技术练习:您还需要做出一个令人信服的案例,即努力是值得的,并且至少在可预见的未来,端口将得到适当的支持。


Windows不在考虑之中,因为移植到它需要进行如此多的更改,它几乎就是一个单独的项目。 (但是,Valgrind + Wine可以通过一些努力来实现。)此外,非开源操作系统很难处理; 能够看到操作系统和相关的(libc)源代码使事情变得更容易。 但是,Valgrind可以与Wine结合使用,这意味着可以在Valgrind下运行Windows程序。


此消息说明了我们的移植原理。 我们一如既往地采用灵活的方法,如果您有任何意见,我们有兴趣听取您的意见/移植需求。


我的内核是 4.4.110 支持的,但C库是uclibc valgrind不支持,所以无法运行


最后,valgrind 在 ARM Linux 下交叉编译时:


对CPU 架构、内核版本、Glibc 版本都有严格要求,大家在移植前需要到官网查看

推荐阅读

史海拾趣

HEIMANN公司的发展小趣事

在电子行业中,HEC Inc(以下简称HEC)作为一家知名的科技公司,其发展历程充满了挑战与机遇。以下是五个关于HEC发展起来的相关故事,每个故事均基于事实描述:

1. 技术创新引领市场突破

HEC自成立之初便致力于技术创新,在通信设备领域取得了显著成就。公司研发的高效路由器和交换机产品,凭借其卓越的性能和稳定性,迅速在市场中占据一席之地。特别是在5G技术兴起的背景下,HEC提前布局,成功推出了多款支持5G网络的通信设备,满足了市场对高速、低延迟网络连接的迫切需求。这些技术创新不仅巩固了HEC在通信行业的领先地位,也为其后续的市场拓展奠定了坚实基础。

2. 环保理念推动可持续发展

随着全球对环保问题的日益重视,HEC积极响应号召,将绿色技术融入产品研发和生产过程中。公司推出的多款电子产品,如智能手机和平板电脑,均采用了环保材料和节能设计,有效降低了产品生命周期中的碳排放。此外,HEC还建立了完善的电子废弃物回收体系,实现了资源的循环利用。这些环保举措不仅提升了公司的品牌形象,也为其赢得了更多消费者的青睐和市场的认可。

3. 跨界合作拓展业务领域

为了进一步扩大市场份额,HEC积极寻求跨界合作机会。公司与多家知名汽车制造商合作,将先进的通信技术应用于车载智能系统中,提升了驾驶体验和行车安全。同时,HEC还与智能家居厂商合作,推出了多款智能家电产品,实现了家居设备的互联互通和远程控制。这些跨界合作不仅丰富了HEC的产品线,也为其带来了新的增长点。

4. 全球化战略布局

为了应对日益激烈的国际竞争,HEC制定了全球化发展战略。公司在全球范围内设立了多个研发中心和销售网络,以更好地了解当地市场需求并快速响应。通过整合全球资源,HEC成功推出了多款符合不同国家和地区消费者需求的产品。此外,公司还积极参与国际展会和交流活动,提升了品牌知名度和国际影响力。

5. 应对挑战实现转型升级

面对行业内的激烈竞争和技术变革,HEC始终保持着敏锐的洞察力和强大的适应能力。公司不断调整产品结构,加大研发投入,推动产品向高端化、智能化方向发展。同时,HEC还积极拥抱数字化转型,通过大数据、云计算等先进技术优化生产流程和管理模式,提高了生产效率和产品质量。这些努力使HEC在挑战中实现了转型升级,保持了持续稳健的发展态势。

厦门法拉(faratronic)公司的发展小趣事

FMI公司始终坚持以客户为中心的发展理念,致力于为客户提供定制化的频率控制解决方案。公司拥有一支专业的研发团队和完善的生产流程,能够根据客户的具体需求进行产品设计和生产。无论是标准产品还是定制产品,FMI都能确保高质量和快速交付。这种灵活的服务模式使得FMI在客户中树立了良好的口碑,并为公司赢得了更多的商业合作机会。

Esterline Power Systems公司的发展小趣事

在追求经济效益的同时,Esterline Power Systems也积极履行社会责任,注重绿色环保和可持续发展。公司采用环保材料和生产工艺,降低生产过程中的能源消耗和废弃物排放。此外,公司还积极参与环保公益活动,推动绿色能源的发展和应用。这些举措不仅提升了公司的社会形象,也为公司赢得了更多客户的信任和支持。

Aydin Corp公司的发展小趣事

面对日益严峻的环境挑战和市场变化,Aydin Corp积极寻求可持续发展之路。公司致力于推广环保理念,采用环保材料和节能技术,降低生产过程中的能耗和排放。同时,Aydin Corp还加大在新能源、智能电子等领域的研发力度,为公司的未来发展做好充分准备。展望未来,Aydin Corp将继续秉持创新、品质、合作的理念,为电子行业的发展贡献更多的力量。

这些故事虽然基于假设,但反映了电子行业公司普遍面临的挑战和机遇。如需获取关于Aydin Corp公司的真实发展故事,建议直接访问其官方网站或查阅相关新闻报道。

Doodle Labs公司的发展小趣事

Doodle Labs公司成立于2010年代初,由一群热衷于无线通信和物联网技术的工程师创立。在成立之初,公司就明确了自己的定位:专注于开发高性能、智能化的无线电技术产品,以满足日益增长的无人机和物联网设备的需求。通过不断的技术研发和创新,Doodle Labs成功推出了其首款智能无线电产品,为无人机提供了稳定、高效的通信解决方案。

Holmes Co Inc公司的发展小趣事

随着全球对环保和可持续发展的重视,Holmes Electronics积极响应号召,开始向绿色能源领域转型。他们投入巨资研发高效太阳能电池板和储能系统,并成功应用于多个光伏项目和智能电网项目中。同时,公司还不断优化生产工艺,减少生产过程中的能源消耗和废弃物排放。这一绿色能源转型不仅为公司赢得了良好的社会声誉,还开辟了新的业务增长点。

问答坊 | AI 解惑

信号的反射问题

信号在传输线上传输时,若遇到阻抗不连续的情况,就会发生信号的反射现象. 我想知道信号是怎样反射的,为什么在阻抗不匹配时就会发生反射现象?有哪些解决措施?…

查看全部问答>

delphi串口通信与工程实践

一本找了很长时间的电子书,免费下载…

查看全部问答>

WINCE4.0上网页的发布

请教各位高手: 我想在WINCE4.0上发布一个可供远程浏览的交互式网页,网页上的数据从ARM9的ISA总线上过来并存在内存中,希望在网页中能浏览并修改。 我看了“成都英创网页上有相关调用COM组件进行远程控制的例子”,那个例子中网页(用ASP实现) ...…

查看全部问答>

单片机课程设计指导

求 :楼然苗 北京航空航天大学出版社 的光盘..... 下载地址,或者通过邮件(puyo730@126.com)和QQ(137861176) 谢谢.…

查看全部问答>

迷茫了,到底是linux 还是 wince????

感觉linux在嵌入式方面被吵的很火,wince就差点了,不知道实际应用上究竟那个更流行,更使用,wince 和 linux各自的优势,(linux是免费开源的就不用强调了,请按行业方面介绍一下)。wince下的开发,是不是主要在应用层啊。底层用的多吗? …

查看全部问答>

大家看看能值多少?

知名台湾IC设计公司工作三年,做嵌入式系统方面工作. 一般大学本科生  自动化专业 三年工作经验 曾经做过USB,SD,MWin GUI,STN,TFT,TP等驱动并维护 曾经跟过10余个专案,知道客户设计,帮助解决问题直至量产 大家看看能值多少? …

查看全部问答>

有谁知道为什么我的libc库中的sprintf函数输出不正确呢

我的开发板是epson的c33,编译工具是由epson提供的gnu33。…

查看全部问答>

【设计工具】2011年EDK13.1培训部分-培训资料

有图有真相 [ 本帖最后由 fuli247012412 于 2012-3-16 22:11 编辑 ]…

查看全部问答>

学模拟+【《运算放大器噪声优化手册》读书笔记二】静下心来,慢慢读

本帖最后由 dontium 于 2015-1-23 11:35 编辑 第一章的标题是统计学导论及回顾 我带着对标题中“统计学导论”不屑的态度看起了这本书(先别骂我,最近就是静不下心来),慢慢的看完第一小节看到时域的视角下噪声是什么样子的。好的吧,看着 ...…

查看全部问答>