]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/ld: fix inconsistency in internal linking of common symbols.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 10 Apr 2013 05:15:49 +0000 (07:15 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Wed, 10 Apr 2013 05:15:49 +0000 (07:15 +0200)
Some variables declared in C could end up as undefined symbols
in the final binary and have null address.

Fixes #5114.
Fixes #5227.

R=golang-dev, iant, ajstarks, dave, r
CC=golang-dev
https://golang.org/cl/8602044

misc/cgo/test/cgo_test.go
misc/cgo/test/issue5227.go [new file with mode: 0644]
src/cmd/ld/lib.c

index 1901d5d086f78d47c5e171da71016909a223cfa1..f985996da53f6c526fc4d6cb481ee969073c01ad 100644 (file)
@@ -37,5 +37,6 @@ func Test3729(t *testing.T)                { test3729(t) }
 func Test3775(t *testing.T)                { test3775(t) }
 func TestCthread(t *testing.T)             { testCthread(t) }
 func TestCallbackCallers(t *testing.T)     { testCallbackCallers(t) }
+func Test5227(t *testing.T)                { test5227(t) }
 
 func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
diff --git a/misc/cgo/test/issue5227.go b/misc/cgo/test/issue5227.go
new file mode 100644 (file)
index 0000000..d89a1ca
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2013 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.
+
+// Issue 5227: linker incorrectly treats common symbols and
+// leaves them undefined.
+
+package cgotest
+
+/*
+typedef struct {
+        int Count;
+} Fontinfo;
+
+Fontinfo SansTypeface;
+
+extern void init();
+
+Fontinfo loadfont() {
+        Fontinfo f;
+        return f;
+}
+
+void init() {
+        SansTypeface = loadfont();
+}
+*/
+import "C"
+
+import "testing"
+
+func test5227(t *testing.T) {
+       C.init()
+}
+
+func selectfont() C.Fontinfo {
+       return C.SansTypeface
+}
index 84777b1a92b57393f0662c645dfe0d9e635023b1..d22c0870f671d2e343001b6a2edcc57487b2af5d 100644 (file)
@@ -311,6 +311,9 @@ loadlib(void)
        // Switch to internal.
        if(linkmode == LinkAuto) {
                linkmode = LinkInternal;
+       }
+
+       if(linkmode == LinkInternal) {
                // Drop all the cgo_import_static declarations.
                // Turns out we won't be needing them.
                for(s = allsym; s != S; s = s->allsym)