当前位置: 首页 > 编程日记 > 正文

Ubuntu上通过android toolchain交叉编译Valgrind操作步骤

关于Valgrind的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/50196189.

这里介绍下在Ubuntu 16.04上通过android toolchain如android-ndk-r14b交叉编译Valgrind源码的操作步骤:

1. 从 https://valgrind.org/ 下载最新的版本3.17.0,解压缩,并将终端定位到主目录;

2. 从官网https://developer.android.com/ndk/downloads/older_releases#ndk-14b-downloads下载android-ndk-r14b并解压缩;

3. 编写脚本build_android.sh,内容如下:此脚本既支持armv7也支持aarch64,在valgrind主目录下执行此脚本

#! /bin/bashif [ $# != 1 ]; thenecho "usage: $0 system_architect"echo "e.g: build armv7: $0 0; build aarch64: $0 1"exit 1
fiif [ $1 != 0 -a $1 != 1 ]; thenecho "input param can only be 0 or 1: \"$0 0\" or \"$0 1\""exit 1
fitoolchain_path=${HOME}/Disk/Soft/android-ndk-r14b
echo "toolchain path: ${toolchain_path}"if [ $1 == 0 ]; thenecho "build android armv7"export AR=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-arexport LD=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ldexport CC=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gccexport CXX=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++export RANLIB=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlibexport STRIP=${toolchain_path}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-stripbash autogen.shCPPFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm" \CFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm" \./configure \--prefix=/ \--host=armv7-unknown-linux \--target=armv7-unknown-linux \--with-tmpdir=/sdcardmake -j4make install DESTDIR=`pwd`/install_armv7
fiif [ $1 == 1 ]; thenecho "build android aarch64"export AR=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-arexport LD=${toolchain_path}/ttoolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ldexport CC=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gccexport CXX=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++export RANLIB=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlibexport STRIP=${toolchain_path}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-stripbash autogen.shCPPFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm64" \CFLAGS="--sysroot=${toolchain_path}/platforms/android-21/arch-arm64" \./configure \--prefix=/ \--host=aarch64-unknown-linux \--target=aarch64-unknown-linux \--with-tmpdir=/sdcardmake -j4make install DESTDIR=`pwd`/install_aarch64
fi

4. 解决编译时的error:oredump-elf.c:149:4: error: conflicting types for 'Elf32_Nhdr',修改源码coregrind/m_coredump/coredump-elf.c,将文件中结构体名Elf32_Nhdr调整为Elf32_Nhdr_,此结构体好像并没有用到

5. 执行完脚本后,会在valgrind主目录下生成install_armv7和install_aarch64目录,结构如下:bin目录下存放着valgrind可执行文件,libexec/valgrind目录下存放着所需的动态库。注意:(1).valgrind的旧版本动态库的存放位置是lib/valgrind目录;(2).在编译完armv7或aarch64后,如继续编译另一个架构,需先执行make clean,再执行./build_android.sh 0或./build_android.sh 1

6. 将install_armv7或install_aarch64拷贝到手机上,查看valgrind版本,结果如下:可见valgrind执行正确。注意:(1).新版本valgrind的VALGRIND_LIB为./install_aarch64/libexec/valgrind,在旧版本中为./install_aarch64/lib/valgrind;(2).当测试的可执行文件依赖其它动态库时,需要用LD_LIBRARY_PATH指定依赖动态库所在的目录;(3).如在执行过程中,遇到类似以下错误时"valgrind: Can't create client cmdline file in /data/local/tmp/valgrind_proc_xxxx_cmdline_yyyyyyyy",在原有命令基础上,添加TMPDIR=. 即可,如TMPDIR=. VALGRIND_LIB=./install_aarch64/libexec/valgrind LD_LIBRARY_PATH=target/android-aarch64/ ./install_aarch64/bin/valgrind --leak-check=full --log-file=log.txt ./build/CppBaseTest

相关文章:

Java状态模式

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 意图:允许对象在内部…

Red Hat 5.8 CentOS 6.5 共用 输入法

pick up from http://jingyan.baidu.com/article/20b68a885a3607796cec622c.html

Python3中with用法

Python中的with语句用于用上下文管理器(context manager)定义的方法包装块的执行,它允许将常见的try…except…finally使用模式封装起来以方便重用。 在Python中,在处理非托管资源(unmanaged resources)(如文件流)时使用with关键字。它允许确保你在使用资…

