No se puede compilar de forma cruzada Mono para ARM
cross-compiling embedded-linux (2)
Debe tener mucho cuidado con los encabezados y bibliotecas que compila en el momento de la compilación cruzada o puede encontrarse con bloqueos extraños y contraintuitivos en el tiempo de ejecución causados por incompatibilidades binarias contra las bibliotecas. Al decir esto, las distribuciones Linux ARM juegan muy seguras con la compatibilidad binaria, generalmente a expensas del rendimiento.
Es muy posible que esté compilando contra los encabezados y bibliotecas de hosts de desarrollo, por lo que la arquitectura no coincide.
Es posible que solo descubra que las imágenes de opkg preconstruidas simplemente funcionan. Angstrom proporciona paquetes preconstruidos para usted. Puede ser tan simple como la instalación de red desde el repositorio de paquetes de Angstrom.
Si encuentra que necesita construir desde el origen, una solución simple a su problema sería obtener el entorno de construcción para Angstrom y usarlo para construir mono. La forma más fácil de solucionar esto es obtener una imagen precompilada (y una imagen de desarrollo) del generador de imágenes en línea de Angtrom . Con un poco de suerte, existe uno para su tablero.
Esta pregunta ya tiene una respuesta aquí:
- Compilación cruzada mono para la respuesta de dispositivo ARM propietario 1
Durante los últimos tres días he intentado compilar de forma cruzada Mono 2.11.4 para la placa TechNexion Blizzard (ejecutando una versión desconocida de Angstrom) usando un Ubuntu virtual (12.04) en mi máquina Win7 de 32 bits y CodeSourcery Sourcery G ++ ARM toolchain , pero con poco o ningún éxito. He seguido todos los tutoriales en la web, pero simplemente no funciona.
CodeSourcery Sourcery G ++ toolchain y Scratchbox2 (compilados a partir de las últimas fuentes de git) están instalados y funcionando. Scratchbox2 lo configuró usando
sb2-init armv7 /home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-gcc
mientras está en el directorio correcto (~ / CodeSourcery / Sourcery_G ++ _ Lite / arm-none-linux-gnueabi / libc).
Puedo compilar un simple ''Hola mundo'' (cpp), compilarlo y ejecutarlo en la pizarra. En Ubuntu:
file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
Yo descargué la fuente para Mono 2.11.4 y seguí una de las instrucciones . La primera parte (en la máquina nativa) funciona bien, sin errores. Sin embargo, cuando ejecuto la segunda parte (compilación para ARM) ./configure funciona como se esperaba pero luego falla con "../lib/mini[some_file] incompatible con la salida del brazo" . Un archivo en estos archivos dice que son, de hecho, ejecutables Intel 80386, pero no sé por qué.
Entonces, el siguiente paso fue ejecutar una limpieza y repetir los pasos, pero aun así produjo el mismo resultado.
Luego traté de ./configure y hacer todo dentro de sb2 y pareció funcionar al principio. Pero luego aparecieron algunos errores al compilarse:
./.libs/libmini.a(libmini_la-mini-arm.o): In function `mono_arch_init'':
/home/dev/source/host-mono/mono-2.11.4/mono/mini/mini-arm.c:689: undefined reference to `debugger_agent_single_step_from_context''
/home/dev/source/host-mono/mono-2.11.4/mono/mini/mini-arm.c:689: undefined reference to `debugger_agent_breakpoint_from_context''
/home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld: .libs/libmono-2.0.so.1.0.0: hidden symbol `debugger_agent_single_step_from_context'' isn''t defined
/home/dev/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi-ld: final link failed: Nonrepresentable section on output
¿Alguna idea sobre lo que estoy haciendo mal o algún consejo sobre tutoriales que podría haber perdido?
// Anders
Es mejor usar ScratchBox para compilar código nativo
[sbox-ARMEL: ~] > mkdir cross
[sbox-ARMEL: ~] > cd cross
[sbox-ARMEL: ~] > tar xzf ../mono-x.xx.tar.gz
[sbox-ARMEL: ~] > cd arm-mono-x.xx
[sbox-ARMEL: ~] > ./configure --disable-mcs-build
[sbox-ARMEL: ~] > make
[sbox-ARMEL: ~] > make install DESTDIR=`pwd`/tmptree
en el otro lado, abra una nueva terminal y cree un código administrado.
$ mkdir host-mono
$ cd host-mono
$ tar xzf ../mono-1.xx.tar.gz
$ cd mono-1.xx
$ ./configure
$ make
$ make install DESTDIR=`pwd`/tmptree