1// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t 2// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/shared.s -o %t2 3// RUN: ld.lld %t2 -o %t2.so -shared 4// RUN: ld.lld %t %t2.so -o %t3 5// RUN: llvm-readobj -s %t3 | FileCheck --check-prefix=SEC %s 6// RUN: llvm-objdump -s -d %t3 | FileCheck %s 7// REQUIRES: x86 8 9// SEC: Name: .plt 10// SEC-NEXT: Type: SHT_PROGBITS 11// SEC-NEXT: Flags [ 12// SEC-NEXT: SHF_ALLOC 13// SEC-NEXT: SHF_EXECINSTR 14// SEC-NEXT: ] 15// SEC-NEXT: Address: 0x201030 16// SEC-NEXT: Offset: 0x1030 17// SEC-NEXT: Size: 48 18 19// SEC: Name: .got.plt 20// SEC-NEXT: Type: SHT_PROGBITS 21// SEC-NEXT: Flags [ 22// SEC-NEXT: SHF_ALLOC 23// SEC-NEXT: SHF_WRITE 24// SEC-NEXT: ] 25// SEC-NEXT: Address: 0x202000 26// SEC-NEXT: Offset: 0x2000 27// SEC-NEXT: Size: 40 28// SEC-NEXT: Link: 0 29// SEC-NEXT: Info: 0 30// SEC-NEXT: AddressAlignment: 8 31// SEC-NEXT: EntrySize: 0 32// SEC-NEXT: } 33 34// SEC: Name: .got 35// SEC-NEXT: Type: SHT_PROGBITS 36// SEC-NEXT: Flags [ 37// SEC-NEXT: SHF_ALLOC 38// SEC-NEXT: SHF_WRITE 39// SEC-NEXT: ] 40// SEC-NEXT: Address: 0x2030F0 41// SEC-NEXT: Offset: 42// SEC-NEXT: Size: 8 43// SEC-NEXT: Link: 0 44// SEC-NEXT: Info: 0 45// SEC-NEXT: AddressAlignment: 8 46// SEC-NEXT: EntrySize: 0 47// SEC-NEXT: } 48 49.section .text,"ax",@progbits,unique,1 50.global _start 51_start: 52 call lulz 53 54.section .text,"ax",@progbits,unique,2 55.zero 4 56.global lulz 57lulz: 58 nop 59 60// CHECK: Disassembly of section .text: 61// CHECK-NEXT: _start: 62// CHECK-NEXT: 201000: e8 04 00 00 00 callq 4 63// CHECK-NEXT: 201005: 64 65// CHECK: lulz: 66// CHECK-NEXT: 201009: 90 nop 67 68 69.section .text2,"ax",@progbits 70.global R_X86_64_32 71R_X86_64_32: 72 movl $R_X86_64_32, %edx 73 74// FIXME: this would be far more self evident if llvm-objdump printed 75// constants in hex. 76// CHECK: Disassembly of section .text2: 77// CHECK-NEXT: R_X86_64_32: 78// CHECK-NEXT: 20100a: {{.*}} movl $2101258, %edx 79 80.section .R_X86_64_32S,"ax",@progbits 81.global R_X86_64_32S 82R_X86_64_32S: 83 movq lulz - 0x100000, %rdx 84 85// CHECK: Disassembly of section .R_X86_64_32S: 86// CHECK-NEXT: R_X86_64_32S: 87// CHECK-NEXT: {{.*}}: {{.*}} movq 1052681, %rdx 88 89.section .R_X86_64_PC32,"ax",@progbits 90.global R_X86_64_PC32 91R_X86_64_PC32: 92 call bar 93 movl $bar, %eax 94//16 is a size of PLT[0] 95// 0x201030 + 16 - (0x201017 + 5) = 20 96// CHECK: Disassembly of section .R_X86_64_PC32: 97// CHECK-NEXT: R_X86_64_PC32: 98// CHECK-NEXT: 201017: {{.*}} callq 36 99// CHECK-NEXT: 20101c: {{.*}} movl $2101312, %eax 100 101.section .R_X86_64_32S_2,"ax",@progbits 102.global R_X86_64_32S_2 103R_X86_64_32S_2: 104 mov bar2, %eax 105// plt is at 0x201030. The second plt entry is at 0x201050 == 69712 106// CHECK: Disassembly of section .R_X86_64_32S_2: 107// CHECK-NEXT: R_X86_64_32S_2: 108// CHECK-NEXT: 201021: {{.*}} movl 2101328, %eax 109 110.section .R_X86_64_64,"a",@progbits 111.global R_X86_64_64 112R_X86_64_64: 113 .quad R_X86_64_64 114 115// CHECK: Contents of section .R_X86_64_64: 116// CHECK-NEXT: 2001c8 c8012000 00000000 117 118.section .R_X86_64_GOTPCREL,"a",@progbits 119.global R_X86_64_GOTPCREL 120R_X86_64_GOTPCREL: 121 .long zed@gotpcrel 122 123// 0x2020F8 - 0x2001D8 = 7952 124// 7952 = 0x101f0000 in little endian 125// CHECK: Contents of section .R_X86_64_GOTPCREL 126// CHECK-NEXT: 2001d0 202f0000 127 128.section .R_X86_64_GOT32,"a",@progbits 129.global R_X86_64_GOT32 130R_X86_64_GOT32: 131 .long zed@got 132 133// CHECK: Contents of section .R_X86_64_GOT32: 134// CHECK-NEXT: f8ffffff 135 136 137// CHECK: Contents of section .R_X86_64_GOT64: 138// CHECK-NEXT: f8ffffff ffffffff 139.section .R_X86_64_GOT64,"a",@progbits 140.global R_X86_64_GOT64 141R_X86_64_GOT64: 142 .quad zed@got 143