Compilación cruzada estática C hello world para Android usando arm-linux-gnueabi-gcc


Quiero construir un hello world estático desde C usando arm-linux-gnueabi-gcc en lugar de usar la cadena de herramientas independiente NDK o Codesourcery para el caso.

En Ubuntu...

He hecho lo siguiente:

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

He creado un hi.c así:

#include <stdio.h>

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

Lo he compilado así:

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

Lo ejecuté en un emulador como este:

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

Pero, entiendo esto:

[1]   Illegal instruction     /data/hi

¿Qué paso he olvidado? Sobre la base de la experiencia pasada, este "debería" tener funcionó, pero obviamente arruiné esto.

Author: corbin, 2012-02-17

6 answers

Intente especificar la arquitectura/cpu. Parece que el compilador está creando código con una versión de arquitectura superior a la que el emulador puede manejar.

Esto podría funcionar:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi
 14
Author: Leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-20 10:42:06

Funcionó para mí con CodeBench compiler en ubuntu desktop. https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Simplemente crea un binario estático con este comando:

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

Entonces, adb push hello / data

Ir a, shell adb $ ./data/hola Esto imprimirá Hello World en la terminal. Mismo se puede hacer de teléfono también. Utilice el emulador de terminal o SL4A bash shell para ejecutar.

 9
Author: Srikant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-24 08:18:05

Si hago esto en una máquina Debian (VM en mi caso), todo parece estar bien. No estoy seguro de lo que cuando está mal con hacer similar en Ubuntu. Podría ser como sugirió Leo, pero no puedo confirmarlo. Esto debería funcionar para ti.

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

Alguien agregó este enlace, pero no está utilizando la cadena de herramientas que mencioné en la descripción. Dejándolo en caso de que alguien esté interesar.

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

 3
Author: corbin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-09 20:06:39

Por lo que sé, no puede ejecutar aplicaciones de tierra de usuario dentro de Android que no estén compiladas con alguna forma de gcc-arm-linux-androideabi.

 1
Author: HacDan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-17 08:32:05

Tu código realmente funciona para mí.

Lo compilé en Ubuntu y lo envié a /data/local/tmp

Y luego chmod 777 hi

Finalmente funciona bien.

 0
Author: Dr. Andong Zhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-10 00:37:30

¿has comprobado los permisos de la carpeta de datos ? Trate de usar el local en su lugar ! Usted puede utilizar adb shell y luego cd en la carpeta donde el ejecutable fue empujado y tratar .- hola. Supongo que esto es solo un problema de permisos

 -2
Author: psteelk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-27 15:59:22