Кросс-компиляция статического C-hello world для Android с использованием arm-linux-gnueabi-gcc

Я хочу создать статический мир привет от C, используя arm-linux-gnueabi-gcc, в отличие от использования автономной инструментальной цепочки NDK или Codesourcery.

В Ubuntu...

Я сделал следующее:

sudo apt-get install gcc-arm-linux-gnueabi

Я создал hi.c следующим образом:

#include <stdio.h>

int main(int argc, char** argv) {
   printf("hello world\n");
   return 0;
}

Я скомпилировал его следующим образом:

arm-linux-gnueabi-gcc -static hi.c -o hi 

Я запускал его на эмуляторе следующим образом:

adb push hi /data/hi
adb shell /data/hi

Но я получаю следующее:

[1]   Illegal instruction     /data/hi

Какой шаг я забыл? Основываясь на прошлом опыте, это "должно" работать, но я, очевидно, испортил это.

Ответ 1

Если я делаю это на машине Debian (VM в моем случае), все выглядит хорошо. Я не уверен, когда ошибаюсь, делая подобное на ubuntu. Это может быть, как предложил Лео, но я не могу подтвердить. Это должно работать для вас, однако.

http://www.cnx-software.com/2012/01/16/installing-emdebian-arm-cross-toolchain-in-debian/

Кто-то добавил эту ссылку, но она не использует инструментальную цепочку, о которой я упоминал в описании. Оставляя его на случай, если кто-то заинтересован.

http://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-android/

Ответ 2

Попробуйте указать архитектуру/процессор. Похоже, что компилятор создает код с более высокой версией архитектуры, чем может обрабатывать эмулятор.

Это может сработать:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi

Ответ 3

Он работал у меня с компилятором CodeBench на рабочем столе ubuntu.  https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Просто создайте статический двоичный файл с помощью этой команды:

arm-none-linux-gnueabi-gcc -o hello -static hello.c

то, adb push hello/data​​p >

перейти, adb shell $./data/hello Это напечатает Hello World на терминале. То же самое можно сделать и с телефона. Используйте эмулятор терминала или SL4A bash.

Ответ 4

Насколько я знаю, вы не можете запускать пользовательские приложения в Android, которые не скомпилированы с помощью какой-либо формы gcc-arm-linux-androideabi.

Ответ 5

Ваш код действительно работает для меня.

Я скомпилировал его на Ubuntu и нажал на него /data/local/tmp

И затем chmod 777 привет

Наконец, он работает хорошо.

Ответ 6

Проверяли ли вы права доступа к папке с данными? Попробуйте использовать локальный вместо этого! Вы можете просто использовать оболочку adb, а затем cd в папку, в которую был нажат исполняемый файл, и попробуйте. /hi. Я думаю, это просто проблема с правами доступа.