]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: set pe section and file alignment to 0 during external linking
authorAlex Brainman <alex.brainman@gmail.com>
Sun, 5 Feb 2017 03:19:19 +0000 (14:19 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Thu, 16 Feb 2017 04:33:17 +0000 (04:33 +0000)
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 <iant@golang.org>
src/cmd/link/internal/amd64/obj.go
src/cmd/link/internal/ld/pe.go
src/cmd/link/internal/x86/obj.go

index 9646b6011502b47eb7b90d38ae7770f7a08dcb9b..1ecade890666793efa0b5b6443b1353ea812e1bb 100644 (file)
@@ -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)
                }
        }
 
index 20855286d775072890c7246d966ebd2979d412ba..e3ebc3ae28705cc17eb3817d82fbe15bfc06b722 100644 (file)
@@ -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
index ea213be7c7b57dc5a2872bbbf8604ff7b5560468..8ae351df9767c8ea35de37ea2a5552e52a21eba9 100644 (file)
@@ -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)
                }
        }