}
func asmb2(ctxt *ld.Link, _ *loader.Loader) {
- machlink := int64(0)
- if ctxt.HeadType == objabi.Hdarwin {
- machlink = ld.Domacholink(ctxt)
+ if ctxt.IsDarwin() {
+ panic("darwin should be generic")
}
switch ctxt.HeadType {
case objabi.Hplan9:
break
- case objabi.Hdarwin:
- ld.Flag8 = true /* 64-bit addresses */
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,
*ld.FlagS = true
symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen)
- case objabi.Hdarwin:
- symo = int64(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,
case objabi.Hwindows:
// Do nothing
-
- case objabi.Hdarwin:
- if ctxt.LinkMode == ld.LinkExternal {
- ld.Machoemitreloc(ctxt)
- }
}
}
magic := uint32(4*26*26 + 7)
ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true)
- case objabi.Hdarwin:
- ld.Asmbmacho(ctxt)
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) {
- machlink := uint32(0)
- if ctxt.HeadType == objabi.Hdarwin {
- machlink = uint32(ld.Domacholink(ctxt))
+ if ctxt.IsDarwin() {
+ panic("darwin should be generic")
}
/* output symbol table */
symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
}
- case objabi.Hdarwin:
- symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
}
ctxt.Out.SeekSet(int64(symo))
ld.Elfemitreloc(ctxt)
}
}
-
- case objabi.Hdarwin:
- if ctxt.LinkMode == ld.LinkExternal {
- ld.Machoemitreloc(ctxt)
- }
}
}
objabi.Hnetbsd,
objabi.Hopenbsd:
ld.Asmbelf(ctxt, int64(symo))
-
- case objabi.Hdarwin:
- ld.Asmbmacho(ctxt)
}
if *ld.FlagC {
wg.Wait()
}
+// 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 second part.
+func asmb2(ctxt *Link) bool {
+ if ctxt.IsDarwin() {
+ machlink := Domacholink(ctxt)
+ Symsize = 0
+ Spsize = 0
+ Lcsize = 0
+ 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)
+ Asmbmacho(ctxt)
+ return true
+ }
+ return false
+}
+
// WritePlan9Header writes out the plan9 header at the present position in the OutBuf.
func WritePlan9Header(buf *OutBuf, magic uint32, entry int64, is64Bit bool) {
if is64Bit {
bench.Start("reloc")
ctxt.reloc()
bench.Start("Asmb2")
- thearch.Asmb2(ctxt, ctxt.loader)
+ if !asmb2(ctxt) {
+ thearch.Asmb2(ctxt, ctxt.loader)
+ }
bench.Start("Munmap")
ctxt.Out.Close() // Close handles Munmapping if necessary.
}
func asmb2(ctxt *ld.Link, _ *loader.Loader) {
- machlink := uint32(0)
- if ctxt.HeadType == objabi.Hdarwin {
- machlink = uint32(ld.Domacholink(ctxt))
+ if ctxt.IsDarwin() {
+ panic("darwin should be generic")
}
ld.Symsize = 0
case objabi.Hplan9:
symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen)
- case objabi.Hdarwin:
- symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink))
-
case objabi.Hwindows:
symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN))
case objabi.Hwindows:
// Do nothing
-
- case objabi.Hdarwin:
- if ctxt.LinkMode == ld.LinkExternal {
- ld.Machoemitreloc(ctxt)
- }
}
}
magic := uint32(4*11*11 + 7)
ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false)
- case objabi.Hdarwin:
- ld.Asmbmacho(ctxt)
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,