Porting packages to MIPS (Galego)

From ParabolaWiki
Jump to: navigation, search

Esta páxina mostra algúns problemas e posibles solución ao portar paquetes do Parabola para MIPS.

1 Antes de tentar correxilo

  • Verificar se o problema ocorre coa versión máis recente do paquete
  • No caso de que sexan erros de compilación, verificar isto tamén no x86_64, normalmente, o erro ocorrerá e será mais rápido para correxir
  • Verificar se outras distros que soporte MIPS n32 ten un patch para él
  • verificar se existen correccións opcionais, patches ou bugs reportados para MIPS o32, SPARC ou outras arquitecturas
  • Se é observado en tempo de execución, verifique se o paquete ten probas automaticas que da mesma forma falle.

2 Vinculando con bibliotecas estáticas

Ocorreu o seguinte erro ao compilar um pacote:

/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

O bug está no paquete que contén a biblioteca mencionada, neste caso o imap (pacman -Qo /usr/lib/gcc/mips64el-unknown-linux-gnu/4.5.2/../../../libc-client.a encontra o nome do pacote).

Note: Como no x86_64, o mips64el esixe compilar bibliotecas compartidas con -fPIC, pero neste caso vinculando unha biblioteca compartida con unha estática, xa foi tentado anteriormente e fallado. Se o pacote soporta x86_64, PKGBUILD probablemente xa engada esa opción para todas as compilacións en x86_64, permitindo tamén que mips64el resolvese o problema.

Unha solución adecuada seria conseguir que as bibliotecas sexan compartidas en vez de ser estáticas.

3 Erro de bus durante a execución do paquete

Aceso a datos non aliñados causa ese erro. Se o paquete funciona no o32 e típicas arquitecturas de 64 bits que require aliñamento. o problema é que os paquetes teñen probablemente o dobre aliñado con 4 bytes en vez de 8.

Utilice o gdb para localizar o código que está causando o problema, e dicir, facer un punteiro desaliñado e pasalo ao código utilizando como unha estructura que contén un duplo. O problema seria correxido engadindo recheo para facer esta estructura aliñada a 8 bytes.

Exemplo de relatório de bugs upstream: [1].

4 Instrucción "ilegal" ao executar o paquete

Utilice o gdb para desmontar o código. Instrucións de como madd.s causa isto cando é utilizado cun NaN nun argumento.

Unha solución simple consiste en compilar o paquete con-march = mips3 </ code> en vez de CFLAGS-march = <code> loongson2f </ code>, asi deste xeito as instrucións non serán utilizadas.

Exemplo: Issue#143.

5 Vinculador fora de memória

Isto é máis comun cando os símbolos de depuración estan habilitados (<code>-ggdb in CFLAGS). O vinculador escribe que non pode asignar a memória, ou apenas falla con violación de segmentación.

Engadindo -Wl,--reduce-memory-overhead -Wl,--no-keep-memory para LDFLAGS fai utilizar menos memória, correxindo o problema en polo menos un caso. Isto fai a vinculación máis lenta, por iso non debe ser activado cando non sexa necessária.

Exemplo: Issue#91.

6 soelim ou outro comando non encontrado por configure

Non hai nada específico en MIPS deste problema, isto é causado por paquetes Arch que foran construídos nun chroot non limpo, tendo así os paquetes instalados non especificados no depends ou makedepends.

Engada o pacote proporcionando o comando que faltaba para makedepends.

Às vezes, un paquete está faltando a pesar de estar no grupo base ou base-devel, isto deberia esta soamente instalado no chroot. Se isto está sendo removido por libremakepkg -c, entón o paquete (ou dependência) debe ser engadido ao /etc/libretools.d/cleansystem (e un bug debe ser comunicado).

7 config.guess non está recoñecendo a arquitectura

Pase o argumento --build=$CHOST ou --host=$CHOST para ./configure, dependendo da mensaxe de erro. Nuns casos raros --target=$CHOST debe ser utilizado, pero isto é probablemente un bug no paquete de programas xa que a maioria non ten un sistema de destino (apenas é util para compiladores).