switch ctxt.HeadType {
default:
case objabi.Hplan9: /* plan9 */
- magic := int32(4*26*26 + 7)
-
- magic |= 0x00008000 /* fat header */
- ctxt.Out.Write32b(uint32(magic)) /* magic */
- ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
- ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
- ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
- ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
- vl := ld.Entryvalue(ctxt)
- ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */
- ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */
- ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */
- ctxt.Out.Write64b(uint64(vl)) /* va of entry */
+ magic := uint32(4*26*26 + 7)
+ ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true)
case objabi.Hdarwin:
ld.Asmbmacho(ctxt)
switch ctxt.HeadType {
default:
case objabi.Hplan9: /* plan 9 */
- ctxt.Out.Write32b(0x647) /* magic */
- ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
- ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
- ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
- ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
- ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */
- ctxt.Out.Write32b(0)
- ctxt.Out.Write32b(uint32(ld.Lcsize))
+ ld.WritePlan9Header(ctxt.Out, 0x647, ld.Entryvalue(ctxt), false)
case objabi.Hlinux,
objabi.Hfreebsd,
symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
}
- 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.Hplan9:
- ld.Asmplan9sym(ctxt)
-
case objabi.Hdarwin:
if ctxt.LinkMode == ld.LinkExternal {
ld.Machoemitreloc(ctxt)
ctxt.Out.SeekSet(0)
switch ctxt.HeadType {
default:
- case objabi.Hplan9: /* plan 9 */
- ctxt.Out.Write32(0x647) /* magic */
- ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
- ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
- ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
- ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */
- ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
- ctxt.Out.Write32(0)
- ctxt.Out.Write32(uint32(ld.Lcsize))
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,
wg.Wait()
}
+
+// 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 {
+ magic |= 0x00008000
+ }
+ buf.Write32b(magic)
+ buf.Write32b(uint32(Segtext.Filelen))
+ buf.Write32b(uint32(Segdata.Filelen))
+ buf.Write32b(uint32(Segdata.Length - Segdata.Filelen))
+ buf.Write32b(uint32(Symsize))
+ if is64Bit {
+ buf.Write32b(uint32(entry &^ 0x80000000))
+ } else {
+ buf.Write32b(uint32(entry))
+ }
+ 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))
+ }
+}
symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen)
symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
}
-
- case objabi.Hplan9:
- symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen)
}
ctxt.Out.SeekSet(int64(symo))
ld.Elfemitreloc(ctxt)
}
}
-
- case objabi.Hplan9:
- ld.Asmplan9sym(ctxt)
}
}
ctxt.Out.SeekSet(0)
switch ctxt.HeadType {
default:
- case objabi.Hplan9: /* plan 9 */
- magic := uint32(4*18*18 + 7)
- if ctxt.Arch == sys.ArchMIPS64LE {
- magic = uint32(4*26*26 + 7)
- }
- ctxt.Out.Write32(magic) /* magic */
- ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
- ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
- ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
- ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */
- ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
- ctxt.Out.Write32(0)
- ctxt.Out.Write32(uint32(ld.Lcsize))
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,
symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound)))
}
- case objabi.Hplan9:
- symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen)
-
case objabi.Haix:
// Nothing to do
}
}
}
- case objabi.Hplan9:
- ld.Asmplan9sym(ctxt)
-
case objabi.Haix:
// symtab must be added once sections have been created in ld.Asmbxcoff
}
ctxt.Out.SeekSet(0)
switch ctxt.HeadType {
default:
- case objabi.Hplan9: /* plan 9 */
- ctxt.Out.Write32(0x647) /* magic */
- ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
- ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
- ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
- ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */
- ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
- ctxt.Out.Write32(0)
- ctxt.Out.Write32(uint32(ld.Lcsize))
-
case objabi.Hlinux,
objabi.Hfreebsd,
objabi.Hnetbsd,
switch ctxt.HeadType {
default:
case objabi.Hplan9: /* plan9 */
- magic := int32(4*11*11 + 7)
-
- ctxt.Out.Write32b(uint32(magic)) /* magic */
- ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
- ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
- ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
- ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
- ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */
- ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */
- ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */
+ magic := uint32(4*11*11 + 7)
+ ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false)
case objabi.Hdarwin:
ld.Asmbmacho(ctxt)