Package: libklibc
Version: 2.0.4-11
Severity: important
Tags: patch upstream

[Possibly this should be RC, but most things do indeed work - I'll leave
that up to you]


I recently noticed that a mips64el initramfs built in unstable was
giving an unusual error (the boot continues as if no error had happened):
> Begin: Running /scripts/init-bottom ... Bus error
> done.

I traced this bug to the "nuke" command which ends up (intentionally)
calling unlink on a directory. A Bus Error then happened in the klibc
syscall handler when writing the new errno.

This happens because klibc is compiled with PIC enabled on mips64el and
the assembler expects the PIC $gp register to be set up correctly for
the store to work. Since it contained a bogus value, the program failed.
I think that when PIE was not enabled in 2.0.4-9, applications wouldn't
mess with the $gp register and by chance it happened to be the correct
value when entering the syscall handler.

I have fixed the bug in the attached patch which disables PIC code
(using the -mno-abicalls option) and adjusted the link flags so the
build still works.

I also submitted this patch and a few others upstream. The other patches
are mostly cleanups and are not that important. They will probably
appear here when the archives refresh themselves:

From 65bf5068d8f65cb26b1550b1c0f3c4f7db5d6e12 Mon Sep 17 00:00:00 2001
From: James Cowgill <>
Date: Fri, 2 Mar 2018 14:48:21 +0000
Subject: [PATCH 1/5] mips64: compile with -mno-abicalls

By default, the MIPS toolchain compiles all code as PIC. Since klibc
links everything at static addresses, we don't need PIC code so use
-mno-abicalls to disable it. To fix subsequent link errors, use
-Ttext-segment to adjust the base address of klibc to a more sensible

This fixes a bug in the shared library form of klibc where programs
would segfault in the syscall handler because we tried to store into the
"errno" variable without setting up the gp register. This is only required
under the PIC ABI.

Signed-off-by: James Cowgill <>
 usr/klibc/arch/mips64/MCONFIG | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/usr/klibc/arch/mips64/MCONFIG b/usr/klibc/arch/mips64/MCONFIG
index b37cc6a7..6a4b41b2 100644
--- a/usr/klibc/arch/mips64/MCONFIG
+++ b/usr/klibc/arch/mips64/MCONFIG
@@ -7,7 +7,17 @@
 # accordingly.
+KLIBCARCHREQFLAGS = -fno-pic -mno-abicalls -G 0
-KLIBCSHAREDFLAGS  = -T $(src)/arch/mips/klibc.ld
+# Extra linkflags when building the shared version of the library
+# This address needs to be reachable using normal inter-module
+# calls, and work on the memory models for this architecture
+# 4862 MB - normal binaries start at 4608 MB. Non-PIC jumps usually
+# use the JAL instruction which requires a destination within the same
+# 256M aligned region. Since we can't put ourselves below the normal
+# load address, use the very top of the 256M region (minus 2MB)
+# Use -Ttext-segment so that the special .MIPS* sections are moved as well.
+KLIBCSHAREDFLAGS     = -Ttext-segment 0x12FE00000

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to