作为计算机专业的你,这些点你命中了哪些?

是不是学计算机的在别人眼里就得会修电脑?是不是编代码的程序员在别人眼里就得喜欢穿格子衫?是不是从事互联网行业的人在别人眼里就喜欢背双肩包出行?1我学计算机就得会修电脑?前两天我在加班的时候,电话突然响起&…

Java空对象模式

在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 在空对象模式中,我们…

JSON入门基础知识

2019独角兽企业重金招聘Python工程师标准>>> JSON入门基础 1、JSON定义 JSON:JavaScript 对象表示法(JavaScript Object Notation)。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快,更易…

Python3中raise用法

Python中raise语句支持强制触发指定的异常。 raise语法: raise [EXPRESSION [from EXPRESSION]] 如果raise后未跟表达式(expression),则raise重新引发当前作用域中活动的最后一个异常。如果当前范围内没有异常处于活动状态,则会引发RuntimeE…

精选实践 | 爱奇艺实用数据库选型树:不同场景如何快速选择数据库?

作者 | 郭磊涛 爱奇艺数据库和中间件负责人 TiDB User Group Ambassador来源 | 授权转载自AskTUG本文系 TUG 线下活动 “不同业务场景下的数据库技术选型思路” 分享实录。我是爱奇艺的数据库和中间件负责人郭磊涛,今天主要向大家分享数据库选型方面的思路&#xff…

iOS处理高并发量的数据请求和数据集合的对应关系

一、处理高并发请求的核心代码如下: // 创建信号量dispatch_semaphore_t semaphore dispatch_semaphore_create(0);// 创建全局并行dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_t group dispatch_gro…

Top 10 Mistakes Java Developers Make(转)

文章列出了Java开发者最常犯的是个错误。 1.将数组转换为ArrayList 为了将数组转换为ArrayList&#xff0c;开发者经常会这样做&#xff1a; ?1List<String> list Arrays.asList(arr);Arrays.asList()会返回一个ArrayList&#xff0c;但这个ArrayList是Arrays的私有静态…

Python3中迭代器介绍

Python中一个可迭代对象(iterable object)是一个实现了__iter__方法的对象&#xff0c;它应该返回一个迭代器对象(iterator object)。迭代器是一个实现__next__方法的对象&#xff0c;它应该返回它的可迭代对象的下一个元素&#xff0c;并在没有可用元素时触发StopIteration异常…

30+博士、100+硕士整理的超全深度强化学习资源清单

作者 | Deep-RL来源 | 深度强化学习实验室&#xff08;ID&#xff1a;Deep-RL&#xff09;今天为大家推荐一个开源、开发的 Github 好项目《A Guide for Deep Reinforcement Learning》。这个项目联合了Deep Reinforcement Learning领域的30位博士&#xff0c;100位硕士共同完成…

Java访问者模式

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接受…

GNU/Linux平台上正则表达式的简单使用

友情提醒&#xff1a;本博文涉及的内容中涉及到的系统实践操作在Centos6.5上实现,GNU/Linux简称为linux&#xff0c;GNU/grep简称为grep&#xff0c;GNU/sed简称为sed&#xff0c;GNU/gawk简称为awk。-------------------------------------------------楔子------------------…

Linux下addr2line命令用法

Linux下addr2line命令用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息(-g)的执行程序出现crash时(core dumped)&#xff0c;可使用addr2line命令快速定位出错的位置。 如果无法确定文件名或函数名&#xff0c;addr2line将在它们的位置打…

JavaMVC 模式

MVC 模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。这种模式用于应用程序的分层开发。 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&#xff0c;在数据变化时更新控制器。View&#xff0…

从概念到技术,打通「中台」的任督二脉,别再说不知道中台是什么

2019 年&#xff0c;「中台」这个词火了&#xff01;随着阿里等头部互联网企业搭建和推动中台业务&#xff0c;让越来越多的企业关注中台&#xff0c;纷纷提出「中台战略」&#xff0c;帮助企业自身加速实现数字化转型。不少企业还在观望「中台」&#xff1a;1、我的企业里需要…

php中序列化与反序列化

