]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: use shdr as a slice rather than counting in elfhdr.Shnum
authorIan Lance Taylor <iant@golang.org>
Fri, 7 Nov 2025 19:20:15 +0000 (11:20 -0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 27 Nov 2025 04:00:38 +0000 (20:00 -0800)
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>
src/cmd/link/internal/ld/elf.go

index ba0c181daf5ac6bfc8c115dd440f69e5d7b3ef93..6bda9f0ef55bce6ec1352a5c6d026508cbbfaca3 100644 (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))