-
Notifications
You must be signed in to change notification settings - Fork 584
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixes golang/go#67839 Change-Id: I3af38d21159f7cac3786b49ac17657d314fbc178 Reviewed-on: https://go-review.googlesource.com/c/sys/+/644295 Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Carlos Amedee <carlos@golang.org> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
- Loading branch information
Showing
3 changed files
with
72 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// Copyright 2025 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
//go:build go1.21 && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) | ||
|
||
package unix | ||
|
||
import ( | ||
"syscall" | ||
"unsafe" | ||
) | ||
|
||
//go:linkname runtime_getAuxv runtime.getAuxv | ||
func runtime_getAuxv() []uintptr | ||
|
||
// Auxv returns the ELF auxiliary vector as a sequence of key/value pairs. | ||
// The returned slice is always a fresh copy, owned by the caller. | ||
// It returns an error on non-ELF platforms, or if the auxiliary vector cannot be accessed, | ||
// which happens in some locked-down environments and build modes. | ||
func Auxv() ([][2]uintptr, error) { | ||
vec := runtime_getAuxv() | ||
vecLen := len(vec) | ||
|
||
if vecLen == 0 { | ||
return nil, syscall.ENOENT | ||
} | ||
|
||
if vecLen%2 != 0 { | ||
return nil, syscall.EINVAL | ||
} | ||
|
||
result := make([]uintptr, vecLen) | ||
copy(result, vec) | ||
return unsafe.Slice((*[2]uintptr)(unsafe.Pointer(&result[0])), vecLen/2), nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
// Copyright 2025 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
//go:build go1.21 && linux | ||
|
||
package unix_test | ||
|
||
import ( | ||
"testing" | ||
|
||
"golang.org/x/sys/unix" | ||
) | ||
|
||
func TestAuxv(t *testing.T) { | ||
vec, err := unix.Auxv() | ||
if err != nil { | ||
t.Fatalf("unexpected error: %v", err) | ||
} | ||
if len(vec) == 0 { | ||
t.Errorf("got zero auxv entries on linux, expected > 0") | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Copyright 2025 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
//go:build !go1.21 && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos) | ||
|
||
package unix | ||
|
||
import "syscall" | ||
|
||
func Auxv() ([][2]uintptr, error) { | ||
return nil, syscall.ENOTSUP | ||
} |