1// REQUIRES: x86 2// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o 3// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o 4// RUN: ld.lld -shared %t2.o -soname=t2.so -o %t2.so 5// RUN: ld.lld %t.o %t2.so -o %t 6// RUN: llvm-readobj -S -r %t | FileCheck %s 7// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %t | FileCheck --check-prefix=DISASM %s 8// RUN: ld.lld -shared %t.o %t2.so -o %t 9// RUN: llvm-readobj -S -r %t | FileCheck --check-prefix=CHECKSHARED %s 10// RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=DISASMSHARED %s 11// RUN: ld.lld -pie %t.o %t2.so -o %t 12// RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=DISASMPIE %s 13 14// CHECK: Name: .plt 15// CHECK-NEXT: Type: SHT_PROGBITS 16// CHECK-NEXT: Flags [ 17// CHECK-NEXT: SHF_ALLOC 18// CHECK-NEXT: SHF_EXECINSTR 19// CHECK-NEXT: ] 20// CHECK-NEXT: Address: 0x4011E0 21// CHECK-NEXT: Offset: 22// CHECK-NEXT: Size: 48 23// CHECK-NEXT: Link: 0 24// CHECK-NEXT: Info: 0 25// CHECK-NEXT: AddressAlignment: 16 26 27// CHECK: Name: .got.plt 28// CHECK-NEXT: Type: SHT_PROGBITS 29// CHECK-NEXT: Flags [ 30// CHECK-NEXT: SHF_ALLOC 31// CHECK-NEXT: SHF_WRITE 32// CHECK-NEXT: ] 33// CHECK-NEXT: Address: 0x403278 34// CHECK-NEXT: Offset: 0x278 35// CHECK-NEXT: Size: 20 36// CHECK-NEXT: Link: 0 37// CHECK-NEXT: Info: 0 38// CHECK-NEXT: AddressAlignment: 4 39// CHECK-NEXT: EntrySize: 0 40 41// First 3 slots of .got.plt are reserved. 42// &.got.plt[3] = 0x403278 + 12 = 0x403284 43// &.got.plt[4] = 0x403278 + 16 = 0x403288 44// CHECK: Relocations [ 45// CHECK-NEXT: Section ({{.*}}) .rel.plt { 46// CHECK-NEXT: 0x403284 R_386_JUMP_SLOT bar 0x0 47// CHECK-NEXT: 0x403288 R_386_JUMP_SLOT zed 0x0 48// CHECK-NEXT: } 49// CHECK-NEXT: ] 50 51// DISASM: <local>: 52// DISASM-NEXT: 4011bc: 53// DISASM-NEXT: 4011be: 54// DISASM: <_start>: 55// DISASM-NEXT: 4011c0: jmp 0x4011f0 <bar@plt> 56// DISASM-NEXT: 4011c5: jmp 0x4011f0 <bar@plt> 57// DISASM-NEXT: 4011ca: jmp 0x401200 <zed@plt> 58// DISASM-NEXT: 4011cf: jmp 0x4011bc <local> 59 60// DISASM: Disassembly of section .plt: 61// DISASM-EMPTY: 62// DISASM-NEXT: <.plt>: 63/// Push .got.plt[1], then jump to .got.plt[2] 64// DISASM-NEXT: 4011e0: pushl 0x40327c 65// DISASM-NEXT: jmpl *0x403280 66// DISASM-NEXT: nop 67// DISASM-NEXT: nop 68// DISASM-NEXT: nop 69// DISASM-NEXT: nop 70// DISASM-EMPTY: 71// DISASM-NEXT: <bar@plt>: 72/// .got.plt[3] = 0x403278 + 12 = 0x403284 73// DISASM-NEXT: 4011f0: jmpl *0x403284 74// DISASM-NEXT: pushl $0x0 75// DISASM-NEXT: jmp 0x4011e0 <.plt> 76// DISASM-EMPTY: 77// DISASM-NEXT: <zed@plt>: 78/// .got.plt[4] = 0x403278 + 16 = 0x403288 79// DISASM-NEXT: 401200: jmpl *0x403288 80// DISASM-NEXT: pushl $0x8 81// DISASM-NEXT: jmp 0x4011e0 <.plt> 82 83// CHECKSHARED: Name: .plt 84// CHECKSHARED-NEXT: Type: SHT_PROGBITS 85// CHECKSHARED-NEXT: Flags [ 86// CHECKSHARED-NEXT: SHF_ALLOC 87// CHECKSHARED-NEXT: SHF_EXECINSTR 88// CHECKSHARED-NEXT: ] 89// CHECKSHARED-NEXT: Address: 0x1200 90// CHECKSHARED-NEXT: Offset: 0x200 91// CHECKSHARED-NEXT: Size: 48 92// CHECKSHARED-NEXT: Link: 0 93// CHECKSHARED-NEXT: Info: 0 94// CHECKSHARED-NEXT: AddressAlignment: 16 95// CHECKSHARED-NEXT: EntrySize: 0 96// CHECKSHARED-NEXT: } 97// CHECKSHARED: Name: .got.plt 98// CHECKSHARED-NEXT: Type: SHT_PROGBITS 99// CHECKSHARED-NEXT: Flags [ 100// CHECKSHARED-NEXT: SHF_ALLOC 101// CHECKSHARED-NEXT: SHF_WRITE 102// CHECKSHARED-NEXT: ] 103// CHECKSHARED-NEXT: Address: 0x3290 104// CHECKSHARED-NEXT: Offset: 0x290 105// CHECKSHARED-NEXT: Size: 20 106// CHECKSHARED-NEXT: Link: 0 107// CHECKSHARED-NEXT: Info: 0 108// CHECKSHARED-NEXT: AddressAlignment: 4 109// CHECKSHARED-NEXT: EntrySize: 0 110// CHECKSHARED-NEXT: } 111 112// 0x3000 + got.plt.reserved(12) = 0x300C 113// 0x3000 + got.plt.reserved(12) + 4 = 0x3010 114// CHECKSHARED: Relocations [ 115// CHECKSHARED-NEXT: Section ({{.*}}) .rel.plt { 116// CHECKSHARED-NEXT: 0x329C R_386_JUMP_SLOT bar 0x0 117// CHECKSHARED-NEXT: 0x32A0 R_386_JUMP_SLOT zed 0x0 118// CHECKSHARED-NEXT: } 119// CHECKSHARED-NEXT: ] 120 121// DISASMSHARED: <local>: 122// DISASMSHARED-NEXT: 11e0: 123// DISASMSHARED-NEXT: 11e2: 124// DISASMSHARED: <_start>: 125// DISASMSHARED-NEXT: 11e4: jmp 0x1210 <bar@plt> 126// DISASMSHARED-NEXT: jmp 0x1210 <bar@plt> 127// DISASMSHARED-NEXT: jmp 0x1220 <zed@plt> 128// DISASMSHARED-NEXT: jmp 0x11e0 <local> 129// DISASMSHARED-EMPTY: 130// DISASMSHARED-NEXT: Disassembly of section .plt: 131// DISASMSHARED-EMPTY: 132// DISASMSHARED-NEXT: <.plt>: 133// DISASMSHARED-NEXT: 1200: pushl 4(%ebx) 134// DISASMSHARED-NEXT: jmpl *8(%ebx) 135// DISASMSHARED-NEXT: nop 136// DISASMSHARED-NEXT: nop 137// DISASMSHARED-NEXT: nop 138// DISASMSHARED-NEXT: nop 139// DISASMSHARED: <bar@plt>: 140// DISASMSHARED-NEXT: 1210: jmpl *12(%ebx) 141// DISASMSHARED-NEXT: pushl $0 142// DISASMSHARED-NEXT: jmp 0x1200 <.plt> 143// DISASMSHARED: <zed@plt>: 144// DISASMSHARED-NEXT: 1220: jmpl *16(%ebx) 145// DISASMSHARED-NEXT: pushl $8 146// DISASMSHARED-NEXT: jmp 0x1200 <.plt> 147 148// DISASMPIE: Disassembly of section .plt: 149// DISASMPIE-EMPTY: 150// DISASMPIE-NEXT: <.plt>: 151// DISASMPIE-NEXT: 11e0: pushl 4(%ebx) 152// DISASMPIE-NEXT: jmpl *8(%ebx) 153// DISASMPIE-NEXT: nop 154// DISASMPIE-NEXT: nop 155// DISASMPIE-NEXT: nop 156// DISASMPIE-NEXT: nop 157// DISASMPIE-EMPTY: 158// DISASMPIE-NEXT: <bar@plt>: 159// DISASMPIE-NEXT: 11f0: jmpl *12(%ebx) 160// DISASMPIE-NEXT: pushl $0 161// DISASMPIE-NEXT: jmp 0x11e0 <.plt> 162// DISASMPIE-EMPTY: 163// DISASMPIE-NEXT: <zed@plt>: 164// DISASMPIE-NEXT: 1200: jmpl *16(%ebx) 165// DISASMPIE-NEXT: pushl $8 166// DISASMPIE-NEXT: jmp 0x11e0 <.plt> 167 168local: 169.long 0 170 171.global _start 172_start: 173 jmp bar@PLT 174 jmp bar@PLT 175 jmp zed@PLT 176 jmp local@plt 177