[dev.link] cmd/link: remove duplicate asmb code

Lots of the architecture specific code for asmb() is very simimar. As
such, move to a common function.

Change-Id: Id1fd50ee7bfa1bc9978e3f42ad08914b04cd677b
Reviewed-on: https://go-review.googlesource.com/c/go/+/234683
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Jeremy Faller 2020-05-20 15:10:05 -04:00
parent 6097f7cf7a
commit 49b12dcca9
22 changed files with 104 additions and 304 deletions

View File

@ -38,7 +38,6 @@ import (
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf" "debug/elf"
"log" "log"
"sync"
) )
func PADDR(x uint32) uint32 { func PADDR(x uint32) uint32 {
@ -680,40 +679,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
} }
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
f := func(ctxt *ld.Link, out *ld.OutBuf, start, length int64) {
// 0xCC is INT $3 - breakpoint instruction
ld.CodeblkPad(ctxt, out, start, length, []byte{0xCC})
}
ld.WriteParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
machlink := int64(0) machlink := int64(0)
if ctxt.HeadType == objabi.Hdarwin { if ctxt.HeadType == objabi.Hdarwin {

View File

@ -50,12 +50,13 @@ func Init() (*sys.Arch, ld.Arch) {
Minalign: minAlign, Minalign: minAlign,
Dwarfregsp: dwarfRegSP, Dwarfregsp: dwarfRegSP,
Dwarfreglr: dwarfRegLR, Dwarfreglr: dwarfRegLR,
// 0xCC is INT $3 - breakpoint instruction
CodePad: []byte{0xCC},
Adddynrel: adddynrel, Adddynrel: adddynrel,
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -39,7 +39,6 @@ import (
"debug/elf" "debug/elf"
"fmt" "fmt"
"log" "log"
"sync"
) )
// This assembler: // This assembler:
@ -672,35 +671,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
} }
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
/* output symbol table */ /* output symbol table */
ld.Symsize = 0 ld.Symsize = 0

View File

