]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "cmd/link: separate virtual address layout from file layout"
authorAustin Clements <austin@google.com>
Wed, 13 Jun 2018 17:42:22 +0000 (17:42 +0000)
committerAustin Clements <austin@google.com>
Wed, 13 Jun 2018 17:55:32 +0000 (17:55 +0000)
This reverts commit bd83774593bca66cc899d5180c77680bc907fab8.

Reason for revert: This broke ELF layout on arm, arm64, mips*, mips64*, ppc64*, and s390x.

Change-Id: I56a27b76e6f4b22ce39a99790af9116f8687eee9
Reviewed-on: https://go-review.googlesource.com/118675
Reviewed-by: Heschi Kreinick <heschi@google.com>
Run-TryBot: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/main.go

index 184e8158fdc75658e3b4fd8759c0c8c91eb5b2ea..3e4773102d3704871bdd3d1573ae0881f3cac1de 100644 (file)
@@ -1903,15 +1903,12 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6
        return sect, n, va
 }
 
-// address assigns virtual addresses to all segments and sections and
-// returns all segments in file order.
-func (ctxt *Link) address() []*sym.Segment {
-       var order []*sym.Segment // Layout order
-
+// assign addresses
+func (ctxt *Link) address() {
        va := uint64(*FlagTextAddr)
-       order = append(order, &Segtext)
        Segtext.Rwx = 05
        Segtext.Vaddr = va
+       Segtext.Fileoff = uint64(HEADR)
        for _, s := range Segtext.Sections {
                va = uint64(Rnd(int64(va), int64(s.Align)))
                s.Vaddr = va
@@ -1919,6 +1916,7 @@ func (ctxt *Link) address() []*sym.Segment {
        }
 
        Segtext.Length = va - uint64(*FlagTextAddr)
+       Segtext.Filelen = Segtext.Length
        if ctxt.HeadType == objabi.Hnacl {
                va += 32 // room for the "halt sled"
        }
@@ -1939,9 +1937,13 @@ func (ctxt *Link) address() []*sym.Segment {
                // writable even for this short period.
                va = uint64(Rnd(int64(va), int64(*FlagRound)))
 
-               order = append(order, &Segrodata)
                Segrodata.Rwx = 04
                Segrodata.Vaddr = va
+               Segrodata.Fileoff = va - Segtext.Vaddr + Segtext.Fileoff
+               Segrodata.Filelen = 0
+               if ctxt.HeadType == objabi.Hwindows {
+                       Segrodata.Fileoff = Segtext.Fileoff + uint64(Rnd(int64(Segtext.Length), PEFILEALIGN))
+               }
                for _, s := range Segrodata.Sections {
                        va = uint64(Rnd(int64(va), int64(s.Align)))
                        s.Vaddr = va
@@ -1949,15 +1951,17 @@ func (ctxt *Link) address() []*sym.Segment {
                }
 
                Segrodata.Length = va - Segrodata.Vaddr
+               Segrodata.Filelen = Segrodata.Length
        }
        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)))
 
-               order = append(order, &Segrelrodata)
                Segrelrodata.Rwx = 06
                Segrelrodata.Vaddr = va
+               Segrelrodata.Fileoff = va - Segrodata.Vaddr + Segrodata.Fileoff
+               Segrelrodata.Filelen = 0
                for _, s := range Segrelrodata.Sections {
                        va = uint64(Rnd(int64(va), int64(s.Align)))
                        s.Vaddr = va
@@ -1965,12 +1969,20 @@ func (ctxt *Link) address() []*sym.Segment {
                }
 
                Segrelrodata.Length = va - Segrelrodata.Vaddr
+               Segrelrodata.Filelen = Segrelrodata.Length
        }
 
        va = uint64(Rnd(int64(va), int64(*FlagRound)))
-       order = append(order, &Segdata)
        Segdata.Rwx = 06
        Segdata.Vaddr = va
+       Segdata.Fileoff = va - Segtext.Vaddr + Segtext.Fileoff
+       Segdata.Filelen = 0
+       if ctxt.HeadType == objabi.Hwindows {
+               Segdata.Fileoff = Segrodata.Fileoff + uint64(Rnd(int64(Segrodata.Length), PEFILEALIGN))
+       }
+       if ctxt.HeadType == objabi.Hplan9 {
+               Segdata.Fileoff = Segtext.Fileoff + Segtext.Filelen
+       }
        var data *sym.Section
        var noptr *sym.Section
        var bss *sym.Section
@@ -2000,14 +2012,16 @@ func (ctxt *Link) address() []*sym.Segment {
                }
        }
 
-       // Assign Segdata's Filelen omitting the BSS. We do this here
-       // simply because right now we know where the BSS starts.
        Segdata.Filelen = bss.Vaddr - Segdata.Vaddr
 
        va = uint64(Rnd(int64(va), int64(*FlagRound)))
-       order = append(order, &Segdwarf)
        Segdwarf.Rwx = 06
        Segdwarf.Vaddr = va
+       Segdwarf.Fileoff = Segdata.Fileoff + uint64(Rnd(int64(Segdata.Filelen), int64(*FlagRound)))
+       Segdwarf.Filelen = 0
+       if ctxt.HeadType == objabi.Hwindows {
+               Segdwarf.Fileoff = Segdata.Fileoff + uint64(Rnd(int64(Segdata.Filelen), PEFILEALIGN))
+       }
        for i, s := range Segdwarf.Sections {
                vlen := int64(s.Length)
                if i+1 < len(Segdwarf.Sections) {
@@ -2021,6 +2035,8 @@ func (ctxt *Link) address() []*sym.Segment {
                Segdwarf.Length = va - Segdwarf.Vaddr
        }
 
+       Segdwarf.Filelen = va - Segdwarf.Vaddr
+
        var (
                text     = Segtext.Sections[0]
                rodata   = ctxt.Syms.Lookup("runtime.rodata", 0).Sect
@@ -2107,34 +2123,6 @@ func (ctxt *Link) address() []*sym.Segment {
        ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr))
        ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length))
        ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length))
-
-       return order
-}
-
-// layout assigns file offsets and lengths to the segments in order.
-func (ctxt *Link) layout(order []*sym.Segment) {
-       var prev *sym.Segment
-       for _, seg := range order {
-               if prev == nil {
-                       seg.Fileoff = uint64(HEADR)
-               } else {
-                       switch ctxt.HeadType {
-                       default:
-                               seg.Fileoff = prev.Fileoff + uint64(Rnd(int64(prev.Filelen), int64(*FlagRound)))
-                       case objabi.Hwindows:
-                               seg.Fileoff = prev.Fileoff + uint64(Rnd(int64(prev.Filelen), PEFILEALIGN))
-                       case objabi.Hplan9:
-                               seg.Fileoff = prev.Fileoff + prev.Filelen
-                       }
-               }
-               if seg != &Segdata {
-                       // Link.address already set Segdata.Filelen to
-                       // account for BSS.
-                       seg.Filelen = seg.Length
-               }
-               prev = seg
-       }
-
 }
 
 // add a trampoline with symbol s (to be laid down after the current function)
index 23dfa277d0eaa5fe37980c127a011f2e1e60886b..bfa3f70a9eefa458d6c7e275c0720efe7fddb4fd 100644 (file)
@@ -224,9 +224,8 @@ func Main(arch *sys.Arch, theArch Arch) {
        ctxt.typelink()
        ctxt.symtab()
        ctxt.dodata()
-       order := ctxt.address()
+       ctxt.address()
        ctxt.reloc()
-       ctxt.layout(order)
        thearch.Asmb(ctxt)
        ctxt.undef()
        ctxt.hostlink()