summaryrefslogtreecommitdiff
path: root/src/run.bash
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2013-03-27 13:27:35 -0700
committerIan Lance Taylor <iant@golang.org>2013-03-27 13:27:35 -0700
commite74e168c8c2607d247dbfbc19f5c17e7906d154e (patch)
tree2f25e4bebec553130cad87443d74a9d319c0d8e8 /src/run.bash
parentf5dffe94e2f6e735aaafae43ad0d51965953a471 (diff)
downloadgo-e74e168c8c2607d247dbfbc19f5c17e7906d154e.tar.gz
cmd/ld: emit TLS relocations during external linking
This CL was written by rsc. I just tweaked 8l. This CL adds TLS relocation to the ELF .o file we write during external linking, so that the host linker (gcc) can decide the final location of m and g. Similar relocations are not necessary on OS X because we use an alternate program start-time mechanism to acquire thread-local storage. Similar relocations are not necessary on ARM or Plan 9 or Windows because external linking mode is not yet supported on those systems. On almost all ELF systems, the references we use are like %fs:-0x4 or %gs:-0x4, which we write in 6a/8a as -0x4(FS) or -0x4(GS). On Linux/ELF, however, Xen's lack of support for this mode forced us long ago to use a two-instruction sequence: first we load %gs:0x0 into a register r, and then we use -0x4(r). (The ELF program loader arranges that %gs:0x0 contains a regular pointer to that same memory location.) In order to relocate those -0x4(r) references, the linker must know where they are. This CL adds the equivalent notation -0x4(r)(GS*1) for this purpose: it assembles to the same encoding as -0x4(r) but the (GS*1) indicates to the linker that this is one of those thread-local references that needs relocation. Thanks to Elias Naur for reminding me about this missing piece and also for writing the test. R=r CC=golang-dev https://codereview.appspot.com/7891047
Diffstat (limited to 'src/run.bash')
-rwxr-xr-xsrc/run.bash8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/run.bash b/src/run.bash
index b7c89d96a..df5b95b0e 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -83,8 +83,14 @@ set -e
go test -ldflags '-linkmode=auto'
go test -ldflags '-linkmode=internal'
case "$GOHOSTOS-$GOARCH" in
-darwin-386 | darwin-amd64 | freebsd-386 | freebsd-amd64 | linux-386 | linux-amd64 | netbsd-386 | netbsd-amd64 | openbsd-386 | openbsd-amd64)
+darwin-386 | darwin-amd64 | openbsd-386 | openbsd-amd64)
+ # test linkmode=external, but __thread not supported, so skip testtls.
go test -ldflags '-linkmode=external'
+ ;;
+freebsd-386 | freebsd-amd64 | linux-386 | linux-amd64 | netbsd-386 | netbsd-amd64)
+ go test -ldflags '-linkmode=external'
+ go test -ldflags '-linkmode=auto' ../testtls
+ go test -ldflags '-linkmode=external' ../testtls
esac
) || exit $?