He intentado durante un par de días para compilar un ARM nativo de Android ARM que se ejecutará en mi teléfono usando una aplicación de terminal. Quiero generar el mismo tipo de binario que los binarios estándar de Posix instalados en el teléfono como ls, mkdir, etc. He descargado el NDK de Android bajo Mac OS X y he podido compilar binarios ELF simples sin errores. Sin embargo, cuando los transfiero al teléfono, siempre segfault. Es decir, segfault cuando se compila con -static en GCC. Si no uso -estático, se quejan de que no están vinculados, etc. En pocas palabras, no funcionan.Quiero compilar un binario nativo de Android Puedo ejecutarlo en la terminal en el teléfono
Mi hipótesis es que no están enlazando correctamente a la biblioteca estándar C de Android. Aunque estoy vinculando mis binarios con la libc proporcionada por el NDK, todavía no funcionan. Leí que Android usa la biblioteca Bionic C, y traté de descargar la fuente para ello, pero no estoy seguro de cómo crear una biblioteca a partir de ella (parece que todo es ensamblado ARM).
¿Es cierto que la biblioteca de Android C en el teléfono es diferente de la proporcionada con el NDK de Android? ¿El que se incluye con el NDK no me permite compilar los binarios nativos que puedo ejecutar a través de un terminal? Cualquier orientación aquí es muy apreciada!
Actualización:
finalmente conseguí que esto funcione usando GCC 4.7.0 en Mac OS X. He descargado los encabezados de Bionic y luego compilado un binario enlazado dinámicamente utilizando la biblioteca de C que viene con el NDK de Android . Pude obtener una aplicación de prueba para que funcionara en el teléfono usando la biblioteca C del teléfono (el binario era de 33K). También traté de vincular estáticamente contra la biblioteca C de NDK, y eso también funcionó.
Para que todo esto funcione, tuve que pasar -nostdlib a GCC y luego agregar manualmente crtbegin_dynamic.o y crtend_android.o a la línea de comandos de GCC. Funciona así:
$CC \
$NDK_PATH/usr/lib/crtbegin_dynamic.o \
hello.c -o hello \
$CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
Para binarios estáticos, utilice "crtbegin_static.o." Esto se explica en la fuente crtbegin_dynamic.S/crtbegin_static.S.
Para este experimento, utilicé simplemente 'ol GCC 4.7.0 y Binutils 2.22. También compilé GCC con newlib, pero en realidad no estoy vinculando mis binarios ARM con newlib. Estoy forzando a GCC/ld a vincular directamente a la libc proporcionada con Android NDK, o en el caso de los binarios dinámicos, a la libc en el teléfono.
FYI, si se configura una acumulación como si estuviera haciendo una biblioteca JNI (ver los ejemplos en la distribución NDK) y cambiar BUILD_SHARED_LIBRARY en el Android.mk a BUILD_EXECUTABLE obtendrá un ejecutable, aunque esta es una función no oficial (podría desaparecer, etc.) del sistema de compilación ndk. –
Posible duplicado de [¿Cómo puedo ejecutar C binary (archivo ejecutable) en Android desde Android Shell] (http://stackoverflow.com/questions/9868309/how-can-i-run-c-binary-executable-file- in-android-from-android-shell) –