• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// REQUIRES: x86
2// RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %S/Inputs/shared2-x86-64.s -o %t1.o
3// RUN: ld.lld %t1.o --shared --soname=t.so -o %t.so
4// RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %s -o %t.o
5// RUN: ld.lld --hash-style=sysv %t.so %t.o -o %tout
6// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %tout | FileCheck %s --check-prefix=DISASM
7// RUN: llvm-objdump -s %tout | FileCheck %s --check-prefix=GOTPLT
8// RUN: llvm-readobj -r --dynamic-table %tout | FileCheck %s
9
10/// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
11// CHECK: DynamicSection [
12// CHECK:  0x00000012 RELSZ                24 (bytes)
13// CHECK:  0x00000002 PLTRELSZ             16 (bytes)
14
15/// Check that the IRELATIVE relocations are placed to the .rel.dyn section after
16/// other regular relocations (e.g. GLOB_DAT).
17// CHECK: Relocations [
18// CHECK-NEXT:   Section (4) .rel.dyn {
19// CHECK-NEXT:     0x4022C8 R_386_GLOB_DAT bar3 0x0
20// CHECK-NEXT:     0x4032E0 R_386_IRELATIVE - 0x0
21// CHECK-NEXT:     0x4032E4 R_386_IRELATIVE - 0x0
22// CHECK-NEXT:   }
23// CHECK-NEXT:   Section (5) .rel.plt {
24// CHECK-NEXT:     0x4032D8 R_386_JUMP_SLOT bar2 0x0
25// CHECK-NEXT:     0x4032DC R_386_JUMP_SLOT zed2 0x0
26// CHECK-NEXT:   }
27
28// Check that IRELATIVE .got.plt entries point to ifunc resolver and not
29// back to the plt entry + 6.
30// GOTPLT: Contents of section .got.plt:
31// GOTPLT:       4032cc 50224000 00000000 00000000 16124000
32// GOTPLT-NEXT:  4032dc 26124000 dc114000 dd114000
33//                                  ^        ^-- <bar> (0x4011dd)
34//                                  -- <foo> (0x4011dcd)
35
36/// Check that we have 2 PLT sections: one regular .plt section and one
37/// .iplt section for ifunc entries.
38// DISASM: Disassembly of section .text:
39// DISASM-EMPTY:
40// DISASM-NEXT: <foo>:
41// DISASM-NEXT:    4011dc:       retl
42// DISASM:      <bar>:
43// DISASM-NEXT:    4011dd:       retl
44// DISASM:      <_start>:
45// DISASM-NEXT:    4011de:       calll   0x401230
46// DISASM-NEXT:                  calll   0x401240
47// DISASM-NEXT:                  calll   0x401210 <bar2@plt>
48// DISASM-NEXT:                  calll   0x401220 <zed2@plt>
49// DISASM-NEXT:                  movl    -0x1004(%eax), %eax
50// DISASM-EMPTY:
51// DISASM-NEXT: Disassembly of section .plt:
52// DISASM-EMPTY:
53// DISASM-NEXT: <.plt>:
54// DISASM-NEXT:    401200:       pushl   0x4032d0
55// DISASM-NEXT:                  jmpl    *0x4032d4
56// DISASM-NEXT:                  nop
57// DISASM-NEXT:                  nop
58// DISASM-NEXT:                  nop
59// DISASM-NEXT:                  nop
60// DISASM-EMPTY:
61// DISASM-NEXT:   <bar2@plt>:
62// DISASM-NEXT:    401210:       jmpl    *0x4032d8
63// DISASM-NEXT:                  pushl   $0x0
64// DISASM-NEXT:                  jmp     0x401200 <.plt>
65// DISASM-EMPTY:
66// DISASM-NEXT:   <zed2@plt>:
67// DISASM-NEXT:    401220:       jmpl    *0x4032dc
68// DISASM-NEXT:                  pushl   $0x8
69// DISASM-NEXT:                  jmp     0x401200 <.plt>
70// DISASM-EMPTY:
71// DISASM-NEXT: Disassembly of section .iplt:
72// DISASM-EMPTY:
73// DISASM-NEXT: <.iplt>:
74// DISASM-NEXT:                  jmpl    *0x4032e0
75// DISASM-NEXT:                  pushl   $0x0
76// DISASM-NEXT:                  jmp     0x401200 <.plt>
77// DISASM-NEXT:                  jmpl    *0x4032e4
78// DISASM-NEXT:                  pushl   $0x8
79// DISASM-NEXT:                  jmp     0x401200 <.plt>
80
81.text
82.type foo STT_GNU_IFUNC
83.globl foo
84foo:
85 ret
86
87.type bar STT_GNU_IFUNC
88.globl bar
89bar:
90 ret
91
92.globl _start
93_start:
94 call foo@plt
95 call bar@plt
96 call bar2@plt
97 call zed2@plt
98 movl bar3@GOT(%eax), %eax
99