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



我在下面准备了一个示例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 - 0 test.c

我将二进制文件——test——复制到目标设备的"/system/bin"目录下。

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

$ pwd

/系统/bin

$ ./test

bash: ./test: No such file or directory

$ ls -al | grep test

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

,尽管二进制文件——test——已经在"/system/bin"目录下。

我的交叉编译器是

$ arm-none-linux-gnueabi-gcc——version

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

为什么我得到这个错误?

bash: ./test: No such file or directory

这个问题与动态加载器有关。当我用readelf检查二进制文件的输出时,我注意到我使用的交叉编译器有不同类型的默认动态加载器——"/lib/ld-linux.so"。,但是Android使用"/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

为了改变动态加载器(动态链接器),链接器应该使用"——dynamic-link =/path/to/loader"。

$ arm-none-linux-gnueabi-gcc -o test test.c- wl,动态链接器=/系统/bin/链接

最新更新