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

alb*_*bin 10 android elf cross-compiling

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

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

int
main(int argc, char **argv)
{
    printf("Android Test Application.\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

$ 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:没有这样的文件或目录

alb*_*bin 18

这个问题与动态加载器有关.当我用readelf检查二进制文件的输出时,我通知我使用的交叉编译器有一个不同类型的默认动态加载器 - "/ lib/ld-linux.so.3",但Android使用"/ system /斌/连接器"

$ 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
Run Code Online (Sandbox Code Playgroud)

为了更改动态加载程序(动态链接程序),链接器应使用"--dynamic-linker =/path/to/loader".

$ arm-none-linux-gnueabi-gcc -o test test.c -Wall -Wl, - dynamic-linker =/system/bin/linker

  • 这对于在Android中编译恢复文件系统的二进制文件非常有用,其中没有/ system/bin/linker可用且必须重新定义路径.谢谢. (2认同)