]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: replace Segment's linked list of Sections with a slice
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 18 Apr 2017 09:52:06 +0000 (21:52 +1200)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 18 Apr 2017 21:24:32 +0000 (21:24 +0000)
Just noticed this in passing.

Change-Id: I58fa828ef58598209ed4cbe4abc6f9f02ffc4844
Reviewed-on: https://go-review.googlesource.com/40896
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
15 files changed:
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/dwarf.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/macho.go
src/cmd/link/internal/ld/pe.go
src/cmd/link/internal/ld/symtab.go
src/cmd/link/internal/mips/asm.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/x86/asm.go

index 4084f19092b768f16714734165051565bfd883a2..af3d6e7b13e146c648a77820c13911ffd4ad6529 100644 (file)
@@ -659,11 +659,11 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        // 0xCC is INT $3 - breakpoint instruction
        ld.CodeblkPad(ctxt, int64(sect.Vaddr), int64(sect.Length), []byte{0xCC})
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }
index ee57df11b34e204f2daa98fbd0e922a703a2fbec..53811c02fd48e980c5f61ce44ab959dcfdd727cb 100644 (file)
@@ -755,10 +755,10 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }
index 118a575c2c8ad974af8007c7e07ad39a43ce8bd6..d7576b1686b0bf6b0633acceb3b720ae60ab9106 100644 (file)
@@ -400,10 +400,10 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }
index 099a5361ac4921c485f814c66cf16e06cbc2ef06..9198cfef310b0039b7685feec708560238ab1480 100644 (file)
@@ -605,7 +605,7 @@ func relocsym(ctxt *Link, s *Symbol) {
                        // to the start of the first text section, even if there are multiple.
 
                        if r.Sym.Sect.Name == ".text" {
-                               o = Symaddr(r.Sym) - int64(Segtext.Sect.Vaddr) + r.Add
+                               o = Symaddr(r.Sym) - int64(Segtext.Sections[0].Vaddr) + r.Add
                        } else {
                                o = Symaddr(r.Sym) - int64(r.Sym.Sect.Vaddr) + r.Add
                        }
@@ -1856,23 +1856,23 @@ func (ctxt *Link) dodata() {
        /* number the sections */
        n := int32(1)
 
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                sect.Extnum = int16(n)
                n++
        }
-       for sect := Segrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrodata.Sections {
                sect.Extnum = int16(n)
                n++
        }
-       for sect := Segrelrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrelrodata.Sections {
                sect.Extnum = int16(n)
                n++
        }
-       for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdata.Sections {
                sect.Extnum = int16(n)
                n++
        }
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                sect.Extnum = int16(n)
                n++
        }
