From: Alex Brainman Date: Tue, 14 Feb 2017 01:01:01 +0000 (+1100) Subject: cmd/link: delay calculating pe file parameters after Linkmode is set X-Git-Tag: go1.9beta1~1537 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=0ad247c6f0335f44a27217d0411b8c92e367ebd8;p=gostls13.git cmd/link: delay calculating pe file parameters after Linkmode is set For #10776. Change-Id: Id64a7e35c7cdcd9be16cbe3358402fa379090e36 Reviewed-on: https://go-review.googlesource.com/36975 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 1ecade8906..52ea8ffe0f 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -142,18 +142,8 @@ func archinit(ctxt *ld.Link) { } case obj.Hwindows, obj.Hwindowsgui: /* PE executable */ - ld.Peinit(ctxt) - - ld.HEADR = ld.PEFILEHEADR - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = ld.PEBASE + int64(ld.PESECTHEADR) - } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } - if *ld.FlagRound == -1 { - *ld.FlagRound = int(ld.PESECTALIGN) - } + // ld.HEADR, ld.FlagTextAddr, ld.FlagDataAddr and ld.FlagRound are set in ld.Peinit + return } if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 74d79d394c..7f056826c8 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -430,6 +430,11 @@ func (ctxt *Link) loadlib() { // We now have enough information to determine the link mode. determineLinkMode(ctxt) + // Recalculate pe parameters now that we have Linkmode set. + if Headtype == obj.Hwindows || Headtype == obj.Hwindowsgui { + Peinit(ctxt) + } + if Linkmode == LinkExternal && SysArch.Family == sys.PPC64 { toc := ctxt.Syms.Lookup(".TOC.", 0) toc.Type = obj.SDYNIMPORT diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index e3ebc3ae28..6a1c19520c 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -455,6 +455,20 @@ func Peinit(ctxt *Link) { ctxt.xdefine("__image_base__", obj.SDATA, PEBASE) ctxt.xdefine("_image_base__", obj.SDATA, PEBASE) + + HEADR = PEFILEHEADR + if *FlagTextAddr == -1 { + *FlagTextAddr = PEBASE + int64(PESECTHEADR) + } + if *FlagDataAddr == -1 { + *FlagDataAddr = 0 + } + if *FlagRound == -1 { + *FlagRound = int(PESECTALIGN) + } + if *FlagDataAddr != 0 && *FlagRound != 0 { + fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*FlagDataAddr), uint32(*FlagRound)) + } } func pewrite() { diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index 8ae351df97..ba1dfcd4d0 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -134,18 +134,8 @@ func archinit(ctxt *ld.Link) { } case obj.Hwindows, obj.Hwindowsgui: /* PE executable */ - ld.Peinit(ctxt) - - ld.HEADR = ld.PEFILEHEADR - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = ld.PEBASE + int64(ld.PESECTHEADR) - } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } - if *ld.FlagRound == -1 { - *ld.FlagRound = int(ld.PESECTALIGN) - } + // ld.HEADR, ld.FlagTextAddr, ld.FlagDataAddr and ld.FlagRound are set in ld.Peinit + return } if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 {