diff options
author | Ian Lance Taylor <iant@golang.org> | 2013-03-27 13:27:35 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2013-03-27 13:27:35 -0700 |
commit | e74e168c8c2607d247dbfbc19f5c17e7906d154e (patch) | |
tree | 2f25e4bebec553130cad87443d74a9d319c0d8e8 /src/run.bash | |
parent | f5dffe94e2f6e735aaafae43ad0d51965953a471 (diff) | |
download | go-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-x | src/run.bash | 8 |
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 $? |