2012-04-30 23 views
9

He estado compilando varias herramientas de Linux (y parte de mi propio código C) para Android y uno de los desafíos que enfrento es que la libc de Android tiene algunos componentes faltantes/eliminados y me acaban de parcheo mi código para que funcione con libc de Android (por ejemplo, un problema como este http://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.html)Enlace estático de Android vs enlace dinámico contra glibc

P1: ¿Cómo hago para estáticamente ligado con glibc (y otras dependencias), mientras-compilación cruzada con la cadena de herramientas del brazo (o ndk-build)?

Q2: ¿Es una buena idea vincular estáticamente contra glibc para binarios para Android? ¿Debo esperar que algo se rompa si empiezo a enlazar estáticamente? ¿Hay problemas de rendimiento/memoria?

entiendo la mayoría de los pros y los contras de estática vs vinculación dinámica de aquí - C++ application - should I use static or dynamic linking for the libraries? y Static linking vs dynamic linking

Así que deseo saber si debería ser estáticamente que une glibc para Android cuando cruzada compilación de binarios.

Respuesta

5

Primero una pequeña nota sobre la libc. La libc de Android es la libc Bionic (https://github.com/android/platform_bionic/) en lugar de la libc de GNU (glibc). Por lo tanto, la libc contenida en el NDK es Bionic, al igual que la libc disponible en dispositivos Android.

En lo que se refiere a glibc, es posible construirlo con el NDK. Sin embargo, su nombre chocará con la libc del sistema cuando esté instalado en dispositivos Android. Tenga en cuenta que esto es solo si va a construir una biblioteca dinámica. Si construye la libc de GNU como una biblioteca estática, entonces todo el problema anterior se soslaya, ya que nunca necesita instalar una biblioteca estática.

Ahora que responde a sus preguntas:

  1. P1: Si usted está construyendo la glibc utilizando el NDK, entonces el Android.mk utiliza la variable BUILD_STATIC_LIBRARY para construir bibliotecas estáticas. Sin embargo, si no usa el NDK, entonces probablemente deba experimentar muchos dolores de cabeza (no sabe cuánto). No puedo contarte más sobre esto ya que no he intentado construir glibc, ya sea estático o dinámico. Además, parece que la vinculación estática con glibc es altamente desaconsejable, al menos para plataformas no móviles.

  2. Desde el punto de vista de la ruptura, no hay diferencia entre los enlaces estáticos y dinámicos. Desde el punto de vista de la puesta en marcha, un ejecutable estático se inicia más rápido ya que el paso de carga de las bibliotecas dinámicas no es necesario. No hay penalización de memoria o velocidad de ejecución en ejecutables vinculados estáticos o dinámicos. El requisito de almacenamiento en disco es mayor para los ejecutables estáticos.

En cuanto a los problemas con la funcionalidad libc biónica falta, puede utilizar el método utilizado por la mayoría del software GNU, que es, proporcionar su propia implementación de una función en caso de que no se encuentra en las bibliotecas del sistema. He compilado el archivo-5.11, GNU make 3.82, diffutils-2.8 para Android pasando los toolchains NDK/includes/libs a autotools (./configure ...). Parece que estos programas contienen implementaciones de la mayor parte de la función de biblioteca no esencial, en caso de que las bibliotecas estándar no las proporcionen (en este caso, Bionic).

Nota: Intentaré construir un glibc estático y actualizaré la respuesta cuando tenga éxito/fallo.

+1

No es solo el uso en el disco, también aumenta el uso en la memoria. Cuando vincula las bibliotecas jni de la aplicación Android con Bionic libc, hereda el acceso compartido de solo lectura a una copia que ya está en la memoria. –

+0

¿Podría indicarme su fuente de información sobre esto? Quiero saber más, pero no puedo encontrar nada sobre esto. Sé que si las bibliotecas contienen datos, los datos no parecen estar compartidos entre los procesos, sin embargo, puede ser un caso de duplicación de copia de escritura de las páginas de memoria si el código de la biblioteca cambia sus variables de datos internas. – Samveen

+0

Creo que ChrisStratton menciona: el caso de libc enlazado estáticamente. Cada proceso terminaría con su propia copia completa de TODAS las secciones de la misma biblioteca. Con la vinculación dinámica, tiene razón @Samveen – Tuxdude

2

Si va a utilizar glibc en lugar de biónico, puede valer la pena examinar el uso de la cadena de herramientas de una distribución arm-linux (generación de kernel compatible) en lugar de la ndk.Esto sería especialmente cierto si estuviera generando un ejecutable de línea de comando. (La gente ha introducido experimentalmente entornos chroot debian en dispositivos Android hasta el G1)

Para un sub jni (que sigue siendo el único vehículo respaldado oficialmente por el código de aplicación nativo) podría ser un poco "interesante" con cualquiera toolchain, ya que se ejecutará en un proceso que ya se ha mapeado y está haciendo un uso continuo de la libc biónica para admitir la VM Dalvik. Es de suponer que si vincula estáticamente las dependencias de la biblioteca, no se encontrará con conflictos de nombres, pero espero que sea cual sea el camino que elija, será una experiencia de aprendizaje sobre el funcionamiento interno, y no es necesariamente algo malo.

¿Tienes que tener ncurses? Construí con éxito maldiciones para android con el ndk una vez. También considere si el programa está aprovechando seriamente eso (es decir, ¿está realmente haciendo un formato de texto sustancial?), O simplemente usándolo para algo pequeño porque se asumió que estaba disponible en los sistemas de destino.

+0

Puede acercarse y responder esta pregunta: http://stackoverflow.com/questions/10798357/want-to-compile-native-android-binary-i-can- run-in-terminal-on-the-phone –

Cuestiones relacionadas