| // Copyright 2021 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. | |
| package base | |
| import ( | |
| "cmd/internal/obj" | |
| ) | |
| var Ctxt *obj.Link | |
| // TODO(mdempsky): These should probably be obj.Link methods. | |
| // PkgLinksym returns the linker symbol for name within the given | |
| // package prefix. For user packages, prefix should be the package | |
| // path encoded with objabi.PathToPrefix. | |
| func PkgLinksym(prefix, name string, abi obj.ABI) *obj.LSym { | |
| if name == "_" { | |
| // TODO(mdempsky): Cleanup callers and Fatalf instead. | |
| return linksym(prefix, "_", abi) | |
| } | |
| return linksym(prefix, prefix+"."+name, abi) | |
| } | |
| // Linkname returns the linker symbol for the given name as it might | |
| // appear within a //go:linkname directive. | |
| func Linkname(name string, abi obj.ABI) *obj.LSym { | |
| return linksym("_", name, abi) | |
| } | |
| // linksym is an internal helper function for implementing the above | |
| // exported APIs. | |
| func linksym(pkg, name string, abi obj.ABI) *obj.LSym { | |
| return Ctxt.LookupABIInit(name, abi, func(r *obj.LSym) { r.Pkg = pkg }) | |
| } |