逆向-beginners之C++ 线程本地存储TLS

#include
#include

/*
 * 线程本地存储(Thread Local Storage, TLS)是一种在线程内部共享数据的数据交换区域。
 *
 * 每个线程都可以在这个区域保存它们要在内部共享的数据。
 *
 * 一个比较知名的例子是C语言的全局变量errno。对于errno这类的全局变量来说,如果多线程进程的某一个线程对其进行了
 * 修改,那么这个变量就会影响到其他所有的线程。这显然和实际需求相悖,因此全局变量errno必须保存在TLS中。
 *
 * 为解决这个矛盾,C++11标准新增了一个限定符thread_local。它能将指定变量和特定的线程联系起来。由它限定的变量被
 * 初始化,并且会被保存在TLS中。
 */ 

thread_local int tmp = 3;

int main()
{
    std::cout << tmp << std::endl;
}


#if 0
/*
 * intel
 */
00000000000011a9

:
    11a9:    f3 0f 1e fa              endbr64 
    11ad:    55                       push   %rbp
    11ae:    48 89 e5                 mov    %rsp,%rbp
    11b1:    64 8b 04 25 fc ff ff     mov    %fs:0xfffffffffffffffc,%eax
    11b8:    ff 
    11b9:    89 c6                    mov    %eax,%esi
    11bb:    48 8d 3d 7e 2e 00 00     lea    0x2e7e(%rip),%rdi        # 4040 <_ZSt4cout@@GLIBCXX_3.4>
    11c2:    e8 e9 fe ff ff           callq  10b0 <_ZNSolsEi@plt>
    11c7:    48 89 c2                 mov    %rax,%rdx
    11ca:    48 8b 05 ff 2d 00 00     mov    0x2dff(%rip),%rax        # 3fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>
    11d1:    48 89 c6                 mov    %rax,%rsi
    11d4:    48 89 d7                 mov    %rdx,%rdi
    11d7:    e8 b4 fe ff ff           callq  1090 <_ZNSolsEPFRSoS_E@plt>
    11dc:    b8 00 00 00 00           mov    $0x0,%eax
    11e1:    5d                       pop    %rbp
    11e2:    c3                       retq   

/*
 * arm
 */
00000000004008bc

:
  4008bc:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  4008c0:    910003fd     mov    x29, sp
  4008c4:    d53bd040     mrs    x0, tpidr_el0
  4008c8:    91400000     add    x0, x0, #0x0, lsl #12
  4008cc:    91004000     add    x0, x0, #0x10
  4008d0:    b9400001     ldr    w1, [x0]
  4008d4:    b0000080     adrp    x0, 411000 <_ZNSolsEi@GLIBCXX_3.4>
  4008d8:    91016000     add    x0, x0, #0x58
  4008dc:    97ffff95     bl    400730 <_ZNSolsEi@plt>
  4008e0:    aa0003e2     mov    x2, x0
  4008e4:    90000000     adrp    x0, 400000
  4008e8:    911ec000     add    x0, x0, #0x7b0
  4008ec:    aa0003e1     mov    x1, x0
  4008f0:    aa0203e0     mov    x0, x2
  4008f4:    97ffffab     bl    4007a0 <_ZNSolsEPFRSoS_E@plt>
  4008f8:    52800000     mov    w0, #0x0                       // #0
  4008fc:    a8c17bfd     ldp    x29, x30, [sp], #16
  400900:    d65f03c0     ret


#endif

你可能感兴趣的:(Assembly,汇编)