| // 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 }) |
| } |