summaryrefslogtreecommitdiff
path: root/misc/cgo
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2014-01-30 09:25:47 -0800
committerIan Lance Taylor <iant@golang.org>2014-01-30 09:25:47 -0800
commit41b2f193c1eec265104e772b35d9e812619aeda1 (patch)
treea9f43d1d771b9a4ec4943d755f91f60be6611b41 /misc/cgo
parent068f3ccb77937b10da44614e035d07d9a797f6ab (diff)
downloadgo-41b2f193c1eec265104e772b35d9e812619aeda1.tar.gz
cmd/ld: fix bug with "runtime/cgo" in external link mode
In external link mode the linker explicitly adds the string constant "runtime/cgo". It adds the string constant using the same symbol name as the compiler, but a different format. The compiler assumes that the string data immediately follows the string header, but the linker puts the two in different sections. The result is bad string data when the compiler sees "runtime/cgo" used as a string constant. The compiler assumption is in datastring in [568]g/gobj.c. The linker layout is in addstrdata in ld/data.c. The compiler assumption is valid for string literals. The linker is not creating a string literal, so its assumption is also valid. There are a few ways to avoid this problem. This patch fixes it by only doing the fake import of runtime/cgo if necessary, and by only creating the string symbol if necessary. Fixes issue 7234. LGTM=dvyukov R=golang-codereviews, dvyukov, bradfitz CC=golang-codereviews https://codereview.appspot.com/58410043
Diffstat (limited to 'misc/cgo')
-rw-r--r--misc/cgo/test/issue7234_test.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/misc/cgo/test/issue7234_test.go b/misc/cgo/test/issue7234_test.go
new file mode 100644
index 000000000..713dade4c
--- /dev/null
+++ b/misc/cgo/test/issue7234_test.go
@@ -0,0 +1,21 @@
+// Copyright 2014 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.
+
+package cgotest
+
+import "testing"
+
+// This test actually doesn't have anything to do with cgo. It is a
+// test of http://golang.org/issue/7234, a compiler/linker bug in
+// handling string constants when using -linkmode=external. The test
+// is in this directory because we routinely test -linkmode=external
+// here.
+
+var v7234 = [...]string{"runtime/cgo"}
+
+func TestIssue7234(t *testing.T) {
+ if v7234[0] != "runtime/cgo" {
+ t.Errorf("bad string constant %q", v7234[0])
+ }
+}