2012-09-19 24 views
13

Estoy buscando métodos para ejecutar ARM nativo ejecutable en Android 4.1 (Jelly Bean). Por ejemplo, la compilación del programa clásico CEjecutar ARM ejecutable nativo en Jelly Bean

// hello.c 
#include <stdio.h> 
int main() { 
    printf("Hello world"); 
} 

a ARMv7a ejecutable, por ejemplo hello utilizando el NDK de Android y luego ejecutarlo en cáscara de Android. He tratado método sugerido en la web, tales como empujar el ejecutable a /data/local por

adb push hello /data/local 

permiso de modificación para que pueda ser ejecutado por

adb shell chmod 755 /data/local/hello 

y después invocarlos en el intérprete de comandos usando

adb shell /data/local/hello 

El último paso produce el error:

/data/local/hello: not found 

pero evidentemente el archivo está allí. Sospecho que el problema es que el shell de Jelly Bean ya no permite ejecutar binarios alienígenas. ¿Alguien puede confirmar esto y darme una solución?

+3

Esto no es una cuestión de programación para Android tan cerca como puedo ver. Creo que esto sería de interés para los usuarios hardcore de Android. – ale

+0

@ Chak Gracias. Sin embargo, no creo que haya respondido a mi pregunta original. En última instancia, me gustaría ejecutar programas como 'dd' compilando de forma cruzada o utilizando la versión precompilada de ARM. Ahora recuerdo de 'busybox' y 'kbox' que también instalan un nuevo binario en el sistema, así que creo que no hay ningún problema de seguridad aquí. Veré esos trabajos para ver cómo lo hicieron. –

+3

@ Chak - Dado que la pregunta de desbordamiento de pila es de octubre de 2011, y por lo tanto está respondiendo una versión anterior no especificada de Android, la respuesta para Jelly Bean * podría * ser diferente. El interlocutor realmente solo quiere que alguien confirme si es o no, lo cual es una pregunta práctica y confiable sobre Android. –

Respuesta

6

Si desea ejecutar un binario ARM nativo en Android, debe compilar con -static.

El libc que se utiliza para construir (si se utiliza la cadena de herramientas ARM estándar y no Android NDK) es diferente de Android de libc (biónica) y por lo tanto cuando su binario tiene la intención de enlazar dinámicamente a libc en el blanco no lo hará porque libc no existe en el destino.

Con la opción -static que vincular en lo que necesita de libc en tiempo de compilación y no tiene que preocuparse acerca de la vinculación de las cosas de forma dinámica.

0

Comprueba que adb push no está volcando un error "Permiso denegado". La existencia de un archivo de comprobación ejecutando: adb shell ls/data/local

Desde que actualicé a 4.0.4 no puedo acceder a/data/local sino a/data/local/tmp, y esto explicaría el mensaje "No encontrado" "error.

+0

Resuelvo el problema instalando la cadena de herramientas autónoma NDK de Google y recompilando el código fuente con ella. Debe haber algunas cosas misteriosas que la cadena de herramientas hace bajo el capó. –

Cuestiones relacionadas