]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: ignore SEH marking on PE objects
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 8 Nov 2020 02:20:36 +0000 (03:20 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Wed, 16 Dec 2020 00:08:40 +0000 (00:08 +0000)
Microsoft's linker looks at whether all input objects have an empty
section called @feat.00. If all of them do, then it enables SEH;
otherwise it doesn't enable that feature. So, since around the Windows
XP SP2 era, most tools that make PE objects just tack on that section,
so that it won't gimp Microsoft's linker logic. Go doesn't support SEH,
so in theory, none of this really matters to us. But actually, if the
linker tries to ingest an object with @feat.00 -- which are produced by
LLVM's resource compiler, for example -- it chokes because of the
IMAGE_SYM_ABSOLUTE section that it doesn't know how to deal with. Since
@feat.00 is just a marking anyway, skip IMAGE_SYM_ABSOLUTE sections that
are called @feat.00.

Change-Id: I1d7bfcf6001186c53e2c487c5ac251ca65efefee
Reviewed-on: https://go-review.googlesource.com/c/go/+/268239
Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Trust: Alex Brainman <alex.brainman@gmail.com>
Trust: Jason A. Donenfeld <Jason@zx2c4.com>

src/cmd/link/internal/loadpe/ldpe.go

index c72965dddc21fa32d23cdb38704976efafca1469..1e6f978531d6dab16e1a00d70d6291f290f810ca 100644 (file)
@@ -6,6 +6,7 @@
 package loadpe
 
 import (
+       "bytes"
        "cmd/internal/bio"
        "cmd/internal/objabi"
        "cmd/internal/sys"
@@ -359,6 +360,20 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
                if pesym.SectionNumber == IMAGE_SYM_DEBUG {
                        continue
                }
+               if pesym.SectionNumber == IMAGE_SYM_ABSOLUTE && bytes.Equal(pesym.Name[:], []byte("@feat.00")) {
+                       // Microsoft's linker looks at whether all input objects have an empty
+                       // section called @feat.00. If all of them do, then it enables SEH;
+                       // otherwise it doesn't enable that feature. So, since around the Windows
+                       // XP SP2 era, most tools that make PE objects just tack on that section,
+                       // so that it won't gimp Microsoft's linker logic. Go doesn't support SEH,
+                       // so in theory, none of this really matters to us. But actually, if the
+                       // linker tries to ingest an object with @feat.00 -- which are produced by
+                       // LLVM's resource compiler, for example -- it chokes because of the
+                       // IMAGE_SYM_ABSOLUTE section that it doesn't know how to deal with. Since
+                       // @feat.00 is just a marking anyway, skip IMAGE_SYM_ABSOLUTE sections that
+                       // are called @feat.00.
+                       continue
+               }
                var sect *pe.Section
                if pesym.SectionNumber > 0 {
                        sect = f.Sections[pesym.SectionNumber-1]