我已经准备了下面的示例C代码,以便按照这些程序在Android操作系统上运行,
/*test.c file*/
#include <stdio.h>
int
main(int argc, char **argv)
{
printf("Android Test Application.\n");
return 0;
}
$ arm-none-linux-gnueabi-gcc -o test test.c -Wall
我将二进制文件--test--复制到目标设备“/ system / bin”目录中。
当我尝试在目标系统上进行交叉编译二进制运行时,我收到此错误
$ pwd
/系统/ bin中
$ ./test
bash:./ test:没有这样的文件或目录
$ ls -al | grep测试
-rwxr-xr-x 1 0 0 8384 2011-12-22 15:26测试
虽然二进制文件--test--已经在“/ system / bin”目录中。
我的交叉编译器是
$ arm-none-linux-gnueabi-gcc --version
arm-none-linux-gnueabi-gcc(Sourcery G ++ Lite 2009q1-203)4.3.3 版权所有(C)2008 Free Software Foundation,Inc。这是免费的 软件;查看复制条件的来源。没有 保证;甚至不适用于特定的适销性或适用性 用途
为什么我收到此错误?
bash:./ test:没有这样的文件或目录
答案 0 :(得分:18)
此问题与动态加载程序有关。当我用readelf检查二进制文件的输出时,我通知我使用的交叉编译器有一个不同类型的默认动态加载器 - “/lib/ld-linux.so.3”,但Android使用“/ system / bin中/接头“
$ readelf --program-headers test
Elf file type is EXEC (Executable file)
Entry point 0x8380
There are 8 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
EXIDX 0x0004fc 0x000084fc 0x000084fc 0x00050 0x00050 R 0x4
PHDR 0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
INTERP 0x000134 0x00008134 0x00008134 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.3]
LOAD 0x000000 0x00008000 0x00008000 0x00550 0x00550 R E 0x8000
LOAD 0x000550 0x00010550 0x00010550 0x00124 0x00128 RW 0x8000
DYNAMIC 0x00055c 0x0001055c 0x0001055c 0x000f0 0x000f0 RW 0x4
NOTE 0x000148 0x00008148 0x00008148 0x00020 0x00020 R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4
为了更改动态加载程序(动态链接程序),链接器应使用“--dynamic-linker = / path / to / loader”。
$ arm-none-linux-gnueabi-gcc -o test test.c -Wall -Wl, - 动态接头= /系统/ bin中/接头