Commit 096ab3c2 authored by Elias Naur's avatar Elias Naur

cmd/link/internal/ld,syscall: drop $INODE64 suffixes on simulators

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: default avatarKeith Randall <khr@golang.org>
parent a74e0120
...@@ -786,6 +786,27 @@ func (x machoscmp) Less(i, j int) bool { ...@@ -786,6 +786,27 @@ func (x machoscmp) Less(i, j int) bool {
func machogenasmsym(ctxt *Link) { func machogenasmsym(ctxt *Link) {
genasmsym(ctxt, addsym) genasmsym(ctxt, addsym)
for _, s := range ctxt.Syms.Allsym { 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.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ {
if s.Attr.Reachable() { if s.Attr.Reachable() {
addsym(ctxt, s, "", DataSym, 0, nil) addsym(ctxt, s, "", DataSym, 0, nil)
......
...@@ -350,10 +350,6 @@ while(<>) { ...@@ -350,10 +350,6 @@ while(<>) {
$text .= "//go:linkname $funcname $funcname\n"; $text .= "//go:linkname $funcname $funcname\n";
# Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix. # Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix.
my $basename = substr $funcname, 5; 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"; $text .= "//go:cgo_import_dynamic $funcname $basename \"/usr/lib/libSystem.B.dylib\"\n\n";
} }
} }
......
...@@ -347,6 +347,20 @@ func init() { ...@@ -347,6 +347,20 @@ func init() {
execveDarwin = execve 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) { 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)) r0, _, e1 := syscall(funcPC(libc_read_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))
n = int(r0) n = int(r0)
......
...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline() ...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
//go:linkname libc_sendfile libc_sendfile //go:linkname libc_sendfile libc_sendfile
//go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" //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) // 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) func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
......
...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline() ...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
//go:linkname libc_sendfile libc_sendfile //go:linkname libc_sendfile libc_sendfile
//go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" //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) // Implemented in the runtime package (runtime/sys_darwin_64.go)
func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
......
...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline() ...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
//go:linkname libc_sendfile libc_sendfile //go:linkname libc_sendfile libc_sendfile
//go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" //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) // 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) func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
......
...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline() ...@@ -58,20 +58,6 @@ func libc_sendfile_trampoline()
//go:linkname libc_sendfile libc_sendfile //go:linkname libc_sendfile libc_sendfile
//go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" //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) // Implemented in the runtime package (runtime/sys_darwin_64.go)
func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
......
...@@ -1278,7 +1278,7 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { ...@@ -1278,7 +1278,7 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
func libc_readdir_r_trampoline() func libc_readdir_r_trampoline()
//go:linkname libc_readdir_r libc_readdir_r //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 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
......
...@@ -1278,7 +1278,7 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { ...@@ -1278,7 +1278,7 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) {
func libc_readdir_r_trampoline() func libc_readdir_r_trampoline()
//go:linkname libc_readdir_r libc_readdir_r //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 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
......
...@@ -7,10 +7,10 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0 ...@@ -7,10 +7,10 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0
JMP libc_getfsstat64(SB) JMP libc_getfsstat64(SB)
TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0
JMP libc_setattrlist(SB) JMP libc_setattrlist(SB)
TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
JMP libc_sendfile(SB)
TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
JMP libc_fdopendir(SB) JMP libc_fdopendir(SB)
TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
JMP libc_sendfile(SB)
TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0
JMP libc_getgroups(SB) JMP libc_getgroups(SB)
TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0
...@@ -75,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 ...@@ -75,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0
JMP libc_chroot(SB) JMP libc_chroot(SB)
TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0
JMP libc_close(SB) JMP libc_close(SB)
TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
JMP libc_closedir(SB)
TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0
JMP libc_dup(SB) JMP libc_dup(SB)
TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0
...@@ -159,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0 ...@@ -159,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0
JMP libc_pwrite(SB) JMP libc_pwrite(SB)
TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0
JMP libc_read(SB) 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 TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0
JMP libc_readlink(SB) JMP libc_readlink(SB)
TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0
...@@ -233,8 +237,6 @@ TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0 ...@@ -233,8 +237,6 @@ TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
JMP libc_unlinkat(SB) JMP libc_unlinkat(SB)
TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0
JMP libc_openat(SB) JMP libc_openat(SB)
TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
JMP libc_closedir(SB)
TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0
JMP libc_fstat(SB) JMP libc_fstat(SB)
TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0
...@@ -243,8 +245,6 @@ TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 ...@@ -243,8 +245,6 @@ TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0
JMP libc_gettimeofday(SB) JMP libc_gettimeofday(SB)
TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0
JMP libc_lstat(SB) 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 TEXT ·libc_stat_trampoline(SB),NOSPLIT,$0-0
JMP libc_stat(SB) JMP libc_stat(SB)
TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0
......
...@@ -7,10 +7,10 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0 ...@@ -7,10 +7,10 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0
JMP libc_getfsstat64(SB) JMP libc_getfsstat64(SB)
TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0
JMP libc_setattrlist(SB) JMP libc_setattrlist(SB)
TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
JMP libc_sendfile(SB)
TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0
JMP libc_fdopendir(SB) JMP libc_fdopendir(SB)
TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0
JMP libc_sendfile(SB)
TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0
JMP libc_getgroups(SB) JMP libc_getgroups(SB)
TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0
...@@ -75,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 ...@@ -75,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0
JMP libc_chroot(SB) JMP libc_chroot(SB)
TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0
JMP libc_close(SB) JMP libc_close(SB)
TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
JMP libc_closedir(SB)
TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0
JMP libc_dup(SB) JMP libc_dup(SB)
TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0
...@@ -159,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0 ...@@ -159,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0
JMP libc_pwrite(SB) JMP libc_pwrite(SB)
TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0
JMP libc_read(SB) 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 TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0
JMP libc_readlink(SB) JMP libc_readlink(SB)
TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0
...@@ -233,8 +237,6 @@ TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0 ...@@ -233,8 +237,6 @@ TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0
JMP libc_unlinkat(SB) JMP libc_unlinkat(SB)
TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0
JMP libc_openat(SB) JMP libc_openat(SB)
TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0
JMP libc_closedir(SB)
TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0
JMP libc_fstat(SB) JMP libc_fstat(SB)
TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0
...@@ -243,8 +245,6 @@ TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 ...@@ -243,8 +245,6 @@ TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0
JMP libc_gettimeofday(SB) JMP libc_gettimeofday(SB)
TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0
JMP libc_lstat(SB) 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 TEXT ·libc_stat_trampoline(SB),NOSPLIT,$0-0
JMP libc_stat(SB) JMP libc_stat(SB)
TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0 TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment