]> Cypherpunks repositories - gostls13.git/commit
cmd/ld: emit TLS relocations during external linking
authorIan Lance Taylor <iant@golang.org>
Wed, 27 Mar 2013 20:27:35 +0000 (13:27 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 27 Mar 2013 20:27:35 +0000 (13:27 -0700)
commit30e29ee9b6b71a4c40f781c513a8680e8f2c4f64
tree4a9fcc5e648792965796691618f7c69524820f5b
parent23482db9f1d6cc4ad7a74c9f6f807954c39ab701
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
22 files changed:
misc/cgo/testtls/tls.go [new file with mode: 0644]
misc/cgo/testtls/tls_test.go [new file with mode: 0644]
misc/cgo/testtls/tls_unix.c [new file with mode: 0644]
src/cmd/5l/5.out.h
src/cmd/6l/6.out.h
src/cmd/6l/asm.c
src/cmd/6l/obj.c
src/cmd/6l/span.c
src/cmd/8a/a.y
src/cmd/8a/y.tab.c
src/cmd/8a/y.tab.h
src/cmd/8l/8.out.h
src/cmd/8l/asm.c
src/cmd/8l/obj.c
src/cmd/8l/pass.c
src/cmd/8l/span.c
src/cmd/dist/buildruntime.c
src/cmd/ld/data.c
src/cmd/ld/elf.c
src/cmd/ld/lib.h
src/cmd/ld/symtab.c
src/run.bash