func asmb() { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime()) } ld.Bflush(&ld.Bso) if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f codeblk\n", obj.Cputime()) } ld.Bflush(&ld.Bso) if ld.Iself { ld.Asmbelfsetup() } sect := ld.Segtext.Sect ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) ld.Codeblk(int64(sect.Vaddr), int64(sect.Length)) for sect = sect.Next; sect != nil; sect = sect.Next { ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) ld.Datblk(int64(sect.Vaddr), int64(sect.Length)) } if ld.Segrodata.Filelen > 0 { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f rodatblk\n", obj.Cputime()) } ld.Bflush(&ld.Bso) ld.Cseek(int64(ld.Segrodata.Fileoff)) ld.Datblk(int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) } if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f datblk\n", obj.Cputime()) } ld.Bflush(&ld.Bso) ld.Cseek(int64(ld.Segdata.Fileoff)) ld.Datblk(int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) machlink := int64(0) if ld.HEADTYPE == ld.Hdarwin { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f dwarf\n", obj.Cputime()) } dwarfoff := ld.Rnd(int64(uint64(ld.HEADR)+ld.Segtext.Length), int64(ld.INITRND)) + ld.Rnd(int64(ld.Segdata.Filelen), int64(ld.INITRND)) ld.Cseek(dwarfoff) ld.Segdwarf.Fileoff = uint64(ld.Cpos()) ld.Dwarfemitdebugsections() ld.Segdwarf.Filelen = uint64(ld.Cpos()) - ld.Segdwarf.Fileoff machlink = ld.Domacholink() } switch ld.HEADTYPE { default: ld.Diag("unknown header type %d", ld.HEADTYPE) fallthrough case ld.Hplan9, ld.Helf: break case ld.Hdarwin: ld.Debug['8'] = 1 /* 64-bit addresses */ case ld.Hlinux, ld.Hfreebsd, ld.Hnetbsd, ld.Hopenbsd, ld.Hdragonfly, ld.Hsolaris: ld.Debug['8'] = 1 /* 64-bit addresses */ case ld.Hnacl, ld.Hwindows: break } ld.Symsize = 0 ld.Spsize = 0 ld.Lcsize = 0 symo := int64(0) if ld.Debug['s'] == 0 { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f sym\n", obj.Cputime()) } ld.Bflush(&ld.Bso) switch ld.HEADTYPE { default: case ld.Hplan9, ld.Helf: ld.Debug['s'] = 1 symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) case ld.Hdarwin: symo = int64(ld.Segdata.Fileoff + uint64(ld.Rnd(int64(ld.Segdata.Filelen), int64(ld.INITRND))) + uint64(machlink)) case ld.Hlinux, ld.Hfreebsd, ld.Hnetbsd, ld.Hopenbsd, ld.Hdragonfly, ld.Hsolaris, ld.Hnacl: symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) symo = ld.Rnd(symo, int64(ld.INITRND)) case ld.Hwindows: symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) symo = ld.Rnd(symo, ld.PEFILEALIGN) } ld.Cseek(symo) switch ld.HEADTYPE { default: if ld.Iself { ld.Cseek(symo) ld.Asmelfsym() ld.Cflush() ld.Cwrite(ld.Elfstrdat) if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f dwarf\n", obj.Cputime()) } ld.Dwarfemitdebugsections() if ld.Linkmode == ld.LinkExternal { ld.Elfemitreloc() } } case ld.Hplan9: ld.Asmplan9sym() ld.Cflush() sym := ld.Linklookup(ld.Ctxt, "pclntab", 0) if sym != nil { ld.Lcsize = int32(len(sym.P)) for i := 0; int32(i) < ld.Lcsize; i++ { ld.Cput(uint8(sym.P[i])) } ld.Cflush() } case ld.Hwindows: if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f dwarf\n", obj.Cputime()) } ld.Dwarfemitdebugsections() case ld.Hdarwin: if ld.Linkmode == ld.LinkExternal { ld.Machoemitreloc() } } } if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f headr\n", obj.Cputime()) } ld.Bflush(&ld.Bso) ld.Cseek(0) switch ld.HEADTYPE { default: case ld.Hplan9: /* plan9 */ magic := int32(4*26*26 + 7) magic |= 0x00008000 /* fat header */ ld.Lputb(uint32(magic)) /* magic */ ld.Lputb(uint32(ld.Segtext.Filelen)) /* sizes */ ld.Lputb(uint32(ld.Segdata.Filelen)) ld.Lputb(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ld.Lputb(uint32(ld.Symsize)) /* nsyms */ vl := ld.Entryvalue() ld.Lputb(PADDR(uint32(vl))) /* va of entry */ ld.Lputb(uint32(ld.Spsize)) /* sp offsets */ ld.Lputb(uint32(ld.Lcsize)) /* line offsets */ ld.Vputb(uint64(vl)) /* va of entry */ case ld.Hdarwin: ld.Asmbmacho() case ld.Hlinux, ld.Hfreebsd, ld.Hnetbsd, ld.Hopenbsd, ld.Hdragonfly, ld.Hsolaris, ld.Hnacl: ld.Asmbelf(symo) case ld.Hwindows: ld.Asmbpe() } ld.Cflush() }
func asmb() { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime()) } ld.Bflush(&ld.Bso) if ld.Iself { ld.Asmbelfsetup() } sect := ld.Segtext.Sect ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) ld.Codeblk(int64(sect.Vaddr), int64(sect.Length)) for sect = sect.Next; sect != nil; sect = sect.Next { ld.Cseek(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) ld.Datblk(int64(sect.Vaddr), int64(sect.Length)) } if ld.Segrodata.Filelen > 0 { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f rodatblk\n", obj.Cputime()) } ld.Bflush(&ld.Bso) ld.Cseek(int64(ld.Segrodata.Fileoff)) ld.Datblk(int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) } if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f datblk\n", obj.Cputime()) } ld.Bflush(&ld.Bso) ld.Cseek(int64(ld.Segdata.Fileoff)) ld.Datblk(int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) machlink := uint32(0) if ld.HEADTYPE == ld.Hdarwin { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f dwarf\n", obj.Cputime()) } dwarfoff := uint32(ld.Rnd(int64(uint64(ld.HEADR)+ld.Segtext.Length), int64(ld.INITRND)) + ld.Rnd(int64(ld.Segdata.Filelen), int64(ld.INITRND))) ld.Cseek(int64(dwarfoff)) ld.Segdwarf.Fileoff = uint64(ld.Cpos()) ld.Dwarfemitdebugsections() ld.Segdwarf.Filelen = uint64(ld.Cpos()) - ld.Segdwarf.Fileoff machlink = uint32(ld.Domacholink()) } ld.Symsize = 0 ld.Spsize = 0 ld.Lcsize = 0 symo := uint32(0) if ld.Debug['s'] == 0 { // TODO: rationalize if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f sym\n", obj.Cputime()) } ld.Bflush(&ld.Bso) switch ld.HEADTYPE { default: if ld.Iself { symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) symo = uint32(ld.Rnd(int64(symo), int64(ld.INITRND))) } case ld.Hplan9: symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) case ld.Hdarwin: symo = uint32(ld.Segdata.Fileoff + uint64(ld.Rnd(int64(ld.Segdata.Filelen), int64(ld.INITRND))) + uint64(machlink)) case ld.Hwindows: symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN)) } ld.Cseek(int64(symo)) switch ld.HEADTYPE { default: if ld.Iself { if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f elfsym\n", obj.Cputime()) } ld.Asmelfsym() ld.Cflush() ld.Cwrite(ld.Elfstrdat) if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f dwarf\n", obj.Cputime()) } ld.Dwarfemitdebugsections() if ld.Linkmode == ld.LinkExternal { ld.Elfemitreloc() } } case ld.Hplan9: ld.Asmplan9sym() ld.Cflush() sym := ld.Linklookup(ld.Ctxt, "pclntab", 0) if sym != nil { ld.Lcsize = int32(len(sym.P)) for i := 0; int32(i) < ld.Lcsize; i++ { ld.Cput(uint8(sym.P[i])) } ld.Cflush() } case ld.Hwindows: if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f dwarf\n", obj.Cputime()) } ld.Dwarfemitdebugsections() case ld.Hdarwin: if ld.Linkmode == ld.LinkExternal { ld.Machoemitreloc() } } } if ld.Debug['v'] != 0 { fmt.Fprintf(&ld.Bso, "%5.2f headr\n", obj.Cputime()) } ld.Bflush(&ld.Bso) ld.Cseek(0) switch ld.HEADTYPE { default: case ld.Hplan9: /* plan9 */ magic := int32(4*11*11 + 7) ld.Lputb(uint32(magic)) /* magic */ ld.Lputb(uint32(ld.Segtext.Filelen)) /* sizes */ ld.Lputb(uint32(ld.Segdata.Filelen)) ld.Lputb(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ld.Lputb(uint32(ld.Symsize)) /* nsyms */ ld.Lputb(uint32(ld.Entryvalue())) /* va of entry */ ld.Lputb(uint32(ld.Spsize)) /* sp offsets */ ld.Lputb(uint32(ld.Lcsize)) /* line offsets */ case ld.Hdarwin: ld.Asmbmacho() case ld.Hlinux, ld.Hfreebsd, ld.Hnetbsd, ld.Hopenbsd, ld.Hnacl: ld.Asmbelf(int64(symo)) case ld.Hwindows: ld.Asmbpe() } ld.Cflush() }