func archinit() { // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when // Go was built; see ../../make.bash. if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" { ld.Linkmode = ld.LinkInternal } if ld.Buildmode == ld.BuildmodeCArchive || ld.Buildmode == ld.BuildmodeCShared || ld.DynlinkingGo() { ld.Linkmode = ld.LinkExternal } switch ld.HEADTYPE { default: if ld.Linkmode == ld.LinkAuto { ld.Linkmode = ld.LinkInternal } if ld.Linkmode == ld.LinkExternal && obj.Getgoextlinkenabled() != "1" { log.Fatalf("cannot use -linkmode=external with -H %s", ld.Headstr(int(ld.HEADTYPE))) } case obj.Hdarwin, obj.Hdragonfly, obj.Hfreebsd, obj.Hlinux, obj.Hnacl, obj.Hnetbsd, obj.Hopenbsd, obj.Hsolaris, obj.Hwindows: break } switch ld.HEADTYPE { default: ld.Exitf("unknown -H option: %v", ld.HEADTYPE) case obj.Hplan9: /* plan 9 */ ld.HEADR = 32 + 8 if ld.INITTEXT == -1 { ld.INITTEXT = 0x200000 + int64(ld.HEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 0x200000 } case obj.Helf: /* elf32 executable */ ld.HEADR = int32(ld.Rnd(52+3*32, 16)) if ld.INITTEXT == -1 { ld.INITTEXT = 0x80110000 } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 4096 } case obj.Hdarwin: /* apple MACH */ ld.Machoinit() ld.HEADR = ld.INITIAL_MACHO_HEADR if ld.INITRND == -1 { ld.INITRND = 4096 } if ld.INITTEXT == -1 { ld.INITTEXT = 4096 + int64(ld.HEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } case obj.Hlinux, /* elf64 executable */ obj.Hfreebsd, /* freebsd */ obj.Hnetbsd, /* netbsd */ obj.Hopenbsd, /* openbsd */ obj.Hdragonfly, /* dragonfly */ obj.Hsolaris: /* solaris */ ld.Elfinit() ld.HEADR = ld.ELFRESERVE if ld.INITTEXT == -1 { ld.INITTEXT = (1 << 22) + int64(ld.HEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 4096 } case obj.Hnacl: ld.Elfinit() ld.Debug['w']++ // disable dwarf, which gets confused and is useless anyway ld.HEADR = 0x10000 ld.Funcalign = 32 if ld.INITTEXT == -1 { ld.INITTEXT = 0x20000 } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 0x10000 } case obj.Hwindows: /* PE executable */ ld.Peinit() ld.HEADR = ld.PEFILEHEADR if ld.INITTEXT == -1 { ld.INITTEXT = ld.PEBASE + int64(ld.PESECTHEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = ld.PESECTALIGN } } if ld.INITDAT != 0 && ld.INITRND != 0 { fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND)) } }
func archinit() { // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when // Go was built; see ../../make.bash. if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" { ld.Linkmode = ld.LinkInternal } if ld.Buildmode == ld.BuildmodeCShared || ld.Buildmode == ld.BuildmodePIE || ld.DynlinkingGo() { ld.Linkmode = ld.LinkExternal got := ld.Linklookup(ld.Ctxt, "_GLOBAL_OFFSET_TABLE_", 0) got.Type = obj.SDYNIMPORT got.Reachable = true } switch ld.HEADTYPE { default: if ld.Linkmode == ld.LinkAuto { ld.Linkmode = ld.LinkInternal } if ld.Linkmode == ld.LinkExternal && obj.Getgoextlinkenabled() != "1" { log.Fatalf("cannot use -linkmode=external with -H %s", ld.Headstr(int(ld.HEADTYPE))) } case obj.Hdarwin, obj.Hfreebsd, obj.Hlinux, obj.Hnetbsd, obj.Hopenbsd, obj.Hwindows: break } switch ld.HEADTYPE { default: ld.Exitf("unknown -H option: %v", ld.HEADTYPE) case obj.Hplan9: /* plan 9 */ ld.HEADR = 32 if ld.INITTEXT == -1 { ld.INITTEXT = 4096 + 32 } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 4096 } case obj.Hdarwin: /* apple MACH */ ld.Machoinit() ld.HEADR = ld.INITIAL_MACHO_HEADR if ld.INITTEXT == -1 { ld.INITTEXT = 4096 + int64(ld.HEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 4096 } case obj.Hlinux, /* elf32 executable */ obj.Hfreebsd, obj.Hnetbsd, obj.Hopenbsd: ld.Elfinit() ld.HEADR = ld.ELFRESERVE if ld.INITTEXT == -1 { ld.INITTEXT = 0x08048000 + int64(ld.HEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 4096 } case obj.Hnacl: ld.Elfinit() ld.HEADR = 0x10000 ld.Funcalign = 32 if ld.INITTEXT == -1 { ld.INITTEXT = 0x20000 } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = 0x10000 } case obj.Hwindows: /* PE executable */ ld.Peinit() ld.HEADR = ld.PEFILEHEADR if ld.INITTEXT == -1 { ld.INITTEXT = ld.PEBASE + int64(ld.PESECTHEADR) } if ld.INITDAT == -1 { ld.INITDAT = 0 } if ld.INITRND == -1 { ld.INITRND = ld.PESECTALIGN } } if ld.INITDAT != 0 && ld.INITRND != 0 { fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(ld.INITDAT), uint32(ld.INITRND)) } }