From f90bb8a38f2f1ed2109f8fa88fb90a5c2db1f3fe Mon Sep 17 00:00:00 2001 From: Cherry Mui Date: Thu, 4 May 2023 17:09:49 -0400 Subject: [PATCH] cmd/link: remove elfsetstring out of the loader Currently, we pass elfsetstring to the loader as a callback, for a special case of Addstring. This is only used for ELF when adding strings to the section header string table. Move the logic to the caller instead, so the loader would not have this special case. Change-Id: Icfb91f380fe4ba435985c3019681597932f58242 Reviewed-on: https://go-review.googlesource.com/c/go/+/492718 Run-TryBot: Cherry Mui TryBot-Result: Gopher Robot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data_test.go | 3 +- src/cmd/link/internal/ld/dwarf.go | 13 +- src/cmd/link/internal/ld/elf.go | 127 +++++++++--------- src/cmd/link/internal/ld/lib.go | 3 +- src/cmd/link/internal/loader/loader.go | 7 +- src/cmd/link/internal/loader/loader_test.go | 3 +- src/cmd/link/internal/loader/symbolbuilder.go | 4 - 7 files changed, 76 insertions(+), 84 deletions(-) diff --git a/src/cmd/link/internal/ld/data_test.go b/src/cmd/link/internal/ld/data_test.go index f91493bc41..2c22cfeb01 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 4eb0baf63c..d060dda54d 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 cc387da68b..713f7739a5 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") - } - shstrtab.Addstring(".got.plt") - shstrtab.Addstring(".dynamic") - shstrtab.Addstring(".dynsym") - shstrtab.Addstring(".dynstr") - shstrtab.Addstring(elfRelType) - shstrtab.Addstring(elfRelType + ".plt") - - shstrtab.Addstring(".plt") - shstrtab.Addstring(".gnu.version") - shstrtab.Addstring(".gnu.version_r") + shstrtabAddstring(".glink") + } + shstrtabAddstring(".got.plt") + shstrtabAddstring(".dynamic") + shstrtabAddstring(".dynsym") + shstrtabAddstring(".dynstr") + shstrtabAddstring(elfRelType) + shstrtabAddstring(elfRelType + ".plt") + + 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 03b13da37a..0febb3081f 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 fa74dcede4..f4b075b077 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 8ee4be033b..32ff2586ce 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 1744df2784..5a3e88b90e 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)) -- 2.50.0