1// REQUIRES: x86 2// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o 3// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o 4// RUN: ld.lld -shared -soname=so %t2.o -o %t2.so 5// RUN: ld.lld -shared %t.o %t2.so -o %t 6// RUN: ld.lld %t.o %t2.so -o %t3 7// RUN: llvm-readobj -S -r %t | FileCheck %s 8// RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefix=DISASM %s 9// RUN: llvm-readobj -S -r %t3 | FileCheck --check-prefix=CHECK2 %s 10// RUN: llvm-objdump -d --no-show-raw-insn %t3 | FileCheck --check-prefix=DISASM2 %s 11 12// CHECK: Name: .plt 13// CHECK-NEXT: Type: SHT_PROGBITS 14// CHECK-NEXT: Flags [ 15// CHECK-NEXT: SHF_ALLOC 16// CHECK-NEXT: SHF_EXECINSTR 17// CHECK-NEXT: ] 18// CHECK-NEXT: Address: 0x1320 19// CHECK-NEXT: Offset: 20// CHECK-NEXT: Size: 64 21// CHECK-NEXT: Link: 0 22// CHECK-NEXT: Info: 0 23// CHECK-NEXT: AddressAlignment: 16 24 25// CHECK: Relocations [ 26// CHECK-NEXT: Section ({{.*}}) .rela.plt { 27// CHECK-NEXT: 0x3438 R_X86_64_JUMP_SLOT bar 0x0 28// CHECK-NEXT: 0x3440 R_X86_64_JUMP_SLOT zed 0x0 29// CHECK-NEXT: 0x3448 R_X86_64_JUMP_SLOT _start 0x0 30// CHECK-NEXT: } 31// CHECK-NEXT: ] 32 33// CHECK2: Name: .plt 34// CHECK2-NEXT: Type: SHT_PROGBITS 35// CHECK2-NEXT: Flags [ 36// CHECK2-NEXT: SHF_ALLOC 37// CHECK2-NEXT: SHF_EXECINSTR 38// CHECK2-NEXT: ] 39// CHECK2-NEXT: Address: 0x2012E0 40// CHECK2-NEXT: Offset: 41// CHECK2-NEXT: Size: 48 42// CHECK2-NEXT: Link: 0 43// CHECK2-NEXT: Info: 0 44// CHECK2-NEXT: AddressAlignment: 16 45 46// CHECK2: Relocations [ 47// CHECK2-NEXT: Section ({{.*}}) .rela.plt { 48// CHECK2-NEXT: 0x2033F8 R_X86_64_JUMP_SLOT bar 0x0 49// CHECK2-NEXT: 0x203400 R_X86_64_JUMP_SLOT zed 0x0 50// CHECK2-NEXT: } 51// CHECK2-NEXT: ] 52 53// DISASM: <_start>: 54// DISASM-NEXT: jmp {{.*}} <bar@plt> 55// DISASM-NEXT: jmp {{.*}} <bar@plt> 56// DISASM-NEXT: jmp {{.*}} <zed@plt> 57// DISASM-NEXT: jmp {{.*}} <_start@plt> 58 59// 0x3018 - 0x1036 = 8162 60// 0x3020 - 0x1046 = 8154 61// 0x3028 - 0x1056 = 8146 62 63// DISASM: Disassembly of section .plt: 64// DISASM-EMPTY: 65// DISASM-NEXT: <.plt>: 66// DISASM-NEXT: 1320: pushq 8450(%rip) 67// DISASM-NEXT: jmpq *8452(%rip) 68// DISASM-NEXT: nopl (%rax) 69// DISASM-EMPTY: 70// DISASM-NEXT: <bar@plt>: 71// DISASM-NEXT: 1330: jmpq *8450(%rip) 72// DISASM-NEXT: pushq $0 73// DISASM-NEXT: jmp 0x1320 <.plt> 74// DISASM-EMPTY: 75// DISASM-NEXT: <zed@plt>: 76// DISASM-NEXT: 1340: jmpq *8442(%rip) 77// DISASM-NEXT: pushq $1 78// DISASM-NEXT: jmp 0x1320 <.plt> 79// DISASM-EMPTY: 80// DISASM-NEXT: <_start@plt>: 81// DISASM-NEXT: 1350: jmpq *8434(%rip) 82// DISASM-NEXT: pushq $2 83// DISASM-NEXT: jmp 0x1320 <.plt> 84 85// 0x201030 - (0x201000 + 1) - 4 = 43 86// 0x201030 - (0x201005 + 1) - 4 = 38 87// 0x201040 - (0x20100a + 1) - 4 = 49 88// 0x201000 - (0x20100f + 1) - 4 = -20 89 90// DISASM2: <_start>: 91// DISASM2-NEXT: jmp 0x2012f0 <bar@plt> 92// DISASM2-NEXT: jmp 0x2012f0 <bar@plt> 93// DISASM2-NEXT: jmp 0x201300 <zed@plt> 94// DISASM2-NEXT: jmp 0x2012c0 <_start> 95 96// 0x202018 - 0x201036 = 4066 97// 0x202020 - 0x201046 = 4058 98 99// DISASM2: Disassembly of section .plt: 100// DISASM2-EMPTY: 101// DISASM2-NEXT: <.plt>: 102// DISASM2-NEXT: 2012e0: pushq 8450(%rip) 103// DISASM2-NEXT: jmpq *8452(%rip) 104// DISASM2-NEXT: nopl (%rax) 105// DISASM2-EMPTY: 106// DISASM2-NEXT: <bar@plt>: 107// DISASM2-NEXT: 2012f0: jmpq *8450(%rip) 108// DISASM2-NEXT: pushq $0 109// DISASM2-NEXT: jmp 0x2012e0 <.plt> 110// DISASM2-EMPTY: 111// DISASM2-NEXT: <zed@plt>: 112// DISASM2-NEXT: 201300: jmpq *8442(%rip) 113// DISASM2-NEXT: pushq $1 114// DISASM2-NEXT: jmp 0x2012e0 <.plt> 115// DISASM2-NOT: {{.}} 116 117.global _start 118_start: 119 jmp bar@PLT 120 jmp bar@PLT 121 jmp zed@PLT 122 jmp _start@plt 123