0 votos

¿Por qué son diferentes los archivos ELF de Android?

Cuando intento ejecutar un archivo x64 ELF que fue compilado para Android en mi PC de escritorio, recibo un error de "archivo no encontrado".

Creo que es normal porque los archivos ELF de Android no son compatibles con los archivos ELF normales.

¿Cuál es la razón detrás de esto?

1voto

John Dallman Puntos 103

El formato de archivo ELF es el mismo. La diferencia está en las rutas de archivo incrustadas en el archivo ELF.

ELF es un formato muy general, que puede codificar muchas cosas sobre el contenido de un archivo. Linux, Android y muchos otros sistemas operativos utilizan el formato ELF para ejecutables y bibliotecas, pero eso no los hace compatibles. Es como tener direcciones para diferentes viajes por carretera. Todos están escritos en el mismo idioma (correspondiente a ELF) pero tratar de seguir las direcciones para llegar a Colonia desde Stuttgart cuando estás saliendo de Frankfurt no funcionará.

Según los comentarios, si construyes un ejecutable completamente vinculado estáticamente para x86-64, es posible que funcione tanto en el emulador de Android como en tu escritorio de Linux. Sin embargo, la mayoría de los programas necesitan usar bibliotecas del sistema, y el enlazador incrusta los nombres de esas bibliotecas y la ruta al enlazador en tiempo de ejecución en tus ejecutables ELF.

Aunque Android utiliza un kernel de Linux, las bibliotecas del sistema y el enlazador en tiempo de ejecución son completamente diferentes a las de Linux. Android utiliza la biblioteca Bionic, y la mayoría de los sistemas Linux utilizan glibc. Esto fue deliberado: Android fue diseñado originalmente para dispositivos bastante lentos sin mucha RAM, y necesitaba una biblioteca que no ocupara mucho espacio y se ejecutara rápidamente. Glibc podía asumir hardware más potente.

El enlazador en tiempo de ejecución de Android es /system/bin/linker (o /system/bin/linker64 para código de 64 bits). El enlazador en tiempo de ejecución de Linux es generalmente /lib/ld.so (o /lib64/ld-linux-x86-64.so.2 para código de 64 bits). Obviamente, estas son rutas diferentes, y cada una solo existe en el sistema operativo correspondiente. El error de "archivo no encontrado" que obtienes al ejecutar un archivo ELF de Android en Linux es una queja de que /system/bin/linker64 no existe en tu sistema Linux.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X