文章目录
- 开发环境
- 运行失败现象
- 解决办法
- 方法一:使用静态库
- 方法二:使用动态库
- 创建lib
- 查找依赖库
- 复制需要注意的事情
开发环境
- 开发板:正点原子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这样的问题,暂时还没发现