cmd/link: use shdr as a slice rather than counting in elfhdr.Shnum

Change-Id: I293e50e3a6ab19fb927099e106095d6aa1241b9f
Reviewed-on: https://go-review.googlesource.com/c/go/+/718820
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
Ian Lance Taylor 2025-11-07 11:20:15 -08:00
parent 0ff323143d
commit b0c278be40

View file

@ -365,16 +365,16 @@ func elf32shdr(out *OutBuf, e *ElfShdr) {
func elfwriteshdrs(out *OutBuf) uint32 {
if elf64 {
for i := 0; i < int(ehdr.Shnum); i++ {
elf64shdr(out, shdr[i])
for _, sh := range shdr {
elf64shdr(out, sh)
}
return uint32(ehdr.Shnum) * ELF64SHDRSIZE
return uint32(len(shdr)) * ELF64SHDRSIZE
}
for i := 0; i < int(ehdr.Shnum); i++ {
elf32shdr(out, shdr[i])
for _, sh := range shdr {
elf32shdr(out, sh)
}
return uint32(ehdr.Shnum) * ELF32SHDRSIZE
return uint32(len(shdr)) * ELF32SHDRSIZE
}
// elfSortShdrs sorts the section headers so that allocated sections
@ -460,7 +460,6 @@ func newElfShdr(name int64) *ElfShdr {
e.Name = uint32(name)
e.shnum = -1 // make invalid for now, set by elfSortShdrs
shdr = append(shdr, e)
ehdr.Shnum++
return e
}
@ -1172,8 +1171,7 @@ func elfshname(name string) *ElfShdr {
continue
}
off := elfstr[i].off
for i = 0; i < int(ehdr.Shnum); i++ {
sh := shdr[i]
for _, sh := range shdr {
if sh.Name == uint32(off) {
return sh
}
@ -2380,6 +2378,11 @@ elfobj:
pph.Memsz = pph.Filesz
}
if len(shdr) >= 0xffff {
Errorf("too many ELF sections")
}
eh.Shnum = uint16(len(shdr))
ctxt.Out.SeekSet(0)
a := int64(0)
a += int64(elfwritehdr(ctxt.Out))