@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) {
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Trampoline: trampoline, Trampoline: trampoline,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -39,7 +39,6 @@ import (
"debug/elf" "debug/elf"
"fmt" "fmt"
"log" "log"
"sync"
) )
func gentext(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@ -797,35 +796,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
} }
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
machlink := uint32(0) machlink := uint32(0)
if ctxt.HeadType == objabi.Hdarwin { if ctxt.HeadType == objabi.Hdarwin {

View File

@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) {
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -0,0 +1,70 @@
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package ld
import (
"cmd/link/internal/loader"
"sync"
)
// Assembling the binary is broken into two steps:
// - writing out the code/data/dwarf Segments
// - writing out the architecture specific pieces.
// This function handles the first part.
func asmb(ctxt *Link, ldr *loader.Loader) {
// TODO(jfaller): delete me.
if thearch.Asmb != nil {
thearch.Asmb(ctxt, ldr)
return
}
if ctxt.IsELF {
Asmbelfsetup()
}
var wg sync.WaitGroup
sect := Segtext.Sections[0]
offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff
f := func(ctxt *Link, out *OutBuf, start, length int64) {
pad := thearch.CodePad
if pad == nil {
pad = zeros[:]
}
CodeblkPad(ctxt, out, start, length, pad)
}
if !thearch.WriteTextBlocks {
writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range Segtext.Sections[1:] {
offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff
writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
} else {
// TODO why can't we handle all sections this way?
for _, sect := range Segtext.Sections {
offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff
// Handle additional text sections with Codeblk
if sect.Name == ".text" {
writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
} else {
writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
}
}
if Segrodata.Filelen > 0 {
writeParallel(&wg, Datblk, ctxt, Segrodata.Fileoff, Segrodata.Vaddr, Segrodata.Filelen)
}
if Segrelrodata.Filelen > 0 {
writeParallel(&wg, Datblk, ctxt, Segrelrodata.Fileoff, Segrelrodata.Vaddr, Segrelrodata.Filelen)
}
writeParallel(&wg, Datblk, ctxt, Segdata.Fileoff, Segdata.Vaddr, Segdata.Filelen)
writeParallel(&wg, dwarfblk, ctxt, Segdwarf.Fileoff, Segdwarf.Vaddr, Segdwarf.Filelen)
wg.Wait()
}

View File

@ -801,10 +801,6 @@ func (state *dodataState) dynreloc(ctxt *Link) {
} }
} }
func Codeblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
CodeblkPad(ctxt, out, addr, size, zeros[:])
}
func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) { func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) {
writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad) writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad)
} }
@ -951,8 +947,8 @@ func writeBlock(out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size i
type writeFn func(*Link, *OutBuf, int64, int64) type writeFn func(*Link, *OutBuf, int64, int64)
// WriteParallel handles scheduling parallel execution of data write functions. // writeParallel handles scheduling parallel execution of data write functions.
func WriteParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) { func writeParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) {
if out, err := ctxt.Out.View(seek); err != nil { if out, err := ctxt.Out.View(seek); err != nil {
ctxt.Out.SeekSet(int64(seek)) ctxt.Out.SeekSet(int64(seek))
fn(ctxt, ctxt.Out, int64(vaddr), int64(length)) fn(ctxt, ctxt.Out, int64(vaddr), int64(length))
@ -981,7 +977,7 @@ func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) {
writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:]) writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:])
} }
func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { func dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
// Concatenate the section symbol lists into a single list to pass // Concatenate the section symbol lists into a single list to pass
// to writeBlocks. // to writeBlocks.
// //

View File

@ -184,8 +184,18 @@ type Arch struct {
Openbsddynld string Openbsddynld string
Dragonflydynld string Dragonflydynld string
Solarisdynld string Solarisdynld string
Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool
Archinit func(*Link) // Empty spaces between codeblocks will be padded with this value.
// For example an architecture might want to pad with a trap instruction to
// catch wayward programs. Architectures that do not define a padding value
// are padded with zeros.
CodePad []byte
// Set to true to write all text blocks in with CodeBlkWrite
WriteTextBlocks bool
Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool
Archinit func(*Link)
// Archreloc is an arch-specific hook that assists in relocation processing // Archreloc is an arch-specific hook that assists in relocation processing
// (invoked by 'relocsym'); it handles target-specific relocation tasks. // (invoked by 'relocsym'); it handles target-specific relocation tasks.
// Here "rel" is the current relocation being examined, "sym" is the symbol // Here "rel" is the current relocation being examined, "sym" is the symbol
@ -212,10 +222,13 @@ type Arch struct {
// index of the relocation. // index of the relocation.
Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym) Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym)
// Asmb and Asmb2 are arch-specific routines that write the output // Assembling the binary breaks into two phases, writing the code/data/
// file. Typically, Asmb writes most of the content (sections and // dwarf information (which is rather generic), and some more architecture
// segments), for which we have computed the size and offset. Asmb2 // specific work like setting up the elf headers/dynamic relocations, etc.
// writes the rest. // The phases are called "Asmb" and "Asmb2". Asmb2 needs to be defined for
// every architecture, but only if architecture has an Asmb function will
// it be used for assembly. Otherwise a generic assembly Asmb function is
// used.
Asmb func(*Link, *loader.Loader) Asmb func(*Link, *loader.Loader)
Asmb2 func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader)

View File

@ -313,11 +313,11 @@ func Main(arch *sys.Arch, theArch Arch) {
panic(err) panic(err)
} }
} }
// Asmb will redirect symbols to the output file mmap, and relocations // asmb will redirect symbols to the output file mmap, and relocations
// will be applied directly there. // will be applied directly there.
bench.Start("Asmb") bench.Start("Asmb")
ctxt.loader.InitOutData() ctxt.loader.InitOutData()
thearch.Asmb(ctxt, ctxt.loader) asmb(ctxt, ctxt.loader)
bench.Start("reloc") bench.Start("reloc")
ctxt.reloc() ctxt.reloc()
bench.Start("Asmb2") bench.Start("Asmb2")

View File