@@ -2024,7 +2024,7 @@ func (ctxt *Link) textaddress() {
        // Assign PCs in text segment.
        // Could parallelize, by assigning to text
        // and then letting threads copy down, but probably not worth it.
-       sect := Segtext.Sect
+       sect := Segtext.Sections[0]
 
        sect.Align = int32(Funcalign)
 
@@ -2132,7 +2132,7 @@ func (ctxt *Link) address() {
        Segtext.Rwx = 05
        Segtext.Vaddr = va
        Segtext.Fileoff = uint64(HEADR)
-       for s := Segtext.Sect; s != nil; s = s.Next {
+       for _, s := range Segtext.Sections {
                va = uint64(Rnd(int64(va), int64(s.Align)))
                s.Vaddr = va
                va += s.Length
@@ -2144,7 +2144,7 @@ func (ctxt *Link) address() {
                va += 32 // room for the "halt sled"
        }
 
-       if Segrodata.Sect != nil {
+       if len(Segrodata.Sections) > 0 {
                // align to page boundary so as not to mix
                // rodata and executable text.
                //
@@ -2164,7 +2164,7 @@ func (ctxt *Link) address() {
                Segrodata.Vaddr = va
                Segrodata.Fileoff = va - Segtext.Vaddr + Segtext.Fileoff
                Segrodata.Filelen = 0
-               for s := Segrodata.Sect; s != nil; s = s.Next {
+               for _, s := range Segrodata.Sections {
                        va = uint64(Rnd(int64(va), int64(s.Align)))
                        s.Vaddr = va
                        va += s.Length
@@ -2173,7 +2173,7 @@ func (ctxt *Link) address() {
                Segrodata.Length = va - Segrodata.Vaddr
                Segrodata.Filelen = Segrodata.Length
        }
-       if Segrelrodata.Sect != nil {
+       if len(Segrelrodata.Sections) > 0 {
                // align to page boundary so as not to mix
                // rodata, rel-ro data, and executable text.
                va = uint64(Rnd(int64(va), int64(*FlagRound)))
@@ -2182,7 +2182,7 @@ func (ctxt *Link) address() {
                Segrelrodata.Vaddr = va
                Segrelrodata.Fileoff = va - Segrodata.Vaddr + Segrodata.Fileoff
                Segrelrodata.Filelen = 0
-               for s := Segrelrodata.Sect; s != nil; s = s.Next {
+               for _, s := range Segrelrodata.Sections {
                        va = uint64(Rnd(int64(va), int64(s.Align)))
                        s.Vaddr = va
                        va += s.Length
@@ -2208,13 +2208,13 @@ func (ctxt *Link) address() {
        var bss *Section
        var noptrbss *Section
        var vlen int64
-       for s := Segdata.Sect; s != nil; s = s.Next {
+       for i, s := range Segdata.Sections {
                if Iself && s.Name == ".tbss" {
                        continue
                }
                vlen = int64(s.Length)
-               if s.Next != nil && !(Iself && s.Next.Name == ".tbss") {
-                       vlen = int64(s.Next.Vaddr - s.Vaddr)
+               if i+1 < len(Segdata.Sections) && !(Iself && Segdata.Sections[i+1].Name == ".tbss") {
+                       vlen = int64(Segdata.Sections[i+1].Vaddr - s.Vaddr)
                }
                s.Vaddr = va
                va += uint64(vlen)
@@ -2243,10 +2243,10 @@ func (ctxt *Link) address() {
        if Headtype == obj.Hwindows {
                Segdwarf.Fileoff = Segdata.Fileoff + uint64(Rnd(int64(Segdata.Filelen), int64(PEFILEALIGN)))
        }
-       for s := Segdwarf.Sect; s != nil; s = s.Next {
+       for i, s := range Segdwarf.Sections {
                vlen = int64(s.Length)
-               if s.Next != nil {
-                       vlen = int64(s.Next.Vaddr - s.Vaddr)
+               if i+1 < len(Segdwarf.Sections) {
+                       vlen = int64(Segdwarf.Sections[i+1].Vaddr - s.Vaddr)
                }
                s.Vaddr = va
                va += uint64(vlen)
@@ -2259,7 +2259,7 @@ func (ctxt *Link) address() {
        Segdwarf.Filelen = va - Segdwarf.Vaddr
 
        var (
-               text     = Segtext.Sect
+               text     = Segtext.Sections[0]
                rodata   = ctxt.Syms.Lookup("runtime.rodata", 0).Sect
                itablink = ctxt.Syms.Lookup("runtime.itablink", 0).Sect
                symtab   = ctxt.Syms.Lookup("runtime.symtab", 0).Sect
@@ -2268,8 +2268,10 @@ func (ctxt *Link) address() {
        )
        lasttext := text
        // Could be multiple .text sections
-       for sect := text.Next; sect != nil && sect.Name == ".text"; sect = sect.Next {
-               lasttext = sect
+       for _, sect := range Segtext.Sections {
+               if sect.Name == ".text" {
+                       lasttext = sect
+               }
        }
 
        for _, s := range datap {
@@ -2303,10 +2305,14 @@ func (ctxt *Link) address() {
        // If there are multiple text sections, create runtime.text.n for
        // their section Vaddr, using n for index
        n := 1
-       for sect := Segtext.Sect.Next; sect != nil && sect.Name == ".text"; sect = sect.Next {
-               symname := fmt.Sprintf("runtime.text.%d", n)
-               ctxt.xdefine(symname, obj.STEXT, int64(sect.Vaddr))
-               n++
+       for _, sect := range Segtext.Sections[1:] {
+               if sect.Name == ".text" {
+                       symname := fmt.Sprintf("runtime.text.%d", n)
+                       ctxt.xdefine(symname, obj.STEXT, int64(sect.Vaddr))
+                       n++
+               } else {
+                       break
+               }
        }
 
        ctxt.xdefine("runtime.rodata", obj.SRODATA, int64(rodata.Vaddr))
index 744e2153a35649879e23e3034abe9f60e9aede59..e42c8cfe56aa58b9ce6559a1b3490da1f28d4451 100644 (file)
@@ -1618,7 +1618,7 @@ func dwarfaddpeheaders(ctxt *Link) {
        if *FlagW { // disable dwarf
                return
        }
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                h := newPEDWARFSection(ctxt, sect.Name, int64(sect.Length))
                fileoff := sect.Vaddr - Segdwarf.Vaddr + Segdwarf.Fileoff
                if uint64(h.PointerToRawData) != fileoff {
index 978c166d4da28c6092d4ee2630e8d2d627d2d2f2..18514b90eda992193a68fd6f23a87117aff4b614 100644 (file)
@@ -1831,7 +1831,7 @@ func Elfemitreloc(ctxt *Link) {
                Cput(0)
        }
 
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                if sect.Name == ".text" {
                        elfrelocsect(ctxt, sect, ctxt.Textp)
                } else {
@@ -1839,16 +1839,16 @@ func Elfemitreloc(ctxt *Link) {
                }
        }
 
-       for sect := Segrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrodata.Sections {
                elfrelocsect(ctxt, sect, datap)
        }
-       for sect := Segrelrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrelrodata.Sections {
                elfrelocsect(ctxt, sect, datap)
        }
-       for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdata.Sections {
                elfrelocsect(ctxt, sect, datap)
        }
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                elfrelocsect(ctxt, sect, dwarfp)
        }
 }
@@ -2167,7 +2167,7 @@ func Asmbelfsetup() {
        /* This null SHdr must appear before all others */
        elfshname("")
 
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                // There could be multiple .text sections. Instead check the Elfsect
                // field to determine if already has an ElfShdr and if not, create one.
                if sect.Name == ".text" {
@@ -2178,16 +2178,16 @@ func Asmbelfsetup() {
                        elfshalloc(sect)
                }
        }
-       for sect := Segrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrodata.Sections {
                elfshalloc(sect)
        }
-       for sect := Segrelrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrelrodata.Sections {
                elfshalloc(sect)
        }
-       for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdata.Sections {
                elfshalloc(sect)
        }
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                elfshalloc(sect)
        }
 }
@@ -2216,7 +2216,7 @@ func Asmbelf(ctxt *Link, symo int64) {
        elfreserve := int64(ELFRESERVE)
 
        numtext := int64(0)
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                if sect.Name == ".text" {
                        numtext++
                }
@@ -2367,10 +2367,10 @@ func Asmbelf(ctxt *Link, symo int64) {
        // Additions to the reserved area must be above this line.
 
        elfphload(&Segtext)
-       if Segrodata.Sect != nil {
+       if len(Segrodata.Sections) > 0 {
                elfphload(&Segrodata)
        }
-       if Segrelrodata.Sect != nil {
+       if len(Segrelrodata.Sections) > 0 {
                elfphload(&Segrelrodata)
                elfphrelro(&Segrelrodata)
        }
@@ -2523,7 +2523,7 @@ func Asmbelf(ctxt *Link, symo int64) {
                 * Thread-local storage segment (really just size).
                 */
                tlssize := uint64(0)
-               for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segdata.Sections {
                        if sect.Name == ".tbss" {
                                tlssize = sect.Length
                        }
@@ -2566,33 +2566,33 @@ elfobj:
                elfshname(".strtab")
        }
 
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                elfshbits(sect)
        }
-       for sect := Segrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrodata.Sections {
                elfshbits(sect)
        }
-       for sect := Segrelrodata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segrelrodata.Sections {
                elfshbits(sect)
        }
-       for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdata.Sections {
                elfshbits(sect)
        }
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                elfshbits(sect)
        }
 
        if Linkmode == LinkExternal {
-               for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segtext.Sections {
                        elfshreloc(sect)
                }
-               for sect := Segrodata.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segrodata.Sections {
                        elfshreloc(sect)
                }
-               for sect := Segrelrodata.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segrelrodata.Sections {
                        elfshreloc(sect)
                }
-               for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segdata.Sections {
                        elfshreloc(sect)
                }
                for _, s := range dwarfp {
index 383e16e4f2a8d85a20506ddc00c25de33f0f7081..814a403d42704abc6a1c43e16feccfad6c49eedc 100644 (file)
@@ -141,12 +141,12 @@ const (
 )
 
 type Segment struct {
-       Rwx     uint8  // permission as usual unix bits (5 = r-x etc)
-       Vaddr   uint64 // virtual address
-       Length  uint64 // length in memory
-       Fileoff uint64 // file offset
-       Filelen uint64 // length on disk
-       Sect    *Section
+       Rwx      uint8  // permission as usual unix bits (5 = r-x etc)
+       Vaddr    uint64 // virtual address
+       Length   uint64 // length in memory
+       Fileoff  uint64 // file offset
+       Filelen  uint64 // length on disk
+       Sections []*Section
 }
 
 type Section struct {
@@ -156,7 +156,6 @@ type Section struct {
        Name    string
        Vaddr   uint64
        Length  uint64
-       Next    *Section
        Seg     *Segment
        Elfsect *ElfShdr
        Reloff  uint64
@@ -1603,16 +1602,12 @@ func pathtoprefix(s string) string {
 }
 
 func addsection(seg *Segment, name string, rwx int) *Section {
-       var l **Section
-
-       for l = &seg.Sect; *l != nil; l = &(*l).Next {
-       }
        sect := new(Section)
        sect.Rwx = uint8(rwx)
        sect.Name = name
        sect.Seg = seg
        sect.Align = int32(SysArch.PtrSize) // everything is at least pointer-aligned
-       *l = sect
+       seg.Sections = append(seg.Sections, sect)
        return sect
 }
 
@@ -1913,7 +1908,7 @@ func genasmsym(ctxt *Link, put func(*Link, *Symbol, string, SymbolType, int64, *
        n := 0
 
        // Generate base addresses for all text sections if there are multiple
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                if n == 0 {
                        n++
                        continue
index 1ab61b7d1597d81093ddcb67ebcfeb7c3dde377a..9234be1aefd4f6f3374df3d458e12b61bab8249c 100644 (file)
@@ -472,7 +472,7 @@ func Asmbmacho(ctxt *Link) {
                ms.prot2 = 5
        }
 
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                machoshbits(ctxt, ms, sect, "__TEXT")
        }
 
@@ -488,7 +488,7 @@ func Asmbmacho(ctxt *Link) {
                ms.prot2 = 3
        }
 
-       for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdata.Sections {
                machoshbits(ctxt, ms, sect, "__DATA")
        }
 
@@ -501,7 +501,7 @@ func Asmbmacho(ctxt *Link) {
                        ms.fileoffset = Segdwarf.Fileoff
                        ms.filesize = Segdwarf.Filelen
                }
-               for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segdwarf.Sections {
                        machoshbits(ctxt, ms, sect, "__DWARF")
                }
        }
@@ -892,14 +892,14 @@ func Machoemitreloc(ctxt *Link) {
                Cput(0)
        }
 
-       machorelocsect(ctxt, Segtext.Sect, ctxt.Textp)
-       for sect := Segtext.Sect.Next; sect != nil; sect = sect.Next {
+       machorelocsect(ctxt, Segtext.Sections[0], ctxt.Textp)
+       for _, sect := range Segtext.Sections[1:] {
                machorelocsect(ctxt, sect, datap)
        }
-       for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdata.Sections {
                machorelocsect(ctxt, sect, datap)
        }
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                machorelocsect(ctxt, sect, dwarfp)
        }
 }
index a9d14c390fad129907b43082f5b0a8fa23d59cbb..17683efcffbe7172d10e6192fa31cae373bade7c 100644 (file)
@@ -887,8 +887,8 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) {
        }
 
        peemitsectreloc(text, func() int {
-               n := perelocsect(ctxt, Segtext.Sect, ctxt.Textp, Segtext.Vaddr)
-               for sect := Segtext.Sect.Next; sect != nil; sect = sect.Next {
+               n := perelocsect(ctxt, Segtext.Sections[0], ctxt.Textp, Segtext.Vaddr)
+               for _, sect := range Segtext.Sections[1:] {
                        n += perelocsect(ctxt, sect, datap, Segtext.Vaddr)
                }
                return n
@@ -896,14 +896,14 @@ func peemitreloc(ctxt *Link, text, data, ctors *IMAGE_SECTION_HEADER) {
 
        peemitsectreloc(data, func() int {
                var n int
-               for sect := Segdata.Sect; sect != nil; sect = sect.Next {
+               for _, sect := range Segdata.Sections {
                        n += perelocsect(ctxt, sect, datap, Segdata.Vaddr)
                }
                return n
        })
 
 dwarfLoop:
-       for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segdwarf.Sections {
                for i, name := range shNames {
                        if sect.Name == name {
                                peemitsectreloc(&sh[i], func() int {
index 87de67bbdcbac87d9d3022e834dab2df32f433d6..e796fe08166a9b7584f56249361a7fda3c480d68 100644 (file)
@@ -311,7 +311,7 @@ func textsectionmap(ctxt *Link) uint32 {
        t.Attr |= AttrReachable
        nsections := int64(0)
 
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range Segtext.Sections {
                if sect.Name == ".text" {
                        nsections++
                } else {
@@ -332,8 +332,8 @@ func textsectionmap(ctxt *Link) uint32 {
        // order of creation starting with 1. These symbols provide the section's
        // address after relocation by the linker.
 
-       textbase := Segtext.Sect.Vaddr
-       for sect := Segtext.Sect; sect != nil; sect = sect.Next {
+       textbase := Segtext.Sections[0].Vaddr
+       for _, sect := range Segtext.Sections {
                if sect.Name != ".text" {
                        break
                }
index a591b06dfa02828770268f21c03af692732957f4..9b437908740edcd5ff06478edace34be84bc07ee 100644 (file)
@@ -185,10 +185,10 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }
index 1c3216f9bee71f8d08af4279370d44646f758eeb..0ddb4727feb0226cb7eed9bdb85f90a866e4bace 100644 (file)
@@ -192,10 +192,10 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }
index cf2c532f9e894ce32d6c8f02c05c82cacd235f87..f13d8300279cafc2b5aaf45db70a424e99dfc916 100644 (file)
@@ -880,7 +880,7 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       for sect := ld.Segtext.Sect; sect != nil; sect = sect.Next {
+       for _, sect := range ld.Segtext.Sections {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                // Handle additional text sections with Codeblk
                if sect.Name == ".text" {
index a9bb26145b9ce114903712217d6ad159485d2e13..2db9428d00bd764a04ae7761d9063a20a8d2178e 100644 (file)
@@ -512,10 +512,10 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }
index 1f4e08bc94fc71d419c4a74310492c2203d6857e..6ba00d72d56da595c8725ce8bc0e0567b4591d81 100644 (file)
@@ -637,11 +637,11 @@ func asmb(ctxt *ld.Link) {
                ld.Asmbelfsetup()
        }
 
-       sect := ld.Segtext.Sect
+       sect := ld.Segtext.Sections[0]
        ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
        // 0xCC is INT $3 - breakpoint instruction
        ld.CodeblkPad(ctxt, int64(sect.Vaddr), int64(sect.Length), []byte{0xCC})
-       for sect = sect.Next; sect != nil; sect = sect.Next {
+       for _, sect = range ld.Segtext.Sections[1:] {
                ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff))
                ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length))
        }