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