安卓跑linux程序_Android下运行Linux可执行程序

2019-07-22

关键字:/system/bin/sh: xxx: No such file or directory

虽然说 Android 也是基于 Linux 的,但总归来说它们的编译链还是很有可能不一样的,这就导致编译出来的程序有可能不能通用,即使它们都是基于 Linux 的。

而有些不能通用的根本原因在于程序运行时所依赖的环境不满足,比如常见的就是一些库文件缺失了。

笔者这边有个需求,需要将一个第三方的,原本目标运行环境是 Linux 嵌入式环境的可执行程序在 Android4.4 的环境上运行起来。

刚一接到这个需求的时候我就一阵头大,一想到编译链不同我就两脚发软。

果然,刚一想运行这一程序,它就给报了一个这样的错误提示

/system/bin/sh: ./system/home1/ctstor/ctserver: No such file or directory

想都不带想的,肯定是编译链不同导致运行环境不满足使得程序不能运行的。

但问题还得解决啊,总不能直接就和领导说编译链不同搞不了吧。

怎么办呢?看看它到底缺了些什么。

用纯正 Linux 环境来看一下这个可执行程序的环境依赖信息。笔者这边是将程序放到 ubuntu 下去分析,因为笔者的 Android4.4 上没有相关程序。

通过以下命令查看这个可执行程序的编译依赖信息

readelf -l xxx

结果如下所示

Elf file type is EXEC (Executable file)

Entry point0xe6e0There are8 program headers, starting at offset 52Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align

EXIDX0x00be90 0x00013e90 0x00013e90 0x00008 0x00008 R 0x4PHDR0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4INTERP0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1[Requesting program interpreter:/lib/ld-linux.so.3]

LOAD0x000000 0x00008000 0x00008000 0x0be9c 0x0be9c R E 0x8000LOAD0x00c000 0x0001c000 0x0001c000 0x0067c 0x006cc RW 0x8000DYNAMIC0x00c01c 0x0001c01c 0x0001c01c 0x00130 0x00130 RW 0x4NOTE0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4GNU_STACK0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4Section to Segment mapping:

Segment Sections...00.ARM.exidx01

02.interp03 .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame04.init_array .fini_array .jcr .dynamic .got .data .bss05.dynamic06 .note.ABI-tag07

可以看到上面红色加粗的部分表明程序的运行需要一个 “解释器” 。说白了就是要想加载这个程序,运行环境中必须要有上面黄色加粗部分的库,就是 /lib/ld-linux.so.3 库。

那这是不是说,只要我将这个库放到指定路径下,它就可以加载了呢?试一下就知道了。

不过在这之前,我们还有一个关键的步骤:必须要知道这个可执行程序所使用的编译链。

笔者这边有个文档,记载了它的编译链为: arm-none-linux-gnueabi

直接去网上下载这个编译链,然后在里面找到 ld-linux.so.3 库,再放进 Android 开发板中去就好了。

这里要注意,它要求的是根目录下的 lib 目录,Android4.4 系统默认是不带 /lib 目录的。要自己创建。

先开一下根目录的操作仅限

mount -o remount r,w /

当然,这一步不见得都能执行成功,如果执行不成功,那就得您自个去找找原因了。

然后再 mkdir /lib 并将 ld-linux.so.3 下载到这个目录下去。

这里也有一个关键点:不能修改创建出来的目录以及下载下去的文件的权限。否则的话,在运行的时候是会报 permission denied 错误的。

然后试一下,这个程序果然不报前面那个 No such file or directory 的错误了。但是报了另外一个错误

error while loading shared libraries: libqte.so.3: cannot open shared object file: No such file or directory

还是 No such file or directory 错误,只不过是另外一个 No such file or directory 错误。而且这个错误也很明显,就是运行时的动态库缺失。

这个时候,得再回到前面 ubuntu 中去看看这个可执行程序在运行时期需要什么库依赖。

readelf -d xxx

然后可以看到下列结果

Dynamic section at offset 0xc01c contains 33entries:

Tag Type Name/Value0x00000001 (NEEDED) Shared library: [libqte.so.3]0x00000001 (NEEDED) Shared library: [libts-0.0.so.0]0x00000001 (NEEDED) Shared library: [librt.so.1]0x00000001 (NEEDED) Shared library: [libpthread.so.0]0x00000001 (NEEDED) Shared library: [libdl.so.2]0x00000001 (NEEDED) Shared library: [libstdc++.so.6]0x00000001 (NEEDED) Shared library: [libm.so.6]0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]0x00000001 (NEEDED) Shared library: [libc.so.6]0x0000000f (RPATH) Library rpath: [/usr/qte338-target2/lib]0x0000000c (INIT) 0xd778

