1 // Inferno utils/8l/asm.c
2 // https://bitbucket.org/inferno-os/inferno-os/src/default/utils/8l/asm.c
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
6 // Portions Copyright © 1997-1999 Vita Nuova Limited
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
8 // Portions Copyright © 2004,2006 Bruce Ellis
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
11 // Portions Copyright © 2009 The Go Authors. All rights reserved.
13 // Permission is hereby granted, free of charge, to any person obtaining a copy
14 // of this software and associated documentation files (the "Software"), to deal
15 // in the Software without restriction, including without limitation the rights
16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 // copies of the Software, and to permit persons to whom the Software is
18 // furnished to do so, subject to the following conditions:
20 // The above copyright notice and this permission notice shall be included in
21 // all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
39 "cmd/link/internal/loadelf"
40 "cmd/link/internal/loadmacho"
41 "cmd/link/internal/loadpe"
42 "cmd/link/internal/objfile"
43 "cmd/link/internal/sym"
61 // Data layout and relocation.
63 // Derived from Inferno utils/6l/l.h
64 // https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h
66 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
67 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
68 // Portions Copyright © 1997-1999 Vita Nuova Limited
69 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
70 // Portions Copyright © 2004,2006 Bruce Ellis
71 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
72 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
73 // Portions Copyright © 2009 The Go Authors. All rights reserved.
75 // Permission is hereby granted, free of charge, to any person obtaining a copy
76 // of this software and associated documentation files (the "Software"), to deal
77 // in the Software without restriction, including without limitation the rights
78 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
79 // copies of the Software, and to permit persons to whom the Software is
80 // furnished to do so, subject to the following conditions:
82 // The above copyright notice and this permission notice shall be included in
83 // all copies or substantial portions of the Software.
85 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
86 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
87 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
88 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
89 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
90 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
103 Dragonflydynld string
105 Adddynrel func(*Link, *sym.Symbol, *sym.Reloc) bool
107 Archreloc func(*Link, *sym.Reloc, *sym.Symbol, *int64) bool
108 Archrelocvariant func(*Link, *sym.Reloc, *sym.Symbol, int64) int64
109 Trampoline func(*Link, *sym.Reloc, *sym.Symbol)
111 Elfreloc1 func(*Link, *sym.Reloc, int64) bool
112 Elfsetupplt func(*Link)
114 Machoreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool
115 PEreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool
117 // TLSIEtoLE converts a TLS Initial Executable relocation to
118 // a TLS Local Executable relocation.
120 // This is possible when a TLS IE relocation refers to a local
121 // symbol in an executable, which is typical when internally
122 // linking PIE binaries.
123 TLSIEtoLE func(s *sym.Symbol, off, size int)
125 // optional override for assignAddress
126 AssignAddress func(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint64, isTramp bool) (*sym.Section, int, uint64)
138 MINFUNC = 16 // minimum size for a function
141 // DynlinkingGo returns whether we are producing Go code that can live
142 // in separate shared libraries linked together at runtime.
143 func (ctxt *Link) DynlinkingGo() bool {
145 panic("DynlinkingGo called before all symbols loaded")
147 return ctxt.BuildMode == BuildModeShared || ctxt.linkShared || ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins()
150 // CanUsePlugins returns whether a plugins can be used
151 func (ctxt *Link) CanUsePlugins() bool {
152 return ctxt.Syms.ROLookup("plugin.Open", 0) != nil
155 // UseRelro returns whether to make use of "read only relocations" aka
157 func (ctxt *Link) UseRelro() bool {
158 switch ctxt.BuildMode {
159 case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePIE, BuildModePlugin:
162 return ctxt.linkShared
176 debug_s bool // backup old value of debug['s']
185 Segrodata sym.Segment
186 Segrelrodata sym.Segment
191 const pkgdef = "__.PKGDEF"
194 // Set if we see an object compiled by the host compiler that is not
195 // from a package that is known to support internal linking mode.
200 func Lflag(ctxt *Link, arg string) {
201 ctxt.Libdir = append(ctxt.Libdir, arg)
205 * Unix doesn't like it when we write to a running (or, sometimes,
206 * recently run) binary, so remove the output file before writing it.
207 * On Windows 7, remove() can force a subsequent create() to fail.
208 * S_ISREG() does not exist on Plan 9.
210 func mayberemoveoutfile() {
211 if fi, err := os.Lstat(*flagOutfile); err == nil && !fi.Mode().IsRegular() {
214 os.Remove(*flagOutfile)
217 func libinit(ctxt *Link) {
218 Funcalign = thearch.Funcalign
220 // add goroot to the end of the libdir list.
224 if *flagInstallSuffix != "" {
226 suffix = *flagInstallSuffix
227 } else if *flagRace {
230 } else if *flagMsan {
235 Lflag(ctxt, filepath.Join(objabi.GOROOT, "pkg", fmt.Sprintf("%s_%s%s%s", objabi.GOOS, objabi.GOARCH, suffixsep, suffix)))
238 f, err := os.OpenFile(*flagOutfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775)
240 Exitf("cannot create %s: %v", *flagOutfile, err)
243 ctxt.Out.w = bufio.NewWriter(f)
246 if *flagEntrySymbol == "" {
247 switch ctxt.BuildMode {
248 case BuildModeCShared, BuildModeCArchive:
249 *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s_lib", objabi.GOARCH, objabi.GOOS)
250 case BuildModeExe, BuildModePIE:
251 *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s", objabi.GOARCH, objabi.GOOS)
252 case BuildModeShared, BuildModePlugin:
253 // No *flagEntrySymbol for -buildmode=shared and plugin
255 Errorf(nil, "unknown *flagEntrySymbol for buildmode %v", ctxt.BuildMode)
267 func loadinternal(ctxt *Link, name string) *sym.Library {
268 if ctxt.linkShared && ctxt.PackageShlib != nil {
269 if shlib := ctxt.PackageShlib[name]; shlib != "" {
270 return addlibpath(ctxt, "internal", "internal", "", name, shlib)
273 if ctxt.PackageFile != nil {
274 if pname := ctxt.PackageFile[name]; pname != "" {
275 return addlibpath(ctxt, "internal", "internal", pname, name, "")
277 ctxt.Logf("loadinternal: cannot find %s\n", name)
281 for _, libdir := range ctxt.Libdir {
283 shlibname := filepath.Join(libdir, name+".shlibname")
284 if ctxt.Debugvlog != 0 {
285 ctxt.Logf("searching for %s.a in %s\n", name, shlibname)
287 if _, err := os.Stat(shlibname); err == nil {
288 return addlibpath(ctxt, "internal", "internal", "", name, shlibname)
291 pname := filepath.Join(libdir, name+".a")
292 if ctxt.Debugvlog != 0 {
293 ctxt.Logf("searching for %s.a in %s\n", name, pname)
295 if _, err := os.Stat(pname); err == nil {
296 return addlibpath(ctxt, "internal", "internal", pname, name, "")
300 ctxt.Logf("warning: unable to find %s.a\n", name)
304 // findLibPathCmd uses cmd command to find gcc library libname.
305 // It returns library full path if found, or "none" if not found.
306 func (ctxt *Link) findLibPathCmd(cmd, libname string) string {
307 if *flagExtld == "" {
310 args := hostlinkArchArgs(ctxt.Arch)
311 args = append(args, cmd)
312 if ctxt.Debugvlog != 0 {
313 ctxt.Logf("%s %v\n", *flagExtld, args)
315 out, err := exec.Command(*flagExtld, args...).Output()
317 if ctxt.Debugvlog != 0 {
318 ctxt.Logf("not using a %s file because compiler failed\n%v\n%s\n", libname, err, out)
322 return strings.TrimSpace(string(out))
325 // findLibPath searches for library libname.
326 // It returns library full path if found, or "none" if not found.
327 func (ctxt *Link) findLibPath(libname string) string {
328 return ctxt.findLibPathCmd("--print-file-name="+libname, libname)
331 func (ctxt *Link) loadlib() {
332 switch ctxt.BuildMode {
333 case BuildModeCShared, BuildModePlugin:
334 s := ctxt.Syms.Lookup("runtime.islibrary", 0)
335 s.Attr |= sym.AttrDuplicateOK
337 case BuildModeCArchive:
338 s := ctxt.Syms.Lookup("runtime.isarchive", 0)
339 s.Attr |= sym.AttrDuplicateOK
343 loadinternal(ctxt, "runtime")
344 if ctxt.Arch.Family == sys.ARM {
345 loadinternal(ctxt, "math")
348 loadinternal(ctxt, "runtime/race")
351 loadinternal(ctxt, "runtime/msan")
354 // ctxt.Library grows during the loop, so not a range loop.
355 for i := 0; i < len(ctxt.Library); i++ {
356 lib := ctxt.Library[i]
358 if ctxt.Debugvlog > 1 {
359 ctxt.Logf("%5.2f autolib: %s (from %s)\n", Cputime(), lib.File, lib.Objref)
361 loadobjfile(ctxt, lib)
365 for _, lib := range ctxt.Library {
367 if ctxt.Debugvlog > 1 {
368 ctxt.Logf("%5.2f autolib: %s (from %s)\n", Cputime(), lib.Shlib, lib.Objref)
370 ldshlibsyms(ctxt, lib.Shlib)
374 iscgo = ctxt.Syms.ROLookup("x_cgo_init", 0) != nil
376 // We now have enough information to determine the link mode.
377 determineLinkMode(ctxt)
379 // Recalculate pe parameters now that we have ctxt.LinkMode set.
380 if ctxt.HeadType == objabi.Hwindows {
384 if ctxt.HeadType == objabi.Hdarwin && ctxt.LinkMode == LinkExternal {
388 if ctxt.LinkMode == LinkExternal && ctxt.Arch.Family == sys.PPC64 {
389 toc := ctxt.Syms.Lookup(".TOC.", 0)
390 toc.Type = sym.SDYNIMPORT
393 if ctxt.LinkMode == LinkExternal && !iscgo && ctxt.LibraryByPkg["runtime/cgo"] == nil && !(objabi.GOOS == "darwin" && (ctxt.Arch.Family == sys.AMD64 || ctxt.Arch.Family == sys.I386)) {
394 // This indicates a user requested -linkmode=external.
395 // The startup code uses an import of runtime/cgo to decide
396 // whether to initialize the TLS. So give it one. This could
397 // be handled differently but it's an unusual case.
398 if lib := loadinternal(ctxt, "runtime/cgo"); lib != nil {
400 ldshlibsyms(ctxt, lib.Shlib)
402 if ctxt.BuildMode == BuildModeShared || ctxt.linkShared {
403 Exitf("cannot implicitly include runtime/cgo in a shared library")
405 loadobjfile(ctxt, lib)
410 if ctxt.LinkMode == LinkInternal {
411 // Drop all the cgo_import_static declarations.
412 // Turns out we won't be needing them.
413 for _, s := range ctxt.Syms.Allsym {
414 if s.Type == sym.SHOSTOBJ {
415 // If a symbol was marked both
416 // cgo_import_static and cgo_import_dynamic,
417 // then we want to make it cgo_import_dynamic
419 if s.Extname != "" && s.Dynimplib != "" && !s.Attr.CgoExport() {
420 s.Type = sym.SDYNIMPORT
428 tlsg := ctxt.Syms.Lookup("runtime.tlsg", 0)
430 // runtime.tlsg is used for external linking on platforms that do not define
431 // a variable to hold g in assembly (currently only intel).
433 tlsg.Type = sym.STLSBSS
434 tlsg.Size = int64(ctxt.Arch.PtrSize)
435 } else if tlsg.Type != sym.SDYNIMPORT {
436 Errorf(nil, "runtime declared tlsg variable %v", tlsg.Type)
438 tlsg.Attr |= sym.AttrReachable
441 var moduledata *sym.Symbol
442 if ctxt.BuildMode == BuildModePlugin {
443 moduledata = ctxt.Syms.Lookup("local.pluginmoduledata", 0)
444 moduledata.Attr |= sym.AttrLocal
446 moduledata = ctxt.Syms.Lookup("runtime.firstmoduledata", 0)
448 if moduledata.Type != 0 && moduledata.Type != sym.SDYNIMPORT {
449 // If the module (toolchain-speak for "executable or shared
450 // library") we are linking contains the runtime package, it
451 // will define the runtime.firstmoduledata symbol and we
452 // truncate it back to 0 bytes so we can define its entire
453 // contents in symtab.go:symtab().
456 // In addition, on ARM, the runtime depends on the linker
457 // recording the value of GOARM.
458 if ctxt.Arch.Family == sys.ARM {
459 s := ctxt.Syms.Lookup("runtime.goarm", 0)
462 s.AddUint8(uint8(objabi.GOARM))
465 if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) {
466 s := ctxt.Syms.Lookup("runtime.framepointer_enabled", 0)
472 // If OTOH the module does not contain the runtime package,
473 // create a local symbol for the moduledata.
474 moduledata = ctxt.Syms.Lookup("local.moduledata", 0)
475 moduledata.Attr |= sym.AttrLocal
477 // In all cases way we mark the moduledata as noptrdata to hide it from
479 moduledata.Type = sym.SNOPTRDATA
480 moduledata.Attr |= sym.AttrReachable
481 ctxt.Moduledata = moduledata
483 // Now that we know the link mode, trim the dynexp list.
484 x := sym.AttrCgoExportDynamic
486 if ctxt.LinkMode == LinkExternal {
487 x = sym.AttrCgoExportStatic
490 for i := range dynexp {
491 if dynexp[i].Attr&x != 0 {
492 dynexp[w] = dynexp[i]
498 // In internal link mode, read the host object files.
499 if ctxt.LinkMode == LinkInternal {
502 // If we have any undefined symbols in external
503 // objects, try to read them from the libgcc file.
505 for _, s := range ctxt.Syms.Allsym {
506 for _, r := range s.R {
507 if r.Sym != nil && r.Sym.Type == sym.SXREF && r.Sym.Name != ".got" {
514 if *flagLibGCC == "" {
515 *flagLibGCC = ctxt.findLibPathCmd("--print-libgcc-file-name", "libgcc")
517 if *flagLibGCC != "none" {
518 hostArchive(ctxt, *flagLibGCC)
520 if ctxt.HeadType == objabi.Hwindows {
521 if p := ctxt.findLibPath("libmingwex.a"); p != "none" {
524 if p := ctxt.findLibPath("libmingw32.a"); p != "none" {
527 // TODO: maybe do something similar to peimporteddlls to collect all lib names
528 // and try link them all to final exe just like libmingwex.a and libmingw32.a:
531 #cgo windows LDFLAGS: -lmsvcrt -lm
541 // We've loaded all the code now.
544 // If there are no dynamic libraries needed, gcc disables dynamic linking.
545 // Because of this, glibc's dynamic ELF loader occasionally (like in version 2.13)
546 // assumes that a dynamic binary always refers to at least one dynamic library.
547 // Rather than be a source of test cases for glibc, disable dynamic linking
548 // the same way that gcc would.
550 // Exception: on OS X, programs such as Shark only work with dynamic
551 // binaries, so leave it enabled on OS X (Mach-O) binaries.
552 // Also leave it enabled on Solaris which doesn't support
553 // statically linked binaries.
554 if ctxt.BuildMode == BuildModeExe {
555 if havedynamic == 0 && ctxt.HeadType != objabi.Hdarwin && ctxt.HeadType != objabi.Hsolaris {
560 // If type. symbols are visible in the symbol table, rename them
561 // using a SHA-1 prefix. This reduces binary size (the full
562 // string of a type symbol can be multiple kilobytes) and removes
563 // characters that upset external linkers.
565 // Keep the type.. prefix, which parts of the linker (like the
566 // DWARF generator) know means the symbol is not decodable.
568 // Leave type.runtime. symbols alone, because other parts of
569 // the linker manipulates them, and also symbols whose names
570 // would not be shortened by this process.
571 if typeSymbolMangling(ctxt) {
572 *FlagW = true // disable DWARF generation
573 for _, s := range ctxt.Syms.Allsym {
574 newName := typeSymbolMangle(s.Name)
575 if newName != s.Name {
576 ctxt.Syms.Rename(s.Name, newName, int(s.Version))
581 // If package versioning is required, generate a hash of the
582 // packages used in the link.
583 if ctxt.BuildMode == BuildModeShared || ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins() {
584 for _, lib := range ctxt.Library {
591 if ctxt.Arch == sys.Arch386 {
592 if (ctxt.BuildMode == BuildModeCArchive && ctxt.IsELF) || (ctxt.BuildMode == BuildModeCShared && ctxt.HeadType != objabi.Hwindows) || ctxt.BuildMode == BuildModePIE || ctxt.DynlinkingGo() {
593 got := ctxt.Syms.Lookup("_GLOBAL_OFFSET_TABLE_", 0)
594 got.Type = sym.SDYNIMPORT
595 got.Attr |= sym.AttrReachable
601 // put symbols into Textp
602 // do it in postorder so that packages are laid down in dependency order
603 // internal first, then everything else
604 ctxt.Library = postorder(ctxt.Library)
605 for _, doInternal := range [2]bool{true, false} {
606 for _, lib := range ctxt.Library {
607 if isRuntimeDepPkg(lib.Pkg) != doInternal {
610 ctxt.Textp = append(ctxt.Textp, lib.Textp...)
611 for _, s := range lib.DupTextSyms {
612 if !s.Attr.OnList() {
613 ctxt.Textp = append(ctxt.Textp, s)
614 s.Attr |= sym.AttrOnList
615 // dupok symbols may be defined in multiple packages. its
616 // associated package is chosen sort of arbitrarily (the
617 // first containing package that the linker loads). canonicalize
618 // it here to the package with which it will be laid down
620 s.File = objabi.PathToPrefix(lib.Pkg)
626 if len(ctxt.Shlibs) > 0 {
627 // We might have overwritten some functions above (this tends to happen for the
628 // autogenerated type equality/hashing functions) and we don't want to generated
629 // pcln table entries for these any more so remove them from Textp.
630 textp := make([]*sym.Symbol, 0, len(ctxt.Textp))
631 for _, s := range ctxt.Textp {
632 if s.Type != sym.SDYNIMPORT {
633 textp = append(textp, s)
640 // typeSymbolMangling reports whether the linker should shorten the
641 // names of symbols that represent Go types.
643 // As the names of these symbols are derived from the string of
644 // the type, they can run to many kilobytes long. So we shorten
645 // them using a SHA-1 when the name appears in the final binary.
647 // These are the symbols that begin with the prefix 'type.' and
648 // contain run-time type information used by the runtime and reflect
649 // packages. All Go binaries contain these symbols, but only only
650 // those programs loaded dynamically in multiple parts need these
651 // symbols to have entries in the symbol table.
652 func typeSymbolMangling(ctxt *Link) bool {
653 return ctxt.BuildMode == BuildModeShared || ctxt.linkShared || ctxt.BuildMode == BuildModePlugin || ctxt.Syms.ROLookup("plugin.Open", 0) != nil
656 // typeSymbolMangle mangles the given symbol name into something shorter.
657 func typeSymbolMangle(name string) string {
658 if !strings.HasPrefix(name, "type.") {
661 if strings.HasPrefix(name, "type.runtime.") {
664 if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529
667 hash := sha1.Sum([]byte(name))
672 return prefix + base64.StdEncoding.EncodeToString(hash[:6])
676 * look for the next file in an archive.
677 * adapted from libmach.
679 func nextar(bp *bio.Reader, off int64, a *ArHdr) int64 {
684 var buf [SAR_HDR]byte
685 if n, err := io.ReadFull(bp, buf[:]); err != nil {
686 if n == 0 && err != io.EOF {
692 a.name = artrim(buf[0:16])
693 a.date = artrim(buf[16:28])
694 a.uid = artrim(buf[28:34])
695 a.gid = artrim(buf[34:40])
696 a.mode = artrim(buf[40:48])
697 a.size = artrim(buf[48:58])
698 a.fmag = artrim(buf[58:60])
700 arsize := atolwhex(a.size)
704 return arsize + SAR_HDR
707 func genhash(ctxt *Link, lib *sym.Library) {
708 f, err := bio.Open(lib.File)
710 Errorf(nil, "cannot open file %s for hash generation: %v", lib.File, err)
715 var magbuf [len(ARMAG)]byte
716 if _, err := io.ReadFull(f, magbuf[:]); err != nil {
717 Exitf("file %s too short", lib.File)
720 if string(magbuf[:]) != ARMAG {
721 Exitf("%s is not an archive file", lib.File)
725 l := nextar(f, f.Offset(), &arhdr)
727 Errorf(nil, "%s: short read on archive file symbol header", lib.File)
730 if arhdr.name != pkgdef {
731 Errorf(nil, "%s: missing package data entry", lib.File)
737 // To compute the hash of a package, we hash the first line of
738 // __.PKGDEF (which contains the toolchain version and any
739 // GOEXPERIMENT flags) and the export data (which is between
740 // the first two occurrences of "\n$$").
742 pkgDefBytes := make([]byte, atolwhex(arhdr.size))
743 _, err = io.ReadFull(f, pkgDefBytes)
745 Errorf(nil, "%s: error reading package data: %v", lib.File, err)
748 firstEOL := bytes.IndexByte(pkgDefBytes, '\n')
750 Errorf(nil, "cannot parse package data of %s for hash generation, no newline found", lib.File)
753 firstDoubleDollar := bytes.Index(pkgDefBytes, []byte("\n$$"))
754 if firstDoubleDollar < 0 {
755 Errorf(nil, "cannot parse package data of %s for hash generation, no \\n$$ found", lib.File)
758 secondDoubleDollar := bytes.Index(pkgDefBytes[firstDoubleDollar+1:], []byte("\n$$"))
759 if secondDoubleDollar < 0 {
760 Errorf(nil, "cannot parse package data of %s for hash generation, only one \\n$$ found", lib.File)
763 h.Write(pkgDefBytes[0:firstEOL])
764 h.Write(pkgDefBytes[firstDoubleDollar : firstDoubleDollar+secondDoubleDollar])
765 lib.Hash = hex.EncodeToString(h.Sum(nil))
768 func loadobjfile(ctxt *Link, lib *sym.Library) {
769 pkg := objabi.PathToPrefix(lib.Pkg)
771 if ctxt.Debugvlog > 1 {
772 ctxt.Logf("%5.2f ldobj: %s (%s)\n", Cputime(), lib.File, pkg)
774 f, err := bio.Open(lib.File)
776 Exitf("cannot open file %s: %v", lib.File, err)
780 if pkg == "main" && !lib.Main {
781 Exitf("%s: not package main", lib.File)
784 // Ideally, we'd check that *all* object files within
785 // the archive were marked safe, but here we settle
788 // Historically, cmd/link only checked the __.PKGDEF
789 // file, which in turn came from the first object
790 // file, typically produced by cmd/compile. The
791 // remaining object files are normally produced by
792 // cmd/asm, which doesn't support marking files as
793 // safe anyway. So at least in practice, this matches
794 // how safe mode has always worked.
795 if *flagU && !lib.Safe {
796 Exitf("%s: load of unsafe package %s", lib.File, pkg)
800 for i := 0; i < len(ARMAG); i++ {
801 if c, err := f.ReadByte(); err == nil && c == ARMAG[i] {
805 /* load it as a regular file */
808 ldobj(ctxt, f, lib, l, lib.File, lib.File)
813 * load all the object files from the archive now.
814 * this gives us sequential file access and keeps us
815 * from needing to come back later to pick up more
816 * objects. it breaks the usual C archive model, but
817 * this is Go, not C. the common case in Go is that
818 * we need to load all the objects, and then we throw away
819 * the individual symbols that are unused.
821 * loading every object will also make it possible to
822 * load foreign objects not referenced by __.PKGDEF.
827 l := nextar(f, off, &arhdr)
832 Exitf("%s: malformed archive", lib.File)
836 // __.PKGDEF isn't a real Go object file, and it's
837 // absent in -linkobj builds anyway. Skipping it
838 // ensures consistency between -linkobj and normal
840 if arhdr.name == pkgdef {
844 pname := fmt.Sprintf("%s(%s)", lib.File, arhdr.name)
845 l = atolwhex(arhdr.size)
846 ldobj(ctxt, f, lib, l, pname, lib.File)
850 type Hostobj struct {
851 ld func(*Link, *bio.Reader, string, int64, string)
859 var hostobj []Hostobj
861 // These packages can use internal linking mode.
862 // Others trigger external mode.
863 var internalpkg = []string{
864 "crypto/internal/boring",
873 func ldhostobj(ld func(*Link, *bio.Reader, string, int64, string), headType objabi.HeadType, f *bio.Reader, pkg string, length int64, pn string, file string) *Hostobj {
875 for _, intpkg := range internalpkg {
882 // DragonFly declares errno with __thread, which results in a symbol
883 // type of R_386_TLS_GD or R_X86_64_TLSGD. The Go linker does not
884 // currently know how to handle TLS relocations, hence we have to
885 // force external linking for any libraries that link in code that
886 // uses errno. This can be removed if the Go linker ever supports
887 // these relocation types.
888 if headType == objabi.Hdragonfly {
889 if pkg == "net" || pkg == "os/user" {
898 hostobj = append(hostobj, Hostobj{})
899 h := &hostobj[len(hostobj)-1]
909 func hostobjs(ctxt *Link) {
912 for i := 0; i < len(hostobj); i++ {
914 f, err := bio.Open(h.file)
916 Exitf("cannot reopen %s: %v", h.pn, err)
920 h.ld(ctxt, f, h.pkg, h.length, h.pn)
925 func hostlinksetup(ctxt *Link) {
926 if ctxt.LinkMode != LinkExternal {
930 // For external link, record that we need to tell the external linker -s,
931 // and turn off -s internally: the external linker needs the symbol
932 // information for its final link.
936 // create temporary directory and arrange cleanup
937 if *flagTmpdir == "" {
938 dir, err := ioutil.TempDir("", "go-link-")
945 os.RemoveAll(*flagTmpdir)
949 // change our output to temporary object file
953 p := filepath.Join(*flagTmpdir, "go.o")
955 f, err := os.OpenFile(p, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775)
957 Exitf("cannot create %s: %v", p, err)
960 ctxt.Out.w = bufio.NewWriter(f)
965 // hostobjCopy creates a copy of the object files in hostobj in a
966 // temporary directory.
967 func hostobjCopy() (paths []string) {
968 var wg sync.WaitGroup
969 sema := make(chan struct{}, runtime.NumCPU()) // limit open file descriptors
970 for i, h := range hostobj {
972 dst := filepath.Join(*flagTmpdir, fmt.Sprintf("%06d.o", i))
973 paths = append(paths, dst)
982 f, err := os.Open(h.file)
984 Exitf("cannot reopen %s: %v", h.pn, err)
986 if _, err := f.Seek(h.off, 0); err != nil {
987 Exitf("cannot seek %s: %v", h.pn, err)
990 w, err := os.Create(dst)
992 Exitf("cannot create %s: %v", dst, err)
994 if _, err := io.CopyN(w, f, h.length); err != nil {
995 Exitf("cannot write %s: %v", dst, err)
997 if err := w.Close(); err != nil {
998 Exitf("cannot close %s: %v", dst, err)
1006 // writeGDBLinkerScript creates gcc linker script file in temp
1007 // directory. writeGDBLinkerScript returns created file path.
1008 // The script is used to work around gcc bug
1009 // (see https://golang.org/issue/20183 for details).
1010 func writeGDBLinkerScript() string {
1011 name := "fix_debug_gdb_scripts.ld"
1012 path := filepath.Join(*flagTmpdir, name)
1015 .debug_gdb_scripts BLOCK(__section_alignment__) (NOLOAD) :
1017 *(.debug_gdb_scripts)
1020 INSERT AFTER .debug_types;
1022 err := ioutil.WriteFile(path, []byte(src), 0666)
1024 Errorf(nil, "WriteFile %s failed: %v", name, err)
1029 // archive builds a .a archive from the hostobj object files.
1030 func (ctxt *Link) archive() {
1031 if ctxt.BuildMode != BuildModeCArchive {
1035 if *flagExtar == "" {
1039 mayberemoveoutfile()
1041 // Force the buffer to flush here so that external
1042 // tools will see a complete file.
1044 if err := ctxt.Out.f.Close(); err != nil {
1045 Exitf("close: %v", err)
1049 argv := []string{*flagExtar, "-q", "-c", "-s", *flagOutfile}
1050 argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
1051 argv = append(argv, hostobjCopy()...)
1053 if ctxt.Debugvlog != 0 {
1054 ctxt.Logf("archive: %s\n", strings.Join(argv, " "))
1057 if out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput(); err != nil {
1058 Exitf("running %s failed: %v\n%s", argv[0], err, out)
1062 func (ctxt *Link) hostlink() {
1063 if ctxt.LinkMode != LinkExternal || nerrors > 0 {
1066 if ctxt.BuildMode == BuildModeCArchive {
1070 if *flagExtld == "" {
1075 argv = append(argv, *flagExtld)
1076 argv = append(argv, hostlinkArchArgs(ctxt.Arch)...)
1078 if *FlagS || debug_s {
1079 if ctxt.HeadType == objabi.Hdarwin {
1080 // Recent versions of macOS print
1081 // ld: warning: option -s is obsolete and being ignored
1082 // so do not pass any arguments.
1084 argv = append(argv, "-s")
1088 switch ctxt.HeadType {
1089 case objabi.Hdarwin:
1090 argv = append(argv, "-Wl,-headerpad,1144")
1091 if ctxt.DynlinkingGo() {
1092 argv = append(argv, "-Wl,-flat_namespace")
1094 if ctxt.BuildMode == BuildModeExe && !ctxt.Arch.InFamily(sys.ARM64) {
1095 argv = append(argv, "-Wl,-no_pie")
1097 case objabi.Hopenbsd:
1098 argv = append(argv, "-Wl,-nopie")
1099 case objabi.Hwindows:
1101 argv = append(argv, "-mwindows")
1103 argv = append(argv, "-mconsole")
1107 switch ctxt.BuildMode {
1109 if ctxt.HeadType == objabi.Hdarwin {
1110 if ctxt.Arch.Family == sys.ARM64 {
1111 // __PAGEZERO segment size determined empirically.
1112 // XCode 9.0.1 successfully uploads an iOS app with this value.
1113 argv = append(argv, "-Wl,-pagezero_size,100000000")
1115 argv = append(argv, "-Wl,-pagezero_size,4000000")
1120 if ctxt.HeadType != objabi.Hdarwin {
1121 if ctxt.UseRelro() {
1122 argv = append(argv, "-Wl,-z,relro")
1124 argv = append(argv, "-pie")
1126 case BuildModeCShared:
1127 if ctxt.HeadType == objabi.Hdarwin {
1128 argv = append(argv, "-dynamiclib")
1129 if ctxt.Arch.Family != sys.AMD64 {
1130 argv = append(argv, "-Wl,-read_only_relocs,suppress")
1134 argv = append(argv, "-Wl,-Bsymbolic")
1135 if ctxt.UseRelro() {
1136 argv = append(argv, "-Wl,-z,relro")
1138 argv = append(argv, "-shared")
1139 if ctxt.HeadType != objabi.Hwindows {
1140 // Pass -z nodelete to mark the shared library as
1141 // non-closeable: a dlclose will do nothing.
1142 argv = append(argv, "-Wl,-z,nodelete")
1145 case BuildModeShared:
1146 if ctxt.UseRelro() {
1147 argv = append(argv, "-Wl,-z,relro")
1149 argv = append(argv, "-shared")
1150 case BuildModePlugin:
1151 if ctxt.HeadType == objabi.Hdarwin {
1152 argv = append(argv, "-dynamiclib")
1154 if ctxt.UseRelro() {
1155 argv = append(argv, "-Wl,-z,relro")
1157 argv = append(argv, "-shared")
1161 if ctxt.IsELF && ctxt.DynlinkingGo() {
1162 // We force all symbol resolution to be done at program startup
1163 // because lazy PLT resolution can use large amounts of stack at
1164 // times we cannot allow it to do so.
1165 argv = append(argv, "-Wl,-znow")
1167 // Do not let the host linker generate COPY relocations. These
1168 // can move symbols out of sections that rely on stable offsets
1169 // from the beginning of the section (like sym.STYPE).
1170 argv = append(argv, "-Wl,-znocopyreloc")
1172 if ctxt.Arch.InFamily(sys.ARM, sys.ARM64) {
1173 // On ARM, the GNU linker will generate COPY relocations
1174 // even with -znocopyreloc set.
1175 // https://sourceware.org/bugzilla/show_bug.cgi?id=19962
1177 // On ARM64, the GNU linker will fail instead of
1178 // generating COPY relocations.
1180 // In both cases, switch to gold.
1181 argv = append(argv, "-fuse-ld=gold")
1183 // If gold is not installed, gcc will silently switch
1184 // back to ld.bfd. So we parse the version information
1185 // and provide a useful error if gold is missing.
1186 cmd := exec.Command(*flagExtld, "-fuse-ld=gold", "-Wl,--version")
1187 if out, err := cmd.CombinedOutput(); err == nil {
1188 if !bytes.Contains(out, []byte("GNU gold")) {
1189 log.Fatalf("ARM external linker must be gold (issue #15696), but is not: %s", out)
1195 if ctxt.IsELF && len(buildinfo) > 0 {
1196 argv = append(argv, fmt.Sprintf("-Wl,--build-id=0x%x", buildinfo))
1199 // On Windows, given -o foo, GCC will append ".exe" to produce
1200 // "foo.exe". We have decided that we want to honor the -o
1201 // option. To make this work, we append a '.' so that GCC
1202 // will decide that the file already has an extension. We
1203 // only want to do this when producing a Windows output file
1204 // on a Windows host.
1205 outopt := *flagOutfile
1206 if objabi.GOOS == "windows" && runtime.GOOS == "windows" && filepath.Ext(outopt) == "" {
1209 argv = append(argv, "-o")
1210 argv = append(argv, outopt)
1212 if rpath.val != "" {
1213 argv = append(argv, fmt.Sprintf("-Wl,-rpath,%s", rpath.val))
1216 // Force global symbols to be exported for dlopen, etc.
1218 argv = append(argv, "-rdynamic")
1221 if strings.Contains(argv[0], "clang") {
1222 argv = append(argv, "-Qunused-arguments")
1225 const compressDWARF = "-Wl,--compress-debug-sections=zlib-gnu"
1226 if ctxt.compressDWARF && linkerFlagSupported(argv[0], compressDWARF) {
1227 argv = append(argv, compressDWARF)
1230 argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
1231 argv = append(argv, hostobjCopy()...)
1233 if ctxt.linkShared {
1234 seenDirs := make(map[string]bool)
1235 seenLibs := make(map[string]bool)
1236 addshlib := func(path string) {
1237 dir, base := filepath.Split(path)
1239 argv = append(argv, "-L"+dir)
1241 argv = append(argv, "-Wl,-rpath="+dir)
1243 seenDirs[dir] = true
1245 base = strings.TrimSuffix(base, ".so")
1246 base = strings.TrimPrefix(base, "lib")
1247 if !seenLibs[base] {
1248 argv = append(argv, "-l"+base)
1249 seenLibs[base] = true
1252 for _, shlib := range ctxt.Shlibs {
1253 addshlib(shlib.Path)
1254 for _, dep := range shlib.Deps {
1258 libpath := findshlib(ctxt, dep)
1266 argv = append(argv, ldflag...)
1268 // When building a program with the default -buildmode=exe the
1269 // gc compiler generates code requires DT_TEXTREL in a
1270 // position independent executable (PIE). On systems where the
1271 // toolchain creates PIEs by default, and where DT_TEXTREL
1272 // does not work, the resulting programs will not run. See
1273 // issue #17847. To avoid this problem pass -no-pie to the
1274 // toolchain if it is supported.
1275 if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared {
1276 // GCC uses -no-pie, clang uses -nopie.
1277 for _, nopie := range []string{"-no-pie", "-nopie"} {
1278 if linkerFlagSupported(argv[0], nopie) {
1279 argv = append(argv, nopie)
1285 for _, p := range strings.Fields(*flagExtldflags) {
1286 argv = append(argv, p)
1288 // clang, unlike GCC, passes -rdynamic to the linker
1289 // even when linking with -static, causing a linker
1290 // error when using GNU ld. So take out -rdynamic if
1291 // we added it. We do it in this order, rather than
1292 // only adding -rdynamic later, so that -*extldflags
1293 // can override -rdynamic without using -static.
1294 if ctxt.IsELF && p == "-static" {
1295 for i := range argv {
1296 if argv[i] == "-rdynamic" {
1302 if ctxt.HeadType == objabi.Hwindows {
1303 // use gcc linker script to work around gcc bug
1304 // (see https://golang.org/issue/20183 for details).
1305 p := writeGDBLinkerScript()
1306 argv = append(argv, "-Wl,-T,"+p)
1307 // libmingw32 and libmingwex have some inter-dependencies,
1308 // so must use linker groups.
1309 argv = append(argv, "-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group")
1310 argv = append(argv, peimporteddlls()...)
1313 if ctxt.Debugvlog != 0 {
1314 ctxt.Logf("%5.2f host link:", Cputime())
1315 for _, v := range argv {
1321 if out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput(); err != nil {
1322 Exitf("running %s failed: %v\n%s", argv[0], err, out)
1323 } else if len(out) > 0 {
1324 // always print external output even if the command is successful, so that we don't
1325 // swallow linker warnings (see https://golang.org/issue/17935).
1326 ctxt.Logf("%s", out)
1329 if !*FlagS && !*FlagW && !debug_s && ctxt.HeadType == objabi.Hdarwin {
1330 dsym := filepath.Join(*flagTmpdir, "go.dwarf")
1331 if out, err := exec.Command("dsymutil", "-f", *flagOutfile, "-o", dsym).CombinedOutput(); err != nil {
1332 Exitf("%s: running dsymutil failed: %v\n%s", os.Args[0], err, out)
1334 // Skip combining if `dsymutil` didn't generate a file. See #11994.
1335 if _, err := os.Stat(dsym); os.IsNotExist(err) {
1338 // For os.Rename to work reliably, must be in same directory as outfile.
1339 combinedOutput := *flagOutfile + "~"
1340 isIOS, err := machoCombineDwarf(ctxt, *flagOutfile, dsym, combinedOutput)
1342 Exitf("%s: combining dwarf failed: %v", os.Args[0], err)
1345 os.Remove(*flagOutfile)
1346 if err := os.Rename(combinedOutput, *flagOutfile); err != nil {
1347 Exitf("%s: %v", os.Args[0], err)
1353 var createTrivialCOnce sync.Once
1355 func linkerFlagSupported(linker, flag string) bool {
1356 createTrivialCOnce.Do(func() {
1357 src := filepath.Join(*flagTmpdir, "trivial.c")
1358 if err := ioutil.WriteFile(src, []byte("int main() { return 0; }"), 0666); err != nil {
1359 Errorf(nil, "WriteFile trivial.c failed: %v", err)
1363 cmd := exec.Command(linker, flag, "trivial.c")
1364 cmd.Dir = *flagTmpdir
1365 cmd.Env = append([]string{"LC_ALL=C"}, os.Environ()...)
1366 out, err := cmd.CombinedOutput()
1367 // GCC says "unrecognized command line option ‘-no-pie’"
1368 // clang says "unknown argument: '-no-pie'"
1369 return err == nil && !bytes.Contains(out, []byte("unrecognized")) && !bytes.Contains(out, []byte("unknown"))
1372 // hostlinkArchArgs returns arguments to pass to the external linker
1373 // based on the architecture.
1374 func hostlinkArchArgs(arch *sys.Arch) []string {
1375 switch arch.Family {
1377 return []string{"-m32"}
1378 case sys.AMD64, sys.PPC64, sys.S390X:
1379 return []string{"-m64"}
1381 return []string{"-marm"}
1385 return []string{"-mabi=64"}
1387 return []string{"-mabi=32"}
1392 // ldobj loads an input object. If it is a host object (an object
1393 // compiled by a non-Go compiler) it returns the Hostobj pointer. If
1394 // it is a Go object, it returns nil.
1395 func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, file string) *Hostobj {
1396 pkg := objabi.PathToPrefix(lib.Pkg)
1398 eof := f.Offset() + length
1406 magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4)
1407 if magic == 0x7f454c46 { // \x7F E L F
1408 ldelf := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1409 textp, flags, err := loadelf.Load(ctxt.Arch, ctxt.Syms, f, pkg, length, pn, ehdr.flags)
1411 Errorf(nil, "%v", err)
1415 ctxt.Textp = append(ctxt.Textp, textp...)
1417 return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file)
1420 if magic&^1 == 0xfeedface || magic&^0x01000000 == 0xcefaedfe {
1421 ldmacho := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1422 textp, err := loadmacho.Load(ctxt.Arch, ctxt.Syms, f, pkg, length, pn)
1424 Errorf(nil, "%v", err)
1427 ctxt.Textp = append(ctxt.Textp, textp...)
1429 return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file)
1432 if c1 == 0x4c && c2 == 0x01 || c1 == 0x64 && c2 == 0x86 {
1433 ldpe := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1434 textp, rsrc, err := loadpe.Load(ctxt.Arch, ctxt.Syms, f, pkg, length, pn)
1436 Errorf(nil, "%v", err)
1440 setpersrc(ctxt, rsrc)
1442 ctxt.Textp = append(ctxt.Textp, textp...)
1444 return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file)
1447 /* check the header */
1448 line, err := f.ReadString('\n')
1450 Errorf(nil, "truncated object file: %s: %v", pn, err)
1454 if !strings.HasPrefix(line, "go object ") {
1455 if strings.HasSuffix(pn, ".go") {
1456 Exitf("%s: uncompiled .go source file", pn)
1460 if line == ctxt.Arch.Name {
1461 // old header format: just $GOOS
1462 Errorf(nil, "%s: stale object file", pn)
1466 Errorf(nil, "%s: not an object file", pn)
1470 // First, check that the basic GOOS, GOARCH, and Version match.
1471 t := fmt.Sprintf("%s %s %s ", objabi.GOOS, objabi.GOARCH, objabi.Version)
1473 line = strings.TrimRight(line, "\n")
1474 if !strings.HasPrefix(line[10:]+" ", t) && !*flagF {
1475 Errorf(nil, "%s: object is [%s] expected [%s]", pn, line[10:], t)
1479 // Second, check that longer lines match each other exactly,
1480 // so that the Go compiler and write additional information
1481 // that must be the same from run to run.
1482 if len(line) >= len(t)+10 {
1485 } else if theline != line[10:] {
1486 Errorf(nil, "%s: object is [%s] expected [%s]", pn, line[10:], theline)
1491 // Skip over exports and other info -- ends with \n!\n.
1493 // Note: It's possible for "\n!\n" to appear within the binary
1494 // package export data format. To avoid truncating the package
1495 // definition prematurely (issue 21703), we keep keep track of
1496 // how many "$$" delimiters we've seen.
1498 import0 := f.Offset()
1500 c1 = '\n' // the last line ended in \n
1506 if markers%2 == 0 && c2 == '!' && c3 == '\n' {
1509 if c2 == '$' && c3 == '$' {
1518 Errorf(nil, "truncated object file: %s", pn)
1523 import1 := f.Offset()
1526 ldpkg(ctxt, f, lib, import1-import0-2, pn) // -2 for !\n
1529 objfile.Load(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn)
1530 addImports(ctxt, lib, pn)
1534 func readelfsymboldata(ctxt *Link, f *elf.File, sym *elf.Symbol) []byte {
1535 data := make([]byte, sym.Size)
1536 sect := f.Sections[sym.Section]
1537 if sect.Type != elf.SHT_PROGBITS && sect.Type != elf.SHT_NOTE {
1538 Errorf(nil, "reading %s from non-data section", sym.Name)
1540 n, err := sect.ReadAt(data, int64(sym.Value-sect.Addr))
1541 if uint64(n) != sym.Size {
1542 Errorf(nil, "reading contents of %s: %v", sym.Name, err)
1547 func readwithpad(r io.Reader, sz int32) ([]byte, error) {
1548 data := make([]byte, Rnd(int64(sz), 4))
1549 _, err := io.ReadFull(r, data)
1557 func readnote(f *elf.File, name []byte, typ int32) ([]byte, error) {
1558 for _, sect := range f.Sections {
1559 if sect.Type != elf.SHT_NOTE {
1564 var namesize, descsize, noteType int32
1565 err := binary.Read(r, f.ByteOrder, &namesize)
1570 return nil, fmt.Errorf("read namesize failed: %v", err)
1572 err = binary.Read(r, f.ByteOrder, &descsize)
1574 return nil, fmt.Errorf("read descsize failed: %v", err)
1576 err = binary.Read(r, f.ByteOrder, ¬eType)
1578 return nil, fmt.Errorf("read type failed: %v", err)
1580 noteName, err := readwithpad(r, namesize)
1582 return nil, fmt.Errorf("read name failed: %v", err)
1584 desc, err := readwithpad(r, descsize)
1586 return nil, fmt.Errorf("read desc failed: %v", err)
1588 if string(name) == string(noteName) && typ == noteType {
1596 func findshlib(ctxt *Link, shlib string) string {
1597 if filepath.IsAbs(shlib) {
1600 for _, libdir := range ctxt.Libdir {
1601 libpath := filepath.Join(libdir, shlib)
1602 if _, err := os.Stat(libpath); err == nil {
1606 Errorf(nil, "cannot find shared library: %s", shlib)
1610 func ldshlibsyms(ctxt *Link, shlib string) {
1612 if filepath.IsAbs(shlib) {
1614 shlib = filepath.Base(shlib)
1616 libpath = findshlib(ctxt, shlib)
1621 for _, processedlib := range ctxt.Shlibs {
1622 if processedlib.Path == libpath {
1626 if ctxt.Debugvlog > 1 {
1627 ctxt.Logf("%5.2f ldshlibsyms: found library with name %s at %s\n", Cputime(), shlib, libpath)
1630 f, err := elf.Open(libpath)
1632 Errorf(nil, "cannot open shared library: %s", libpath)
1637 hash, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GOABIHASH_TAG)
1639 Errorf(nil, "cannot read ABI hash from shared library %s: %v", libpath, err)
1643 depsbytes, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GODEPS_TAG)
1645 Errorf(nil, "cannot read dep list from shared library %s: %v", libpath, err)
1649 for _, dep := range strings.Split(string(depsbytes), "\n") {
1653 if !filepath.IsAbs(dep) {
1654 // If the dep can be interpreted as a path relative to the shlib
1655 // in which it was found, do that. Otherwise, we will leave it
1656 // to be resolved by libdir lookup.
1657 abs := filepath.Join(filepath.Dir(libpath), dep)
1658 if _, err := os.Stat(abs); err == nil {
1662 deps = append(deps, dep)
1665 syms, err := f.DynamicSymbols()
1667 Errorf(nil, "cannot read symbols from shared library: %s", libpath)
1670 gcdataLocations := make(map[uint64]*sym.Symbol)
1671 for _, elfsym := range syms {
1672 if elf.ST_TYPE(elfsym.Info) == elf.STT_NOTYPE || elf.ST_TYPE(elfsym.Info) == elf.STT_SECTION {
1675 lsym := ctxt.Syms.Lookup(elfsym.Name, 0)
1676 // Because loadlib above loads all .a files before loading any shared
1677 // libraries, any non-dynimport symbols we find that duplicate symbols
1678 // already loaded should be ignored (the symbols from the .a files
1680 if lsym.Type != 0 && lsym.Type != sym.SDYNIMPORT {
1683 lsym.Type = sym.SDYNIMPORT
1684 lsym.ElfType = elf.ST_TYPE(elfsym.Info)
1685 lsym.Size = int64(elfsym.Size)
1686 if elfsym.Section != elf.SHN_UNDEF {
1687 // Set .File for the library that actually defines the symbol.
1689 // The decodetype_* functions in decodetype.go need access to
1691 if strings.HasPrefix(lsym.Name, "type.") && !strings.HasPrefix(lsym.Name, "type..") {
1692 lsym.P = readelfsymboldata(ctxt, f, &elfsym)
1693 gcdataLocations[elfsym.Value+2*uint64(ctxt.Arch.PtrSize)+8+1*uint64(ctxt.Arch.PtrSize)] = lsym
1697 gcdataAddresses := make(map[*sym.Symbol]uint64)
1698 if ctxt.Arch.Family == sys.ARM64 {
1699 for _, sect := range f.Sections {
1700 if sect.Type == elf.SHT_RELA {
1704 err := binary.Read(rdr, f.ByteOrder, &rela)
1707 } else if err != nil {
1708 Errorf(nil, "reading relocation failed %v", err)
1711 t := elf.R_AARCH64(rela.Info & 0xffff)
1712 if t != elf.R_AARCH64_RELATIVE {
1715 if lsym, ok := gcdataLocations[rela.Off]; ok {
1716 gcdataAddresses[lsym] = uint64(rela.Addend)
1723 ctxt.Shlibs = append(ctxt.Shlibs, Shlib{Path: libpath, Hash: hash, Deps: deps, File: f, gcdataAddresses: gcdataAddresses})
1726 func addsection(arch *sys.Arch, seg *sym.Segment, name string, rwx int) *sym.Section {
1727 sect := new(sym.Section)
1728 sect.Rwx = uint8(rwx)
1731 sect.Align = int32(arch.PtrSize) // everything is at least pointer-aligned
1732 seg.Sections = append(seg.Sections, sect)
1736 func Le16(b []byte) uint16 {
1737 return uint16(b[0]) | uint16(b[1])<<8
1740 func Le32(b []byte) uint32 {
1741 return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
1744 func Le64(b []byte) uint64 {
1745 return uint64(Le32(b)) | uint64(Le32(b[4:]))<<32
1748 func Be16(b []byte) uint16 {
1749 return uint16(b[0])<<8 | uint16(b[1])
1752 func Be32(b []byte) uint32 {
1753 return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
1759 limit int // limit on entry to sym
1762 var morestack *sym.Symbol
1764 // TODO: Record enough information in new object files to
1765 // allow stack checks here.
1767 func haslinkregister(ctxt *Link) bool {
1768 return ctxt.FixedFrameSize() != 0
1771 func callsize(ctxt *Link) int {
1772 if haslinkregister(ctxt) {
1775 return ctxt.Arch.RegSize
1778 func (ctxt *Link) dostkcheck() {
1781 morestack = ctxt.Syms.Lookup("runtime.morestack", 0)
1783 // Every splitting function ensures that there are at least StackLimit
1784 // bytes available below SP when the splitting prologue finishes.
1785 // If the splitting function calls F, then F begins execution with
1786 // at least StackLimit - callsize() bytes available.
1787 // Check that every function behaves correctly with this amount
1788 // of stack, following direct calls in order to piece together chains
1789 // of non-splitting functions.
1792 ch.limit = objabi.StackLimit - callsize(ctxt)
1794 // Check every function, but do the nosplit functions in a first pass,
1795 // to make the printed failure chains as short as possible.
1796 for _, s := range ctxt.Textp {
1797 // runtime.racesymbolizethunk is called from gcc-compiled C
1798 // code running on the operating system thread stack.
1799 // It uses more than the usual amount of stack but that's okay.
1800 if s.Name == "runtime.racesymbolizethunk" {
1804 if s.Attr.NoSplit() {
1806 stkcheck(ctxt, &ch, 0)
1810 for _, s := range ctxt.Textp {
1811 if !s.Attr.NoSplit() {
1813 stkcheck(ctxt, &ch, 0)
1818 func stkcheck(ctxt *Link, up *chain, depth int) int {
1822 // Don't duplicate work: only need to consider each
1823 // function at top of safe zone once.
1824 top := limit == objabi.StackLimit-callsize(ctxt)
1826 if s.Attr.StackCheck() {
1829 s.Attr |= sym.AttrStackCheck
1833 Errorf(s, "nosplit stack check too deep")
1834 stkbroke(ctxt, up, 0)
1838 if s.Attr.External() || s.FuncInfo == nil {
1839 // external function.
1840 // should never be called directly.
1841 // onlyctxt.Diagnose the direct caller.
1842 // TODO(mwhudson): actually think about this.
1843 // TODO(khr): disabled for now. Calls to external functions can only happen on the g0 stack.
1844 // See the trampolines in src/runtime/sys_darwin_$ARCH.go.
1845 if depth == 1 && s.Type != sym.SXREF && !ctxt.DynlinkingGo() &&
1846 ctxt.BuildMode != BuildModeCArchive && ctxt.BuildMode != BuildModePIE && ctxt.BuildMode != BuildModeCShared && ctxt.BuildMode != BuildModePlugin {
1847 //Errorf(s, "call to external function")
1853 stkbroke(ctxt, up, limit)
1857 // morestack looks like it calls functions,
1858 // but it switches the stack pointer first.
1866 if !s.Attr.NoSplit() {
1867 // Ensure we have enough stack to call morestack.
1868 ch.limit = limit - callsize(ctxt)
1870 if stkcheck(ctxt, &ch, depth+1) < 0 {
1876 // Raise limit to allow frame.
1878 if s.FuncInfo != nil {
1879 locals = s.FuncInfo.Locals
1881 limit = int(objabi.StackLimit+locals) + int(ctxt.FixedFrameSize())
1884 // Walk through sp adjustments in function, consuming relocs.
1891 for pciterinit(ctxt, &pcsp, &s.FuncInfo.Pcsp); pcsp.done == 0; pciternext(&pcsp) {
1892 // pcsp.value is in effect for [pcsp.pc, pcsp.nextpc).
1894 // Check stack size in effect for this span.
1895 if int32(limit)-pcsp.value < 0 {
1896 stkbroke(ctxt, up, int(int32(limit)-pcsp.value))
1900 // Process calls in this span.
1901 for ; ri < endr && uint32(s.R[ri].Off) < pcsp.nextpc; ri++ {
1905 case objabi.R_CALL, objabi.R_CALLARM, objabi.R_CALLARM64, objabi.R_CALLPOWER, objabi.R_CALLMIPS:
1906 ch.limit = int(int32(limit) - pcsp.value - int32(callsize(ctxt)))
1908 if stkcheck(ctxt, &ch, depth+1) < 0 {
1912 // Indirect call. Assume it is a call to a splitting function,
1913 // so we have to make sure it can call morestack.
1914 // Arrange the data structures to report both calls, so that
1915 // if there is an error, stkprint shows all the steps involved.
1916 case objabi.R_CALLIND:
1917 ch.limit = int(int32(limit) - pcsp.value - int32(callsize(ctxt)))
1920 ch1.limit = ch.limit - callsize(ctxt) // for morestack in called prologue
1923 if stkcheck(ctxt, &ch1, depth+2) < 0 {
1933 func stkbroke(ctxt *Link, ch *chain, limit int) {
1934 Errorf(ch.sym, "nosplit stack overflow")
1935 stkprint(ctxt, ch, limit)
1938 func stkprint(ctxt *Link, ch *chain, limit int) {
1943 if ch.sym.Attr.NoSplit() {
1944 name += " (nosplit)"
1947 name = "function pointer"
1951 // top of chain. ch->sym != nil.
1952 if ch.sym.Attr.NoSplit() {
1953 fmt.Printf("\t%d\tassumed on entry to %s\n", ch.limit, name)
1955 fmt.Printf("\t%d\tguaranteed after split check in %s\n", ch.limit, name)
1958 stkprint(ctxt, ch.up, ch.limit+callsize(ctxt))
1959 if !haslinkregister(ctxt) {
1960 fmt.Printf("\t%d\ton entry to %s\n", ch.limit, name)
1964 if ch.limit != limit {
1965 fmt.Printf("\t%d\tafter %s uses %d\n", limit, name, ch.limit-limit)
1970 fmt.Fprintf(os.Stderr, "usage: link [options] main.o\n")
1971 objabi.Flagprint(os.Stderr)
1975 type SymbolType int8
1978 // see also https://9p.io/magic/man2html/1/nm
1979 TextSym SymbolType = 'T'
1980 DataSym SymbolType = 'D'
1981 BSSSym SymbolType = 'B'
1982 UndefinedSym SymbolType = 'U'
1983 TLSSym SymbolType = 't'
1984 FrameSym SymbolType = 'm'
1985 ParamSym SymbolType = 'p'
1986 AutoSym SymbolType = 'a'
1988 // Deleted auto (not a real sym, just placeholder for type)
1989 DeletedAutoSym = 'x'
1992 func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int64, *sym.Symbol)) {
1993 // These symbols won't show up in the first loop below because we
1994 // skip sym.STEXT symbols. Normal sym.STEXT symbols are emitted by walking textp.
1995 s := ctxt.Syms.Lookup("runtime.text", 0)
1996 if s.Type == sym.STEXT {
1997 // We've already included this symbol in ctxt.Textp
1998 // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin.
1999 // See data.go:/textaddress
2000 if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) {
2001 put(ctxt, s, s.Name, TextSym, s.Value, nil)
2007 // Generate base addresses for all text sections if there are multiple
2008 for _, sect := range Segtext.Sections {
2013 if sect.Name != ".text" {
2016 s = ctxt.Syms.ROLookup(fmt.Sprintf("runtime.text.%d", n), 0)
2020 if s.Type == sym.STEXT {
2021 put(ctxt, s, s.Name, TextSym, s.Value, nil)
2026 s = ctxt.Syms.Lookup("runtime.etext", 0)
2027 if s.Type == sym.STEXT {
2028 // We've already included this symbol in ctxt.Textp
2029 // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin.
2030 // See data.go:/textaddress
2031 if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) {
2032 put(ctxt, s, s.Name, TextSym, s.Value, nil)
2036 for _, s := range ctxt.Syms.Allsym {
2037 if s.Attr.NotInSymbolTable() {
2040 if (s.Name == "" || s.Name[0] == '.') && s.Version == 0 && s.Name != ".rathole" && s.Name != ".TOC." {
2067 if !s.Attr.Reachable() {
2070 put(ctxt, s, s.Name, DataSym, Symaddr(s), s.Gotype)
2072 case sym.SBSS, sym.SNOPTRBSS:
2073 if !s.Attr.Reachable() {
2077 Errorf(s, "should not be bss (size=%d type=%v special=%v)", len(s.P), s.Type, s.Attr.Special())
2079 put(ctxt, s, s.Name, BSSSym, Symaddr(s), s.Gotype)
2082 if ctxt.HeadType == objabi.Hwindows || ctxt.IsELF {
2083 put(ctxt, s, s.Name, UndefinedSym, s.Value, nil)
2086 case sym.SDYNIMPORT:
2087 if !s.Attr.Reachable() {
2090 put(ctxt, s, s.Extname, UndefinedSym, 0, nil)
2093 if ctxt.LinkMode == LinkExternal {
2094 put(ctxt, s, s.Name, TLSSym, Symaddr(s), s.Gotype)
2100 for _, s := range ctxt.Textp {
2101 put(ctxt, s, s.Name, TextSym, s.Value, s.Gotype)
2104 if s.FuncInfo != nil {
2105 locals = s.FuncInfo.Locals
2107 // NOTE(ality): acid can't produce a stack trace without .frame symbols
2108 put(ctxt, nil, ".frame", FrameSym, int64(locals)+int64(ctxt.Arch.PtrSize), nil)
2110 if s.FuncInfo == nil {
2113 for _, a := range s.FuncInfo.Autom {
2114 if a.Name == objabi.A_DELETED_AUTO {
2115 put(ctxt, nil, "", DeletedAutoSym, 0, a.Gotype)
2119 // Emit a or p according to actual offset, even if label is wrong.
2120 // This avoids negative offsets, which cannot be encoded.
2121 if a.Name != objabi.A_AUTO && a.Name != objabi.A_PARAM {
2125 // compute offset relative to FP
2126 if a.Name == objabi.A_PARAM {
2129 off = a.Aoffset - int32(ctxt.Arch.PtrSize)
2134 put(ctxt, nil, a.Asym.Name, ParamSym, int64(off), a.Gotype)
2139 if off <= int32(-ctxt.Arch.PtrSize) {
2140 put(ctxt, nil, a.Asym.Name, AutoSym, -(int64(off) + int64(ctxt.Arch.PtrSize)), a.Gotype)
2143 // Otherwise, off is addressing the saved program counter.
2144 // Something underhanded is going on. Say nothing.
2148 if ctxt.Debugvlog != 0 || *flagN {
2149 ctxt.Logf("%5.2f symsize = %d\n", Cputime(), uint32(Symsize))
2153 func Symaddr(s *sym.Symbol) int64 {
2154 if !s.Attr.Reachable() {
2155 Errorf(s, "unreachable symbol in symaddr")
2160 func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) {
2161 s := ctxt.Syms.Lookup(p, 0)
2164 s.Attr |= sym.AttrReachable
2165 s.Attr |= sym.AttrSpecial
2166 s.Attr |= sym.AttrLocal
2169 func datoff(s *sym.Symbol, addr int64) int64 {
2170 if uint64(addr) >= Segdata.Vaddr {
2171 return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff)
2173 if uint64(addr) >= Segtext.Vaddr {
2174 return int64(uint64(addr) - Segtext.Vaddr + Segtext.Fileoff)
2176 Errorf(s, "invalid datoff %#x", addr)
2180 func Entryvalue(ctxt *Link) int64 {
2181 a := *flagEntrySymbol
2182 if a[0] >= '0' && a[0] <= '9' {
2185 s := ctxt.Syms.Lookup(a, 0)
2187 return *FlagTextAddr
2189 if s.Type != sym.STEXT {
2190 Errorf(s, "entry not text")
2195 func undefsym(ctxt *Link, s *sym.Symbol) {
2198 for i := 0; i < len(s.R); i++ {
2200 if r.Sym == nil { // happens for some external ARM relocs
2203 // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make
2204 // sense and should be removed when someone has thought about it properly.
2205 if (r.Sym.Type == sym.Sxxx || r.Sym.Type == sym.SXREF) && !r.Sym.Attr.VisibilityHidden() {
2206 Errorf(s, "undefined: %q", r.Sym.Name)
2208 if !r.Sym.Attr.Reachable() && r.Type != objabi.R_WEAKADDROFF {
2209 Errorf(s, "relocation target %q", r.Sym.Name)
2214 func (ctxt *Link) undef() {
2215 // undefsym performs checks (almost) identical to checks
2216 // that report undefined relocations in relocsym.
2217 // Both undefsym and relocsym can report same symbol as undefined,
2218 // which results in error message duplication (see #10978).
2220 // The undef is run after Arch.Asmb and could detect some
2221 // programming errors there, but if object being linked is already
2222 // failed with errors, it is better to avoid duplicated errors.
2227 for _, s := range ctxt.Textp {
2230 for _, s := range datap {
2238 func (ctxt *Link) callgraph() {
2245 for _, s := range ctxt.Textp {
2246 for i = 0; i < len(s.R); i++ {
2251 if (r.Type == objabi.R_CALL || r.Type == objabi.R_CALLARM || r.Type == objabi.R_CALLPOWER || r.Type == objabi.R_CALLMIPS) && r.Sym.Type == sym.STEXT {
2252 ctxt.Logf("%s calls %s\n", s.Name, r.Sym.Name)
2258 func Rnd(v int64, r int64) int64 {
2271 func bgetc(r *bio.Reader) int {
2272 c, err := r.ReadByte()
2275 log.Fatalf("reading input: %v", err)
2282 type markKind uint8 // for postorder traversal
2289 func postorder(libs []*sym.Library) []*sym.Library {
2290 order := make([]*sym.Library, 0, len(libs)) // hold the result
2291 mark := make(map[*sym.Library]markKind, len(libs))
2292 for _, lib := range libs {
2293 dfs(lib, mark, &order)
2298 func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library) {
2299 if mark[lib] == visited {
2302 if mark[lib] == visiting {
2303 panic("found import cycle while visiting " + lib.Pkg)
2305 mark[lib] = visiting
2306 for _, i := range lib.Imports {
2310 *order = append(*order, lib)