From: Sören Tempel <soe...@soeren-tempel.net> On glibc-based systems, off_t is a 32-bit type on 32-bit systems and a 64-bit type on 64-bit systems by default. However, on systems using musl libc off_t is unconditionally a 64-bit type. As such, it is insufficient to use a uintptr type for the mmap offset parameter.
Presently, the (incorrect) mmap declaration causes a libgo run-time failure on 32-bit musl systems (fatal error: runtime: cannot allocate memory). This commit fixes this run-time error. Signed-off-by: Sören Tempel <soe...@soeren-tempel.net> --- This implements what has been proposed by Ian in a GitHub comment https://github.com/golang/go/issues/51280#issuecomment-1046322011 I don't have access to a 32-bit glibc system to test this on but this does seem to work fine on 32-bit and 64-bit musl systems. libgo/go/runtime/mem_gccgo.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libgo/go/runtime/mem_gccgo.go b/libgo/go/runtime/mem_gccgo.go index fa3389d8..07bf325a 100644 --- a/libgo/go/runtime/mem_gccgo.go +++ b/libgo/go/runtime/mem_gccgo.go @@ -15,7 +15,7 @@ import ( //go:linkname sysFree //extern mmap -func sysMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uintptr) unsafe.Pointer +func sysMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off _off_t) unsafe.Pointer //extern munmap func munmap(addr unsafe.Pointer, length uintptr) int32 @@ -38,7 +38,7 @@ func init() { } func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uintptr) (unsafe.Pointer, int) { - p := sysMmap(addr, n, prot, flags, fd, off) + p := sysMmap(addr, n, prot, flags, fd, _off_t(off)) if uintptr(p) == _MAP_FAILED { return nil, errno() }