pname := fmt.Sprintf("%s(%s)", name, arhdr.name)
l = atolwhex(arhdr.size)
- libgcc := Library{Pkg: "libgcc"}
+ libgcc := sym.Library{Pkg: "libgcc"}
h := ldobj(ctxt, f, &libgcc, l, pname, name, ArchiveObj)
f.Seek(h.off, 0)
h.ld(ctxt, f, h.pkg, h.length, h.pn)
sort.Sort(byPkg(ctxt.Library))
h := sha1.New()
for _, l := range ctxt.Library {
- io.WriteString(h, l.hash)
+ io.WriteString(h, l.Hash)
}
addgonote(ctxt, ".note.go.abihash", ELF_NOTE_GOABIHASH_TAG, h.Sum([]byte{}))
addgonote(ctxt, ".note.go.pkg-list", ELF_NOTE_GOPKGLIST_TAG, pkglistfornote)
package ld
import (
+ "cmd/link/internal/sym"
"io/ioutil"
"log"
"os"
return pname, isshlib
}
-func addlib(ctxt *Link, src string, obj string, lib string) *Library {
+func addlib(ctxt *Link, src string, obj string, lib string) *sym.Library {
pkg := pkgname(lib)
// already loaded?
* pkg: package import path, e.g. container/vector
* shlib: path to shared library, or .shlibname file holding path
*/
-func addlibpath(ctxt *Link, srcref string, objref string, file string, pkg string, shlib string) *Library {
+func addlibpath(ctxt *Link, srcref string, objref string, file string, pkg string, shlib string) *sym.Library {
if l := ctxt.LibraryByPkg[pkg]; l != nil {
return l
}
ctxt.Logf("%5.2f addlibpath: srcref: %s objref: %s file: %s pkg: %s shlib: %s\n", Cputime(), srcref, objref, file, pkg, shlib)
}
- l := &Library{}
+ l := &sym.Library{}
ctxt.LibraryByPkg[pkg] = l
ctxt.Library = append(ctxt.Library, l)
l.Objref = objref
Exit(0)
}
-func loadinternal(ctxt *Link, name string) *Library {
+func loadinternal(ctxt *Link, name string) *sym.Library {
if *FlagLinkshared && ctxt.PackageShlib != nil {
if shlib := ctxt.PackageShlib[name]; shlib != "" {
return addlibpath(ctxt, "internal", "internal", "", name, shlib)
if isRuntimeDepPkg(lib.Pkg) != doInternal {
continue
}
- ctxt.Textp = append(ctxt.Textp, lib.textp...)
- for _, s := range lib.dupTextSyms {
+ ctxt.Textp = append(ctxt.Textp, lib.Textp...)
+ for _, s := range lib.DupTextSyms {
if !s.Attr.OnList() {
ctxt.Textp = append(ctxt.Textp, s)
s.Attr |= sym.AttrOnList
return arsize + SAR_HDR
}
-func genhash(ctxt *Link, lib *Library) {
+func genhash(ctxt *Link, lib *sym.Library) {
f, err := bio.Open(lib.File)
if err != nil {
Errorf(nil, "cannot open file %s for hash generation: %v", lib.File, err)
}
h.Write(pkgDefBytes[0:firstEOL])
h.Write(pkgDefBytes[firstDoubleDollar : firstDoubleDollar+secondDoubleDollar])
- lib.hash = hex.EncodeToString(h.Sum(nil))
+ lib.Hash = hex.EncodeToString(h.Sum(nil))
}
-func objfile(ctxt *Link, lib *Library) {
+func objfile(ctxt *Link, lib *sym.Library) {
pkg := objabi.PathToPrefix(lib.Pkg)
if ctxt.Debugvlog > 1 {
// ldobj loads an input object. If it is a host object (an object
// compiled by a non-Go compiler) it returns the Hostobj pointer. If
// it is a Go object, it returns nil.
-func ldobj(ctxt *Link, f *bio.Reader, lib *Library, length int64, pn string, file string, whence int) *Hostobj {
+func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, file string, whence int) *Hostobj {
pkg := objabi.PathToPrefix(lib.Pkg)
eof := f.Offset() + length
f.Seek(import1, 0)
LoadObjFile(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn)
- lib.addImports(ctxt, pn)
+ addImports(ctxt, lib, pn)
return nil
}
visited
)
-func postorder(libs []*Library) []*Library {
- order := make([]*Library, 0, len(libs)) // hold the result
- mark := make(map[*Library]markKind, len(libs))
+func postorder(libs []*sym.Library) []*sym.Library {
+ order := make([]*sym.Library, 0, len(libs)) // hold the result
+ mark := make(map[*sym.Library]markKind, len(libs))
for _, lib := range libs {
dfs(lib, mark, &order)
}
return order
}
-func dfs(lib *Library, mark map[*Library]markKind, order *[]*Library) {
+func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library) {
if mark[lib] == visited {
return
}
panic("found import cycle while visiting " + lib.Pkg)
}
mark[lib] = visiting
- for _, i := range lib.imports {
+ for _, i := range lib.Imports {
dfs(i, mark, order)
}
mark[lib] = visited
Tlsg *sym.Symbol
Libdir []string
- Library []*Library
- LibraryByPkg map[string]*Library
+ Library []*sym.Library
+ LibraryByPkg map[string]*sym.Library
Shlibs []Shlib
Tlsoffset int
Textp []*sym.Symbol
l.Bso.Flush()
}
-type Library struct {
- Objref string
- Srcref string
- File string
- Pkg string
- Shlib string
- hash string
- importStrings []string
- imports []*Library
- textp []*sym.Symbol // text symbols defined in this library
- dupTextSyms []*sym.Symbol // dupok text symbols defined in this library
-}
-
-func (l Library) String() string {
- return l.Pkg
-}
-
-func (l *Library) addImports(ctxt *Link, pn string) {
+func addImports(ctxt *Link, l *sym.Library, pn string) {
pkg := objabi.PathToPrefix(l.Pkg)
- for _, importStr := range l.importStrings {
+ for _, importStr := range l.ImportStrings {
lib := addlib(ctxt, pkg, pn, importStr)
if lib != nil {
- l.imports = append(l.imports, lib)
+ l.Imports = append(l.Imports, lib)
}
}
- l.importStrings = nil
+ l.ImportStrings = nil
}
type Pciter struct {
rd *bufio.Reader
arch *sys.Arch
syms *sym.Symbols
- lib *Library
+ lib *sym.Library
pn string
dupSym *sym.Symbol
localSymVersion int
file []*sym.Symbol
}
-func LoadObjFile(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *Library, length int64, pn string) {
+func LoadObjFile(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, length int64, pn string) {
start := f.Offset()
r := &objReader{
rd: f.Reader,
if lib == "" {
break
}
- r.lib.importStrings = append(r.lib.importStrings, lib)
+ r.lib.ImportStrings = append(r.lib.ImportStrings, lib)
}
// sym.Symbol references
log.Fatalf("symbol %s listed multiple times", s.Name)
}
s.Attr |= sym.AttrOnList
- r.lib.textp = append(r.lib.textp, s)
+ r.lib.Textp = append(r.lib.Textp, s)
} else {
// there may ba a dup in another package
// put into a temp list and add to text later
if !isdup {
- r.lib.dupTextSyms = append(r.lib.dupTextSyms, s)
+ r.lib.DupTextSyms = append(r.lib.DupTextSyms, s)
} else {
- r.lib.dupTextSyms = append(r.lib.dupTextSyms, dup)
+ r.lib.DupTextSyms = append(r.lib.DupTextSyms, dup)
}
}
}
Syms: sym.NewSymbols(),
Out: &OutBuf{arch: arch},
Arch: arch,
- LibraryByPkg: make(map[string]*Library),
+ LibraryByPkg: make(map[string]*sym.Library),
}
if objabi.GOARCH != arch.Name {
var symt *sym.Symbol
-type byPkg []*Library
+type byPkg []*sym.Library
func (libs byPkg) Len() int {
return len(libs)
s := ctxt.Syms.Lookup("go.link.pkghashbytes."+l.Pkg, 0)
s.Attr |= sym.AttrReachable
s.Type = sym.SRODATA
- s.Size = int64(len(l.hash))
- s.P = []byte(l.hash)
+ s.Size = int64(len(l.Hash))
+ s.P = []byte(l.Hash)
str := ctxt.Syms.Lookup("go.link.pkghash."+l.Pkg, 0)
str.Attr |= sym.AttrReachable
str.Type = sym.SRODATA
str.AddAddr(ctxt.Arch, s)
- str.AddUint(ctxt.Arch, uint64(len(l.hash)))
+ str.AddUint(ctxt.Arch, uint64(len(l.Hash)))
}
}
// pkghashes[i].name
addgostring(ctxt, pkghashes, fmt.Sprintf("go.link.pkgname.%d", i), l.Pkg)
// pkghashes[i].linktimehash
- addgostring(ctxt, pkghashes, fmt.Sprintf("go.link.pkglinkhash.%d", i), string(l.hash))
+ addgostring(ctxt, pkghashes, fmt.Sprintf("go.link.pkglinkhash.%d", i), string(l.Hash))
// pkghashes[i].runtimehash
hash := ctxt.Syms.ROLookup("go.link.pkghash."+l.Pkg, 0)
pkghashes.AddAddr(ctxt.Arch, hash)
--- /dev/null
+// Copyright 2017 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 sym
+
+type Library struct {
+ Objref string
+ Srcref string
+ File string
+ Pkg string
+ Shlib string
+ Hash string
+ ImportStrings []string
+ Imports []*Library
+ Textp []*Symbol // text symbols defined in this library
+ DupTextSyms []*Symbol // dupok text symbols defined in this library
+}
+
+func (l Library) String() string {
+ return l.Pkg
+}