Commit a1b85ee7 authored by Austin Clements's avatar Austin Clements

Revert "cmd/link: separate virtual address layout from file layout"

This reverts commit bd837745.

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/118675Reviewed-by: default avatarHeschi Kreinick <heschi@google.com>
Run-TryBot: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 24d29e85
...@@ -1903,15 +1903,12 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6 ...@@ -1903,15 +1903,12 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6
return sect, n, va return sect, n, va
} }
// address assigns virtual addresses to all segments and sections and // assign addresses
// returns all segments in file order. func (ctxt *Link) address() {
func (ctxt *Link) address() []*sym.Segment {
var order []*sym.Segment // Layout order
va := uint64(*FlagTextAddr) va := uint64(*FlagTextAddr)
order = append(order, &Segtext)
Segtext.Rwx = 05 Segtext.Rwx = 05
Segtext.Vaddr = va Segtext.Vaddr = va
Segtext.Fileoff = uint64(HEADR)
for _, s := range Segtext.Sections { for _, s := range Segtext.Sections {
va = uint64(Rnd(int64(va), int64(s.Align))) va = uint64(Rnd(int64(va), int64(s.Align)))
s.Vaddr = va s.Vaddr = va
...@@ -1919,6 +1916,7 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -1919,6 +1916,7 @@ func (ctxt *Link) address() []*sym.Segment {
} }
Segtext.Length = va - uint64(*FlagTextAddr) Segtext.Length = va - uint64(*FlagTextAddr)
Segtext.Filelen = Segtext.Length
if ctxt.HeadType == objabi.Hnacl { if ctxt.HeadType == objabi.Hnacl {
va += 32 // room for the "halt sled" va += 32 // room for the "halt sled"
} }
...@@ -1939,9 +1937,13 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -1939,9 +1937,13 @@ func (ctxt *Link) address() []*sym.Segment {
// writable even for this short period. // writable even for this short period.
va = uint64(Rnd(int64(va), int64(*FlagRound))) va = uint64(Rnd(int64(va), int64(*FlagRound)))
order = append(order, &Segrodata)
Segrodata.Rwx = 04 Segrodata.Rwx = 04
Segrodata.Vaddr = va 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 { for _, s := range Segrodata.Sections {
va = uint64(Rnd(int64(va), int64(s.Align))) va = uint64(Rnd(int64(va), int64(s.Align)))
s.Vaddr = va s.Vaddr = va
...@@ -1949,15 +1951,17 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -1949,15 +1951,17 @@ func (ctxt *Link) address() []*sym.Segment {
} }
Segrodata.Length = va - Segrodata.Vaddr Segrodata.Length = va - Segrodata.Vaddr
Segrodata.Filelen = Segrodata.Length
} }
if len(Segrelrodata.Sections) > 0 { if len(Segrelrodata.Sections) > 0 {
// align to page boundary so as not to mix // align to page boundary so as not to mix
// rodata, rel-ro data, and executable text. // rodata, rel-ro data, and executable text.
va = uint64(Rnd(int64(va), int64(*FlagRound))) va = uint64(Rnd(int64(va), int64(*FlagRound)))
order = append(order, &Segrelrodata)
Segrelrodata.Rwx = 06 Segrelrodata.Rwx = 06
Segrelrodata.Vaddr = va Segrelrodata.Vaddr = va
Segrelrodata.Fileoff = va - Segrodata.Vaddr + Segrodata.Fileoff
Segrelrodata.Filelen = 0
for _, s := range Segrelrodata.Sections { for _, s := range Segrelrodata.Sections {
va = uint64(Rnd(int64(va), int64(s.Align))) va = uint64(Rnd(int64(va), int64(s.Align)))
s.Vaddr = va s.Vaddr = va
...@@ -1965,12 +1969,20 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -1965,12 +1969,20 @@ func (ctxt *Link) address() []*sym.Segment {
} }
Segrelrodata.Length = va - Segrelrodata.Vaddr Segrelrodata.Length = va - Segrelrodata.Vaddr
Segrelrodata.Filelen = Segrelrodata.Length
} }
va = uint64(Rnd(int64(va), int64(*FlagRound))) va = uint64(Rnd(int64(va), int64(*FlagRound)))
order = append(order, &Segdata)
Segdata.Rwx = 06 Segdata.Rwx = 06
Segdata.Vaddr = va 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 data *sym.Section
var noptr *sym.Section var noptr *sym.Section
var bss *sym.Section var bss *sym.Section
...@@ -2000,14 +2012,16 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -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 Segdata.Filelen = bss.Vaddr - Segdata.Vaddr
va = uint64(Rnd(int64(va), int64(*FlagRound))) va = uint64(Rnd(int64(va), int64(*FlagRound)))
order = append(order, &Segdwarf)
Segdwarf.Rwx = 06 Segdwarf.Rwx = 06
Segdwarf.Vaddr = va 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 { for i, s := range Segdwarf.Sections {
vlen := int64(s.Length) vlen := int64(s.Length)
if i+1 < len(Segdwarf.Sections) { if i+1 < len(Segdwarf.Sections) {
...@@ -2021,6 +2035,8 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -2021,6 +2035,8 @@ func (ctxt *Link) address() []*sym.Segment {
Segdwarf.Length = va - Segdwarf.Vaddr Segdwarf.Length = va - Segdwarf.Vaddr
} }
Segdwarf.Filelen = va - Segdwarf.Vaddr
var ( var (
text = Segtext.Sections[0] text = Segtext.Sections[0]
rodata = ctxt.Syms.Lookup("runtime.rodata", 0).Sect rodata = ctxt.Syms.Lookup("runtime.rodata", 0).Sect
...@@ -2107,34 +2123,6 @@ func (ctxt *Link) address() []*sym.Segment { ...@@ -2107,34 +2123,6 @@ func (ctxt *Link) address() []*sym.Segment {
ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr)) ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr))
ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length)) ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length))
ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.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) // add a trampoline with symbol s (to be laid down after the current function)
......
...@@ -224,9 +224,8 @@ func Main(arch *sys.Arch, theArch Arch) { ...@@ -224,9 +224,8 @@ func Main(arch *sys.Arch, theArch Arch) {
ctxt.typelink() ctxt.typelink()
ctxt.symtab() ctxt.symtab()
ctxt.dodata() ctxt.dodata()
order := ctxt.address() ctxt.address()
ctxt.reloc() ctxt.reloc()
ctxt.layout(order)
thearch.Asmb(ctxt) thearch.Asmb(ctxt)
ctxt.undef() ctxt.undef()
ctxt.hostlink() ctxt.hostlink()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment