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 | 30e29ee9b6b71a4c40f781c513a8680e8f2c4f64 (patch) | |
| tree | 4a9fcc5e648792965796691618f7c69524820f5b /src/run.bash | |
| parent | 23482db9f1d6cc4ad7a74c9f6f807954c39ab701 (diff) | |
| download | go-30e29ee9b6b71a4c40f781c513a8680e8f2c4f64.tar.xz | |
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://golang.org/cl/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 b7c89d96a7..df5b95b0e1 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 $? |
