diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 4feccf54f6b..88725790503 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -320,7 +320,7 @@ func (ctxt *Link) NumberSyms() { // Assign special index for builtin symbols. // Don't do it when linking against shared libraries, as the runtime // may be in a different library. - if i := goobj.BuiltinIdx(rs.Name, int(rs.ABI())); i != -1 { + if i := goobj.BuiltinIdx(rs.Name, int(rs.ABI())); i != -1 && !rs.IsLinkname() { rs.PkgIdx = goobj.PkgIdxBuiltin rs.SymIdx = int32(i) rs.Set(AttrIndexed, true) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index f23951416ba..ab56b49e15d 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -1518,6 +1518,8 @@ func TestCheckLinkname(t *testing.T) { {"coro_asm", false}, // pull-only linkname is not ok {"coro2.go", false}, + // pull linkname of a builtin symbol is not ok + {"builtin.go", false}, // legacy bad linkname is ok, for now {"fastrand.go", true}, {"badlinkname.go", true}, diff --git a/src/cmd/link/testdata/linkname/builtin.go b/src/cmd/link/testdata/linkname/builtin.go new file mode 100644 index 00000000000..a238c9b9679 --- /dev/null +++ b/src/cmd/link/testdata/linkname/builtin.go @@ -0,0 +1,17 @@ +// Copyright 2024 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. + +// Linkname builtin symbols (that is not already linknamed, +// e.g. mapaccess1) is not allowed. + +package main + +import "unsafe" + +func main() { + mapaccess1(nil, nil, nil) +} + +//go:linkname mapaccess1 runtime.mapaccess1 +func mapaccess1(t, m, k unsafe.Pointer) unsafe.Pointer