]> Cypherpunks.ru repositories - gostls13.git/blob - src/cmd/link/internal/ld/lib.go
[dev.boringcrypto] all: merge master into dev.boringcrypto
[gostls13.git] / src / cmd / link / internal / ld / lib.go
1 // Inferno utils/8l/asm.c
2 // https://bitbucket.org/inferno-os/inferno-os/src/master/utils/8l/asm.c
3 //
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.
12 //
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:
19 //
20 // The above copyright notice and this permission notice shall be included in
21 // all copies or substantial portions of the Software.
22 //
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
29 // THE SOFTWARE.
30
31 package ld
32
33 import (
34         "bytes"
35         "cmd/internal/bio"
36         "cmd/internal/goobj"
37         "cmd/internal/obj"
38         "cmd/internal/objabi"
39         "cmd/internal/sys"
40         "cmd/link/internal/loadelf"
41         "cmd/link/internal/loader"
42         "cmd/link/internal/loadmacho"
43         "cmd/link/internal/loadpe"
44         "cmd/link/internal/loadxcoff"
45         "cmd/link/internal/sym"
46         "crypto/sha1"
47         "debug/elf"
48         "debug/macho"
49         "encoding/base64"
50         "encoding/binary"
51         "fmt"
52         "internal/buildcfg"
53         exec "internal/execabs"
54         "io"
55         "io/ioutil"
56         "log"
57         "os"
58         "path/filepath"
59         "runtime"
60         "strings"
61         "sync"
62 )
63
64 // Data layout and relocation.
65
66 // Derived from Inferno utils/6l/l.h
67 // https://bitbucket.org/inferno-os/inferno-os/src/master/utils/6l/l.h
68 //
69 //      Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
70 //      Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
71 //      Portions Copyright © 1997-1999 Vita Nuova Limited
72 //      Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
73 //      Portions Copyright © 2004,2006 Bruce Ellis
74 //      Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
75 //      Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
76 //      Portions Copyright © 2009 The Go Authors. All rights reserved.
77 //
78 // Permission is hereby granted, free of charge, to any person obtaining a copy
79 // of this software and associated documentation files (the "Software"), to deal
80 // in the Software without restriction, including without limitation the rights
81 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
82 // copies of the Software, and to permit persons to whom the Software is
83 // furnished to do so, subject to the following conditions:
84 //
85 // The above copyright notice and this permission notice shall be included in
86 // all copies or substantial portions of the Software.
87 //
88 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
89 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
90 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
91 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
92 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
93 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
94 // THE SOFTWARE.
95
96 // ArchSyms holds a number of architecture specific symbols used during
97 // relocation.  Rather than allowing them universal access to all symbols,
98 // we keep a subset for relocation application.
99 type ArchSyms struct {
100         Rel     loader.Sym
101         Rela    loader.Sym
102         RelPLT  loader.Sym
103         RelaPLT loader.Sym
104
105         LinkEditGOT loader.Sym
106         LinkEditPLT loader.Sym
107
108         TOC    loader.Sym
109         DotTOC []loader.Sym // for each version
110
111         GOT    loader.Sym
112         PLT    loader.Sym
113         GOTPLT loader.Sym
114
115         Tlsg      loader.Sym
116         Tlsoffset int
117
118         Dynamic loader.Sym
119         DynSym  loader.Sym
120         DynStr  loader.Sym
121
122         unreachableMethod loader.Sym
123 }
124
125 // mkArchSym is a helper for setArchSyms, to set up a special symbol.
126 func (ctxt *Link) mkArchSym(name string, ver int, ls *loader.Sym) {
127         *ls = ctxt.loader.LookupOrCreateSym(name, ver)
128         ctxt.loader.SetAttrReachable(*ls, true)
129 }
130
131 // mkArchVecSym is similar to  setArchSyms, but operates on elements within
132 // a slice, where each element corresponds to some symbol version.
133 func (ctxt *Link) mkArchSymVec(name string, ver int, ls []loader.Sym) {
134         ls[ver] = ctxt.loader.LookupOrCreateSym(name, ver)
135         ctxt.loader.SetAttrReachable(ls[ver], true)
136 }
137
138 // setArchSyms sets up the ArchSyms structure, and must be called before
139 // relocations are applied.
140 func (ctxt *Link) setArchSyms() {
141         ctxt.mkArchSym(".got", 0, &ctxt.GOT)
142         ctxt.mkArchSym(".plt", 0, &ctxt.PLT)
143         ctxt.mkArchSym(".got.plt", 0, &ctxt.GOTPLT)
144         ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic)
145         ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym)
146         ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr)
147         ctxt.mkArchSym("runtime.unreachableMethod", abiInternalVer, &ctxt.unreachableMethod)
148
149         if ctxt.IsPPC64() {
150                 ctxt.mkArchSym("TOC", 0, &ctxt.TOC)
151
152                 ctxt.DotTOC = make([]loader.Sym, ctxt.MaxVersion()+1)
153                 for i := 0; i <= ctxt.MaxVersion(); i++ {
154                         if i >= sym.SymVerABICount && i < sym.SymVerStatic { // these versions are not used currently
155                                 continue
156                         }
157                         ctxt.mkArchSymVec(".TOC.", i, ctxt.DotTOC)
158                 }
159         }
160         if ctxt.IsElf() {
161                 ctxt.mkArchSym(".rel", 0, &ctxt.Rel)
162                 ctxt.mkArchSym(".rela", 0, &ctxt.Rela)
163                 ctxt.mkArchSym(".rel.plt", 0, &ctxt.RelPLT)
164                 ctxt.mkArchSym(".rela.plt", 0, &ctxt.RelaPLT)
165         }
166         if ctxt.IsDarwin() {
167                 ctxt.mkArchSym(".linkedit.got", 0, &ctxt.LinkEditGOT)
168                 ctxt.mkArchSym(".linkedit.plt", 0, &ctxt.LinkEditPLT)
169         }
170 }
171
172 type Arch struct {
173         Funcalign  int
174         Maxalign   int
175         Minalign   int
176         Dwarfregsp int
177         Dwarfreglr int
178
179         // Threshold of total text size, used for trampoline insertion. If the total
180         // text size is smaller than TrampLimit, we won't need to insert trampolines.
181         // It is pretty close to the offset range of a direct CALL machine instruction.
182         // We leave some room for extra stuff like PLT stubs.
183         TrampLimit uint64
184
185         Androiddynld   string
186         Linuxdynld     string
187         Freebsddynld   string
188         Netbsddynld    string
189         Openbsddynld   string
190         Dragonflydynld string
191         Solarisdynld   string
192
193         // Empty spaces between codeblocks will be padded with this value.
194         // For example an architecture might want to pad with a trap instruction to
195         // catch wayward programs. Architectures that do not define a padding value
196         // are padded with zeros.
197         CodePad []byte
198
199         // Plan 9 variables.
200         Plan9Magic  uint32
201         Plan9_64Bit bool
202
203         Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc, int) bool
204         Archinit  func(*Link)
205         // Archreloc is an arch-specific hook that assists in relocation processing
206         // (invoked by 'relocsym'); it handles target-specific relocation tasks.
207         // Here "rel" is the current relocation being examined, "sym" is the symbol
208         // containing the chunk of data to which the relocation applies, and "off"
209         // is the contents of the to-be-relocated data item (from sym.P). Return
210         // value is the appropriately relocated value (to be written back to the
211         // same spot in sym.P), number of external _host_ relocations needed (i.e.
212         // ELF/Mach-O/etc. relocations, not Go relocations, this must match Elfreloc1,
213         // etc.), and a boolean indicating success/failure (a failing value indicates
214         // a fatal error).
215         Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc, loader.Sym,
216                 int64) (relocatedOffset int64, nExtReloc int, ok bool)
217         // Archrelocvariant is a second arch-specific hook used for
218         // relocation processing; it handles relocations where r.Type is
219         // insufficient to describe the relocation (r.Variant !=
220         // sym.RV_NONE). Here "rel" is the relocation being applied, "sym"
221         // is the symbol containing the chunk of data to which the
222         // relocation applies, and "off" is the contents of the
223         // to-be-relocated data item (from sym.P). Return is an updated
224         // offset value.
225         Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc,
226                 rv sym.RelocVariant, sym loader.Sym, offset int64, data []byte) (relocatedOffset int64)
227
228         // Generate a trampoline for a call from s to rs if necessary. ri is
229         // index of the relocation.
230         Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym)
231
232         // Assembling the binary breaks into two phases, writing the code/data/
233         // dwarf information (which is rather generic), and some more architecture
234         // specific work like setting up the elf headers/dynamic relocations, etc.
235         // The phases are called "Asmb" and "Asmb2". Asmb2 needs to be defined for
236         // every architecture, but only if architecture has an Asmb function will
237         // it be used for assembly.  Otherwise a generic assembly Asmb function is
238         // used.
239         Asmb  func(*Link, *loader.Loader)
240         Asmb2 func(*Link, *loader.Loader)
241
242         // Extreloc is an arch-specific hook that converts a Go relocation to an
243         // external relocation. Return the external relocation and whether it is
244         // needed.
245         Extreloc func(*Target, *loader.Loader, loader.Reloc, loader.Sym) (loader.ExtReloc, bool)
246
247         Elfreloc1      func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int, int64) bool
248         ElfrelocSize   uint32 // size of an ELF relocation record, must match Elfreloc1.
249         Elfsetupplt    func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym)
250         Gentext        func(*Link, *loader.Loader) // Generate text before addressing has been performed.
251         Machoreloc1    func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool
252         MachorelocSize uint32 // size of an Mach-O relocation record, must match Machoreloc1.
253         PEreloc1       func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool
254         Xcoffreloc1    func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool
255
256         // Generate additional symbols for the native symbol table just prior to
257         // code generation.
258         GenSymsLate func(*Link, *loader.Loader)
259
260         // TLSIEtoLE converts a TLS Initial Executable relocation to
261         // a TLS Local Executable relocation.
262         //
263         // This is possible when a TLS IE relocation refers to a local
264         // symbol in an executable, which is typical when internally
265         // linking PIE binaries.
266         TLSIEtoLE func(P []byte, off, size int)
267
268         // optional override for assignAddress
269         AssignAddress func(ldr *loader.Loader, sect *sym.Section, n int, s loader.Sym, va uint64, isTramp bool) (*sym.Section, int, uint64)
270 }
271
272 var (
273         thearch Arch
274         lcSize  int32
275         rpath   Rpath
276         spSize  int32
277         symSize int32
278 )
279
280 const (
281         MINFUNC = 16 // minimum size for a function
282 )
283
284 // Symbol version of ABIInternal symbols. It is sym.SymVerABIInternal if ABI wrappers
285 // are used, 0 otherwise.
286 var abiInternalVer = sym.SymVerABIInternal
287
288 // DynlinkingGo reports whether we are producing Go code that can live
289 // in separate shared libraries linked together at runtime.
290 func (ctxt *Link) DynlinkingGo() bool {
291         if !ctxt.Loaded {
292                 panic("DynlinkingGo called before all symbols loaded")
293         }
294         return ctxt.BuildMode == BuildModeShared || ctxt.linkShared || ctxt.BuildMode == BuildModePlugin || ctxt.canUsePlugins
295 }
296
297 // CanUsePlugins reports whether a plugins can be used
298 func (ctxt *Link) CanUsePlugins() bool {
299         if !ctxt.Loaded {
300                 panic("CanUsePlugins called before all symbols loaded")
301         }
302         return ctxt.canUsePlugins
303 }
304
305 // NeedCodeSign reports whether we need to code-sign the output binary.
306 func (ctxt *Link) NeedCodeSign() bool {
307         return ctxt.IsDarwin() && ctxt.IsARM64()
308 }
309
310 var (
311         dynlib          []string
312         ldflag          []string
313         havedynamic     int
314         Funcalign       int
315         iscgo           bool
316         elfglobalsymndx int
317         interpreter     string
318
319         debug_s bool // backup old value of debug['s']
320         HEADR   int32
321
322         nerrors  int
323         liveness int64 // size of liveness data (funcdata), printed if -v
324
325         // See -strictdups command line flag.
326         checkStrictDups   int // 0=off 1=warning 2=error
327         strictDupMsgCount int
328 )
329
330 var (
331         Segtext      sym.Segment
332         Segrodata    sym.Segment
333         Segrelrodata sym.Segment
334         Segdata      sym.Segment
335         Segdwarf     sym.Segment
336
337         Segments = []*sym.Segment{&Segtext, &Segrodata, &Segrelrodata, &Segdata, &Segdwarf}
338 )
339
340 const pkgdef = "__.PKGDEF"
341
342 var (
343         // externalobj is set to true if we see an object compiled by
344         // the host compiler that is not from a package that is known
345         // to support internal linking mode.
346         externalobj = false
347
348         // unknownObjFormat is set to true if we see an object whose
349         // format we don't recognize.
350         unknownObjFormat = false
351
352         theline string
353 )
354
355 func Lflag(ctxt *Link, arg string) {
356         ctxt.Libdir = append(ctxt.Libdir, arg)
357 }
358
359 /*
360  * Unix doesn't like it when we write to a running (or, sometimes,
361  * recently run) binary, so remove the output file before writing it.
362  * On Windows 7, remove() can force a subsequent create() to fail.
363  * S_ISREG() does not exist on Plan 9.
364  */
365 func mayberemoveoutfile() {
366         if fi, err := os.Lstat(*flagOutfile); err == nil && !fi.Mode().IsRegular() {
367                 return
368         }
369         os.Remove(*flagOutfile)
370 }
371
372 func libinit(ctxt *Link) {
373         Funcalign = thearch.Funcalign
374
375         // add goroot to the end of the libdir list.
376         suffix := ""
377
378         suffixsep := ""
379         if *flagInstallSuffix != "" {
380                 suffixsep = "_"
381                 suffix = *flagInstallSuffix
382         } else if *flagRace {
383                 suffixsep = "_"
384                 suffix = "race"
385         } else if *flagMsan {
386                 suffixsep = "_"
387                 suffix = "msan"
388         } else if *flagAsan {
389                 suffixsep = "_"
390                 suffix = "asan"
391         }
392
393         if buildcfg.GOROOT != "" {
394                 Lflag(ctxt, filepath.Join(buildcfg.GOROOT, "pkg", fmt.Sprintf("%s_%s%s%s", buildcfg.GOOS, buildcfg.GOARCH, suffixsep, suffix)))
395         }
396
397         mayberemoveoutfile()
398
399         if err := ctxt.Out.Open(*flagOutfile); err != nil {
400                 Exitf("cannot create %s: %v", *flagOutfile, err)
401         }
402
403         if *flagEntrySymbol == "" {
404                 switch ctxt.BuildMode {
405                 case BuildModeCShared, BuildModeCArchive:
406                         *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s_lib", buildcfg.GOARCH, buildcfg.GOOS)
407                 case BuildModeExe, BuildModePIE:
408                         *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s", buildcfg.GOARCH, buildcfg.GOOS)
409                 case BuildModeShared, BuildModePlugin:
410                         // No *flagEntrySymbol for -buildmode=shared and plugin
411                 default:
412                         Errorf(nil, "unknown *flagEntrySymbol for buildmode %v", ctxt.BuildMode)
413                 }
414         }
415 }
416
417 func exitIfErrors() {
418         if nerrors != 0 || checkStrictDups > 1 && strictDupMsgCount > 0 {
419                 mayberemoveoutfile()
420                 Exit(2)
421         }
422
423 }
424
425 func errorexit() {
426         exitIfErrors()
427         Exit(0)
428 }
429
430 func loadinternal(ctxt *Link, name string) *sym.Library {
431         zerofp := goobj.FingerprintType{}
432         if ctxt.linkShared && ctxt.PackageShlib != nil {
433                 if shlib := ctxt.PackageShlib[name]; shlib != "" {
434                         return addlibpath(ctxt, "internal", "internal", "", name, shlib, zerofp)
435                 }
436         }
437         if ctxt.PackageFile != nil {
438                 if pname := ctxt.PackageFile[name]; pname != "" {
439                         return addlibpath(ctxt, "internal", "internal", pname, name, "", zerofp)
440                 }
441                 ctxt.Logf("loadinternal: cannot find %s\n", name)
442                 return nil
443         }
444
445         for _, libdir := range ctxt.Libdir {
446                 if ctxt.linkShared {
447                         shlibname := filepath.Join(libdir, name+".shlibname")
448                         if ctxt.Debugvlog != 0 {
449                                 ctxt.Logf("searching for %s.a in %s\n", name, shlibname)
450                         }
451                         if _, err := os.Stat(shlibname); err == nil {
452                                 return addlibpath(ctxt, "internal", "internal", "", name, shlibname, zerofp)
453                         }
454                 }
455                 pname := filepath.Join(libdir, name+".a")
456                 if ctxt.Debugvlog != 0 {
457                         ctxt.Logf("searching for %s.a in %s\n", name, pname)
458                 }
459                 if _, err := os.Stat(pname); err == nil {
460                         return addlibpath(ctxt, "internal", "internal", pname, name, "", zerofp)
461                 }
462         }
463
464         ctxt.Logf("warning: unable to find %s.a\n", name)
465         return nil
466 }
467
468 // extld returns the current external linker.
469 func (ctxt *Link) extld() []string {
470         if len(flagExtld) == 0 {
471                 flagExtld = []string{"gcc"}
472         }
473         return flagExtld
474 }
475
476 // findLibPathCmd uses cmd command to find gcc library libname.
477 // It returns library full path if found, or "none" if not found.
478 func (ctxt *Link) findLibPathCmd(cmd, libname string) string {
479         extld := ctxt.extld()
480         name, args := extld[0], extld[1:]
481         args = append(args, hostlinkArchArgs(ctxt.Arch)...)
482         args = append(args, cmd)
483         if ctxt.Debugvlog != 0 {
484                 ctxt.Logf("%s %v\n", extld, args)
485         }
486         out, err := exec.Command(name, args...).Output()
487         if err != nil {
488                 if ctxt.Debugvlog != 0 {
489                         ctxt.Logf("not using a %s file because compiler failed\n%v\n%s\n", libname, err, out)
490                 }
491                 return "none"
492         }
493         return strings.TrimSpace(string(out))
494 }
495
496 // findLibPath searches for library libname.
497 // It returns library full path if found, or "none" if not found.
498 func (ctxt *Link) findLibPath(libname string) string {
499         return ctxt.findLibPathCmd("--print-file-name="+libname, libname)
500 }
501
502 func (ctxt *Link) loadlib() {
503         var flags uint32
504         switch *FlagStrictDups {
505         case 0:
506                 // nothing to do
507         case 1, 2:
508                 flags |= loader.FlagStrictDups
509         default:
510                 log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups)
511         }
512         elfsetstring1 := func(str string, off int) { elfsetstring(ctxt, 0, str, off) }
513         ctxt.loader = loader.NewLoader(flags, elfsetstring1, &ctxt.ErrorReporter.ErrorReporter)
514         ctxt.ErrorReporter.SymName = func(s loader.Sym) string {
515                 return ctxt.loader.SymName(s)
516         }
517
518         // ctxt.Library grows during the loop, so not a range loop.
519         i := 0
520         for ; i < len(ctxt.Library); i++ {
521                 lib := ctxt.Library[i]
522                 if lib.Shlib == "" {
523                         if ctxt.Debugvlog > 1 {
524                                 ctxt.Logf("autolib: %s (from %s)\n", lib.File, lib.Objref)
525                         }
526                         loadobjfile(ctxt, lib)
527                 }
528         }
529
530         // load internal packages, if not already
531         if *flagRace {
532                 loadinternal(ctxt, "runtime/race")
533         }
534         if *flagMsan {
535                 loadinternal(ctxt, "runtime/msan")
536         }
537         if *flagAsan {
538                 loadinternal(ctxt, "runtime/asan")
539         }
540         loadinternal(ctxt, "runtime")
541         for ; i < len(ctxt.Library); i++ {
542                 lib := ctxt.Library[i]
543                 if lib.Shlib == "" {
544                         loadobjfile(ctxt, lib)
545                 }
546         }
547         // At this point, the Go objects are "preloaded". Not all the symbols are
548         // added to the symbol table (only defined package symbols are). Looking
549         // up symbol by name may not get expected result.
550
551         iscgo = ctxt.LibraryByPkg["runtime/cgo"] != nil
552
553         // Plugins a require cgo support to function. Similarly, plugins may require additional
554         // internal linker support on some platforms which may not be implemented.
555         ctxt.canUsePlugins = ctxt.LibraryByPkg["plugin"] != nil && iscgo
556
557         // We now have enough information to determine the link mode.
558         determineLinkMode(ctxt)
559
560         if ctxt.LinkMode == LinkExternal && !iscgo && !(buildcfg.GOOS == "darwin" && ctxt.BuildMode != BuildModePlugin && ctxt.Arch.Family == sys.AMD64) {
561                 // This indicates a user requested -linkmode=external.
562                 // The startup code uses an import of runtime/cgo to decide
563                 // whether to initialize the TLS.  So give it one. This could
564                 // be handled differently but it's an unusual case.
565                 if lib := loadinternal(ctxt, "runtime/cgo"); lib != nil && lib.Shlib == "" {
566                         if ctxt.BuildMode == BuildModeShared || ctxt.linkShared {
567                                 Exitf("cannot implicitly include runtime/cgo in a shared library")
568                         }
569                         for ; i < len(ctxt.Library); i++ {
570                                 lib := ctxt.Library[i]
571                                 if lib.Shlib == "" {
572                                         loadobjfile(ctxt, lib)
573                                 }
574                         }
575                 }
576         }
577
578         // Add non-package symbols and references of externally defined symbols.
579         ctxt.loader.LoadSyms(ctxt.Arch)
580
581         // Load symbols from shared libraries, after all Go object symbols are loaded.
582         for _, lib := range ctxt.Library {
583                 if lib.Shlib != "" {
584                         if ctxt.Debugvlog > 1 {
585                                 ctxt.Logf("autolib: %s (from %s)\n", lib.Shlib, lib.Objref)
586                         }
587                         ldshlibsyms(ctxt, lib.Shlib)
588                 }
589         }
590
591         // Process cgo directives (has to be done before host object loading).
592         ctxt.loadcgodirectives()
593
594         // Conditionally load host objects, or setup for external linking.
595         hostobjs(ctxt)
596         hostlinksetup(ctxt)
597
598         if ctxt.LinkMode == LinkInternal && len(hostobj) != 0 {
599                 // If we have any undefined symbols in external
600                 // objects, try to read them from the libgcc file.
601                 any := false
602                 undefs := ctxt.loader.UndefinedRelocTargets(1)
603                 if len(undefs) > 0 {
604                         any = true
605                 }
606                 if any {
607                         if *flagLibGCC == "" {
608                                 *flagLibGCC = ctxt.findLibPathCmd("--print-libgcc-file-name", "libgcc")
609                         }
610                         if runtime.GOOS == "openbsd" && *flagLibGCC == "libgcc.a" {
611                                 // On OpenBSD `clang --print-libgcc-file-name` returns "libgcc.a".
612                                 // In this case we fail to load libgcc.a and can encounter link
613                                 // errors - see if we can find libcompiler_rt.a instead.
614                                 *flagLibGCC = ctxt.findLibPathCmd("--print-file-name=libcompiler_rt.a", "libcompiler_rt")
615                         }
616                         if ctxt.HeadType == objabi.Hwindows {
617                                 loadWindowsHostArchives(ctxt)
618                         }
619                         if *flagLibGCC != "none" {
620                                 hostArchive(ctxt, *flagLibGCC)
621                         }
622                 }
623         }
624
625         // We've loaded all the code now.
626         ctxt.Loaded = true
627
628         importcycles()
629
630         strictDupMsgCount = ctxt.loader.NStrictDupMsgs()
631 }
632
633 // loadWindowsHostArchives loads in host archives and objects when
634 // doing internal linking on windows. Older toolchains seem to require
635 // just a single pass through the various archives, but some modern
636 // toolchains when linking a C program with mingw pass library paths
637 // multiple times to the linker, e.g. "... -lmingwex -lmingw32 ...
638 // -lmingwex -lmingw32 ...". To accommodate this behavior, we make two
639 // passes over the host archives below.
640 func loadWindowsHostArchives(ctxt *Link) {
641         any := true
642         for i := 0; any && i < 2; i++ {
643                 // Link crt2.o (if present) to resolve "atexit" when
644                 // using LLVM-based compilers.
645                 isunresolved := symbolsAreUnresolved(ctxt, []string{"atexit"})
646                 if isunresolved[0] {
647                         if p := ctxt.findLibPath("crt2.o"); p != "none" {
648                                 hostObject(ctxt, "crt2", p)
649                         }
650                 }
651                 if p := ctxt.findLibPath("libmingwex.a"); p != "none" {
652                         hostArchive(ctxt, p)
653                 }
654                 if p := ctxt.findLibPath("libmingw32.a"); p != "none" {
655                         hostArchive(ctxt, p)
656                 }
657                 // Link libmsvcrt.a to resolve '__acrt_iob_func' symbol
658                 // (see https://golang.org/issue/23649 for details).
659                 if p := ctxt.findLibPath("libmsvcrt.a"); p != "none" {
660                         hostArchive(ctxt, p)
661                 }
662                 any = false
663                 undefs := ctxt.loader.UndefinedRelocTargets(1)
664                 if len(undefs) > 0 {
665                         any = true
666                 }
667         }
668         // If needed, create the __CTOR_LIST__ and __DTOR_LIST__
669         // symbols (referenced by some of the mingw support library
670         // routines). Creation of these symbols is normally done by the
671         // linker if not already present.
672         want := []string{"__CTOR_LIST__", "__DTOR_LIST__"}
673         isunresolved := symbolsAreUnresolved(ctxt, want)
674         for k, w := range want {
675                 if isunresolved[k] {
676                         sb := ctxt.loader.CreateSymForUpdate(w, 0)
677                         sb.SetType(sym.SDATA)
678                         sb.AddUint64(ctxt.Arch, 0)
679                         sb.SetReachable(true)
680                         ctxt.loader.SetAttrSpecial(sb.Sym(), true)
681                 }
682         }
683         // TODO: maybe do something similar to peimporteddlls to collect
684         // all lib names and try link them all to final exe just like
685         // libmingwex.a and libmingw32.a:
686         /*
687                 for:
688                 #cgo windows LDFLAGS: -lmsvcrt -lm
689                 import:
690                 libmsvcrt.a libm.a
691         */
692 }
693
694 // loadcgodirectives reads the previously discovered cgo directives, creating
695 // symbols in preparation for host object loading or use later in the link.
696 func (ctxt *Link) loadcgodirectives() {
697         l := ctxt.loader
698         hostObjSyms := make(map[loader.Sym]struct{})
699         for _, d := range ctxt.cgodata {
700                 setCgoAttr(ctxt, d.file, d.pkg, d.directives, hostObjSyms)
701         }
702         ctxt.cgodata = nil
703
704         if ctxt.LinkMode == LinkInternal {
705                 // Drop all the cgo_import_static declarations.
706                 // Turns out we won't be needing them.
707                 for symIdx := range hostObjSyms {
708                         if l.SymType(symIdx) == sym.SHOSTOBJ {
709                                 // If a symbol was marked both
710                                 // cgo_import_static and cgo_import_dynamic,
711                                 // then we want to make it cgo_import_dynamic
712                                 // now.
713                                 su := l.MakeSymbolUpdater(symIdx)
714                                 if l.SymExtname(symIdx) != "" && l.SymDynimplib(symIdx) != "" && !(l.AttrCgoExportStatic(symIdx) || l.AttrCgoExportDynamic(symIdx)) {
715                                         su.SetType(sym.SDYNIMPORT)
716                                 } else {
717                                         su.SetType(0)
718                                 }
719                         }
720                 }
721         }
722 }
723
724 // Set up flags and special symbols depending on the platform build mode.
725 // This version works with loader.Loader.
726 func (ctxt *Link) linksetup() {
727         switch ctxt.BuildMode {
728         case BuildModeCShared, BuildModePlugin:
729                 symIdx := ctxt.loader.LookupOrCreateSym("runtime.islibrary", 0)
730                 sb := ctxt.loader.MakeSymbolUpdater(symIdx)
731                 sb.SetType(sym.SNOPTRDATA)
732                 sb.AddUint8(1)
733         case BuildModeCArchive:
734                 symIdx := ctxt.loader.LookupOrCreateSym("runtime.isarchive", 0)
735                 sb := ctxt.loader.MakeSymbolUpdater(symIdx)
736                 sb.SetType(sym.SNOPTRDATA)
737                 sb.AddUint8(1)
738         }
739
740         // Recalculate pe parameters now that we have ctxt.LinkMode set.
741         if ctxt.HeadType == objabi.Hwindows {
742                 Peinit(ctxt)
743         }
744
745         if ctxt.LinkMode == LinkExternal {
746                 // When external linking, we are creating an object file. The
747                 // absolute address is irrelevant.
748                 *FlagTextAddr = 0
749         }
750
751         // If there are no dynamic libraries needed, gcc disables dynamic linking.
752         // Because of this, glibc's dynamic ELF loader occasionally (like in version 2.13)
753         // assumes that a dynamic binary always refers to at least one dynamic library.
754         // Rather than be a source of test cases for glibc, disable dynamic linking
755         // the same way that gcc would.
756         //
757         // Exception: on OS X, programs such as Shark only work with dynamic
758         // binaries, so leave it enabled on OS X (Mach-O) binaries.
759         // Also leave it enabled on Solaris which doesn't support
760         // statically linked binaries.
761         if ctxt.BuildMode == BuildModeExe {
762                 if havedynamic == 0 && ctxt.HeadType != objabi.Hdarwin && ctxt.HeadType != objabi.Hsolaris {
763                         *FlagD = true
764                 }
765         }
766
767         if ctxt.LinkMode == LinkExternal && ctxt.Arch.Family == sys.PPC64 && buildcfg.GOOS != "aix" {
768                 toc := ctxt.loader.LookupOrCreateSym(".TOC.", 0)
769                 sb := ctxt.loader.MakeSymbolUpdater(toc)
770                 sb.SetType(sym.SDYNIMPORT)
771         }
772
773         // The Android Q linker started to complain about underalignment of the our TLS
774         // section. We don't actually use the section on android, so don't
775         // generate it.
776         if buildcfg.GOOS != "android" {
777                 tlsg := ctxt.loader.LookupOrCreateSym("runtime.tlsg", 0)
778                 sb := ctxt.loader.MakeSymbolUpdater(tlsg)
779
780                 // runtime.tlsg is used for external linking on platforms that do not define
781                 // a variable to hold g in assembly (currently only intel).
782                 if sb.Type() == 0 {
783                         sb.SetType(sym.STLSBSS)
784                         sb.SetSize(int64(ctxt.Arch.PtrSize))
785                 } else if sb.Type() != sym.SDYNIMPORT {
786                         Errorf(nil, "runtime declared tlsg variable %v", sb.Type())
787                 }
788                 ctxt.loader.SetAttrReachable(tlsg, true)
789                 ctxt.Tlsg = tlsg
790         }
791
792         var moduledata loader.Sym
793         var mdsb *loader.SymbolBuilder
794         if ctxt.BuildMode == BuildModePlugin {
795                 moduledata = ctxt.loader.LookupOrCreateSym("local.pluginmoduledata", 0)
796                 mdsb = ctxt.loader.MakeSymbolUpdater(moduledata)
797                 ctxt.loader.SetAttrLocal(moduledata, true)
798         } else {
799                 moduledata = ctxt.loader.LookupOrCreateSym("runtime.firstmoduledata", 0)
800                 mdsb = ctxt.loader.MakeSymbolUpdater(moduledata)
801         }
802         if mdsb.Type() != 0 && mdsb.Type() != sym.SDYNIMPORT {
803                 // If the module (toolchain-speak for "executable or shared
804                 // library") we are linking contains the runtime package, it
805                 // will define the runtime.firstmoduledata symbol and we
806                 // truncate it back to 0 bytes so we can define its entire
807                 // contents in symtab.go:symtab().
808                 mdsb.SetSize(0)
809
810                 // In addition, on ARM, the runtime depends on the linker
811                 // recording the value of GOARM.
812                 if ctxt.Arch.Family == sys.ARM {
813                         goarm := ctxt.loader.LookupOrCreateSym("runtime.goarm", 0)
814                         sb := ctxt.loader.MakeSymbolUpdater(goarm)
815                         sb.SetType(sym.SDATA)
816                         sb.SetSize(0)
817                         sb.AddUint8(uint8(buildcfg.GOARM))
818                 }
819
820                 // Set runtime.disableMemoryProfiling bool if
821                 // runtime.MemProfile is not retained in the binary after
822                 // deadcode (and we're not dynamically linking).
823                 memProfile := ctxt.loader.Lookup("runtime.MemProfile", abiInternalVer)
824                 if memProfile != 0 && !ctxt.loader.AttrReachable(memProfile) && !ctxt.DynlinkingGo() {
825                         memProfSym := ctxt.loader.LookupOrCreateSym("runtime.disableMemoryProfiling", 0)
826                         sb := ctxt.loader.MakeSymbolUpdater(memProfSym)
827                         sb.SetType(sym.SDATA)
828                         sb.SetSize(0)
829                         sb.AddUint8(1) // true bool
830                 }
831         } else {
832                 // If OTOH the module does not contain the runtime package,
833                 // create a local symbol for the moduledata.
834                 moduledata = ctxt.loader.LookupOrCreateSym("local.moduledata", 0)
835                 mdsb = ctxt.loader.MakeSymbolUpdater(moduledata)
836                 ctxt.loader.SetAttrLocal(moduledata, true)
837         }
838         // In all cases way we mark the moduledata as noptrdata to hide it from
839         // the GC.
840         mdsb.SetType(sym.SNOPTRDATA)
841         ctxt.loader.SetAttrReachable(moduledata, true)
842         ctxt.Moduledata = moduledata
843
844         if ctxt.Arch == sys.Arch386 && ctxt.HeadType != objabi.Hwindows {
845                 if (ctxt.BuildMode == BuildModeCArchive && ctxt.IsELF) || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE || ctxt.DynlinkingGo() {
846                         got := ctxt.loader.LookupOrCreateSym("_GLOBAL_OFFSET_TABLE_", 0)
847                         sb := ctxt.loader.MakeSymbolUpdater(got)
848                         sb.SetType(sym.SDYNIMPORT)
849                         ctxt.loader.SetAttrReachable(got, true)
850                 }
851         }
852
853         // DWARF-gen and other phases require that the unit Textp slices
854         // be populated, so that it can walk the functions in each unit.
855         // Call into the loader to do this (requires that we collect the
856         // set of internal libraries first). NB: might be simpler if we
857         // moved isRuntimeDepPkg to cmd/internal and then did the test in
858         // loader.AssignTextSymbolOrder.
859         ctxt.Library = postorder(ctxt.Library)
860         intlibs := []bool{}
861         for _, lib := range ctxt.Library {
862                 intlibs = append(intlibs, isRuntimeDepPkg(lib.Pkg))
863         }
864         ctxt.Textp = ctxt.loader.AssignTextSymbolOrder(ctxt.Library, intlibs, ctxt.Textp)
865 }
866
867 // mangleTypeSym shortens the names of symbols that represent Go types
868 // if they are visible in the symbol table.
869 //
870 // As the names of these symbols are derived from the string of
871 // the type, they can run to many kilobytes long. So we shorten
872 // them using a SHA-1 when the name appears in the final binary.
873 // This also removes characters that upset external linkers.
874 //
875 // These are the symbols that begin with the prefix 'type.' and
876 // contain run-time type information used by the runtime and reflect
877 // packages. All Go binaries contain these symbols, but only
878 // those programs loaded dynamically in multiple parts need these
879 // symbols to have entries in the symbol table.
880 func (ctxt *Link) mangleTypeSym() {
881         if ctxt.BuildMode != BuildModeShared && !ctxt.linkShared && ctxt.BuildMode != BuildModePlugin && !ctxt.CanUsePlugins() {
882                 return
883         }
884
885         ldr := ctxt.loader
886         for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ {
887                 if !ldr.AttrReachable(s) && !ctxt.linkShared {
888                         // If -linkshared, the GCProg generation code may need to reach
889                         // out to the shared library for the type descriptor's data, even
890                         // the type descriptor itself is not actually needed at run time
891                         // (therefore not reachable). We still need to mangle its name,
892                         // so it is consistent with the one stored in the shared library.
893                         continue
894                 }
895                 name := ldr.SymName(s)
896                 newName := typeSymbolMangle(name)
897                 if newName != name {
898                         ldr.SetSymExtname(s, newName)
899
900                         // When linking against a shared library, the Go object file may
901                         // have reference to the original symbol name whereas the shared
902                         // library provides a symbol with the mangled name. We need to
903                         // copy the payload of mangled to original.
904                         // XXX maybe there is a better way to do this.
905                         dup := ldr.Lookup(newName, ldr.SymVersion(s))
906                         if dup != 0 {
907                                 st := ldr.SymType(s)
908                                 dt := ldr.SymType(dup)
909                                 if st == sym.Sxxx && dt != sym.Sxxx {
910                                         ldr.CopySym(dup, s)
911                                 }
912                         }
913                 }
914         }
915 }
916
917 // typeSymbolMangle mangles the given symbol name into something shorter.
918 //
919 // Keep the type.. prefix, which parts of the linker (like the
920 // DWARF generator) know means the symbol is not decodable.
921 // Leave type.runtime. symbols alone, because other parts of
922 // the linker manipulates them.
923 func typeSymbolMangle(name string) string {
924         if !strings.HasPrefix(name, "type.") {
925                 return name
926         }
927         if strings.HasPrefix(name, "type.runtime.") {
928                 return name
929         }
930         if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529
931                 return name
932         }
933         hash := sha1.Sum([]byte(name))
934         prefix := "type."
935         if name[5] == '.' {
936                 prefix = "type.."
937         }
938         return prefix + base64.StdEncoding.EncodeToString(hash[:6])
939 }
940
941 /*
942  * look for the next file in an archive.
943  * adapted from libmach.
944  */
945 func nextar(bp *bio.Reader, off int64, a *ArHdr) int64 {
946         if off&1 != 0 {
947                 off++
948         }
949         bp.MustSeek(off, 0)
950         var buf [SAR_HDR]byte
951         if n, err := io.ReadFull(bp, buf[:]); err != nil {
952                 if n == 0 && err != io.EOF {
953                         return -1
954                 }
955                 return 0
956         }
957
958         a.name = artrim(buf[0:16])
959         a.date = artrim(buf[16:28])
960         a.uid = artrim(buf[28:34])
961         a.gid = artrim(buf[34:40])
962         a.mode = artrim(buf[40:48])
963         a.size = artrim(buf[48:58])
964         a.fmag = artrim(buf[58:60])
965
966         arsize := atolwhex(a.size)
967         if arsize&1 != 0 {
968                 arsize++
969         }
970         return arsize + SAR_HDR
971 }
972
973 func loadobjfile(ctxt *Link, lib *sym.Library) {
974         pkg := objabi.PathToPrefix(lib.Pkg)
975
976         if ctxt.Debugvlog > 1 {
977                 ctxt.Logf("ldobj: %s (%s)\n", lib.File, pkg)
978         }
979         f, err := bio.Open(lib.File)
980         if err != nil {
981                 Exitf("cannot open file %s: %v", lib.File, err)
982         }
983         defer f.Close()
984         defer func() {
985                 if pkg == "main" && !lib.Main {
986                         Exitf("%s: not package main", lib.File)
987                 }
988         }()
989
990         for i := 0; i < len(ARMAG); i++ {
991                 if c, err := f.ReadByte(); err == nil && c == ARMAG[i] {
992                         continue
993                 }
994
995                 /* load it as a regular file */
996                 l := f.MustSeek(0, 2)
997                 f.MustSeek(0, 0)
998                 ldobj(ctxt, f, lib, l, lib.File, lib.File)
999                 return
1000         }
1001
1002         /*
1003          * load all the object files from the archive now.
1004          * this gives us sequential file access and keeps us
1005          * from needing to come back later to pick up more
1006          * objects.  it breaks the usual C archive model, but
1007          * this is Go, not C.  the common case in Go is that
1008          * we need to load all the objects, and then we throw away
1009          * the individual symbols that are unused.
1010          *
1011          * loading every object will also make it possible to
1012          * load foreign objects not referenced by __.PKGDEF.
1013          */
1014         var arhdr ArHdr
1015         off := f.Offset()
1016         for {
1017                 l := nextar(f, off, &arhdr)
1018                 if l == 0 {
1019                         break
1020                 }
1021                 if l < 0 {
1022                         Exitf("%s: malformed archive", lib.File)
1023                 }
1024                 off += l
1025
1026                 // __.PKGDEF isn't a real Go object file, and it's
1027                 // absent in -linkobj builds anyway. Skipping it
1028                 // ensures consistency between -linkobj and normal
1029                 // build modes.
1030                 if arhdr.name == pkgdef {
1031                         continue
1032                 }
1033
1034                 // Skip other special (non-object-file) sections that
1035                 // build tools may have added. Such sections must have
1036                 // short names so that the suffix is not truncated.
1037                 if len(arhdr.name) < 16 {
1038                         if ext := filepath.Ext(arhdr.name); ext != ".o" && ext != ".syso" {
1039                                 continue
1040                         }
1041                 }
1042
1043                 pname := fmt.Sprintf("%s(%s)", lib.File, arhdr.name)
1044                 l = atolwhex(arhdr.size)
1045                 ldobj(ctxt, f, lib, l, pname, lib.File)
1046         }
1047 }
1048
1049 type Hostobj struct {
1050         ld     func(*Link, *bio.Reader, string, int64, string)
1051         pkg    string
1052         pn     string
1053         file   string
1054         off    int64
1055         length int64
1056 }
1057
1058 var hostobj []Hostobj
1059
1060 // These packages can use internal linking mode.
1061 // Others trigger external mode.
1062 var internalpkg = []string{
1063         "crypto/internal/boring",
1064         "crypto/x509",
1065         "net",
1066         "os/user",
1067         "runtime/cgo",
1068         "runtime/race",
1069         "runtime/msan",
1070         "runtime/asan",
1071 }
1072
1073 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 {
1074         isinternal := false
1075         for _, intpkg := range internalpkg {
1076                 if pkg == intpkg {
1077                         isinternal = true
1078                         break
1079                 }
1080         }
1081
1082         // DragonFly declares errno with __thread, which results in a symbol
1083         // type of R_386_TLS_GD or R_X86_64_TLSGD. The Go linker does not
1084         // currently know how to handle TLS relocations, hence we have to
1085         // force external linking for any libraries that link in code that
1086         // uses errno. This can be removed if the Go linker ever supports
1087         // these relocation types.
1088         if headType == objabi.Hdragonfly {
1089                 if pkg == "net" || pkg == "os/user" {
1090                         isinternal = false
1091                 }
1092         }
1093
1094         if !isinternal {
1095                 externalobj = true
1096         }
1097
1098         hostobj = append(hostobj, Hostobj{})
1099         h := &hostobj[len(hostobj)-1]
1100         h.ld = ld
1101         h.pkg = pkg
1102         h.pn = pn
1103         h.file = file
1104         h.off = f.Offset()
1105         h.length = length
1106         return h
1107 }
1108
1109 func hostobjs(ctxt *Link) {
1110         if ctxt.LinkMode != LinkInternal {
1111                 return
1112         }
1113         var h *Hostobj
1114
1115         for i := 0; i < len(hostobj); i++ {
1116                 h = &hostobj[i]
1117                 f, err := bio.Open(h.file)
1118                 if err != nil {
1119                         Exitf("cannot reopen %s: %v", h.pn, err)
1120                 }
1121
1122                 f.MustSeek(h.off, 0)
1123                 if h.ld == nil {
1124                         Errorf(nil, "%s: unrecognized object file format", h.pn)
1125                         continue
1126                 }
1127                 h.ld(ctxt, f, h.pkg, h.length, h.pn)
1128                 f.Close()
1129         }
1130 }
1131
1132 func hostlinksetup(ctxt *Link) {
1133         if ctxt.LinkMode != LinkExternal {
1134                 return
1135         }
1136
1137         // For external link, record that we need to tell the external linker -s,
1138         // and turn off -s internally: the external linker needs the symbol
1139         // information for its final link.
1140         debug_s = *FlagS
1141         *FlagS = false
1142
1143         // create temporary directory and arrange cleanup
1144         if *flagTmpdir == "" {
1145                 dir, err := ioutil.TempDir("", "go-link-")
1146                 if err != nil {
1147                         log.Fatal(err)
1148                 }
1149                 *flagTmpdir = dir
1150                 ownTmpDir = true
1151                 AtExit(func() {
1152                         os.RemoveAll(*flagTmpdir)
1153                 })
1154         }
1155
1156         // change our output to temporary object file
1157         if err := ctxt.Out.Close(); err != nil {
1158                 Exitf("error closing output file")
1159         }
1160         mayberemoveoutfile()
1161
1162         p := filepath.Join(*flagTmpdir, "go.o")
1163         if err := ctxt.Out.Open(p); err != nil {
1164                 Exitf("cannot create %s: %v", p, err)
1165         }
1166 }
1167
1168 // hostobjCopy creates a copy of the object files in hostobj in a
1169 // temporary directory.
1170 func hostobjCopy() (paths []string) {
1171         var wg sync.WaitGroup
1172         sema := make(chan struct{}, runtime.NumCPU()) // limit open file descriptors
1173         for i, h := range hostobj {
1174                 h := h
1175                 dst := filepath.Join(*flagTmpdir, fmt.Sprintf("%06d.o", i))
1176                 paths = append(paths, dst)
1177
1178                 wg.Add(1)
1179                 go func() {
1180                         sema <- struct{}{}
1181                         defer func() {
1182                                 <-sema
1183                                 wg.Done()
1184                         }()
1185                         f, err := os.Open(h.file)
1186                         if err != nil {
1187                                 Exitf("cannot reopen %s: %v", h.pn, err)
1188                         }
1189                         defer f.Close()
1190                         if _, err := f.Seek(h.off, 0); err != nil {
1191                                 Exitf("cannot seek %s: %v", h.pn, err)
1192                         }
1193
1194                         w, err := os.Create(dst)
1195                         if err != nil {
1196                                 Exitf("cannot create %s: %v", dst, err)
1197                         }
1198                         if _, err := io.CopyN(w, f, h.length); err != nil {
1199                                 Exitf("cannot write %s: %v", dst, err)
1200                         }
1201                         if err := w.Close(); err != nil {
1202                                 Exitf("cannot close %s: %v", dst, err)
1203                         }
1204                 }()
1205         }
1206         wg.Wait()
1207         return paths
1208 }
1209
1210 // writeGDBLinkerScript creates gcc linker script file in temp
1211 // directory. writeGDBLinkerScript returns created file path.
1212 // The script is used to work around gcc bug
1213 // (see https://golang.org/issue/20183 for details).
1214 func writeGDBLinkerScript() string {
1215         name := "fix_debug_gdb_scripts.ld"
1216         path := filepath.Join(*flagTmpdir, name)
1217         src := `SECTIONS
1218 {
1219   .debug_gdb_scripts BLOCK(__section_alignment__) (NOLOAD) :
1220   {
1221     *(.debug_gdb_scripts)
1222   }
1223 }
1224 INSERT AFTER .debug_types;
1225 `
1226         err := ioutil.WriteFile(path, []byte(src), 0666)
1227         if err != nil {
1228                 Errorf(nil, "WriteFile %s failed: %v", name, err)
1229         }
1230         return path
1231 }
1232
1233 // archive builds a .a archive from the hostobj object files.
1234 func (ctxt *Link) archive() {
1235         if ctxt.BuildMode != BuildModeCArchive {
1236                 return
1237         }
1238
1239         exitIfErrors()
1240
1241         if *flagExtar == "" {
1242                 *flagExtar = "ar"
1243         }
1244
1245         mayberemoveoutfile()
1246
1247         // Force the buffer to flush here so that external
1248         // tools will see a complete file.
1249         if err := ctxt.Out.Close(); err != nil {
1250                 Exitf("error closing %v", *flagOutfile)
1251         }
1252
1253         argv := []string{*flagExtar, "-q", "-c", "-s"}
1254         if ctxt.HeadType == objabi.Haix {
1255                 argv = append(argv, "-X64")
1256         }
1257         argv = append(argv, *flagOutfile)
1258         argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
1259         argv = append(argv, hostobjCopy()...)
1260
1261         if ctxt.Debugvlog != 0 {
1262                 ctxt.Logf("archive: %s\n", strings.Join(argv, " "))
1263         }
1264
1265         // If supported, use syscall.Exec() to invoke the archive command,
1266         // which should be the final remaining step needed for the link.
1267         // This will reduce peak RSS for the link (and speed up linking of
1268         // large applications), since when the archive command runs we
1269         // won't be holding onto all of the linker's live memory.
1270         if syscallExecSupported && !ownTmpDir {
1271                 runAtExitFuncs()
1272                 ctxt.execArchive(argv)
1273                 panic("should not get here")
1274         }
1275
1276         // Otherwise invoke 'ar' in the usual way (fork + exec).
1277         if out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput(); err != nil {
1278                 Exitf("running %s failed: %v\n%s", argv[0], err, out)
1279         }
1280 }
1281
1282 func (ctxt *Link) hostlink() {
1283         if ctxt.LinkMode != LinkExternal || nerrors > 0 {
1284                 return
1285         }
1286         if ctxt.BuildMode == BuildModeCArchive {
1287                 return
1288         }
1289
1290         var argv []string
1291         argv = append(argv, ctxt.extld()...)
1292         argv = append(argv, hostlinkArchArgs(ctxt.Arch)...)
1293
1294         if *FlagS || debug_s {
1295                 if ctxt.HeadType == objabi.Hdarwin {
1296                         // Recent versions of macOS print
1297                         //      ld: warning: option -s is obsolete and being ignored
1298                         // so do not pass any arguments.
1299                 } else {
1300                         argv = append(argv, "-s")
1301                 }
1302         }
1303
1304         // On darwin, whether to combine DWARF into executable.
1305         // Only macOS supports unmapped segments such as our __DWARF segment.
1306         combineDwarf := ctxt.IsDarwin() && !*FlagS && !*FlagW && !debug_s && machoPlatform == PLATFORM_MACOS
1307
1308         switch ctxt.HeadType {
1309         case objabi.Hdarwin:
1310                 if combineDwarf {
1311                         // Leave room for DWARF combining.
1312                         // -headerpad is incompatible with -fembed-bitcode.
1313                         argv = append(argv, "-Wl,-headerpad,1144")
1314                 }
1315                 if ctxt.DynlinkingGo() && buildcfg.GOOS != "ios" {
1316                         // -flat_namespace is deprecated on iOS.
1317                         // It is useful for supporting plugins. We don't support plugins on iOS.
1318                         // -flat_namespace may cause the dynamic linker to hang at forkExec when
1319                         // resolving a lazy binding. See issue 38824.
1320                         // Force eager resolution to work around.
1321                         argv = append(argv, "-Wl,-flat_namespace", "-Wl,-bind_at_load")
1322                 }
1323                 if !combineDwarf {
1324                         argv = append(argv, "-Wl,-S") // suppress STAB (symbolic debugging) symbols
1325                 }
1326         case objabi.Hopenbsd:
1327                 argv = append(argv, "-Wl,-nopie")
1328                 argv = append(argv, "-pthread")
1329         case objabi.Hwindows:
1330                 if windowsgui {
1331                         argv = append(argv, "-mwindows")
1332                 } else {
1333                         argv = append(argv, "-mconsole")
1334                 }
1335                 // Mark as having awareness of terminal services, to avoid
1336                 // ancient compatibility hacks.
1337                 argv = append(argv, "-Wl,--tsaware")
1338
1339                 // Enable DEP
1340                 argv = append(argv, "-Wl,--nxcompat")
1341
1342                 argv = append(argv, fmt.Sprintf("-Wl,--major-os-version=%d", PeMinimumTargetMajorVersion))
1343                 argv = append(argv, fmt.Sprintf("-Wl,--minor-os-version=%d", PeMinimumTargetMinorVersion))
1344                 argv = append(argv, fmt.Sprintf("-Wl,--major-subsystem-version=%d", PeMinimumTargetMajorVersion))
1345                 argv = append(argv, fmt.Sprintf("-Wl,--minor-subsystem-version=%d", PeMinimumTargetMinorVersion))
1346         case objabi.Haix:
1347                 argv = append(argv, "-pthread")
1348                 // prevent ld to reorder .text functions to keep the same
1349                 // first/last functions for moduledata.
1350                 argv = append(argv, "-Wl,-bnoobjreorder")
1351                 // mcmodel=large is needed for every gcc generated files, but
1352                 // ld still need -bbigtoc in order to allow larger TOC.
1353                 argv = append(argv, "-mcmodel=large")
1354                 argv = append(argv, "-Wl,-bbigtoc")
1355         }
1356
1357         // Enable/disable ASLR on Windows.
1358         addASLRargs := func(argv []string, val bool) []string {
1359                 // Old/ancient versions of GCC support "--dynamicbase" and
1360                 // "--high-entropy-va" but don't enable it by default. In
1361                 // addition, they don't accept "--disable-dynamicbase" or
1362                 // "--no-dynamicbase", so the only way to disable ASLR is to
1363                 // not pass any flags at all.
1364                 //
1365                 // More modern versions of GCC (and also clang) enable ASLR
1366                 // by default. With these compilers, however you can turn it
1367                 // off if you want using "--disable-dynamicbase" or
1368                 // "--no-dynamicbase".
1369                 //
1370                 // The strategy below is to try using "--disable-dynamicbase";
1371                 // if this succeeds, then assume we're working with more
1372                 // modern compilers and act accordingly. If it fails, assume
1373                 // an ancient compiler with ancient defaults.
1374                 var dbopt string
1375                 var heopt string
1376                 dbon := "--dynamicbase"
1377                 heon := "--high-entropy-va"
1378                 dboff := "--disable-dynamicbase"
1379                 heoff := "--disable-high-entropy-va"
1380                 if val {
1381                         dbopt = dbon
1382                         heopt = heon
1383                 } else {
1384                         // Test to see whether "--disable-dynamicbase" works.
1385                         newer := linkerFlagSupported(ctxt.Arch, argv[0], "", "-Wl,"+dboff)
1386                         if newer {
1387                                 // Newer compiler, which supports both on/off options.
1388                                 dbopt = dboff
1389                                 heopt = heoff
1390                         } else {
1391                                 // older toolchain: we have to say nothing in order to
1392                                 // get a no-ASLR binary.
1393                                 dbopt = ""
1394                                 heopt = ""
1395                         }
1396                 }
1397                 if dbopt != "" {
1398                         argv = append(argv, "-Wl,"+dbopt)
1399                 }
1400                 // enable high-entropy ASLR on 64-bit.
1401                 if ctxt.Arch.PtrSize >= 8 && heopt != "" {
1402                         argv = append(argv, "-Wl,"+heopt)
1403                 }
1404                 return argv
1405         }
1406
1407         switch ctxt.BuildMode {
1408         case BuildModeExe:
1409                 if ctxt.HeadType == objabi.Hdarwin {
1410                         if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() {
1411                                 argv = append(argv, "-Wl,-no_pie")
1412                                 argv = append(argv, "-Wl,-pagezero_size,4000000")
1413                         }
1414                 }
1415         case BuildModePIE:
1416                 switch ctxt.HeadType {
1417                 case objabi.Hdarwin, objabi.Haix:
1418                 case objabi.Hwindows:
1419                         argv = addASLRargs(argv, *flagAslr)
1420                 default:
1421                         // ELF.
1422                         if ctxt.UseRelro() {
1423                                 argv = append(argv, "-Wl,-z,relro")
1424                         }
1425                         argv = append(argv, "-pie")
1426                 }
1427         case BuildModeCShared:
1428                 if ctxt.HeadType == objabi.Hdarwin {
1429                         argv = append(argv, "-dynamiclib")
1430                 } else {
1431                         if ctxt.UseRelro() {
1432                                 argv = append(argv, "-Wl,-z,relro")
1433                         }
1434                         argv = append(argv, "-shared")
1435                         if ctxt.HeadType == objabi.Hwindows {
1436                                 argv = addASLRargs(argv, *flagAslr)
1437                         } else {
1438                                 // Pass -z nodelete to mark the shared library as
1439                                 // non-closeable: a dlclose will do nothing.
1440                                 argv = append(argv, "-Wl,-z,nodelete")
1441                                 // Only pass Bsymbolic on non-Windows.
1442                                 argv = append(argv, "-Wl,-Bsymbolic")
1443                         }
1444                 }
1445         case BuildModeShared:
1446                 if ctxt.UseRelro() {
1447                         argv = append(argv, "-Wl,-z,relro")
1448                 }
1449                 argv = append(argv, "-shared")
1450         case BuildModePlugin:
1451                 if ctxt.HeadType == objabi.Hdarwin {
1452                         argv = append(argv, "-dynamiclib")
1453                 } else {
1454                         if ctxt.UseRelro() {
1455                                 argv = append(argv, "-Wl,-z,relro")
1456                         }
1457                         argv = append(argv, "-shared")
1458                 }
1459         }
1460
1461         var altLinker string
1462         if ctxt.IsELF && ctxt.DynlinkingGo() {
1463                 // We force all symbol resolution to be done at program startup
1464                 // because lazy PLT resolution can use large amounts of stack at
1465                 // times we cannot allow it to do so.
1466                 argv = append(argv, "-Wl,-znow")
1467
1468                 // Do not let the host linker generate COPY relocations. These
1469                 // can move symbols out of sections that rely on stable offsets
1470                 // from the beginning of the section (like sym.STYPE).
1471                 argv = append(argv, "-Wl,-znocopyreloc")
1472
1473                 if buildcfg.GOOS == "android" {
1474                         // Use lld to avoid errors from default linker (issue #38838)
1475                         altLinker = "lld"
1476                 }
1477
1478                 if ctxt.Arch.InFamily(sys.ARM, sys.ARM64) && buildcfg.GOOS == "linux" {
1479                         // On ARM, the GNU linker will generate COPY relocations
1480                         // even with -znocopyreloc set.
1481                         // https://sourceware.org/bugzilla/show_bug.cgi?id=19962
1482                         //
1483                         // On ARM64, the GNU linker will fail instead of
1484                         // generating COPY relocations.
1485                         //
1486                         // In both cases, switch to gold.
1487                         altLinker = "gold"
1488
1489                         // If gold is not installed, gcc will silently switch
1490                         // back to ld.bfd. So we parse the version information
1491                         // and provide a useful error if gold is missing.
1492                         name, args := flagExtld[0], flagExtld[1:]
1493                         args = append(args, "-fuse-ld=gold", "-Wl,--version")
1494                         cmd := exec.Command(name, args...)
1495                         if out, err := cmd.CombinedOutput(); err == nil {
1496                                 if !bytes.Contains(out, []byte("GNU gold")) {
1497                                         log.Fatalf("ARM external linker must be gold (issue #15696), but is not: %s", out)
1498                                 }
1499                         }
1500                 }
1501         }
1502         if ctxt.Arch.Family == sys.ARM64 && buildcfg.GOOS == "freebsd" {
1503                 // Switch to ld.bfd on freebsd/arm64.
1504                 altLinker = "bfd"
1505
1506                 // Provide a useful error if ld.bfd is missing.
1507                 name, args := flagExtld[0], flagExtld[1:]
1508                 args = append(args, "-fuse-ld=bfd", "-Wl,--version")
1509                 cmd := exec.Command(name, args...)
1510                 if out, err := cmd.CombinedOutput(); err == nil {
1511                         if !bytes.Contains(out, []byte("GNU ld")) {
1512                                 log.Fatalf("ARM64 external linker must be ld.bfd (issue #35197), please install devel/binutils")
1513                         }
1514                 }
1515         }
1516         if altLinker != "" {
1517                 argv = append(argv, "-fuse-ld="+altLinker)
1518         }
1519
1520         if ctxt.IsELF && len(buildinfo) > 0 {
1521                 argv = append(argv, fmt.Sprintf("-Wl,--build-id=0x%x", buildinfo))
1522         }
1523
1524         // On Windows, given -o foo, GCC will append ".exe" to produce
1525         // "foo.exe".  We have decided that we want to honor the -o
1526         // option. To make this work, we append a '.' so that GCC
1527         // will decide that the file already has an extension. We
1528         // only want to do this when producing a Windows output file
1529         // on a Windows host.
1530         outopt := *flagOutfile
1531         if buildcfg.GOOS == "windows" && runtime.GOOS == "windows" && filepath.Ext(outopt) == "" {
1532                 outopt += "."
1533         }
1534         argv = append(argv, "-o")
1535         argv = append(argv, outopt)
1536
1537         if rpath.val != "" {
1538                 argv = append(argv, fmt.Sprintf("-Wl,-rpath,%s", rpath.val))
1539         }
1540
1541         if *flagInterpreter != "" {
1542                 // Many linkers support both -I and the --dynamic-linker flags
1543                 // to set the ELF interpreter, but lld only supports
1544                 // --dynamic-linker so prefer that (ld on very old Solaris only
1545                 // supports -I but that seems less important).
1546                 argv = append(argv, fmt.Sprintf("-Wl,--dynamic-linker,%s", *flagInterpreter))
1547         }
1548
1549         // Force global symbols to be exported for dlopen, etc.
1550         if ctxt.IsELF {
1551                 argv = append(argv, "-rdynamic")
1552         }
1553         if ctxt.HeadType == objabi.Haix {
1554                 fileName := xcoffCreateExportFile(ctxt)
1555                 argv = append(argv, "-Wl,-bE:"+fileName)
1556         }
1557
1558         const unusedArguments = "-Qunused-arguments"
1559         if linkerFlagSupported(ctxt.Arch, argv[0], altLinker, unusedArguments) {
1560                 argv = append(argv, unusedArguments)
1561         }
1562
1563         const compressDWARF = "-Wl,--compress-debug-sections=zlib"
1564         if ctxt.compressDWARF && linkerFlagSupported(ctxt.Arch, argv[0], altLinker, compressDWARF) {
1565                 argv = append(argv, compressDWARF)
1566         }
1567
1568         argv = append(argv, filepath.Join(*flagTmpdir, "go.o"))
1569         argv = append(argv, hostobjCopy()...)
1570         if ctxt.HeadType == objabi.Haix {
1571                 // We want to have C files after Go files to remove
1572                 // trampolines csects made by ld.
1573                 argv = append(argv, "-nostartfiles")
1574                 argv = append(argv, "/lib/crt0_64.o")
1575
1576                 extld := ctxt.extld()
1577                 name, args := extld[0], extld[1:]
1578                 // Get starting files.
1579                 getPathFile := func(file string) string {
1580                         args := append(args, "-maix64", "--print-file-name="+file)
1581                         out, err := exec.Command(name, args...).CombinedOutput()
1582                         if err != nil {
1583                                 log.Fatalf("running %s failed: %v\n%s", extld, err, out)
1584                         }
1585                         return strings.Trim(string(out), "\n")
1586                 }
1587                 // Since GCC version 11, the 64-bit version of GCC starting files
1588                 // are now suffixed by "_64". Even under "-maix64" multilib directory
1589                 // "crtcxa.o" is 32-bit.
1590                 crtcxa := getPathFile("crtcxa_64.o")
1591                 if !filepath.IsAbs(crtcxa) {
1592                         crtcxa = getPathFile("crtcxa.o")
1593                 }
1594                 crtdbase := getPathFile("crtdbase_64.o")
1595                 if !filepath.IsAbs(crtdbase) {
1596                         crtdbase = getPathFile("crtdbase.o")
1597                 }
1598                 argv = append(argv, crtcxa)
1599                 argv = append(argv, crtdbase)
1600         }
1601
1602         if ctxt.linkShared {
1603                 seenDirs := make(map[string]bool)
1604                 seenLibs := make(map[string]bool)
1605                 addshlib := func(path string) {
1606                         dir, base := filepath.Split(path)
1607                         if !seenDirs[dir] {
1608                                 argv = append(argv, "-L"+dir)
1609                                 if !rpath.set {
1610                                         argv = append(argv, "-Wl,-rpath="+dir)
1611                                 }
1612                                 seenDirs[dir] = true
1613                         }
1614                         base = strings.TrimSuffix(base, ".so")
1615                         base = strings.TrimPrefix(base, "lib")
1616                         if !seenLibs[base] {
1617                                 argv = append(argv, "-l"+base)
1618                                 seenLibs[base] = true
1619                         }
1620                 }
1621                 for _, shlib := range ctxt.Shlibs {
1622                         addshlib(shlib.Path)
1623                         for _, dep := range shlib.Deps {
1624                                 if dep == "" {
1625                                         continue
1626                                 }
1627                                 libpath := findshlib(ctxt, dep)
1628                                 if libpath != "" {
1629                                         addshlib(libpath)
1630                                 }
1631                         }
1632                 }
1633         }
1634
1635         // clang, unlike GCC, passes -rdynamic to the linker
1636         // even when linking with -static, causing a linker
1637         // error when using GNU ld. So take out -rdynamic if
1638         // we added it. We do it in this order, rather than
1639         // only adding -rdynamic later, so that -extldflags
1640         // can override -rdynamic without using -static.
1641         // Similarly for -Wl,--dynamic-linker.
1642         checkStatic := func(arg string) {
1643                 if ctxt.IsELF && arg == "-static" {
1644                         for i := range argv {
1645                                 if argv[i] == "-rdynamic" || strings.HasPrefix(argv[i], "-Wl,--dynamic-linker,") {
1646                                         argv[i] = "-static"
1647                                 }
1648                         }
1649                 }
1650         }
1651
1652         for _, p := range ldflag {
1653                 argv = append(argv, p)
1654                 checkStatic(p)
1655         }
1656
1657         // When building a program with the default -buildmode=exe the
1658         // gc compiler generates code requires DT_TEXTREL in a
1659         // position independent executable (PIE). On systems where the
1660         // toolchain creates PIEs by default, and where DT_TEXTREL
1661         // does not work, the resulting programs will not run. See
1662         // issue #17847. To avoid this problem pass -no-pie to the
1663         // toolchain if it is supported.
1664         if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared && !(ctxt.IsDarwin() && ctxt.IsARM64()) {
1665                 // GCC uses -no-pie, clang uses -nopie.
1666                 for _, nopie := range []string{"-no-pie", "-nopie"} {
1667                         if linkerFlagSupported(ctxt.Arch, argv[0], altLinker, nopie) {
1668                                 argv = append(argv, nopie)
1669                                 break
1670                         }
1671                 }
1672         }
1673
1674         for _, p := range flagExtldflags {
1675                 argv = append(argv, p)
1676                 checkStatic(p)
1677         }
1678         if ctxt.HeadType == objabi.Hwindows {
1679                 // Determine which linker we're using. Add in the extldflags in
1680                 // case used has specified "-fuse-ld=...".
1681                 extld := ctxt.extld()
1682                 name, args := extld[0], extld[1:]
1683                 args = append(args, flagExtldflags...)
1684                 args = append(args, "-Wl,--version")
1685                 cmd := exec.Command(name, args...)
1686                 usingLLD := false
1687                 if out, err := cmd.CombinedOutput(); err == nil {
1688                         if bytes.Contains(out, []byte("LLD ")) {
1689                                 usingLLD = true
1690                         }
1691                 }
1692
1693                 // use gcc linker script to work around gcc bug
1694                 // (see https://golang.org/issue/20183 for details).
1695                 if !usingLLD {
1696                         p := writeGDBLinkerScript()
1697                         argv = append(argv, "-Wl,-T,"+p)
1698                 }
1699                 // libmingw32 and libmingwex have some inter-dependencies,
1700                 // so must use linker groups.
1701                 argv = append(argv, "-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group")
1702                 argv = append(argv, peimporteddlls()...)
1703         }
1704
1705         if ctxt.Debugvlog != 0 {
1706                 ctxt.Logf("host link:")
1707                 for _, v := range argv {
1708                         ctxt.Logf(" %q", v)
1709                 }
1710                 ctxt.Logf("\n")
1711         }
1712
1713         out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput()
1714         if err != nil {
1715                 Exitf("running %s failed: %v\n%s", argv[0], err, out)
1716         }
1717
1718         // Filter out useless linker warnings caused by bugs outside Go.
1719         // See also cmd/go/internal/work/exec.go's gccld method.
1720         var save [][]byte
1721         var skipLines int
1722         for _, line := range bytes.SplitAfter(out, []byte("\n")) {
1723                 // golang.org/issue/26073 - Apple Xcode bug
1724                 if bytes.Contains(line, []byte("ld: warning: text-based stub file")) {
1725                         continue
1726                 }
1727
1728                 if skipLines > 0 {
1729                         skipLines--
1730                         continue
1731                 }
1732
1733                 // Remove TOC overflow warning on AIX.
1734                 if bytes.Contains(line, []byte("ld: 0711-783")) {
1735                         skipLines = 2
1736                         continue
1737                 }
1738
1739                 save = append(save, line)
1740         }
1741         out = bytes.Join(save, nil)
1742
1743         if len(out) > 0 {
1744                 // always print external output even if the command is successful, so that we don't
1745                 // swallow linker warnings (see https://golang.org/issue/17935).
1746                 ctxt.Logf("%s", out)
1747         }
1748
1749         if combineDwarf {
1750                 // Find "dsymutils" and "strip" tools using CC --print-prog-name.
1751                 var cc []string
1752                 cc = append(cc, ctxt.extld()...)
1753                 cc = append(cc, hostlinkArchArgs(ctxt.Arch)...)
1754                 cc = append(cc, "--print-prog-name", "dsymutil")
1755                 out, err := exec.Command(cc[0], cc[1:]...).CombinedOutput()
1756                 if err != nil {
1757                         Exitf("%s: finding dsymutil failed: %v\n%s", os.Args[0], err, out)
1758                 }
1759                 dsymutilCmd := strings.TrimSuffix(string(out), "\n")
1760
1761                 cc[len(cc)-1] = "strip"
1762                 out, err = exec.Command(cc[0], cc[1:]...).CombinedOutput()
1763                 if err != nil {
1764                         Exitf("%s: finding strip failed: %v\n%s", os.Args[0], err, out)
1765                 }
1766                 stripCmd := strings.TrimSuffix(string(out), "\n")
1767
1768                 dsym := filepath.Join(*flagTmpdir, "go.dwarf")
1769                 if out, err := exec.Command(dsymutilCmd, "-f", *flagOutfile, "-o", dsym).CombinedOutput(); err != nil {
1770                         Exitf("%s: running dsymutil failed: %v\n%s", os.Args[0], err, out)
1771                 }
1772                 // Remove STAB (symbolic debugging) symbols after we are done with them (by dsymutil).
1773                 // They contain temporary file paths and make the build not reproducible.
1774                 if out, err := exec.Command(stripCmd, "-S", *flagOutfile).CombinedOutput(); err != nil {
1775                         Exitf("%s: running strip failed: %v\n%s", os.Args[0], err, out)
1776                 }
1777                 // Skip combining if `dsymutil` didn't generate a file. See #11994.
1778                 if _, err := os.Stat(dsym); os.IsNotExist(err) {
1779                         return
1780                 }
1781                 // For os.Rename to work reliably, must be in same directory as outfile.
1782                 combinedOutput := *flagOutfile + "~"
1783                 exef, err := os.Open(*flagOutfile)
1784                 if err != nil {
1785                         Exitf("%s: combining dwarf failed: %v", os.Args[0], err)
1786                 }
1787                 defer exef.Close()
1788                 exem, err := macho.NewFile(exef)
1789                 if err != nil {
1790                         Exitf("%s: parsing Mach-O header failed: %v", os.Args[0], err)
1791                 }
1792                 if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil {
1793                         Exitf("%s: combining dwarf failed: %v", os.Args[0], err)
1794                 }
1795                 os.Remove(*flagOutfile)
1796                 if err := os.Rename(combinedOutput, *flagOutfile); err != nil {
1797                         Exitf("%s: %v", os.Args[0], err)
1798                 }
1799         }
1800         if ctxt.NeedCodeSign() {
1801                 err := machoCodeSign(ctxt, *flagOutfile)
1802                 if err != nil {
1803                         Exitf("%s: code signing failed: %v", os.Args[0], err)
1804                 }
1805         }
1806 }
1807
1808 var createTrivialCOnce sync.Once
1809
1810 func linkerFlagSupported(arch *sys.Arch, linker, altLinker, flag string) bool {
1811         createTrivialCOnce.Do(func() {
1812                 src := filepath.Join(*flagTmpdir, "trivial.c")
1813                 if err := ioutil.WriteFile(src, []byte("int main() { return 0; }"), 0666); err != nil {
1814                         Errorf(nil, "WriteFile trivial.c failed: %v", err)
1815                 }
1816         })
1817
1818         flagsWithNextArgSkip := []string{
1819                 "-F",
1820                 "-l",
1821                 "-L",
1822                 "-framework",
1823                 "-Wl,-framework",
1824                 "-Wl,-rpath",
1825                 "-Wl,-undefined",
1826         }
1827         flagsWithNextArgKeep := []string{
1828                 "-arch",
1829                 "-isysroot",
1830                 "--sysroot",
1831                 "-target",
1832         }
1833         prefixesToKeep := []string{
1834                 "-f",
1835                 "-m",
1836                 "-p",
1837                 "-Wl,",
1838                 "-arch",
1839                 "-isysroot",
1840                 "--sysroot",
1841                 "-target",
1842         }
1843
1844         flags := hostlinkArchArgs(arch)
1845         keep := false
1846         skip := false
1847         for _, f := range append(flagExtldflags, ldflag...) {
1848                 if keep {
1849                         flags = append(flags, f)
1850                         keep = false
1851                 } else if skip {
1852                         skip = false
1853                 } else if f == "" || f[0] != '-' {
1854                 } else if contains(flagsWithNextArgSkip, f) {
1855                         skip = true
1856                 } else if contains(flagsWithNextArgKeep, f) {
1857                         flags = append(flags, f)
1858                         keep = true
1859                 } else {
1860                         for _, p := range prefixesToKeep {
1861                                 if strings.HasPrefix(f, p) {
1862                                         flags = append(flags, f)
1863                                         break
1864                                 }
1865                         }
1866                 }
1867         }
1868
1869         if altLinker != "" {
1870                 flags = append(flags, "-fuse-ld="+altLinker)
1871         }
1872         flags = append(flags, flag, "trivial.c")
1873
1874         cmd := exec.Command(linker, flags...)
1875         cmd.Dir = *flagTmpdir
1876         cmd.Env = append([]string{"LC_ALL=C"}, os.Environ()...)
1877         out, err := cmd.CombinedOutput()
1878         // GCC says "unrecognized command line option ‘-no-pie’"
1879         // clang says "unknown argument: '-no-pie'"
1880         return err == nil && !bytes.Contains(out, []byte("unrecognized")) && !bytes.Contains(out, []byte("unknown"))
1881 }
1882
1883 // hostlinkArchArgs returns arguments to pass to the external linker
1884 // based on the architecture.
1885 func hostlinkArchArgs(arch *sys.Arch) []string {
1886         switch arch.Family {
1887         case sys.I386:
1888                 return []string{"-m32"}
1889         case sys.AMD64:
1890                 if buildcfg.GOOS == "darwin" {
1891                         return []string{"-arch", "x86_64", "-m64"}
1892                 }
1893                 return []string{"-m64"}
1894         case sys.S390X:
1895                 return []string{"-m64"}
1896         case sys.ARM:
1897                 return []string{"-marm"}
1898         case sys.ARM64:
1899                 if buildcfg.GOOS == "darwin" {
1900                         return []string{"-arch", "arm64"}
1901                 }
1902         case sys.MIPS64:
1903                 return []string{"-mabi=64"}
1904         case sys.MIPS:
1905                 return []string{"-mabi=32"}
1906         case sys.PPC64:
1907                 if buildcfg.GOOS == "aix" {
1908                         return []string{"-maix64"}
1909                 } else {
1910                         return []string{"-m64"}
1911                 }
1912
1913         }
1914         return nil
1915 }
1916
1917 var wantHdr = objabi.HeaderString()
1918
1919 // ldobj loads an input object. If it is a host object (an object
1920 // compiled by a non-Go compiler) it returns the Hostobj pointer. If
1921 // it is a Go object, it returns nil.
1922 func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, file string) *Hostobj {
1923         pkg := objabi.PathToPrefix(lib.Pkg)
1924
1925         eof := f.Offset() + length
1926         start := f.Offset()
1927         c1 := bgetc(f)
1928         c2 := bgetc(f)
1929         c3 := bgetc(f)
1930         c4 := bgetc(f)
1931         f.MustSeek(start, 0)
1932
1933         unit := &sym.CompilationUnit{Lib: lib}
1934         lib.Units = append(lib.Units, unit)
1935
1936         magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4)
1937         if magic == 0x7f454c46 { // \x7F E L F
1938                 ldelf := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1939                         textp, flags, err := loadelf.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn, ehdr.Flags)
1940                         if err != nil {
1941                                 Errorf(nil, "%v", err)
1942                                 return
1943                         }
1944                         ehdr.Flags = flags
1945                         ctxt.Textp = append(ctxt.Textp, textp...)
1946                 }
1947                 return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file)
1948         }
1949
1950         if magic&^1 == 0xfeedface || magic&^0x01000000 == 0xcefaedfe {
1951                 ldmacho := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1952                         textp, err := loadmacho.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn)
1953                         if err != nil {
1954                                 Errorf(nil, "%v", err)
1955                                 return
1956                         }
1957                         ctxt.Textp = append(ctxt.Textp, textp...)
1958                 }
1959                 return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file)
1960         }
1961
1962         switch c1<<8 | c2 {
1963         case 0x4c01, // 386
1964                 0x6486, // amd64
1965                 0xc401, // arm
1966                 0x64aa: // arm64
1967                 ldpe := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1968                         textp, rsrc, err := loadpe.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn)
1969                         if err != nil {
1970                                 Errorf(nil, "%v", err)
1971                                 return
1972                         }
1973                         if len(rsrc) != 0 {
1974                                 setpersrc(ctxt, rsrc)
1975                         }
1976                         ctxt.Textp = append(ctxt.Textp, textp...)
1977                 }
1978                 return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file)
1979         }
1980
1981         if c1 == 0x01 && (c2 == 0xD7 || c2 == 0xF7) {
1982                 ldxcoff := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) {
1983                         textp, err := loadxcoff.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn)
1984                         if err != nil {
1985                                 Errorf(nil, "%v", err)
1986                                 return
1987                         }
1988                         ctxt.Textp = append(ctxt.Textp, textp...)
1989                 }
1990                 return ldhostobj(ldxcoff, ctxt.HeadType, f, pkg, length, pn, file)
1991         }
1992
1993         if c1 != 'g' || c2 != 'o' || c3 != ' ' || c4 != 'o' {
1994                 // An unrecognized object is just passed to the external linker.
1995                 // If we try to read symbols from this object, we will
1996                 // report an error at that time.
1997                 unknownObjFormat = true
1998                 return ldhostobj(nil, ctxt.HeadType, f, pkg, length, pn, file)
1999         }
2000
2001         /* check the header */
2002         line, err := f.ReadString('\n')
2003         if err != nil {
2004                 Errorf(nil, "truncated object file: %s: %v", pn, err)
2005                 return nil
2006         }
2007
2008         if !strings.HasPrefix(line, "go object ") {
2009                 if strings.HasSuffix(pn, ".go") {
2010                         Exitf("%s: uncompiled .go source file", pn)
2011                         return nil
2012                 }
2013
2014                 if line == ctxt.Arch.Name {
2015                         // old header format: just $GOOS
2016                         Errorf(nil, "%s: stale object file", pn)
2017                         return nil
2018                 }
2019
2020                 Errorf(nil, "%s: not an object file: @%d %q", pn, start, line)
2021                 return nil
2022         }
2023
2024         // First, check that the basic GOOS, GOARCH, and Version match.
2025         if line != wantHdr {
2026                 Errorf(nil, "%s: linked object header mismatch:\nhave %q\nwant %q\n", pn, line, wantHdr)
2027         }
2028
2029         // Skip over exports and other info -- ends with \n!\n.
2030         //
2031         // Note: It's possible for "\n!\n" to appear within the binary
2032         // package export data format. To avoid truncating the package
2033         // definition prematurely (issue 21703), we keep track of
2034         // how many "$$" delimiters we've seen.
2035
2036         import0 := f.Offset()
2037
2038         c1 = '\n' // the last line ended in \n
2039         c2 = bgetc(f)
2040         c3 = bgetc(f)
2041         markers := 0
2042         for {
2043                 if c1 == '\n' {
2044                         if markers%2 == 0 && c2 == '!' && c3 == '\n' {
2045                                 break
2046                         }
2047                         if c2 == '$' && c3 == '$' {
2048                                 markers++
2049                         }
2050                 }
2051
2052                 c1 = c2
2053                 c2 = c3
2054                 c3 = bgetc(f)
2055                 if c3 == -1 {
2056                         Errorf(nil, "truncated object file: %s", pn)
2057                         return nil
2058                 }
2059         }
2060
2061         import1 := f.Offset()
2062
2063         f.MustSeek(import0, 0)
2064         ldpkg(ctxt, f, lib, import1-import0-2, pn) // -2 for !\n
2065         f.MustSeek(import1, 0)
2066
2067         fingerprint := ctxt.loader.Preload(ctxt.IncVersion(), f, lib, unit, eof-f.Offset())
2068         if !fingerprint.IsZero() { // Assembly objects don't have fingerprints. Ignore them.
2069                 // Check fingerprint, to ensure the importing and imported packages
2070                 // have consistent view of symbol indices.
2071                 // Normally the go command should ensure this. But in case something
2072                 // goes wrong, it could lead to obscure bugs like run-time crash.
2073                 // Check it here to be sure.
2074                 if lib.Fingerprint.IsZero() { // Not yet imported. Update its fingerprint.
2075                         lib.Fingerprint = fingerprint
2076                 }
2077                 checkFingerprint(lib, fingerprint, lib.Srcref, lib.Fingerprint)
2078         }
2079
2080         addImports(ctxt, lib, pn)
2081         return nil
2082 }
2083
2084 // symbolsAreUnresolved scans through the loader's list of unresolved
2085 // symbols and checks to see whether any of them match the names of the
2086 // symbols in 'want'. Return value is a list of bools, with list[K] set
2087 // to true if there is an unresolved reference to the symbol in want[K].
2088 func symbolsAreUnresolved(ctxt *Link, want []string) []bool {
2089         returnAllUndefs := -1
2090         undefs := ctxt.loader.UndefinedRelocTargets(returnAllUndefs)
2091         seen := make(map[loader.Sym]struct{})
2092         rval := make([]bool, len(want))
2093         wantm := make(map[string]int)
2094         for k, w := range want {
2095                 wantm[w] = k
2096         }
2097         count := 0
2098         for _, s := range undefs {
2099                 if _, ok := seen[s]; ok {
2100                         continue
2101                 }
2102                 seen[s] = struct{}{}
2103                 if k, ok := wantm[ctxt.loader.SymName(s)]; ok {
2104                         rval[k] = true
2105                         count++
2106                         if count == len(want) {
2107                                 return rval
2108                         }
2109                 }
2110         }
2111         return rval
2112 }
2113
2114 // hostObject reads a single host object file (compare to "hostArchive").
2115 // This is used as part of internal linking when we need to pull in
2116 // files such as "crt?.o".
2117 func hostObject(ctxt *Link, objname string, path string) {
2118         if ctxt.Debugvlog > 1 {
2119                 ctxt.Logf("hostObject(%s)\n", path)
2120         }
2121         objlib := sym.Library{
2122                 Pkg: objname,
2123         }
2124         f, err := bio.Open(path)
2125         if err != nil {
2126                 Exitf("cannot open host object %q file %s: %v", objname, path, err)
2127         }
2128         defer f.Close()
2129         h := ldobj(ctxt, f, &objlib, 0, path, path)
2130         if h.ld == nil {
2131                 Exitf("unrecognized object file format in %s", path)
2132         }
2133         f.MustSeek(h.off, 0)
2134         h.ld(ctxt, f, h.pkg, h.length, h.pn)
2135 }
2136
2137 func checkFingerprint(lib *sym.Library, libfp goobj.FingerprintType, src string, srcfp goobj.FingerprintType) {
2138         if libfp != srcfp {
2139                 Exitf("fingerprint mismatch: %s has %x, import from %s expecting %x", lib, libfp, src, srcfp)
2140         }
2141 }
2142
2143 func readelfsymboldata(ctxt *Link, f *elf.File, sym *elf.Symbol) []byte {
2144         data := make([]byte, sym.Size)
2145         sect := f.Sections[sym.Section]
2146         if sect.Type != elf.SHT_PROGBITS && sect.Type != elf.SHT_NOTE {
2147                 Errorf(nil, "reading %s from non-data section", sym.Name)
2148         }
2149         n, err := sect.ReadAt(data, int64(sym.Value-sect.Addr))
2150         if uint64(n) != sym.Size {
2151                 Errorf(nil, "reading contents of %s: %v", sym.Name, err)
2152         }
2153         return data
2154 }
2155
2156 func readwithpad(r io.Reader, sz int32) ([]byte, error) {
2157         data := make([]byte, Rnd(int64(sz), 4))
2158         _, err := io.ReadFull(r, data)
2159         if err != nil {
2160                 return nil, err
2161         }
2162         data = data[:sz]
2163         return data, nil
2164 }
2165
2166 func readnote(f *elf.File, name []byte, typ int32) ([]byte, error) {
2167         for _, sect := range f.Sections {
2168                 if sect.Type != elf.SHT_NOTE {
2169                         continue
2170                 }
2171                 r := sect.Open()
2172                 for {
2173                         var namesize, descsize, noteType int32
2174                         err := binary.Read(r, f.ByteOrder, &namesize)
2175                         if err != nil {
2176                                 if err == io.EOF {
2177                                         break
2178                                 }
2179                                 return nil, fmt.Errorf("read namesize failed: %v", err)
2180                         }
2181                         err = binary.Read(r, f.ByteOrder, &descsize)
2182                         if err != nil {
2183                                 return nil, fmt.Errorf("read descsize failed: %v", err)
2184                         }
2185                         err = binary.Read(r, f.ByteOrder, &noteType)
2186                         if err != nil {
2187                                 return nil, fmt.Errorf("read type failed: %v", err)
2188                         }
2189                         noteName, err := readwithpad(r, namesize)
2190                         if err != nil {
2191                                 return nil, fmt.Errorf("read name failed: %v", err)
2192                         }
2193                         desc, err := readwithpad(r, descsize)
2194                         if err != nil {
2195                                 return nil, fmt.Errorf("read desc failed: %v", err)
2196                         }
2197                         if string(name) == string(noteName) && typ == noteType {
2198                                 return desc, nil
2199                         }
2200                 }
2201         }
2202         return nil, nil
2203 }
2204
2205 func findshlib(ctxt *Link, shlib string) string {
2206         if filepath.IsAbs(shlib) {
2207                 return shlib
2208         }
2209         for _, libdir := range ctxt.Libdir {
2210                 libpath := filepath.Join(libdir, shlib)
2211                 if _, err := os.Stat(libpath); err == nil {
2212                         return libpath
2213                 }
2214         }
2215         Errorf(nil, "cannot find shared library: %s", shlib)
2216         return ""
2217 }
2218
2219 func ldshlibsyms(ctxt *Link, shlib string) {
2220         var libpath string
2221         if filepath.IsAbs(shlib) {
2222                 libpath = shlib
2223                 shlib = filepath.Base(shlib)
2224         } else {
2225                 libpath = findshlib(ctxt, shlib)
2226                 if libpath == "" {
2227                         return
2228                 }
2229         }
2230         for _, processedlib := range ctxt.Shlibs {
2231                 if processedlib.Path == libpath {
2232                         return
2233                 }
2234         }
2235         if ctxt.Debugvlog > 1 {
2236                 ctxt.Logf("ldshlibsyms: found library with name %s at %s\n", shlib, libpath)
2237         }
2238
2239         f, err := elf.Open(libpath)
2240         if err != nil {
2241                 Errorf(nil, "cannot open shared library: %s", libpath)
2242                 return
2243         }
2244         // Keep the file open as decodetypeGcprog needs to read from it.
2245         // TODO: fix. Maybe mmap the file.
2246         //defer f.Close()
2247
2248         hash, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GOABIHASH_TAG)
2249         if err != nil {
2250                 Errorf(nil, "cannot read ABI hash from shared library %s: %v", libpath, err)
2251                 return
2252         }
2253
2254         depsbytes, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GODEPS_TAG)
2255         if err != nil {
2256                 Errorf(nil, "cannot read dep list from shared library %s: %v", libpath, err)
2257                 return
2258         }
2259         var deps []string
2260         for _, dep := range strings.Split(string(depsbytes), "\n") {
2261                 if dep == "" {
2262                         continue
2263                 }
2264                 if !filepath.IsAbs(dep) {
2265                         // If the dep can be interpreted as a path relative to the shlib
2266                         // in which it was found, do that. Otherwise, we will leave it
2267                         // to be resolved by libdir lookup.
2268                         abs := filepath.Join(filepath.Dir(libpath), dep)
2269                         if _, err := os.Stat(abs); err == nil {
2270                                 dep = abs
2271                         }
2272                 }
2273                 deps = append(deps, dep)
2274         }
2275
2276         syms, err := f.DynamicSymbols()
2277         if err != nil {
2278                 Errorf(nil, "cannot read symbols from shared library: %s", libpath)
2279                 return
2280         }
2281
2282         for _, elfsym := range syms {
2283                 if elf.ST_TYPE(elfsym.Info) == elf.STT_NOTYPE || elf.ST_TYPE(elfsym.Info) == elf.STT_SECTION {
2284                         continue
2285                 }
2286
2287                 // Symbols whose names start with "type." are compiler
2288                 // generated, so make functions with that prefix internal.
2289                 ver := 0
2290                 symname := elfsym.Name // (unmangled) symbol name
2291                 if elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC && strings.HasPrefix(elfsym.Name, "type.") {
2292                         ver = abiInternalVer
2293                 } else if buildcfg.Experiment.RegabiWrappers && elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC {
2294                         // Demangle the ABI name. Keep in sync with symtab.go:mangleABIName.
2295                         if strings.HasSuffix(elfsym.Name, ".abiinternal") {
2296                                 ver = sym.SymVerABIInternal
2297                                 symname = strings.TrimSuffix(elfsym.Name, ".abiinternal")
2298                         } else if strings.HasSuffix(elfsym.Name, ".abi0") {
2299                                 ver = 0
2300                                 symname = strings.TrimSuffix(elfsym.Name, ".abi0")
2301                         }
2302                 }
2303
2304                 l := ctxt.loader
2305                 s := l.LookupOrCreateSym(symname, ver)
2306
2307                 // Because loadlib above loads all .a files before loading
2308                 // any shared libraries, any non-dynimport symbols we find
2309                 // that duplicate symbols already loaded should be ignored
2310                 // (the symbols from the .a files "win").
2311                 if l.SymType(s) != 0 && l.SymType(s) != sym.SDYNIMPORT {
2312                         continue
2313                 }
2314                 su := l.MakeSymbolUpdater(s)
2315                 su.SetType(sym.SDYNIMPORT)
2316                 l.SetSymElfType(s, elf.ST_TYPE(elfsym.Info))
2317                 su.SetSize(int64(elfsym.Size))
2318                 if elfsym.Section != elf.SHN_UNDEF {
2319                         // Set .File for the library that actually defines the symbol.
2320                         l.SetSymPkg(s, libpath)
2321
2322                         // The decodetype_* functions in decodetype.go need access to
2323                         // the type data.
2324                         sname := l.SymName(s)
2325                         if strings.HasPrefix(sname, "type.") && !strings.HasPrefix(sname, "type..") {
2326                                 su.SetData(readelfsymboldata(ctxt, f, &elfsym))
2327                         }
2328                 }
2329
2330                 if symname != elfsym.Name {
2331                         l.SetSymExtname(s, elfsym.Name)
2332                 }
2333         }
2334         ctxt.Shlibs = append(ctxt.Shlibs, Shlib{Path: libpath, Hash: hash, Deps: deps, File: f})
2335 }
2336
2337 func addsection(ldr *loader.Loader, arch *sys.Arch, seg *sym.Segment, name string, rwx int) *sym.Section {
2338         sect := ldr.NewSection()
2339         sect.Rwx = uint8(rwx)
2340         sect.Name = name
2341         sect.Seg = seg
2342         sect.Align = int32(arch.PtrSize) // everything is at least pointer-aligned
2343         seg.Sections = append(seg.Sections, sect)
2344         return sect
2345 }
2346
2347 type chain struct {
2348         sym   loader.Sym
2349         up    *chain
2350         limit int // limit on entry to sym
2351 }
2352
2353 func haslinkregister(ctxt *Link) bool {
2354         return ctxt.FixedFrameSize() != 0
2355 }
2356
2357 func callsize(ctxt *Link) int {
2358         if haslinkregister(ctxt) {
2359                 return 0
2360         }
2361         return ctxt.Arch.RegSize
2362 }
2363
2364 type stkChk struct {
2365         ldr       *loader.Loader
2366         ctxt      *Link
2367         morestack loader.Sym
2368         done      loader.Bitmap
2369 }
2370
2371 // Walk the call tree and check that there is always enough stack space
2372 // for the call frames, especially for a chain of nosplit functions.
2373 func (ctxt *Link) dostkcheck() {
2374         ldr := ctxt.loader
2375         sc := stkChk{
2376                 ldr:       ldr,
2377                 ctxt:      ctxt,
2378                 morestack: ldr.Lookup("runtime.morestack", 0),
2379                 done:      loader.MakeBitmap(ldr.NSym()),
2380         }
2381
2382         // Every splitting function ensures that there are at least StackLimit
2383         // bytes available below SP when the splitting prologue finishes.
2384         // If the splitting function calls F, then F begins execution with
2385         // at least StackLimit - callsize() bytes available.
2386         // Check that every function behaves correctly with this amount
2387         // of stack, following direct calls in order to piece together chains
2388         // of non-splitting functions.
2389         var ch chain
2390         ch.limit = objabi.StackLimit - callsize(ctxt)
2391         if buildcfg.GOARCH == "arm64" {
2392                 // need extra 8 bytes below SP to save FP
2393                 ch.limit -= 8
2394         }
2395
2396         // Check every function, but do the nosplit functions in a first pass,
2397         // to make the printed failure chains as short as possible.
2398         for _, s := range ctxt.Textp {
2399                 if ldr.IsNoSplit(s) {
2400                         ch.sym = s
2401                         sc.check(&ch, 0)
2402                 }
2403         }
2404
2405         for _, s := range ctxt.Textp {
2406                 if !ldr.IsNoSplit(s) {
2407                         ch.sym = s
2408                         sc.check(&ch, 0)
2409                 }
2410         }
2411 }
2412
2413 func (sc *stkChk) check(up *chain, depth int) int {
2414         limit := up.limit
2415         s := up.sym
2416         ldr := sc.ldr
2417         ctxt := sc.ctxt
2418
2419         // Don't duplicate work: only need to consider each
2420         // function at top of safe zone once.
2421         top := limit == objabi.StackLimit-callsize(ctxt)
2422         if top {
2423                 if sc.done.Has(s) {
2424                         return 0
2425                 }
2426                 sc.done.Set(s)
2427         }
2428
2429         if depth > 500 {
2430                 sc.ctxt.Errorf(s, "nosplit stack check too deep")
2431                 sc.broke(up, 0)
2432                 return -1
2433         }
2434
2435         if ldr.AttrExternal(s) {
2436                 // external function.
2437                 // should never be called directly.
2438                 // onlyctxt.Diagnose the direct caller.
2439                 // TODO(mwhudson): actually think about this.
2440                 // TODO(khr): disabled for now. Calls to external functions can only happen on the g0 stack.
2441                 // See the trampolines in src/runtime/sys_darwin_$ARCH.go.
2442                 //if depth == 1 && ldr.SymType(s) != sym.SXREF && !ctxt.DynlinkingGo() &&
2443                 //      ctxt.BuildMode != BuildModeCArchive && ctxt.BuildMode != BuildModePIE && ctxt.BuildMode != BuildModeCShared && ctxt.BuildMode != BuildModePlugin {
2444                 //      Errorf(s, "call to external function")
2445                 //}
2446                 return -1
2447         }
2448         info := ldr.FuncInfo(s)
2449         if !info.Valid() { // external function. see above.
2450                 return -1
2451         }
2452
2453         if limit < 0 {
2454                 sc.broke(up, limit)
2455                 return -1
2456         }
2457
2458         // morestack looks like it calls functions,
2459         // but it switches the stack pointer first.
2460         if s == sc.morestack {
2461                 return 0
2462         }
2463
2464         var ch chain
2465         ch.up = up
2466
2467         if !ldr.IsNoSplit(s) {
2468                 // Ensure we have enough stack to call morestack.
2469                 ch.limit = limit - callsize(ctxt)
2470                 ch.sym = sc.morestack
2471                 if sc.check(&ch, depth+1) < 0 {
2472                         return -1
2473                 }
2474                 if !top {
2475                         return 0
2476                 }
2477                 // Raise limit to allow frame.
2478                 locals := info.Locals()
2479                 limit = objabi.StackLimit + int(locals) + int(ctxt.FixedFrameSize())
2480         }
2481
2482         // Walk through sp adjustments in function, consuming relocs.
2483         relocs := ldr.Relocs(s)
2484         var ch1 chain
2485         pcsp := obj.NewPCIter(uint32(ctxt.Arch.MinLC))
2486         ri := 0
2487         for pcsp.Init(ldr.Data(ldr.Pcsp(s))); !pcsp.Done; pcsp.Next() {
2488                 // pcsp.value is in effect for [pcsp.pc, pcsp.nextpc).
2489
2490                 // Check stack size in effect for this span.
2491                 if int32(limit)-pcsp.Value < 0 {
2492                         sc.broke(up, int(int32(limit)-pcsp.Value))
2493                         return -1
2494                 }
2495
2496                 // Process calls in this span.
2497                 for ; ri < relocs.Count(); ri++ {
2498                         r := relocs.At(ri)
2499                         if uint32(r.Off()) >= pcsp.NextPC {
2500                                 break
2501                         }
2502                         t := r.Type()
2503                         switch {
2504                         case t.IsDirectCall():
2505                                 ch.limit = int(int32(limit) - pcsp.Value - int32(callsize(ctxt)))
2506                                 ch.sym = r.Sym()
2507                                 if sc.check(&ch, depth+1) < 0 {
2508                                         return -1
2509                                 }
2510
2511                         // Indirect call. Assume it is a call to a splitting function,
2512                         // so we have to make sure it can call morestack.
2513                         // Arrange the data structures to report both calls, so that
2514                         // if there is an error, stkprint shows all the steps involved.
2515                         case t == objabi.R_CALLIND:
2516                                 ch.limit = int(int32(limit) - pcsp.Value - int32(callsize(ctxt)))
2517                                 ch.sym = 0
2518                                 ch1.limit = ch.limit - callsize(ctxt) // for morestack in called prologue
2519                                 ch1.up = &ch
2520                                 ch1.sym = sc.morestack
2521                                 if sc.check(&ch1, depth+2) < 0 {
2522                                         return -1
2523                                 }
2524                         }
2525                 }
2526         }
2527
2528         return 0
2529 }
2530
2531 func (sc *stkChk) broke(ch *chain, limit int) {
2532         sc.ctxt.Errorf(ch.sym, "nosplit stack overflow")
2533         sc.print(ch, limit)
2534 }
2535
2536 func (sc *stkChk) print(ch *chain, limit int) {
2537         ldr := sc.ldr
2538         ctxt := sc.ctxt
2539         var name string
2540         if ch.sym != 0 {
2541                 name = fmt.Sprintf("%s<%d>", ldr.SymName(ch.sym), ldr.SymVersion(ch.sym))
2542                 if ldr.IsNoSplit(ch.sym) {
2543                         name += " (nosplit)"
2544                 }
2545         } else {
2546                 name = "function pointer"
2547         }
2548
2549         if ch.up == nil {
2550                 // top of chain. ch.sym != 0.
2551                 if ldr.IsNoSplit(ch.sym) {
2552                         fmt.Printf("\t%d\tassumed on entry to %s\n", ch.limit, name)
2553                 } else {
2554                         fmt.Printf("\t%d\tguaranteed after split check in %s\n", ch.limit, name)
2555                 }
2556         } else {
2557                 sc.print(ch.up, ch.limit+callsize(ctxt))
2558                 if !haslinkregister(ctxt) {
2559                         fmt.Printf("\t%d\ton entry to %s\n", ch.limit, name)
2560                 }
2561         }
2562
2563         if ch.limit != limit {
2564                 fmt.Printf("\t%d\tafter %s uses %d\n", limit, name, ch.limit-limit)
2565         }
2566 }
2567
2568 func usage() {
2569         fmt.Fprintf(os.Stderr, "usage: link [options] main.o\n")
2570         objabi.Flagprint(os.Stderr)
2571         Exit(2)
2572 }
2573
2574 type SymbolType int8 // TODO: after genasmsym is gone, maybe rename to plan9typeChar or something
2575
2576 const (
2577         // see also https://9p.io/magic/man2html/1/nm
2578         TextSym      SymbolType = 'T'
2579         DataSym      SymbolType = 'D'
2580         BSSSym       SymbolType = 'B'
2581         UndefinedSym SymbolType = 'U'
2582         TLSSym       SymbolType = 't'
2583         FrameSym     SymbolType = 'm'
2584         ParamSym     SymbolType = 'p'
2585         AutoSym      SymbolType = 'a'
2586
2587         // Deleted auto (not a real sym, just placeholder for type)
2588         DeletedAutoSym = 'x'
2589 )
2590
2591 // defineInternal defines a symbol used internally by the go runtime.
2592 func (ctxt *Link) defineInternal(p string, t sym.SymKind) loader.Sym {
2593         s := ctxt.loader.CreateSymForUpdate(p, 0)
2594         s.SetType(t)
2595         s.SetSpecial(true)
2596         s.SetLocal(true)
2597         return s.Sym()
2598 }
2599
2600 func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) loader.Sym {
2601         s := ctxt.defineInternal(p, t)
2602         ctxt.loader.SetSymValue(s, v)
2603         return s
2604 }
2605
2606 func datoff(ldr *loader.Loader, s loader.Sym, addr int64) int64 {
2607         if uint64(addr) >= Segdata.Vaddr {
2608                 return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff)
2609         }
2610         if uint64(addr) >= Segtext.Vaddr {
2611                 return int64(uint64(addr) - Segtext.Vaddr + Segtext.Fileoff)
2612         }
2613         ldr.Errorf(s, "invalid datoff %#x", addr)
2614         return 0
2615 }
2616
2617 func Entryvalue(ctxt *Link) int64 {
2618         a := *flagEntrySymbol
2619         if a[0] >= '0' && a[0] <= '9' {
2620                 return atolwhex(a)
2621         }
2622         ldr := ctxt.loader
2623         s := ldr.Lookup(a, 0)
2624         st := ldr.SymType(s)
2625         if st == 0 {
2626                 return *FlagTextAddr
2627         }
2628         if !ctxt.IsAIX() && st != sym.STEXT {
2629                 ldr.Errorf(s, "entry not text")
2630         }
2631         return ldr.SymValue(s)
2632 }
2633
2634 func (ctxt *Link) callgraph() {
2635         if !*FlagC {
2636                 return
2637         }
2638
2639         ldr := ctxt.loader
2640         for _, s := range ctxt.Textp {
2641                 relocs := ldr.Relocs(s)
2642                 for i := 0; i < relocs.Count(); i++ {
2643                         r := relocs.At(i)
2644                         rs := r.Sym()
2645                         if rs == 0 {
2646                                 continue
2647                         }
2648                         if r.Type().IsDirectCall() && ldr.SymType(rs) == sym.STEXT {
2649                                 ctxt.Logf("%s calls %s\n", ldr.SymName(s), ldr.SymName(rs))
2650                         }
2651                 }
2652         }
2653 }
2654
2655 func Rnd(v int64, r int64) int64 {
2656         if r <= 0 {
2657                 return v
2658         }
2659         v += r - 1
2660         c := v % r
2661         if c < 0 {
2662                 c += r
2663         }
2664         v -= c
2665         return v
2666 }
2667
2668 func bgetc(r *bio.Reader) int {
2669         c, err := r.ReadByte()
2670         if err != nil {
2671                 if err != io.EOF {
2672                         log.Fatalf("reading input: %v", err)
2673                 }
2674                 return -1
2675         }
2676         return int(c)
2677 }
2678
2679 type markKind uint8 // for postorder traversal
2680 const (
2681         _ markKind = iota
2682         visiting
2683         visited
2684 )
2685
2686 func postorder(libs []*sym.Library) []*sym.Library {
2687         order := make([]*sym.Library, 0, len(libs)) // hold the result
2688         mark := make(map[*sym.Library]markKind, len(libs))
2689         for _, lib := range libs {
2690                 dfs(lib, mark, &order)
2691         }
2692         return order
2693 }
2694
2695 func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library) {
2696         if mark[lib] == visited {
2697                 return
2698         }
2699         if mark[lib] == visiting {
2700                 panic("found import cycle while visiting " + lib.Pkg)
2701         }
2702         mark[lib] = visiting
2703         for _, i := range lib.Imports {
2704                 dfs(i, mark, order)
2705         }
2706         mark[lib] = visited
2707         *order = append(*order, lib)
2708 }
2709
2710 func ElfSymForReloc(ctxt *Link, s loader.Sym) int32 {
2711         // If putelfsym created a local version of this symbol, use that in all
2712         // relocations.
2713         les := ctxt.loader.SymLocalElfSym(s)
2714         if les != 0 {
2715                 return les
2716         } else {
2717                 return ctxt.loader.SymElfSym(s)
2718         }
2719 }
2720
2721 func AddGotSym(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, elfRelocTyp uint32) {
2722         if ldr.SymGot(s) >= 0 {
2723                 return
2724         }
2725
2726         Adddynsym(ldr, target, syms, s)
2727         got := ldr.MakeSymbolUpdater(syms.GOT)
2728         ldr.SetGot(s, int32(got.Size()))
2729         got.AddUint(target.Arch, 0)
2730
2731         if target.IsElf() {
2732                 if target.Arch.PtrSize == 8 {
2733                         rela := ldr.MakeSymbolUpdater(syms.Rela)
2734                         rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
2735                         rela.AddUint64(target.Arch, elf.R_INFO(uint32(ldr.SymDynid(s)), elfRelocTyp))
2736                         rela.AddUint64(target.Arch, 0)
2737                 } else {
2738                         rel := ldr.MakeSymbolUpdater(syms.Rel)
2739                         rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
2740                         rel.AddUint32(target.Arch, elf.R_INFO32(uint32(ldr.SymDynid(s)), elfRelocTyp))
2741                 }
2742         } else if target.IsDarwin() {
2743                 leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT)
2744                 leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s)))
2745                 if target.IsPIE() && target.IsInternal() {
2746                         // Mach-O relocations are a royal pain to lay out.
2747                         // They use a compact stateful bytecode representation.
2748                         // Here we record what are needed and encode them later.
2749                         MachoAddBind(int64(ldr.SymGot(s)), s)
2750                 }
2751         } else {
2752                 ldr.Errorf(s, "addgotsym: unsupported binary format")
2753         }
2754 }