@ -38,7 +38,6 @@ import (
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf" "debug/elf"
"fmt" "fmt"
"sync"
) )
func gentext(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@ -153,31 +152,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
return -1 return -1
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect = range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
/* output symbol table */ /* output symbol table */
ld.Symsize = 0 ld.Symsize = 0

View File

@ -52,7 +52,6 @@ func Init() (*sys.Arch, ld.Arch) {
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -38,7 +38,6 @@ import (
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf" "debug/elf"
"fmt" "fmt"
"sync"
) )
func gentext(ctxt *ld.Link, ldr *loader.Loader) {} func gentext(ctxt *ld.Link, ldr *loader.Loader) {}
@ -159,35 +158,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
return -1 return -1
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
/* output symbol table */ /* output symbol table */
ld.Symsize = 0 ld.Symsize = 0

View File

@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) {
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -41,7 +41,6 @@ import (
"fmt" "fmt"
"log" "log"
"strings" "strings"
"sync"
) )
func genplt(ctxt *ld.Link, ldr *loader.Loader) { func genplt(ctxt *ld.Link, ldr *loader.Loader) {
@ -1081,36 +1080,6 @@ func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilde
return glink return glink
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
for _, sect := range ld.Segtext.Sections {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
// Handle additional text sections with Codeblk
if sect.Name == ".text" {
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
} else {
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
/* output symbol table */ /* output symbol table */
ld.Symsize = 0 ld.Symsize = 0

View File

@ -43,17 +43,17 @@ func Init() (*sys.Arch, ld.Arch) {
} }
theArch := ld.Arch{ theArch := ld.Arch{
Funcalign: funcAlign, Funcalign: funcAlign,
Maxalign: maxAlign, Maxalign: maxAlign,
Minalign: minAlign, Minalign: minAlign,
Dwarfregsp: dwarfRegSP, Dwarfregsp: dwarfRegSP,
Dwarfreglr: dwarfRegLR, Dwarfreglr: dwarfRegLR,
WriteTextBlocks: true,
Adddynrel: adddynrel, Adddynrel: adddynrel,
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -13,7 +13,6 @@ import (
"cmd/link/internal/sym" "cmd/link/internal/sym"
"fmt" "fmt"
"log" "log"
"sync"
) )
func gentext(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@ -91,35 +90,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
return -1 return -1
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ld.Symsize = 0 ld.Symsize = 0
ld.Lcsize = 0 ld.Lcsize = 0

View File

@ -23,7 +23,6 @@ func Init() (*sys.Arch, ld.Arch) {
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -38,7 +38,6 @@ import (
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf" "debug/elf"
"fmt" "fmt"
"sync"
) )
// gentext generates assembly to append the local moduledata to the global // gentext generates assembly to append the local moduledata to the global
@ -477,35 +476,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
} }
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
/* output symbol table */ /* output symbol table */
ld.Symsize = 0 ld.Symsize = 0

View File

@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) {
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,

View File

@ -38,7 +38,6 @@ import (
"cmd/link/internal/sym" "cmd/link/internal/sym"
"debug/elf" "debug/elf"
"log" "log"
"sync"
) )
func gentext(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
@ -511,38 +510,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
} }
} }
func asmb(ctxt *ld.Link, _ *loader.Loader) {
if ctxt.IsELF {
ld.Asmbelfsetup()
}
var wg sync.WaitGroup
sect := ld.Segtext.Sections[0]
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
f := func(ctxt *ld.Link, out *ld.OutBuf, start, length int64) {
ld.CodeblkPad(ctxt, out, start, length, []byte{0xCC})
}
ld.WriteParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length)
for _, sect := range ld.Segtext.Sections[1:] {
offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff
ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length)
}
if ld.Segrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen)
}
if ld.Segrelrodata.Filelen > 0 {
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen)
}
ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen)
ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen)
wg.Wait()
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) { func asmb2(ctxt *ld.Link, _ *loader.Loader) {
machlink := uint32(0) machlink := uint32(0)
if ctxt.HeadType == objabi.Hdarwin { if ctxt.HeadType == objabi.Hdarwin {

View File

@ -45,12 +45,13 @@ func Init() (*sys.Arch, ld.Arch) {
Minalign: minAlign, Minalign: minAlign,
Dwarfregsp: dwarfRegSP, Dwarfregsp: dwarfRegSP,
Dwarfreglr: dwarfRegLR, Dwarfreglr: dwarfRegLR,
// 0xCC is INT $3 - breakpoint instruction
CodePad: []byte{0xCC},
Adddynrel: adddynrel, Adddynrel: adddynrel,
Archinit: archinit, Archinit: archinit,
Archreloc: archreloc, Archreloc: archreloc,
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc1: elfreloc1, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,