Se ha descrito en ART wiki: https://en.m.wikipedia.org/wiki/Android_Runtime?_e_pi_=7%2CPAGE_ID10%2C1898354483 , que ART compila los archivos apk en archivos ELF durante la instalación.
Y GCC en GNU/Linux también crea archivos ELF como salida, últimamente en lugar del formato a.out.
Sé que hay diferencias en la API y la arquitectura en ambos entornos, pero ¿hay alguna diferencia estructural o notable en estos dos formatos?
¿Estos formatos son compatibles entre sí, si la arquitectura es la misma (dado que Android se ha portado a x86)?
¿O estos dos formatos de archivo son completamente diferentes?
Explicación casera: en PDF (Dalvik y ART) puede encontrar que "los archivos OAT están realmente incrustados en archivos de objetos ELF" (en la página 16 de PDF puede ver la estructura OAT). La estructura de archivos es la misma que en wiki . Es posible porque ELF "es flexible y extensible por diseño, y no está vinculado a ningún procesador o arquitectura en particular".
Del formato elf en wikipedia : con Android Runtime (ART), el valor predeterminado desde Android 5.0 "Lollipop", todas las aplicaciones se compilan en binarios ELF nativos al momento de la instalación.
Conclusión: la respuesta a su pregunta es que gcc elf y android elf tienen el mismo formato de archivo. Puede encontrar más información sobre el formato en wiki .
Actualizar
"¿Estos formatos son compatibles entre sí, si la arquitectura es la misma?"
Readelf para el archivo oat de Android (comprobado con una de las aplicaciones que tengo) muestra que el tipo de archivo oat es "DYN (archivo de objeto compartido)". Es similar a los archivos .so que podría ver si su proyecto usa JNI libs. Esos archivos elf no son compatibles con los archivos elf habituales de GNU/Linux, incluso si están creados para la misma arquitectura debido a las "funciones de la biblioteca del sistema bionic y al enlazador dinámico" (que se usa en Android). Puede encontrar más descripción sobre por qué no son compatibles aquí . Bionic en wiki .