| // 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 -relocations %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: 0x30D0 |
| // CHECK-NEXT: Offset: |
| // CHECK-NEXT: Size: 40 |
| |
| // CHECK: Relocations [ |
| // CHECK: Section ({{.+}}) .rela.dyn { |
| // CHECK-NEXT: 0x30D0 R_X86_64_DTPMOD64 - 0x0 |
| // CHECK-NEXT: 0x30E0 R_X86_64_DTPMOD64 c 0x0 |
| // CHECK-NEXT: 0x30E8 R_X86_64_DTPOFF64 c 0x0 |
| // CHECK-NEXT: 0x30F0 R_X86_64_TPOFF64 c 0x0 |
| // CHECK-NEXT: } |
| |
| // 4297 = (0x20D0 + -4) - (0x1000 + 3) // PC relative offset to got entry. |
| // 4285 = (0x20D0 + -4) - (0x100c + 3) // PC relative offset to got entry. |
| // 4267 = (0x20E0 + -4) - (0x102e + 3) // PC relative offset to got entry. |
| // 4263 = (0x20F0 + -4) - (0x1042 + 3) // PC relative offset to got entry. |
| |
| // DIS: Disassembly of section .text: |
| // DIS-NEXT: .text: |
| // DIS-NEXT: 1000: {{.+}} leaq 8393(%rip), %rdi |
| // DIS-NEXT: 1007: {{.+}} callq |
| // DIS-NEXT: 100c: {{.+}} leaq 8381(%rip), %rdi |
| // DIS-NEXT: 1013: {{.+}} callq |
| // DIS-NEXT: 1018: {{.+}} leaq (%rax), %rcx |
| // DIS-NEXT: 101f: {{.+}} leaq 4(%rax), %rcx |
| // DIS-NEXT: 1026: 04 00 |
| // DIS-NEXT: 1028: 00 00 |
| // DIS-NEXT: 102a: 00 00 |
| // DIS-NEXT: 102c: 00 00 |
| // DIS-NEXT: 102e: {{.+}} leaq 8363(%rip), %rdi |
| // DIS-NEXT: 1035: {{.+}} callq |
| // DIS-NEXT: 103b: {{.+}} leaq (%rax), %rcx |
| // DIS-NEXT: 1042: {{.+}} movq 8359(%rip), %rax |
| // DIS-NEXT: 1049: {{.+}} movq %fs:(%rax), %rax |
| // DIS-NEXT: 104d: {{.+}} movabsq $0, %rax |
| // DIS-NEXT: 1057: {{.+}} movabsq $4, %rax |
| // DIS-NEXT: 1061: {{.+}} movabsq $0, %rax |