Кросс-компиляция программы на C для Android - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь скопировать исполняемый файл с моего компьютера с Linux (Ubuntu) в приложение для Android в качестве ресурса.Я успешно смог переместить исполняемый файл в файловую систему Android, но когда я пытаюсь выполнить, мне сообщают об ошибке 'sh: not executable: 64-bit ELF file.' Я выполнил команду файла на исполняемом файле, и это был вывод:

'ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so, for GNU/Linux 2.6.32 not stripped.'

Когда я запускаю файл на исполняемом файле, который работает на устройстве Android:

'ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, stripped.'

Чтобы добавить немного контекста, я пытаюсь скомпилировать эту программу.

Я скачал Android NDK и запускаю следующие команды для компиляции программы:

 sudo ./configure --cc=/home/username/arm/bin/arm-linux-androideabi-gcc 
 sudo make

Компиляция работает, пока не дойдет до связывания, затем выдает следующие ошибки:

/home/username/arm/bin/../lib/gcc/arm-Linux-androideabi/4.9.x/../../../../arm-Linux-androideabi/bin/ld: error: fio.o: incompatible target               
/home/username/arm/bin/../sysroot/usr/lib/crtbegin_dynamic.o:crtbrand.c:function _start: error: undefined reference to 'main'    
engines/net.c:318: error: undefined reference to 'inet_network'  
engines/net.c:322: error: undefined reference to 'inet_network'  
engines/net.c:323: error: undefined reference to 'inet_network'  
engines/net.c:318: error: undefined reference to 'inet_network'  
cgroup.c:28: error: undefined reference to 'setmntent'  
cgroup.c:34: error: undefined reference to 'getmntent_r'  
cgroup.c:45: error: undefined reference to 'endmntent'  
collect2: error: ld return 1 exit status  
Makefile:433: recipe for target 'fio' failed  
make *** [fio] Error 1

Нужно ли указывать определенный компоновщик?

1 Ответ

0 голосов
/ 25 мая 2018

Я не могу дать полный ответ на этот вопрос, но, надеюсь, поможет следующее:

Вы правильно определили, что ваш первый двоичный файл был скомпилирован для неправильной архитектуры (x86-64 против ARM aarch64).Решение состоит в том, чтобы использовать кросс-компилятор, как у вас с arm-linux-androideabi-gcc.

. Для устранения ошибок «неопределенная ссылка» вы также должны ссылаться на кросс-скомпилированные версии библиотек, которые предоставляют эти символы,Флаг -L может использоваться для указания на скомпилированные библиотеки.Вам нужно будет найти пути к ним самостоятельно.

Для Android стандартная библиотека C предоставляется библиотекой Bionic.https://android.googlesource.com/platform/bionic/

У меня нет опыта работы с NDK, поэтому я не знаю, идет ли он с Bionic или нет.Я думаю, что NDK предназначен только для использования C / C ++ из приложений Java.Этого может быть недостаточно для создания автономных нативных программ.

Я настоятельно рекомендую Карим Ягмур из "Embedded Android" для получения дополнительной информации о компиляции ОС Android и добавлении нативных приложений в сборку.Если у вас есть целая система сборки AOSP (она огромна), то эта книга поможет вам добавить нужную нативную программу в вашу сборку.Оттуда вы можете загрузить программу на устройство.

...