rebased to master after sw 3rd party completed
[dyninst.git] / dyninstAPI_RT / src / RTtlsgetaddr-x86_64.S
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 /*
32  * This function is used to help support TLS when rewriting static binaries.
33  * It is originally provided by the dynamic linker (which is unavailable to
34  * static binaries).  One TLS model is to call the function with a module
35  * index in order to retrieve a TLS variable (see general dynamic). This model
36  * is unnecessarily general for static binaries but does exist in some non-PIC
37  * relocatable files. The GNU ld approach is to perform code transformations to
38  * relax the TLS model. In order to keep the rewriter for static binaries
39  * simple, the approach of emulating a call to ___tls_get_addr was used instead
40  * of implementing these link-time code transformations.
41  */
42
43
44 #if defined(DYNINST_RT_STATIC_LIB)
45 .text 
46 .globl ___tls_get_addr
47 .globl __tls_get_addr
48
49 __tls_get_addr:
50 ___tls_get_addr:
51     mov (%rdi), %rax /* Get the TLS offset of the variable */
52     add %fs:0, %rax /* Get the absolute address of the variable */
53     ret
54
55 #endif
56
57 .section .note.GNU-stack,"",@progbits
58