http://www.cnblogs.com/A-Song/archive/2011/12/13/2285619.html 转自&#xff1a;http://qing.weibo.com/tag/unserialize 把复杂的数据类型压缩到一个字符串中 serialize() 把变量和它们的值编码成文本形式unserialize() 恢复原先变量eg:$stooges array(Moe,Larry,Curly);$…

Python3中生成器介绍

生成器(generator)&#xff1a;一个返回生成器迭代器的函数。它看起来像一个普通函数&#xff0c;除了它包含用于生成一系列可在for循环中使用的值的yield表达式或者可以使用next函数一次检索一个值。 在Python中&#xff0c;使用了yield的函数被称为生成器。跟普通函数不同的是…

数学学渣必备!拍照上传,分步求解,微软解题神器拯救你

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;在学好数学这条路上&#xff0c;很多同志前赴后继「死伤无数」&#xff0c;即便大家不断的寻求「场外救援」&#xff0c;可最终都逃不过一个字&#xff1a;难&#xff01;两个字&#xff1a;真难…

Java业务代表模式

业务代表模式&#xff08;Business Delegate Pattern&#xff09;用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。在业务层中我们有以下实体。 客户端&#xff08;Client&#xff09; - 表示层代码可以是 JSP、servlet 或 UI j…

在wamp环境下面安装Zend Optimizer的方法

我是用WAMP来做PHP的服务器&#xff0c;进行本机测试和开发PHP项目。 wamp环境是刚刚安装的。由于这个项目的代码是zend加密的&#xff0c;运行时候都是乱码&#xff0c;需要安装一个Zend Optimizer配置。 首先下载一个Zend Optimizer软件。 1、进入安装界面后&#xff0c;按NE…

libuvc介绍及简单使用

libuvc是一个用于USB视频设备的跨平台库&#xff0c;构建在libusb之上&#xff0c;编译libuvc时需要依赖libusb。libuvc的License为BSD&#xff0c;最新发布版本为0.0.6&#xff0c;源码地址: https://github.com/libuvc/libuvc libuvc支持在非windows系统上直接编译&#xff0…

AI又被彩虹吹!​网易被预言为“下一个百度”?

人工智能到底有多火&#xff1f;近日国内首份《BAT人工智能领域人才发展报告》新鲜出炉&#xff0c;此次报告是针对国内人工智能领域的人才争夺情况进行了梳理。并把研究对象锁定在BAT三大巨头的身上。来源&#xff1a;《BAT人工智能领域人才发展报告》其中得出最为核心的结论&…

Java组合实体模式

组合实体模式&#xff08;Composite Entity Pattern&#xff09;用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean&#xff0c;代表了对象的图解。当更新一个组合实体时&#xff0c;内部依赖对象 beans 会自动更新&#xff0c;因为它们是由 EJB 实体 bean 管理的。以下…

JAVA的StringBuffer类

StringBuffer类和String一样&#xff0c;也用来代表字符串&#xff0c;只是由于StringBuffer的内部实现方式和String不同&#xff0c;所以StringBuffer在进行字符串处理时&#xff0c;不生成新的对象&#xff0c;在内存使用上要优于String类。 所以在实际使用时&#xff0c;如果…

程序员请收好:10个非常有用的Visual Studio Code插件

作者 | Daan译者 | Elle出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】一个插件列表&#xff0c;可以让你的程序员生活变得轻松许多。无论你是经验丰富的开发人员还是刚刚开始第一份工作的初级开发人员&#xff0c;你都会想让自己的开发工作尽可能轻松一点…

Python3中装饰器介绍

Python中的装饰器(decorator)是一个接受另一个函数作为参数的函数。装饰器通常会修改或增强它接受的函数并返回修改后的函数。这意味着当你调用一个装饰函数时&#xff0c;你会得到一个与基本定义相比可能有一些额外特性的函数。Python中的函数可以用作或作为参数传递。 Python…

Java数据访问对象模式

数据访问对象模式&#xff08;Data Access Object Pattern&#xff09;或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。以下是数据访问对象模式的参与者。 数据访问对象接口&#xff08;Data Access Object Interface&#xff09; - 该接口定义了在一…

hdoj 5199 Gunner map

Gunner Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid5199 Description Long long ago, there is a gunner whose name is Jack. He likes to go hunting very much. One day he go to the grove. There are n birds and n tr…