Porting packages to MIPS
This page lists some problems and potential solutions when porting Parabola packages to MIPS.
1 Before trying to fix it
- check if the problem occurs with newest release of the package
- in case of build errors, check on x86_64, typically the error will occur and will be quicker to fix
- check if other distros supporting MIPS n32 have a patch for it
- check if there are optional fixes, patches or bugs reported for MIPS o32, SPARC or other architectures
- if it's observed at runtime, check if package has automated tests which similarly fail
2 Linking with static libraries
The following error occurred when compiling a package:
/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
The bug is in the package containing the mentioned library, in this case imap (
pacman -Qo /usr/lib/gcc/mips64el-unknown-linux-gnu/4.5.2/../../../libc-client.a finds the package name).
A proper fix would be to make shared libraries instead of static ones.
3 Bus error when running the package
Accessing unaligned data causes such error. If a package works on o32 and typical 64-bit architectures requiring alignment, the problem is probably in having doubles aligned to 4 instead of 8 bytes.
Use gdb to find the code causing the problem, i.e. making an unaligned pointer and passing it to code using it as a structure containing a double. The problem would be fixed by adding padding to make this structure aligned to 8 bytes.
Example upstream bug report: .
4 "Illegal" instruction when running the package
Use gdb to disassemble the code. Instructions like
madd.s cause it when used with a NaN in an argument.
A simple workaround is to compile the package with
-march=mips3 in CFLAGS instead of
-march=loongson2f so these instructions won't be used.
5 Linker out of memory
This is more common when debug symbols are enabled (
-ggdb in CFLAGS). Linker writes that it cannot allocate memory, or just fails with segmentation violation.
-Wl,--reduce-memory-overhead -Wl,--no-keep-memory to LDFLAGS makes it use less memory, fixing the problem in at least one case. It makes linking slower, so it shouldn't be enabled when not needed.
soelim or another command not found by
There is nothing MIPS-specific in this problem, it's caused by Arch packages being built not in a clean chroot, thus having installed packages not specified in
Add the package providing the missing command to
Sometimes a package is missing despite being in the
base-devel group, it should be just installed in the chroot. If it's being removed by
libremakepkg -c, then it (or its dependency) should be added to
/etc/libretools.d/cleansystem (and a bug should be reported).
config.guess not recognizing the architecture
--host=$CHOST argument to
./configure, depending on the error message. In rare cases
--target=$CHOST should be used, but it's probably a bug in the package since most programs don't have a target system (it's only useful for compilers).
There is another reason for this script to fail: it needs the C compiler to determine endian (eb or el in the architecture name) and fails if the compiler fails. This typically occurs when updating gcc after its dependencies changing SONAME (the fix described in the previous paragraph would make it fail more clearly in another configure test).
8 Undeclared function
This usually isn't MIPS-specific. Check the man page of the function mentioned in the error message, the source file probably doesn't include the header where POSIX states it to be declared (older GCC and GLIBC included it in other headers) or, if it's a GNU extension, declares _GNU_SOURCE after including a header. Patch it to fix this.