Porting packages to MIPS (Español)

From ParabolaWiki
Jump to: navigation, search

Esta página muestra algunos problemas y posibles soluciones en el momento de portar paquetes de Parabola para la arquitectura MIPS.

1 Antes de intentar corregir algún problema

  • verificar si el problema ocurre con la versión mas reciente del paquete.
  • en caso de errores de compilación, verificar si esto también pasa en el x86_64, normalmente, el error sucederá y será mas rápido para corregir.
  • verificar si otras distros de soporte MIPS n32 tiene patch incluido para esto
  • verificar si existen correcciones opcionales. patches o bugs reportados para MIPS o32, SPARC u otras arquitecturas
  • si esto es observado en tiempo de ejecución, verifique si el paquete tiene pruebas automatizados que da la misma forma falle.

2 Enlazando con bibliotecas estáticas

Ocurrió el siguiente error al compilar un paquete:

/usr/bin/ld: /usr/lib/gcc/mips64el-unknown-linux-gnu/4.5.2/../../../libc-client.a(osdep.o): \
relocation R_MIPS_HI16 against `__gnu_local_gp' can not be used when making a shared object; recompile with -fPIC

EL bug está en el paquete que contiene la libreria mencionada, en este caso el imap (pacman -Qo /usr/lib/gcc/mips64el-unknown-linux-gnu/4.5.2/../../../libc-client.a encontra el nombre del paquete).

Nota: Como en x86_64, mips64el exige compilar bibliotecas compartidas con -fPIC, pero en este caso enlazando una biblioteca compartida con una estática, anteriormente esto ya fue intentado en otras ocasiones pero fallaba. Si el paquete soporta x86_64, PKGBUILD probablemente ja agrega esta opción para todas las compilaciones en x86_64, permitiendo así que se resuelva el problema en mips64el.

Una solución adecuada seria conseguir que las bibliotecas sean compartidas en vez de ser estáticas.

3 Error de bus durante la ejecución del paquete

Este tipo de error es causado por acceder a datos no alineados. Si el paquete funciona en o32 y en típicas arquitecturas de 64 bits que requiere alineamiento, el problema seria que los paquetes tiene probablemente el alineado doble de 4 bytes en vez de 8.

Use gdb para localizar el código que está causando el problema, o sea, hacer un puntero no alineado y pasarlo al código que utiliza, como una estructura que contiene un alineado doble. El problema seria corregido agregando relleno para hacer una estructura alineada a 8 bytes.

Ejemplo de informe de error upstream: [1].

4 Instrucción "ilegal" al ejecutar el paquete

Use el gdb para desmontar el codigo. Instrucciones como madd.s genera esto cuando un argumento es usado con un NaN.

Una solución simples consiste en compilar el paquete con -march=mips3 en el CFLAGS en vez de -march=loongson2f, asi de esa manera las instrucciones no serán usadas.

Exemplo: Issue#143.

5 Vinculador fora de memória

Esto es más común cuando los símbolos de depuración están habilitados (-ggdb en CFLAGS). El enlazador escribe que no puede asignar memoria, o simplemente genera error con violación de segmento.

Agregando -Wl,--reduce-memory-overhead -Wl,--no-keep-memory para LDFLAGS, hace usar menos memoria, corrigiendo el problema en pelo menos un caso. Esto hace un enlazamiento mas lento, por eso no debe ser activado al menos que sea necesario.

Exemplo: Issue#91.

6 soelim u otro comando no encontrado por configure

No hay nada especifico en MIPS este problema, esto es causado por paquetes Arch que fueron construidos en un chroot no limpio, teniendo asi, paquetes instalados que no están especificados en depends o makedepends.

Agregue el paquete ofreciendo el comando que faltaba para makedepends.

As veces, un paquete está faltando a pesar de estar en el grupo base o base-devel, esto debería de estar solamente instalado en chroot. Si está siendo eliminado por libremakepkg -c, entonces el paquete (o dependencia) debe ser agregado a /etc/libretools.d/cleansystem (e el bug debe ser comunicado).

7 config.guess no está reconociendo la arquitectura

Pase el argumento --build=$CHOST o --host=$CHOST para ./configure, dependiendo del mensaje de error. En raros casos, el --target=$CHOST debe ser utilizado, pero esto es probablemente un bug en el paquete de programas, ya que la mayoría no tiene un sistema de destino (es útil apenas para compiladores).