| // REQUIRES: x86 |
| // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t |
| // RUN: ld.lld --hash-style=sysv -shared %t -o %tout |
| // RUN: llvm-readobj --sections -r %tout | FileCheck %s |
| // RUN: llvm-objdump -d %tout | FileCheck %s --check-prefix=DIS |
| |
| leaq a@tlsld(%rip), %rdi |
| callq __tls_get_addr@PLT |
| leaq b@tlsld(%rip), %rdi |
| callq __tls_get_addr@PLT |
| leaq a@dtpoff(%rax), %rcx |
| leaq b@dtpoff(%rax), %rcx |
| .long b@dtpoff, 0 |
| leaq c@tlsgd(%rip), %rdi |
| rex64 |
| callq __tls_get_addr@PLT |
| leaq a@dtpoff(%rax), %rcx |
| // Initial Exec Model Code Sequence, II |
| movq c@gottpoff(%rip),%rax |
| movq %fs:(%rax),%rax |
| movabs $a@dtpoff, %rax |
| movabs $b@dtpoff, %rax |
| movabs $a@dtpoff, %rax |
| |
| .global a |
| .hidden a |
| .section .tbss,"awT",@nobits |
| .align 4 |
| a: |
| .long 0 |
| |
| .section .tbss,"awT",@nobits |
| .align 4 |
| b: |
| .long 0 |
| .global c |
| .section .tbss,"awT",@nobits |
| .align 4 |
| c: |
| .long 0 |
| |
| // Get the address of the got, and check that it has 4 entries. |
| |
| // CHECK: Sections [ |
| // CHECK: Name: .got ( |
| // CHECK-NEXT: Type: SHT_PROGBITS |
| // CHECK-NEXT: Flags [ |
| // CHECK-NEXT: SHF_ALLOC |
| // CHECK-NEXT: SHF_WRITE |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: Address: 0x24A0 |
| // CHECK-NEXT: Offset: |
| // CHECK-NEXT: Size: 40 |
| |
| // CHECK: Relocations [ |
| // CHECK: Section ({{.+}}) .rela.dyn { |
| // CHECK-NEXT: 0x24A0 R_X86_64_DTPMOD64 - 0x0 |
| // CHECK-NEXT: 0x24B0 R_X86_64_DTPMOD64 c 0x0 |
| // CHECK-NEXT: 0x24B8 R_X86_64_DTPOFF64 c 0x0 |
| // CHECK-NEXT: 0x24C0 R_X86_64_TPOFF64 c 0x0 |
| // CHECK-NEXT: } |
| |
| // 4457 = (0x24A0 + -4) - (0x1330 + 3) // PC relative offset to got entry. |
| // 4445 = (0x24B0 + -4) - (0x133c + 3) // PC relative offset to got entry. |
| // 4427 = (0x24B8 + -4) - (0x135e + 3) // PC relative offset to got entry. |
| // 4423 = (0x24C0 + -4) - (0x1372 + 3) // PC relative offset to got entry. |
| |
| // DIS: Disassembly of section .text: |
| // DIS-EMPTY: |
| // DIS-NEXT: <.text>: |
| // DIS-NEXT: 1330: {{.+}} leaq 4457(%rip), %rdi |
| // DIS-NEXT: {{.+}} callq |
| // DIS-NEXT: 133c: {{.+}} leaq 4445(%rip), %rdi |
| // DIS-NEXT: {{.+}} callq |
| // DIS-NEXT: {{.+}} leaq (%rax), %rcx |
| // DIS-NEXT: {{.+}} leaq 4(%rax), %rcx |
| // DIS-NEXT: 04 00 |
| // DIS-NEXT: 00 00 |
| // DIS-NEXT: 00 00 |
| // DIS-NEXT: 00 00 |
| // DIS-NEXT: 135e: {{.+}} leaq 4427(%rip), %rdi |
| // DIS-NEXT: {{.+}} callq |
| // DIS-NEXT: {{.+}} leaq (%rax), %rcx |
| // DIS-NEXT: 1372: {{.+}} movq 4423(%rip), %rax |
| // DIS-NEXT: {{.+}} movq %fs:(%rax), %rax |
| // DIS-NEXT: {{.+}} movabsq $0, %rax |
| // DIS-NEXT: {{.+}} movabsq $4, %rax |
| // DIS-NEXT: {{.+}} movabsq $0, %rax |