Porting packages to MIPS (Deutsch)

From ParabolaWiki
Jump to: navigation, search

Diese Seite listet einige Probleme und mögliche Lösungen bei der Portierung von Parabola-Paketen nach MIPS.

1 Bevor dem Versuch das Paket zu reparieren

  • Überprüfe ob das Problem mit der neuesten Version des Paketes auftritt.
  • Im Fall von Kompilierfehlern, überprüfe auf x86_64. Der Fehler wird üblicherweise auftreten und schneller zu beheben sein.
  • Überprüfe ob andere Distributionen mit Unterstützung für MIPS n32 einen Patch dafür haben.
  • Überprüfe ob es optionale Reparaturen, Patches oder Fehlerberichte für MIPS o32, SPARC oder andere Architekturen gibt.
  • Wenn der Fehler während der Laufzeit beobachtet wird, überprüfe ob das Paket automatisierte Tests hat, die ähnlich fehlschlagen.

2 Linken mit statischen Bibliotheken

Der folgende Fehler tritt beim Kompilieren eines Paketes auf:

/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

Der Fehler ist im Paket welches die genannte Bibliothek enthält, in diesem Fall imap (Der Paketname kann mit pacman -Qo /usr/lib/gcc/mips64el-unknown-linux-gnu/4.5.2/../../../libc-client.a gefunden werden).

Note: Wie auch x86_64, benötigt mips64el, dass gemeinsam genutzte Bibliotheken mit -fPIC kompiliert werden, aber in diesem Fall wurde versucht eine gemeinsam genutzte Bibliothek mit einer statischen zu linken und es ist fehlgeschlagen. Wenn das Paket x86_64 unterstützt, fügt der PKGBUILD wahrscheinlich schon diese Option für die Kompilation unter x86_64 hinzu, es auch für mips64el zu aktivieren würde das Problem lösen.

Die richtige Lösung wäre es gemeinsam genutzte an Stelle von statischen Bibliotheken zu erstellen.

3 Busfehler während der Laufzeit des Paketes

Der Zugriff auf unausgerichtete Daten verursacht solche Fehler. Wenn ein Paket unter o32 und typischen 64bit-Architekturen, die Ausrichtung verlangen, funktioniert, so ist der Fehler wahrscheinlich die Ausrichtung von Doubles auf 4 an Stelle von 8 Byte.

Benutze gdb um den Code zu finden, der das Problem verursacht, d.h. einen unausgerichteten Zeiger erstellt und es Code als eine Struktur, die ein Double enthält, übergibt. Das Problem würde behoben indem man Füllung hinzufügt um die Struktur auf 8 Byte auszurichten.

Beispiel-Fehlerbericht: [1].

4 Unerlaubte Anweisung während der Laufzeit eines Paketes

Benutze gdb um den Code zu disassemblieren. Anweisungen wie madd.s verursachen diesen Fehler, wenn sie mit NaN als Argument benutzt werden.

Ein eine Fehlerumgehung ist es die Pakete mit -march=mips3 in CFLAGS an Stelle von -march=loongson2f zu kompilieren, so dass diese Anweisungen nicht benutzt werden.

Beispiel: [2].

5 Linker: kein freier Hauptspeicher (Out of memory)

Dies tritt häufiger auf, wenn Debug-Symole aktiviert sind (-ggdb in CFLAGS). Der Linker schreibt, dass er keinen Speicher reservieren konnte oder schlägt einfach mit einer Segmentationsverletzung fehl.

Das Hinzufügen von -Wl,--reduce-memory-overhead -Wl,--no-keep-memory zu LDFLAGS lässt ihn weniger Hauptspeicher nutzen und behebt das Problem in mindests einem Fall. Es verlangsamt das Linken allerdings und sollte so nicht aktiviert werden, wenn es nicht nötig ist.

Beispiel: [3].

6 soelim oder eine andere Anweisung nicht von configure gefunden

Dies ist kein MIPS-spezifisches Problem, sondern wird dadurch verursacht, dass Arch-Pakete nicht in einer sauberen "chroot" gebaut werden und dadurch Pakete installiert sind, die nicht in depends oder makedepends spezifiziert sind.

Füge die Pakete, die die fehlenden Anweisungen bereitstellen zu makedepends hinzu.

Manchmal fehlt ein Paket obwohl es zur base oder base-devel Groppe gehört. In diesem Fall sollte es einfach in der "chroot" installiert werden. Wenn es von libremakepkg -c entfernt wird, dann sollte es (oder seine Abhängigkeit) zu /etc/libretools.d/cleansystem hinzugefügt werden (und ein Fehlerbericht erstellt werden).

7 config.guess erkennt die Architektur nicht

Übergebe das --build=$CHOST oder --host=$CHOST Argument zu ./configure, abhängig von der Fehlermeldung. In seltenen Fällen sollte --target=$CHOST benutzt werden, aber das ist wahrscheinlich ein Fehler im Paket, da die meisten Programme kein Zielsystem haben. (Es ist nur für Kompilierer nützlich.)