From: Alex Brainman Date: Sun, 5 Feb 2017 03:19:19 +0000 (+1100) Subject: cmd/link: set pe section and file alignment to 0 during external linking X-Git-Tag: go1.9beta1~1538 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e31144f128e2a491845dc4fcc57d45e22fc1b963;p=gostls13.git cmd/link: set pe section and file alignment to 0 during external linking This is what gcc does when it generates object files. And it is easier to count everything, when it starts from 0. Make go linker do the same. gcc also does not output IMAGE_OPTIONAL_HEADER or PE64_IMAGE_OPTIONAL_HEADER for object files. Perhaps we should do the same, but not in this CL. For #10776. Change-Id: I9789c337648623b6cfaa7d18d1ac9cef32e180dc Reviewed-on: https://go-review.googlesource.com/36974 Reviewed-by: Ian Lance Taylor --- diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 9646b60115..1ecade8906 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -152,7 +152,7 @@ func archinit(ctxt *ld.Link) { *ld.FlagDataAddr = 0 } if *ld.FlagRound == -1 { - *ld.FlagRound = ld.PESECTALIGN + *ld.FlagRound = int(ld.PESECTALIGN) } } diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 20855286d7..e3ebc3ae28 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -101,15 +101,17 @@ type IMAGE_EXPORT_DIRECTORY struct { const ( PEBASE = 0x00400000 +) +var ( // SectionAlignment must be greater than or equal to FileAlignment. // The default is the page size for the architecture. - PESECTALIGN = 0x1000 + PESECTALIGN int64 = 0x1000 // FileAlignment should be a power of 2 between 512 and 64 K, inclusive. // The default is 512. If the SectionAlignment is less than // the architecture's page size, then FileAlignment must match SectionAlignment. - PEFILEALIGN = 2 << 8 + PEFILEALIGN int64 = 2 << 8 ) const ( @@ -435,8 +437,17 @@ func Peinit(ctxt *Link) { dd = oh.DataDirectory[:] } + if Linkmode == LinkExternal { + PESECTALIGN = 0 + PEFILEALIGN = 0 + } + PEFILEHEADR = int32(Rnd(int64(len(dosstub)+binary.Size(&fh)+l+binary.Size(&sh)), PEFILEALIGN)) - PESECTHEADR = int32(Rnd(int64(PEFILEHEADR), PESECTALIGN)) + if Linkmode != LinkExternal { + PESECTHEADR = int32(Rnd(int64(PEFILEHEADR), PESECTALIGN)) + } else { + PESECTHEADR = 0 + } nextsectoff = int(PESECTHEADR) nextfileoff = int(PEFILEHEADR) @@ -1218,10 +1229,10 @@ func Asmbpe(ctxt *Link) { oh.BaseOfCode = t.VirtualAddress oh64.ImageBase = PEBASE oh.ImageBase = PEBASE - oh64.SectionAlignment = PESECTALIGN - oh.SectionAlignment = PESECTALIGN - oh64.FileAlignment = PEFILEALIGN - oh.FileAlignment = PEFILEALIGN + oh64.SectionAlignment = uint32(PESECTALIGN) + oh.SectionAlignment = uint32(PESECTALIGN) + oh64.FileAlignment = uint32(PEFILEALIGN) + oh.FileAlignment = uint32(PEFILEALIGN) oh64.MajorOperatingSystemVersion = 4 oh.MajorOperatingSystemVersion = 4 oh64.MinorOperatingSystemVersion = 0 diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index ea213be7c7..8ae351df97 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -144,7 +144,7 @@ func archinit(ctxt *ld.Link) { *ld.FlagDataAddr = 0 } if *ld.FlagRound == -1 { - *ld.FlagRound = ld.PESECTALIGN + *ld.FlagRound = int(ld.PESECTALIGN) } }