【Linux学习笔记】安卓运行C可执行文件No such file or directory


开发环境

  • 开发板:正点原子RK3568开发板
  • 安卓版本:11
  • 可执行程序命名:ledApp
  • 需加载模块:dtsled.ko

其实就是正点原子的设备树开发第一个例程

运行失败现象

在这里插入图片描述
加载完模块后运行可执行程序出现 No such file or directory

1|console:/data/local/tmp/Demo # ./ledApp /dev/led 1
/system/bin/sh: ./ledApp: No such file or directory

解决办法

方法一:使用静态库

一般为了驱动测试编写的测试app用这个方法即可,虽然编译完体积大了点,但是方便
在编译可执行程序时在之后加上 -static 即可

/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc ledApp.c -o ledApp -static

方法二:使用动态库

如果不是为了测试,更改比较频繁,用这种会更好

编译可执行程序时使用:

/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc ledApp.c -o ledApp

方法就是:把Linux C的动态连接库给复制到安卓的 /lib 目录下。

创建lib

没有这个目录的,手动创建一个。有就跳过这一步

//手动创建lib需要先开一下根目录的操作权限
mount -o remount r,w /
mkdir /lib

查找依赖库

readelf -l ledApp      //检查一下加载这个执行文件需要的库
are 9 program headers, starting at offset 64

......
                 0x000000000000001b 0x000000000000001b  R      0x1
      [Requesting program interpreter: /lib/ld-linux-aarch64.so.1]
......
   08     .init_array .fini_array .dynamic .got 

看到 [Requesting program interpreter: /lib/ld-linux-aarch64.so.1]这句话表明程序的运行需要一个 “解释器” 。也就是说想要加载这个程序就必须包含ld-linux-aarch64.so.1库。
将ld-linux-aarch64.so.1这个库放到/lib中去。

readelf -d ledApp   //查一下运行时需要什么支持库
Dynamic section at offset 0xdf8 contains 25 entries:
  标记        类型                         名称/0x0000000000000001 (NEEDED)             共享库:[libc.so.6]
 0x000000000000000c (INIT)               0x400568
 ......
 0x000000006ffffff0 (VERSYM)             0x400432
 0x0000000000000000 (NULL)               0x0

把后面标有NEEDED 的库全都搬到安卓的/lib中,再次运行即可。

复制需要注意的事情

因为Linux C的动态链接库中包含了很多链接,所以不能直接复制,需要先压缩再复制到安卓中再解压,保证链接也被一起复制。
压缩使用:.tar.bz2格式

至于其他原因出现No such file or directory这样的问题,暂时还没发现

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值