0x0000000d (FINI) 0x1317c

0x00000019 (INIT_ARRAY) 0x1c000

0x0000001b (INIT_ARRAYSZ) 20(bytes)0x0000001a (FINI_ARRAY) 0x1c014

0x0000001c (FINI_ARRAYSZ) 4(bytes)0x00000004 (HASH) 0x8168

0x00000005 (STRTAB) 0xa184

0x00000006 (SYMTAB) 0x8b24

0x0000000a (STRSZ) 10293(bytes)0x0000000b (SYMENT) 16(bytes)0x00000015 (DEBUG) 0x0

0x00000003 (PLTGOT) 0x1c14c

0x00000002 (PLTRELSZ) 2608(bytes)0x00000014(PLTREL) REL0x00000017 (JMPREL) 0xcd48

0x00000011 (REL) 0xcd08

0x00000012 (RELSZ) 64(bytes)0x00000013 (RELENT) 8(bytes)0x6ffffffe (VERNEED) 0xcc88

0x6fffffff (VERNEEDNUM) 4

0x6ffffff0 (VERSYM) 0xc9ba

0x00000000 (NULL) 0x0

然后就很清晰了,将上面的几个标示为 NEEDED 的库文件全部拷贝到 /lib 目录下。这些库文件一般都可以在指定的编译链中找到,如果有一些特殊的库不是直接包含在编译链中的,那就得另想办法去寻找了。一般而言,稍微负点责任的程序提供方都会将这些库一并给过来的。

在弄好库文件以后,再去运行就发现可以了。我们的原本目标运行环境是嵌入式 Linux 环境的可执行程序就在 Android 下跑起来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 中国地质大学 计算机文化基础 复习题

《计算机文化基础》模拟题 一、单项选择题 1.自然界中常见的光能够由()三种颜色混合而成. A.红黄绿 B.红绿蓝 C.澄蓝紫 D.白红绿 2.显示器彩电等成像显示设备的工作是基于()三色原理. A.RYG(红黄绿) B.WRG(白红绿) C.RGB(红绿蓝) D.CMY(青品红黄) 3.PentiumIICPU是()位处理器…

最常见的SQL报错注入函数(floor、updatexml、extractvalue)及payload总结

SQL报错注入是一种常见的SQL注入攻击方式,攻击者通过注入恶意代码,触发数据库的错误响应,并从错误信息中获取有用的信息。 下面介绍最常见的三个报错注入函数用法及payload总结: 1、floor() 使用floor报错注入,需要…

光电转换器与光纤收发器有哪些区别?

说到光电转换器,我们都知道光电转换器是一种类似于基带MODEM(数字调制解调器)的设备,和基带MODEM不同的是接入的是光纤专线,是光信号,分为全双工流控,半双工背压控制。那么,光电转换…

[渝粤教育] 中国地质大学 马克思主义基本原理 复习题

《马克思主义基本原理》 一.单选题 1.思维与存在的关系问题是() A.唯心主义哲学的基本问题 B.唯物主义哲学的基本问题 C.全部哲学的基本问题 D.一部分哲学的基本问题 2.金融资本是() A.银行垄断资本和工业垄断资本相互渗透融合生长而形成的新型的资本形态. B.银行垄断资本. C.…

如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优

1. 数据本地化的级别:1.PROCESS_LOCAL2.NODE_LOCAL3.NO_PREF4.RACK_LOCAL5.ANY1) PROCESS_LOCALtask要计算的数据在本进程(Executor)的内存中。2) NODE_LOCAL① task所计算的数据在本节点所在的磁盘上。② task所计算的数据在本节点其他Execu…

[渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(1)

数据库应用——在线考试复习资料 一、单选题 1.“表达式生成器”是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符号? A. B. C.? D.* 3.以下属于非绑定控件的是哪一个? A.文本框 B.单选按钮 C.组合框 D.直线控件 …

光收发器安装介绍,光纤收发器连接示意图解

对于光纤布线来讲光纤收发器都是非常熟悉的产品了,在光纤网络中,我们常常会使用到光纤收发器,那么,在网络布线过程中光纤收发器该怎么连接呢?接下来飞畅科技的小编就来为大家介绍下光纤收发器安装以及连接图解&#xf…

[渝粤教育] 西南科技大学 电子产品制造工艺 在线考试复习资料

电子产品制造工艺——在线考试复习资料 一、单选题 1.对放大电路进行调试,静态主要测试( )参数。 A.放大倍数 B.静态工作点 C.输入电阻 D.输出电阻 2.用万用表测量1.9k的电阻,挡位应该选择( )。 A.10k B.5k C.2k D.1k 3.对手工焊接的工艺要求描述错误的是( )。 A.焊…

变压器图案

Transformer模式是Java(以及可能仅具有使用场所差异和不变参数类型的其他OO语言)的设计模式,可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703相关的OpenJDK线程&#xff…

mysql 分库分表_大众点评订单系统分库分表实践

原大众点评的订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到瓶颈,应用只能通过限速、异步队列等对其进行保护…

[渝粤教育] 西南科技大学 经济学概论 在线考试复习资料

经济学概论——在线考试复习资料 一、单选题 1.可持续发展战略的核心内容是正确处理? A.农、轻、重之间的比例关系 B.第一、二、三产业之间的比例关系 C.经济发展与人口、资源、环境之间的关系 D.积累与消费之间的比例关系 2.调整和优化产业结构就是要? A.在国民经济各部门之…

多模光纤收发器购买时需要注意什么问题?

光纤收发器是光通讯产品的一类,它一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中,同时在帮助把光纤最后一公里线路连接到城域网和更外层的网络上也发挥了巨大的作用。现如今,随着光通信产业的高速发展&#xff0…

[渝粤教育] 西南科技大学 计算机网络应用基础 在线考试复习资料2021版(1)

计算机网络应用基础——在线考试复习资料2021版 一、单选题 1. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以( )。 A. 检测出一位差错 B. 检测并纠正一位差错 C. 检测出多位突发性差错 D. 检测并纠正多位突发性差错 答案:看左边查询 2.为了保证连接的可靠性,TCP通常…

[渝粤教育] 西南科技大学 高级语言程序设计(Java) 在线考试复习资料

高级语言程序设计(Java)——在线考试复习资料 一、单选题 1.下列哪一个包给出了Runnable接口的定义?( ) A.iava.util B.java.io C.java.lang D.java.sql 2.下列( )属于Java线程同步方法。 A.joiny( ) B.run( ) C.wait( ) D.stroy( ) 3.下列方法中可以…

cd mysql 权限不够_.bash_profile权限不够_cdmysql权限不够

mac环境下创建bash_profile文件并写入内容_IO690x477 - 118KB - JPEGmac下创建bash_profile的问题? - Mac - 知乎585x366 - 22KB - PNG如何设置bash profile格式599x366 - 38KB - JPEG如何设置bash profile格式599x366 - 38KB - JPEG.bash_profile .bashrc profile文件的作用的…

POE交换机产品如何设计防雷保护?

在POE供电系统实际应用中,有很多受电设备AP或移动基站的基站AP与天线,经常要安装于建筑物的高端点,因此这些受电设备也成为遭受雷击的高发点。所以,对于这类的数据网络中心,不仅要考虑建设良好的直击雷防护网与良好的接…

【渝粤教育】电大中专学前儿童科学教育 (5)作业 题库

作业视频教务托管,壹叁路路贰陆陆壹〇肆〇 学前儿童科学教育的学习重点是( ) A.技术的概念 B.学前儿童科学教育的内涵 C.科学的概念 D.学前儿童科学教育的概念 错误 正确答案:左边查询 学生答案:A 2.以认识自然为目的的是( &#…

lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议

lucene 多个分词查找Lucene的“ 建议”模块提供了许多有趣的自动建议实现,以便在用户将每个字符输入搜索框时为他们提供实时搜索建议。 例如, WFSTCompletionLookup将所有建议及其权重编译到一个紧凑的有限状态传感器中 ,从而可以对基本建议…

【渝粤教育】电大中专幼儿园课程论 (7)作业 题库

作业视频教务托管,壹叁路路贰陆陆壹〇肆〇 以下哪种不是按照课程的表现形态划分的( ) A.活动课程 B.分科课程 C.分科课程 D.显性课程 错误 正确答案:左边查询 学生答案:未作答 2.如果幼儿园课程的教育理念强调儿童的发…

32linux下安装mysql5.7_Linux系统下以RPM方式安装mysql-5.7.9

1在开始安装之前,我们先来一小段官方文档,看下图。图中英文翻译过来就是:从MySQL5.7.4起,以RPM包的方式安装后的MySQL的部署默认是安全的,并且有这些特点:在大多数情况下,你只需要安装MySQL-ser…