Кросс-компиляция статического 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/datap >
перейти,
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. Я думаю, это просто проблема с правами доступа.