package ld
import (
+ "cmd/internal/objabi"
"cmd/link/internal/loader"
"fmt"
"sync"
return
}
- Symsize = 0
- Spsize = 0
- Lcsize = 0
+ symSize = 0
+ spSize = 0
+ lcSize = 0
- if ctxt.IsDarwin() {
- machlink := doMachoLink(ctxt)
- if !*FlagS && ctxt.IsExternal() {
- symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink))
- ctxt.Out.SeekSet(symo)
- machoEmitReloc(ctxt)
- }
- ctxt.Out.SeekSet(0)
+ switch ctxt.HeadType {
+ default:
+ panic("unknown platform")
+
+ // Macho
+ case objabi.Hdarwin:
asmbMacho(ctxt)
- }
- if ctxt.IsElf() {
- var symo int64
- if !*FlagS {
- symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen)
- symo = Rnd(symo, int64(*FlagRound))
- ctxt.Out.SeekSet(symo)
- asmElfSym(ctxt)
- ctxt.Out.Write(Elfstrdat)
- if ctxt.IsExternal() {
- elfEmitReloc(ctxt)
- }
- }
- ctxt.Out.SeekSet(0)
- asmbElf(ctxt, symo)
- }
+ // Plan9
+ case objabi.Hplan9:
+ asmbPlan9(ctxt)
- if ctxt.IsWindows() {
+ // PE
+ case objabi.Hwindows:
asmbPe(ctxt)
- }
- if ctxt.IsPlan9() {
- if !*FlagS {
- *FlagS = true
- symo := int64(Segdata.Fileoff + Segdata.Filelen)
- ctxt.Out.SeekSet(symo)
- asmbPlan9Sym(ctxt)
- }
- ctxt.Out.SeekSet(0)
- writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit)
- }
+ // Xcoff
+ case objabi.Haix:
+ asmbXcoff(ctxt)
- if ctxt.IsAIX() {
- ctxt.Out.SeekSet(0)
- fileoff := uint32(Segdwarf.Fileoff + Segdwarf.Filelen)
- fileoff = uint32(Rnd(int64(fileoff), int64(*FlagRound)))
- asmbXcoff(ctxt, int64(fileoff))
+ // Elf
+ case objabi.Hdragonfly,
+ objabi.Hfreebsd,
+ objabi.Hlinux,
+ objabi.Hnetbsd,
+ objabi.Hopenbsd,
+ objabi.Hsolaris:
+ asmbElf(ctxt)
}
if *FlagC {
fmt.Printf("textsize=%d\n", Segtext.Filelen)
fmt.Printf("datsize=%d\n", Segdata.Filelen)
fmt.Printf("bsssize=%d\n", Segdata.Length-Segdata.Filelen)
- fmt.Printf("symsize=%d\n", Symsize)
- fmt.Printf("lcsize=%d\n", Lcsize)
- fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(Symsize)+uint64(Lcsize))
+ fmt.Printf("symsize=%d\n", symSize)
+ fmt.Printf("lcsize=%d\n", lcSize)
+ fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(symSize)+uint64(lcSize))
}
}
buf.Write32b(uint32(Segtext.Filelen))
buf.Write32b(uint32(Segdata.Filelen))
buf.Write32b(uint32(Segdata.Length - Segdata.Filelen))
- buf.Write32b(uint32(Symsize))
+ buf.Write32b(uint32(symSize))
if is64Bit {
buf.Write32b(uint32(entry &^ 0x80000000))
} else {
buf.Write32b(uint32(entry))
}
- buf.Write32b(uint32(Spsize))
- buf.Write32b(uint32(Lcsize))
+ buf.Write32b(uint32(spSize))
+ buf.Write32b(uint32(lcSize))
// amd64 includes the entry at the beginning of the symbol table.
if is64Bit {
buf.Write64b(uint64(entry))
}
}
+
+// asmbPlan9 assembles a plan 9 binary.
+func asmbPlan9(ctxt *Link) {
+ if !*FlagS {
+ *FlagS = true
+ symo := int64(Segdata.Fileoff + Segdata.Filelen)
+ ctxt.Out.SeekSet(symo)
+ asmbPlan9Sym(ctxt)
+ }
+ ctxt.Out.SeekSet(0)
+ writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit)
+}
}
}
-func asmbElf(ctxt *Link, symo int64) {
+func asmbElf(ctxt *Link) {
+ var symo int64
+ if !*FlagS {
+ symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen)
+ symo = Rnd(symo, int64(*FlagRound))
+ ctxt.Out.SeekSet(symo)
+ asmElfSym(ctxt)
+ ctxt.Out.Write(Elfstrdat)
+ if ctxt.IsExternal() {
+ elfEmitReloc(ctxt)
+ }
+ }
+ ctxt.Out.SeekSet(0)
ldr := ctxt.loader
eh := getElfEhdr()
sh := elfshname(".symtab")
sh.type_ = SHT_SYMTAB
sh.off = uint64(symo)
- sh.size = uint64(Symsize)
+ sh.size = uint64(symSize)
sh.addralign = uint64(ctxt.Arch.RegSize)
sh.entsize = 8 + 2*uint64(ctxt.Arch.RegSize)
sh.link = uint32(elfshname(".strtab").shnum)
sh = elfshname(".strtab")
sh.type_ = SHT_STRTAB
- sh.off = uint64(symo) + uint64(Symsize)
+ sh.off = uint64(symo) + uint64(symSize)
sh.size = uint64(len(Elfstrdat))
sh.addralign = 1
}
out.Write16(uint16(shndx))
out.Write64(uint64(addr))
out.Write64(uint64(size))
- Symsize += ELF64SYMSIZE
+ symSize += ELF64SYMSIZE
} else {
out.Write32(uint32(off))
out.Write32(uint32(addr))
out.Write8(uint8(info))
out.Write8(uint8(other))
out.Write16(uint16(shndx))
- Symsize += ELF32SYMSIZE
+ symSize += ELF32SYMSIZE
}
}
ctxt.Out.WriteString(name)
ctxt.Out.Write8(0)
- Symsize += int32(l) + 1 + int32(len(name)) + 1
+ symSize += int32(l) + 1 + int32(len(name)) + 1
}
func asmbPlan9Sym(ctxt *Link) {
}
if ctxt.Debugvlog != 0 || *flagN {
- ctxt.Logf("symsize = %d\n", uint32(Symsize))
+ ctxt.Logf("symsize = %d\n", uint32(symSize))
}
xfile.updatePreviousFile(ctxt, true)
}
}
// Generate XCOFF assembly file
-func asmbXcoff(ctxt *Link, fileoff int64) {
+func asmbXcoff(ctxt *Link) {
+ ctxt.Out.SeekSet(0)
+ fileoff := int64(Segdwarf.Fileoff + Segdwarf.Filelen)
+ fileoff = int64(Rnd(int64(fileoff), int64(*FlagRound)))
+
xfile.sectNameToScnum = make(map[string]int16)
// Add sections