"cmd/link/internal/sym"
"debug/elf"
"log"
- "sync"
)
func PADDR(x uint32) uint32 {
}
}
-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) {
machlink := int64(0)
if ctxt.HeadType == objabi.Hdarwin {
Minalign: minAlign,
Dwarfregsp: dwarfRegSP,
Dwarfreglr: dwarfRegLR,
+ // 0xCC is INT $3 - breakpoint instruction
+ CodePad: []byte{0xCC},
Adddynrel: adddynrel,
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"debug/elf"
"fmt"
"log"
- "sync"
)
// This assembler:
}
}
-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) {
/* output symbol table */
ld.Symsize = 0
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
Trampoline: trampoline,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"debug/elf"
"fmt"
"log"
- "sync"
)
func gentext(ctxt *ld.Link, ldr *loader.Loader) {
}
}
-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) {
machlink := uint32(0)
if ctxt.HeadType == objabi.Hdarwin {
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
--- /dev/null
+// 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()
+}
}
}
-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) {
writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad)
}
type writeFn func(*Link, *OutBuf, int64, int64)
-// WriteParallel handles scheduling parallel execution of data write functions.
-func WriteParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) {
+// writeParallel handles scheduling parallel execution of data write functions.
+func writeParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) {
if out, err := ctxt.Out.View(seek); err != nil {
ctxt.Out.SeekSet(int64(seek))
fn(ctxt, ctxt.Out, int64(vaddr), int64(length))
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
// to writeBlocks.
//
Openbsddynld string
Dragonflydynld 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
// (invoked by 'relocsym'); it handles target-specific relocation tasks.
// Here "rel" is the current relocation being examined, "sym" is the symbol
// index of the relocation.
Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym)
- // Asmb and Asmb2 are arch-specific routines that write the output
- // file. Typically, Asmb writes most of the content (sections and
- // segments), for which we have computed the size and offset. Asmb2
- // writes the rest.
+ // Assembling the binary breaks into two phases, writing the code/data/
+ // dwarf information (which is rather generic), and some more architecture
+ // specific work like setting up the elf headers/dynamic relocations, etc.
+ // 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)
Asmb2 func(*Link, *loader.Loader)
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.
bench.Start("Asmb")
ctxt.loader.InitOutData()
- thearch.Asmb(ctxt, ctxt.loader)
+ asmb(ctxt, ctxt.loader)
bench.Start("reloc")
ctxt.reloc()
bench.Start("Asmb2")
"cmd/link/internal/sym"
"debug/elf"
"fmt"
- "sync"
)
func gentext(ctxt *ld.Link, ldr *loader.Loader) {
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) {
/* output symbol table */
ld.Symsize = 0
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"cmd/link/internal/sym"
"debug/elf"
"fmt"
- "sync"
)
func gentext(ctxt *ld.Link, ldr *loader.Loader) {}
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) {
/* output symbol table */
ld.Symsize = 0
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"fmt"
"log"
"strings"
- "sync"
)
func genplt(ctxt *ld.Link, ldr *loader.Loader) {
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) {
/* output symbol table */
ld.Symsize = 0
}
theArch := ld.Arch{
- Funcalign: funcAlign,
- Maxalign: maxAlign,
- Minalign: minAlign,
- Dwarfregsp: dwarfRegSP,
- Dwarfreglr: dwarfRegLR,
+ Funcalign: funcAlign,
+ Maxalign: maxAlign,
+ Minalign: minAlign,
+ Dwarfregsp: dwarfRegSP,
+ Dwarfreglr: dwarfRegLR,
+ WriteTextBlocks: true,
Adddynrel: adddynrel,
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"cmd/link/internal/sym"
"fmt"
"log"
- "sync"
)
func gentext(ctxt *ld.Link, ldr *loader.Loader) {
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) {
ld.Symsize = 0
ld.Lcsize = 0
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"cmd/link/internal/sym"
"debug/elf"
"fmt"
- "sync"
)
// gentext generates assembly to append the local moduledata to the global
}
}
-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) {
/* output symbol table */
ld.Symsize = 0
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,
"cmd/link/internal/sym"
"debug/elf"
"log"
- "sync"
)
func gentext(ctxt *ld.Link, ldr *loader.Loader) {
}
}
-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) {
machlink := uint32(0)
if ctxt.HeadType == objabi.Hdarwin {
Minalign: minAlign,
Dwarfregsp: dwarfRegSP,
Dwarfreglr: dwarfRegLR,
+ // 0xCC is INT $3 - breakpoint instruction
+ CodePad: []byte{0xCC},
Adddynrel: adddynrel,
Archinit: archinit,
Archreloc: archreloc,
Archrelocvariant: archrelocvariant,
- Asmb: asmb,
Asmb2: asmb2,
Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt,