• Ian Lance Taylor's avatar
    cmd/ld: emit TLS relocations during external linking · 30e29ee9
    Ian Lance Taylor authored
    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
    30e29ee9
tls.go 547 Bytes