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")
}
}
}
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)