| // 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" |
| ) |
| |
| // ReservedImports are import paths used internally for generated |
| // symbols by the compiler. |
| // |
| // The linker uses the magic symbol prefixes "go:" and "type:". |
| // Avoid potential confusion between import paths and symbols |
| // by rejecting these reserved imports for now. Also, people |
| // "can do weird things in GOPATH and we'd prefer they didn't |
| // do _that_ weird thing" (per rsc). See also #4257. |
| var ReservedImports = map[string]bool{ |
| "go": true, |
| "type": true, |
| } |
| |
| 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) |
| } |
| sep := "." |
| if ReservedImports[prefix] { |
| sep = ":" |
| } |
| return linksym(prefix, prefix+sep+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 }) |
| } |