如何为Android交叉编译ELF可执行文件?

如何为Android交叉编译ELF可执行文件?,android,cross-compiling,elf,Android,Cross Compiling,Elf,我在下面准备了一个示例C代码,通过以下步骤使其在Android操作系统上运行 /*test.c file*/ #include <stdio.h> int main(int argc, char **argv) { printf("Android Test Application.\n"); return 0; } /*test.c文件*/ #包括 int 主(内部argc,字符**argv) { printf(“Android测试应用程序。\n”); 返回0;

我在下面准备了一个示例C代码,通过以下步骤使其在Android操作系统上运行

/*test.c file*/
#include <stdio.h>

int
main(int argc, char **argv)
{
    printf("Android Test Application.\n");
    return 0;
}
/*test.c文件*/
#包括
int
主(内部argc,字符**argv)
{
printf(“Android测试应用程序。\n”);
返回0;
}
$arm none linux gnueabi gcc-o test.c-Wall

我将二进制文件test复制到目标设备“/system/bin”目录中

当我试图在目标系统上运行交叉编译的二进制文件时,我得到了这个错误

$pwd

/系统/垃圾箱

美元/测试

bash:./test:没有这样的文件或目录

$ls-al| grep测试

-rwxr-xr-x 1 0 8384 2011-12-22 15:26测试

尽管二进制文件test已经在“/system/bin”目录中

我的交叉编译器是

$arm none linux gnueabi gcc--版本

arm none linux gnueabi gcc(Sourcery G++Lite 2009q1-203)4.3.3 版权所有(C)2008免费软件基金会,这是免费的 软件;有关复制条件,请参见源。没有 担保甚至不是为了适销性或某一特定产品的适合性 目的

为什么我会犯这个错误

bash:./test:没有这样的文件或目录


此问题与动态加载程序有关。当我用readelf检查二进制文件的输出时,我通知说我使用的交叉编译器有不同类型的默认动态加载程序-“/lib/ld linux.so.3”,但Android使用“/system/bin/linker”

要更改动态加载程序(动态链接器),链接器应使用“--dynamic linker=/path/to/loader”

$arm none linux gnueabi gcc-o test.c-Wall -Wl,--动态链接器=/system/bin/linker

$ 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

可能是缺少/链接不良的动态加载程序或类似的东西。通过
readelf
了解加载程序是什么。在设备上尝试
ldd./test
。还可以尝试静态链接exe,看看是否至少有效。在我的手机上运行
ls-al | grep date
会产生
lrwxrwx
作为权限。可能是权限问题?如何检测当前的动态加载程序?我可以使用readelf实用程序来了解这一点吗?这对于在Android中编译恢复文件系统的二进制文件非常有用,因为在Android中没有/system/bin/linker可用,并且必须重新定义路径。谢谢