Porting packages to MIPS (Deutsch)
Diese Seite listet einige Probleme und mögliche Lösungen bei der Portierung von Parabola-Paketen nach MIPS.
Contents
- 1 Bevor dem Versuch das Paket zu reparieren
- 2 Linken mit statischen Bibliotheken
- 3 Busfehler während der Laufzeit des Paketes
- 4 Unerlaubte Anweisung während der Laufzeit eines Paketes
- 5 Linker: kein freier Hauptspeicher (Out of memory)
- 6 soelim oder eine andere Anweisung nicht von configure gefunden
- 7 config.guess erkennt die Architektur nicht
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).
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.)