cmd/link: fix mode parameter to fallocate on Linux

Fix the mode parameter to fallocate on Linux which is the operation mode
and not the file mode as with os.OpenFile.

Also handle syscall.EINTR.

Fixes #38950

Change-Id: Ieed20d9ab5c8a49be51c9f9a42b7263f394a5261
Reviewed-on: https://go-review.googlesource.com/c/go/+/232805
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
diff --git a/src/cmd/link/internal/ld/outbuf_linux.go b/src/cmd/link/internal/ld/outbuf_linux.go
index 93e621a..bd9a0c6 100644
--- a/src/cmd/link/internal/ld/outbuf_linux.go
+++ b/src/cmd/link/internal/ld/outbuf_linux.go
@@ -7,5 +7,5 @@
 import "syscall"
 
 func (out *OutBuf) fallocate(size uint64) error {
-	return syscall.Fallocate(int(out.f.Fd()), outbufMode, 0, int64(size))
+	return syscall.Fallocate(int(out.f.Fd()), 0, 0, int64(size))
 }
diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go
index e6ee041..e2e50cc84 100644
--- a/src/cmd/link/internal/ld/outbuf_mmap.go
+++ b/src/cmd/link/internal/ld/outbuf_mmap.go
@@ -10,8 +10,12 @@
 	"syscall"
 )
 
-func (out *OutBuf) Mmap(filesize uint64) error {
-	err := out.fallocate(filesize)
+func (out *OutBuf) Mmap(filesize uint64) (err error) {
+	for {
+		if err = out.fallocate(filesize); err != syscall.EINTR {
+			break
+		}
+	}
 	if err != nil {
 		// Some file systems do not support fallocate. We ignore that error as linking
 		// can still take place, but you might SIGBUS when you write to the mmapped