diff --git a/src/cmd/link/internal/ld/data_test.go b/src/cmd/link/internal/ld/data_test.go index f91493bc417..2c22cfeb014 100644 --- a/src/cmd/link/internal/ld/data_test.go +++ b/src/cmd/link/internal/ld/data_test.go @@ -14,10 +14,9 @@ import ( func setUpContext(arch *sys.Arch, iself bool, ht objabi.HeadType, bm, lm string) *Link { ctxt := linknew(arch) - edummy := func(str string, off int) {} ctxt.HeadType = ht er := loader.ErrorReporter{} - ctxt.loader = loader.NewLoader(0, edummy, &er) + ctxt.loader = loader.NewLoader(0, &er) ctxt.BuildMode.Set(bm) ctxt.LinkMode.Set(lm) ctxt.IsELF = iself diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 4eb0baf63c1..d060dda54d8 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -2147,21 +2147,20 @@ func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit) []loader.Sym { return syms } -/* - * Elf. - */ -func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) { +// Add DWARF section names to the section header string table, by calling add +// on each name. ELF only. +func dwarfaddshstrings(ctxt *Link, add func(string)) { if *FlagW { // disable dwarf return } secs := []string{"abbrev", "frame", "info", "loc", "line", "gdb_scripts", "ranges"} for _, sec := range secs { - shstrtab.Addstring(".debug_" + sec) + add(".debug_" + sec) if ctxt.IsExternal() { - shstrtab.Addstring(elfRelType + ".debug_" + sec) + add(elfRelType + ".debug_" + sec) } else { - shstrtab.Addstring(".zdebug_" + sec) + add(".zdebug_" + sec) } } } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index cc387da68b1..713f7739a5b 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1390,83 +1390,88 @@ func (ctxt *Link) doelf() { shstrtab.SetType(sym.SELFROSECT) - shstrtab.Addstring("") - shstrtab.Addstring(".text") - shstrtab.Addstring(".noptrdata") - shstrtab.Addstring(".data") - shstrtab.Addstring(".bss") - shstrtab.Addstring(".noptrbss") - shstrtab.Addstring(".go.fuzzcntrs") - shstrtab.Addstring(".go.buildinfo") + shstrtabAddstring := func(s string) { + off := shstrtab.Addstring(s) + elfsetstring(ctxt, 0, s, int(off)) + } + + shstrtabAddstring("") + shstrtabAddstring(".text") + shstrtabAddstring(".noptrdata") + shstrtabAddstring(".data") + shstrtabAddstring(".bss") + shstrtabAddstring(".noptrbss") + shstrtabAddstring(".go.fuzzcntrs") + shstrtabAddstring(".go.buildinfo") if ctxt.IsMIPS() { - shstrtab.Addstring(".MIPS.abiflags") - shstrtab.Addstring(".gnu.attributes") + shstrtabAddstring(".MIPS.abiflags") + shstrtabAddstring(".gnu.attributes") } // generate .tbss section for dynamic internal linker or external // linking, so that various binutils could correctly calculate // PT_TLS size. See https://golang.org/issue/5200. if !*FlagD || ctxt.IsExternal() { - shstrtab.Addstring(".tbss") + shstrtabAddstring(".tbss") } if ctxt.IsNetbsd() { - shstrtab.Addstring(".note.netbsd.ident") + shstrtabAddstring(".note.netbsd.ident") if *flagRace { - shstrtab.Addstring(".note.netbsd.pax") + shstrtabAddstring(".note.netbsd.pax") } } if ctxt.IsOpenbsd() { - shstrtab.Addstring(".note.openbsd.ident") + shstrtabAddstring(".note.openbsd.ident") } if ctxt.IsFreebsd() { - shstrtab.Addstring(".note.tag") + shstrtabAddstring(".note.tag") } if len(buildinfo) > 0 { - shstrtab.Addstring(".note.gnu.build-id") + shstrtabAddstring(".note.gnu.build-id") } if *flagBuildid != "" { - shstrtab.Addstring(".note.go.buildid") + shstrtabAddstring(".note.go.buildid") } - shstrtab.Addstring(".elfdata") - shstrtab.Addstring(".rodata") + shstrtabAddstring(".elfdata") + shstrtabAddstring(".rodata") // See the comment about data.rel.ro.FOO section names in data.go. relro_prefix := "" if ctxt.UseRelro() { - shstrtab.Addstring(".data.rel.ro") + shstrtabAddstring(".data.rel.ro") relro_prefix = ".data.rel.ro" } - shstrtab.Addstring(relro_prefix + ".typelink") - shstrtab.Addstring(relro_prefix + ".itablink") - shstrtab.Addstring(relro_prefix + ".gosymtab") - shstrtab.Addstring(relro_prefix + ".gopclntab") + shstrtabAddstring(relro_prefix + ".typelink") + shstrtabAddstring(relro_prefix + ".itablink") + shstrtabAddstring(relro_prefix + ".gosymtab") + shstrtabAddstring(relro_prefix + ".gopclntab") if ctxt.IsExternal() { *FlagD = true - shstrtab.Addstring(elfRelType + ".text") - shstrtab.Addstring(elfRelType + ".rodata") - shstrtab.Addstring(elfRelType + relro_prefix + ".typelink") - shstrtab.Addstring(elfRelType + relro_prefix + ".itablink") - shstrtab.Addstring(elfRelType + relro_prefix + ".gosymtab") - shstrtab.Addstring(elfRelType + relro_prefix + ".gopclntab") - shstrtab.Addstring(elfRelType + ".noptrdata") - shstrtab.Addstring(elfRelType + ".data") + shstrtabAddstring(elfRelType + ".text") + shstrtabAddstring(elfRelType + ".rodata") + shstrtabAddstring(elfRelType + relro_prefix + ".typelink") + shstrtabAddstring(elfRelType + relro_prefix + ".itablink") + shstrtabAddstring(elfRelType + relro_prefix + ".gosymtab") + shstrtabAddstring(elfRelType + relro_prefix + ".gopclntab") + shstrtabAddstring(elfRelType + ".noptrdata") + shstrtabAddstring(elfRelType + ".data") if ctxt.UseRelro() { - shstrtab.Addstring(elfRelType + ".data.rel.ro") + shstrtabAddstring(elfRelType + ".data.rel.ro") } - shstrtab.Addstring(elfRelType + ".go.buildinfo") + shstrtabAddstring(elfRelType + ".go.buildinfo") if ctxt.IsMIPS() { - shstrtab.Addstring(elfRelType + ".MIPS.abiflags") - shstrtab.Addstring(elfRelType + ".gnu.attributes") + shstrtabAddstring(elfRelType + ".MIPS.abiflags") + shstrtabAddstring(elfRelType + ".gnu.attributes") } // add a .note.GNU-stack section to mark the stack as non-executable - shstrtab.Addstring(".note.GNU-stack") + shstrtabAddstring(".note.GNU-stack") if ctxt.IsShared() { - shstrtab.Addstring(".note.go.abihash") - shstrtab.Addstring(".note.go.pkg-list") - shstrtab.Addstring(".note.go.deps") + shstrtabAddstring(".note.go.abihash") + shstrtabAddstring(".note.go.pkg-list") + shstrtabAddstring(".note.go.deps") } } @@ -1479,35 +1484,35 @@ func (ctxt *Link) doelf() { } if hasinitarr { - shstrtab.Addstring(".init_array") - shstrtab.Addstring(elfRelType + ".init_array") + shstrtabAddstring(".init_array") + shstrtabAddstring(elfRelType + ".init_array") } if !*FlagS { - shstrtab.Addstring(".symtab") - shstrtab.Addstring(".strtab") - dwarfaddshstrings(ctxt, shstrtab) + shstrtabAddstring(".symtab") + shstrtabAddstring(".strtab") + dwarfaddshstrings(ctxt, shstrtabAddstring) } - shstrtab.Addstring(".shstrtab") + shstrtabAddstring(".shstrtab") if !*FlagD { /* -d suppresses dynamic loader format */ - shstrtab.Addstring(".interp") - shstrtab.Addstring(".hash") - shstrtab.Addstring(".got") + shstrtabAddstring(".interp") + shstrtabAddstring(".hash") + shstrtabAddstring(".got") if ctxt.IsPPC64() { - shstrtab.Addstring(".glink") + shstrtabAddstring(".glink") } - shstrtab.Addstring(".got.plt") - shstrtab.Addstring(".dynamic") - shstrtab.Addstring(".dynsym") - shstrtab.Addstring(".dynstr") - shstrtab.Addstring(elfRelType) - shstrtab.Addstring(elfRelType + ".plt") + shstrtabAddstring(".got.plt") + shstrtabAddstring(".dynamic") + shstrtabAddstring(".dynsym") + shstrtabAddstring(".dynstr") + shstrtabAddstring(elfRelType) + shstrtabAddstring(elfRelType + ".plt") - shstrtab.Addstring(".plt") - shstrtab.Addstring(".gnu.version") - shstrtab.Addstring(".gnu.version_r") + shstrtabAddstring(".plt") + shstrtabAddstring(".gnu.version") + shstrtabAddstring(".gnu.version_r") /* dynamic symbol table - first entry all zeros */ dynsym := ldr.CreateSymForUpdate(".dynsym", 0) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 03b13da37a5..0febb3081f7 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -528,8 +528,7 @@ func (ctxt *Link) loadlib() { default: log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) } - elfsetstring1 := func(str string, off int) { elfsetstring(ctxt, 0, str, off) } - ctxt.loader = loader.NewLoader(flags, elfsetstring1, &ctxt.ErrorReporter.ErrorReporter) + ctxt.loader = loader.NewLoader(flags, &ctxt.ErrorReporter.ErrorReporter) ctxt.ErrorReporter.SymName = func(s loader.Sym) string { return ctxt.loader.SymName(s) } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index fa74dcede42..f4b075b0770 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -261,8 +261,6 @@ type Loader struct { strictDupMsgs int // number of strict-dup warning/errors, when FlagStrictDups is enabled - elfsetstring elfsetstringFunc - errorReporter *ErrorReporter npkgsyms int // number of package symbols, for accounting @@ -284,8 +282,6 @@ const ( goObjStart ) -type elfsetstringFunc func(str string, off int) - // extSymPayload holds the payload (data + relocations) for linker-synthesized // external symbols (note that symbol value is stored in a separate slice). type extSymPayload struct { @@ -304,7 +300,7 @@ const ( FlagStrictDups = 1 << iota ) -func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorReporter) *Loader { +func NewLoader(flags uint32, reporter *ErrorReporter) *Loader { nbuiltin := goobj.NBuiltin() extReader := &oReader{objidx: extObj} ldr := &Loader{ @@ -333,7 +329,6 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor extStaticSyms: make(map[nameVer]Sym), builtinSyms: make([]Sym, nbuiltin), flags: flags, - elfsetstring: elfsetstring, errorReporter: reporter, sects: []*sym.Section{nil}, // reserve index 0 for nil section } diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 8ee4be033b7..32ff2586ceb 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -26,9 +26,8 @@ func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { } func mkLoader() *Loader { - edummy := func(str string, off int) {} er := ErrorReporter{} - ldr := NewLoader(0, edummy, &er) + ldr := NewLoader(0, &er) er.ldr = ldr return ldr } diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 1744df2784e..5a3e88b90eb 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -332,10 +332,6 @@ func (sb *SymbolBuilder) Addstring(str string) int64 { sb.kind = sym.SNOPTRDATA } r := sb.size - if sb.name == ".shstrtab" { - // FIXME: find a better mechanism for this - sb.l.elfsetstring(str, int(r)) - } sb.data = append(sb.data, str...) sb.data = append(sb.data, 0) sb.size = int64(len(sb.data))