]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/link/internal/ld,syscall: drop $INODE64 suffixes on simulators
authorElias Naur <mail@eliasnaur.com>
Sat, 27 Apr 2019 09:36:40 +0000 (11:36 +0200)
committerElias Naur <mail@eliasnaur.com>
Sat, 27 Apr 2019 21:47:07 +0000 (21:47 +0000)
Some libc functions are suffixed with "$INODE64" on macOS.
Unfortunately, the iOS simulator doesn't have the suffixes, so we can't
use GOARCH to distinguish the two platform.

Add linker support for adding the suffix, using the macho platform
to determine whether it is needed.

While here, add the correct suffix for fdopendir on 386. It's
"$INODE64$UNIX2003", believe it or not. Without the suffix,

GOARCH=386 go test -short syscall

crashes on my Mojave machine.

Fixes #31447

Change-Id: I9bd3de40ece7df62f744bc24cd00909e56b00b78
Reviewed-on: https://go-review.googlesource.com/c/go/+/174199
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/link/internal/ld/macho.go
src/syscall/mksyscall.pl
src/syscall/syscall_darwin.go
src/syscall/syscall_darwin_386.go
src/syscall/syscall_darwin_amd64.go
src/syscall/syscall_darwin_arm.go
src/syscall/syscall_darwin_arm64.go
src/syscall/zsyscall_darwin_386.go
src/syscall/zsyscall_darwin_amd64.go
src/syscall/zsyscall_darwin_arm.s
src/syscall/zsyscall_darwin_arm64.s

