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: 0x11030 16// SEC-NEXT: Offset: 0x1030 17// SEC-NEXT: Size: 48 18 19// SEC: Name: .got 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: 0x120F0 26// SEC-NEXT: Offset: 27// SEC-NEXT: Size: 8 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.plt 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: 0x13000 41// SEC-NEXT: Offset: 0x3000 42// SEC-NEXT: Size: 40 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: 11000: e8 04 00 00 00 callq 4 63// CHECK-NEXT: 11005: 64 65// CHECK: lulz: 66// CHECK-NEXT: 11009: 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: 1100a: {{.*}} movl $69642, %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 -978935, %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// 0x11030 + 16 - (0x11017 + 5) = 20 96// CHECK: Disassembly of section .R_X86_64_PC32: 97// CHECK-NEXT: R_X86_64_PC32: 98// CHECK-NEXT: 11017: {{.*}} callq 36 99// CHECK-NEXT: 1101c: {{.*}} movl $69696, %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 0x11030. The second plt entry is at 0x11050 == 69712 106// CHECK: Disassembly of section .R_X86_64_32S_2: 107// CHECK-NEXT: R_X86_64_32S_2: 108// CHECK-NEXT: 11021: {{.*}} movl 69712, %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: 101c8 c8010100 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// 0x120F8 - 0x101D8 = 7952 124// 7952 = 0x101f0000 in little endian 125// CHECK: Contents of section .R_X86_64_GOTPCREL 126// CHECK-NEXT: 101d0 201f0000 127