Как вы кросс-компилировать исполняемые файлы ELF для Android? - PullRequest
10 голосов
/ 23 декабря 2011

Я подготовил приведенный ниже пример кода 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

/ системы / бен

$ ./test

bash: ./test: Нет такого файла или каталога

$ ls -al | grep test

-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 Copyright (C) 2008 Free Software Foundation, Inc. Это бесплатно программного обеспечения; см. источник для условий копирования. Здесь нет гарантия; даже не для ИЗДЕЛИИ или ФИТНЕСА ДЛЯ ОСОБЕННОСТИ ЦЕЛЬ.

Почему я получаю эту ошибку?

bash: ./test: Нет такого файла или каталога

1 Ответ

18 голосов
/ 23 декабря 2011

Эта проблема была связана с динамическим загрузчиком. Когда я проверил вывод двоичного файла с помощью 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

Чтобы изменить динамический загрузчик (динамический компоновщик), необходимо использовать «--dynamic-linker = / path / to / loader» для компоновщика.

$ arm-none-linux-gnueabi-gcc -o test test.c -Wall -Wl, - динамический-линкер = / системы / бен / линкер

...