index 8500b61db7c31c3048533eaf3702d60250321928..98c4d3d3a5bd0dc171e795b4e4e41e8796e27e74 100644 (file)
@@ -786,6 +786,27 @@ func (x machoscmp) Less(i, j int) bool {
 func machogenasmsym(ctxt *Link) {
        genasmsym(ctxt, addsym)
        for _, s := range ctxt.Syms.Allsym {
+               // Some 64-bit functions have a "$INODE64" or "$INODE64$UNIX2003" suffix.
+               if s.Type == sym.SDYNIMPORT && s.Dynimplib() == "/usr/lib/libSystem.B.dylib" {
+                       // But only on macOS.
+                       if machoPlatform == PLATFORM_MACOS {
+                               switch n := s.Extname(); n {
+                               case "fdopendir":
+                                       switch objabi.GOARCH {
+                                       case "amd64":
+                                               s.SetExtname(n + "$INODE64")
+                                       case "386":
+                                               s.SetExtname(n + "$INODE64$UNIX2003")
+                                       }
+                               case "readdir_r":
+                                       switch objabi.GOARCH {
+                                       case "amd64", "386":
+                                               s.SetExtname(n + "$INODE64")
+                                       }
+                               }
+                       }
+               }
+
                if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ {
                        if s.Attr.Reachable() {
                                addsym(ctxt, s, "", DataSym, 0, nil)
index 75345df159bbb004419fa76f56321d8c2f3fa088..667ca54c02f685c89b7c90f575e4b361dd558116 100755 (executable)
@@ -350,10 +350,6 @@ while(<>) {
                        $text .= "//go:linkname $funcname $funcname\n";
                        # Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix.
                        my $basename = substr $funcname, 5;
-                       if($basename eq "readdir_r" && ($ENV{'GOARCH'} eq "386" || $ENV{'GOARCH'} eq "amd64")) {
-                           # Hack to make sure we get the 64-bit inode version on darwin/macOS.
-                           $basename .= "\$INODE64"
-                       }
                        $text .= "//go:cgo_import_dynamic $funcname $basename \"/usr/lib/libSystem.B.dylib\"\n\n";
                }
        }
index e5d0d5c386578e9c6c4db667ce44ab35e7d3dd4c..7fc96f8937fe5609d1c58cabb60374ef45b3aa92 100644 (file)
@@ -347,6 +347,20 @@ func init() {
        execveDarwin = execve
 }
 
+func fdopendir(fd int) (dir uintptr, err error) {
+       r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
+       dir = uintptr(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+func libc_fdopendir_trampoline()
+
+//go:linkname libc_fdopendir libc_fdopendir
+//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
+
 func readlen(fd int, buf *byte, nbuf int) (n int, err error) {
        r0, _, e1 := syscall(funcPC(libc_read_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))
        n = int(r0)
index d39c65505c51848b648bf5ae5ce5758174c2ecd0..a8926c022a57da0f1d2e3333acc8e58d6c4fb419 100644 (file)
@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
 //go:linkname libc_sendfile libc_sendfile
 //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib"
 
-func fdopendir(fd int) (dir uintptr, err error) {
-       r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
-       dir = uintptr(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_fdopendir_trampoline()
-
-//go:linkname libc_fdopendir libc_fdopendir
-//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
-
 // Implemented in the runtime package (runtime/sys_darwin_32.go)
 func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
 
index 6fc7fb7f1031f53aef3545bf3d8fd77b9a1b1504..bc3acf8d7589ff266d9dd44708d7aeda889da38e 100644 (file)
@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
 //go:linkname libc_sendfile libc_sendfile
 //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib"
 
-func fdopendir(fd int) (dir uintptr, err error) {
-       r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
-       dir = uintptr(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_fdopendir_trampoline()
-
-//go:linkname libc_fdopendir libc_fdopendir
-//go:cgo_import_dynamic libc_fdopendir fdopendir$INODE64 "/usr/lib/libSystem.B.dylib"
-
 // Implemented in the runtime package (runtime/sys_darwin_64.go)
 func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
 
index c1b417de92020420193bc175651e065388e1239d..19c9827c093ac95ce523adb6f08769276af6e86b 100644 (file)
@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
 //go:linkname libc_sendfile libc_sendfile
 //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib"
 
-func fdopendir(fd int) (dir uintptr, err error) {
-       r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
-       dir = uintptr(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_fdopendir_trampoline()
-
-//go:linkname libc_fdopendir libc_fdopendir
-//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
-
 // Implemented in the runtime package (runtime/sys_darwin_32.go)
 func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
 
index 3a4c9629acfaddc92c18659bbaa53423194310bd..95eb9465b9bd691d89fefcdc340bc7d0fb48386f 100644 (file)
@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
 //go:linkname libc_sendfile libc_sendfile
 //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib"
 
-func fdopendir(fd int) (dir uintptr, err error) {
-       r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0)
-       dir = uintptr(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-func libc_fdopendir_trampoline()
-
-//go:linkname libc_fdopendir libc_fdopendir
-//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib"
-
 // Implemented in the runtime package (runtime/sys_darwin_64.go)
 func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
 
index 06b188f6c48dc665b745671230cb958639c380cd..06a51557e685baed52c397a859b11f65400aab8b 100644 (file)
@@ -1278,7 +1278,7 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
 func libc_readdir_r_trampoline()
 
 //go:linkname libc_readdir_r libc_readdir_r
-//go:cgo_import_dynamic libc_readdir_r readdir_r$INODE64 "/usr/lib/libSystem.B.dylib"
+//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
index d7d08211be596b26e85e9500acf41f8239e6b29b..c2b88fc4c42a1fc22bc210aca0799b4bd84b3b5d 100644 (file)
@@ -1278,7 +1278,7 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
 func libc_readdir_r_trampoline()
 
 //go:linkname libc_readdir_r libc_readdir_r
-//go:cgo_import_dynamic libc_readdir_r readdir_r$INODE64 "/usr/lib/libSystem.B.dylib"
+//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib"
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
index f9978d755d49e4f610aa6272ee3ddd11b29c4ae7..fc1a18400362393cf8043b26b120c00cb2e3be92 100644 (file)
@@ -7,10 +7,10 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_getfsstat64(SB)
 TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_setattrlist(SB)
-TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_sendfile(SB)
 TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fdopendir(SB)
+TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_sendfile(SB)
 TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_getgroups(SB)
 TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0
@@ -75,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_chroot(SB)
 TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_close(SB)
+TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_closedir(SB)
 TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_dup(SB)
 TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0
@@ -159,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_pwrite(SB)
 TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_read(SB)
+TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_readdir_r(SB)
 TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_readlink(SB)
 TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0
@@ -233,8 +237,6 @@ TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_unlinkat(SB)
 TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_openat(SB)
-TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_closedir(SB)
 TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstat(SB)
 TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0
@@ -243,8 +245,6 @@ TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_gettimeofday(SB)
 TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_lstat(SB)
-TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_readdir_r(SB)
 TEXT ·libc_stat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_stat(SB)
 TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0
index 7ef24e534d0665cf2e59580f07989f4c7c5fb525..4df76084bc5ecb93a4832a939d8df05a86bf8ebf 100644 (file)
@@ -7,10 +7,10 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_getfsstat64(SB)
 TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_setattrlist(SB)
-TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_sendfile(SB)
 TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fdopendir(SB)
+TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_sendfile(SB)
 TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_getgroups(SB)
 TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0
@@ -75,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_chroot(SB)
 TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_close(SB)
+TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_closedir(SB)
 TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_dup(SB)
 TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0
@@ -159,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_pwrite(SB)
 TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_read(SB)
+TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
+       JMP     libc_readdir_r(SB)
 TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_readlink(SB)
 TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0
@@ -233,8 +237,6 @@ TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_unlinkat(SB)
 TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_openat(SB)
-TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_closedir(SB)
 TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_fstat(SB)
 TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0
@@ -243,8 +245,6 @@ TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_gettimeofday(SB)
 TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_lstat(SB)
-TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0
-       JMP     libc_readdir_r(SB)
 TEXT ·libc_stat_trampoline(SB),NOSPLIT,$0-0
        JMP     libc_stat(SB)
 TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0