]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: do not use _GLOBAL_OFFSET_TABLE_ on windows/386
authorAlex Brainman <alex.brainman@gmail.com>
Sat, 24 Nov 2018 07:02:29 +0000 (18:02 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Tue, 27 Nov 2018 08:52:43 +0000 (08:52 +0000)
When building windows/386 executable that imports "plugin" package,
cmd/link adds reference to DLL with blank name. Running

objdump -x a.exe

reports

...
The Import Tables (interpreted .idata section contents)
...
DLL Name:
vma:  Hint/Ord Member-Name Bound-To
25308a     0  _GLOBAL_OFFSET_TABLE_
...

So, obviously, executable cannot run, because Windows complains
that it cannot find DLL when trying to run it.

Stop using _GLOBAL_OFFSET_TABLE_ on windows/386.

Fixes #28789

Change-Id: Idd489eafd998f6e329f40c5d90a2a8965ab1d873
Reviewed-on: https://go-review.googlesource.com/c/151139
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/link/internal/ld/lib.go
src/plugin/plugin_test.go [new file with mode: 0644]

index 3038b7957444b18daf370aa3c685dd4eb70f0350..458d7a43175d0dbabf627d5dd5dd2442577711f3 100644 (file)
@@ -588,8 +588,8 @@ func (ctxt *Link) loadlib() {
                }
        }
 
-       if ctxt.Arch == sys.Arch386 {
-               if (ctxt.BuildMode == BuildModeCArchive && ctxt.IsELF) || (ctxt.BuildMode == BuildModeCShared && ctxt.HeadType != objabi.Hwindows) || ctxt.BuildMode == BuildModePIE || ctxt.DynlinkingGo() {
+       if ctxt.Arch == sys.Arch386 && ctxt.HeadType != objabi.Hwindows {
+               if (ctxt.BuildMode == BuildModeCArchive && ctxt.IsELF) || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE || ctxt.DynlinkingGo() {
                        got := ctxt.Syms.Lookup("_GLOBAL_OFFSET_TABLE_", 0)
                        got.Type = sym.SDYNIMPORT
                        got.Attr |= sym.AttrReachable
diff --git a/src/plugin/plugin_test.go b/src/plugin/plugin_test.go
new file mode 100644 (file)
index 0000000..6dfe148
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !nacl
+
+package plugin_test
+
+import (
+       _ "plugin"
+       "testing"
+)
+
+func TestPlugin(t *testing.T) {
+       // This test makes sure that executable that imports plugin
+       // package can actually run. See issue #28789 for details.
+}