2012-02-17 11 views
32

Quiero construir un hello world estático desde C usando arm-linux-gnueabi-gcc en lugar de utilizar la cadena de herramientas independiente de NDK o Codesourcery para ese caso .Compilación cruzada de C hello world para Android usando arm-linux-gnueabi-gcc

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; 
} 

he recopilado esta manera:

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

I r una que en un emulador de esta manera:

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

Pero, me sale esto:

[1] Illegal instruction  /data/hi 

Qué paso he olvidado? Basado en experiencias pasadas, este "debería" haber funcionado, pero obviamente lo arruiné.

+0

Btw .. Haciendo esto en Ubuntu Oneiric Ocelot. Además, arm-linux-gnueabi-gcc es un enlace a la versión 4.6 de gnueabi-gcc. – corbin

+0

¿Cuál es su versión de Ubuntu? ¿Cuál es la versión del SDK u otros detalles del emulador? –

Respuesta

3

Si hago esto en una máquina Debian (VM en mi caso), todo parece ir bien. No estoy seguro de qué pasa cuando hago algo similar en ubuntu. Podría ser como sugirió Leo, pero no puedo confirmarlo. Sin embargo, esto debería funcionar para ti.

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

Alguien ha añadido este enlace, pero no está utilizando el conjunto de herramientas que he mencionado en la descripción. Dejándolo en caso de que alguien esté interesado.

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

1

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

+0

Esto se ha hecho con la misma cadena de herramientas, código sourcery y otros. Solo buscando el paso que falta. – corbin

+1

Incorrecto. Funciona con armv5tel-redhat-linux-gnueabi-gcc, por ejemplo. Mientras compiles binarios estáticos y la arquitectura es correcta, funciona. – thejh

14

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 
+0

Gracias por la respuesta. Resultado inmediato (cavará más), reciba una advertencia: la CPU de destino no admite las instrucciones de PULGAR [habilitadas por defecto]. Pero todavía genera un resultado. Luego, si presiono eso en el dispositivo, obtengo la misma instrucción ilegal. – corbin

+1

Si utilicé -march = armv5te no recibo la advertencia, pero sigo recibiendo el error de instrucción ilegal. Similar si uso -march = armv5te -mthumb. – corbin

+2

Puede ser que las bibliotecas estándar para arm-linux-gnueabi-gcc utilicen una arquitectura más alta que el emulador (aunque esto suena extraño). Obtuvimos el mismo error al compilar con CodeSourcery para un dispositivo con una CPU ARMv4. Aparentemente, las bibliotecas de CodeSourcery eran todas ARMv5. – Leo

-2

¿Ha comprobado los permisos de la carpeta de datos? ¡Intenta usar el local en su lugar! Puede usar adb shell y luego hacer un cd en la carpeta donde se ejecutó el ejecutable e intentar con ./hi. Supongo que esto es solo un problema de permisos

+2

¿No debería entonces quejarse de permiso denegado en lugar de instrucción ilegal? No creo haber recibido "instrucción ilegal" a menos que realmente haya habido algún tipo de problema con el binario. – Leo

+0

(Sí, esta respuesta es claramente incorrecta) –

9

que trabajó para mí con Codebench compilador en el escritorio de Ubuntu. https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Basta con crear un binario estático con este comando:

brazo-ninguno-linux-gnueabi-gcc -o hola hola.c -static

a continuación, empuje ADB hola/datos

vaya a, adb shell $ ./data/hello Esto imprimirá Hello World en la terminal. Lo mismo se puede hacer desde el teléfono también.Use el emulador de terminal o SL4A bash shell para ejecutar.

+1

Esta debería ser la respuesta aceptada, aunque explique el comando y sus parámetros. –

0

Tu código funciona en realidad para mí.

compilé en Ubuntu y lo empuja al/datos/local/tmp

Y luego chmod 777 hi

Por último funciona bien.

+0

Me di cuenta (no estoy seguro de si esto todavía es cierto) de que el compilador cruzado que ubuntu estaba tomando de forma predeterminada solo admitía hard float y mi dispositivo era uno anterior que no funcionaba con eso. – corbin