aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/tools/llvm-readobj/ELF/dynamic-reloc.test
blob: 1e5b9e2e3c21009fb171485729a7effb4eea4a67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
## Test that we are able to print dynamic relocations with --dyn-relocations.

## Check what we print when there are no dynamic relocations in an object.
# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readobj --dyn-relocations %t1 2>&1 | FileCheck %s --check-prefix=LLVM-NONE
# RUN: llvm-readelf --dyn-relocations %t1 2>&1 | FileCheck %s --implicit-check-not={{.}} --allow-empty

# LLVM-NONE:      Dynamic Relocations {
# LLVM-NONE-NEXT: }
# LLVM-NONE-NOT:  {{.}}

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN

## Check that we dump all possbile dynamic relocation sections.
# RUN: yaml2obj --docnum=2 %s -o %t2.1
# RUN: llvm-readobj --dyn-relocations %t2.1 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix=LLVM-RELOCS
# RUN: llvm-readelf --dyn-relocations %t2.1 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --strict-whitespace \
# RUN:     --match-full-lines --check-prefixes=GNU-RELOCS,GNU-PLTREL

## 7 == DT_RELA.
# RUN: yaml2obj --docnum=2 %s -DDTPLTREL=7 -DPLTTYPE=SHT_RELA -DPLTRELSZ=0x18 -o %t2.2
# RUN: llvm-readobj --dyn-relocations %t2.2 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --check-prefix=LLVM-RELOCS
# RUN: llvm-readelf --dyn-relocations %t2.2 2>&1 | \
# RUN:   FileCheck %s --implicit-check-not=warning: --strict-whitespace \
# RUN:     --match-full-lines --check-prefixes=GNU-RELOCS,GNU-PLTRELA

# LLVM-RELOCS:      Dynamic Relocations {
# LLVM-RELOCS-NEXT:   0x8 R_X86_64_64 foo 0x0
# LLVM-RELOCS-NEXT:   0x1 R_X86_64_NONE foo 0x0
# LLVM-RELOCS-NEXT:   0x2 R_X86_64_NONE foo
# LLVM-RELOCS-NEXT:   0x4 R_X86_64_RELATIVE -
# LLVM-RELOCS-NEXT:   0x8 R_X86_64_NONE foo
# LLVM-RELOCS-NEXT: }

#       GNU-RELOCS:'CREL' relocation section at offset 0xa8:
#  GNU-RELOCS-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name
#  GNU-RELOCS-NEXT:0000000000000008  0000000100000001 R_X86_64_64            0000000000000000 foo + 0
# GNU-RELOCS-EMPTY:
#       GNU-RELOCS:'RELA' relocation section at offset 0x78 contains 24 bytes:
#  GNU-RELOCS-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
#  GNU-RELOCS-NEXT:0000000000000001  0000000100000000 R_X86_64_NONE          0000000000000000 foo + 0
# GNU-RELOCS-EMPTY:
#  GNU-RELOCS-NEXT:'REL' relocation section at offset 0x90 contains 16 bytes:
#  GNU-RELOCS-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name
#  GNU-RELOCS-NEXT:0000000000000002  0000000100000000 R_X86_64_NONE          0000000000000000 foo
# GNU-RELOCS-EMPTY:
#  GNU-RELOCS-NEXT:'RELR' relocation section at offset 0xa0 contains 8 bytes:
#  GNU-RELOCS-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name
#  GNU-RELOCS-NEXT:0000000000000004  0000000000000008 R_X86_64_RELATIVE                 {{$}}
# GNU-RELOCS-EMPTY:
#  GNU-PLTREL-NEXT:'PLT' relocation section at offset 0xac contains 16 bytes:
#  GNU-PLTREL-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name
#  GNU-PLTREL-NEXT:0000000000000008  0000000100000000 R_X86_64_NONE          0000000000000000 foo
# GNU-PLTRELA-NEXT:'PLT' relocation section at offset 0xac contains 24 bytes:
# GNU-PLTRELA-NEXT:    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
# GNU-PLTRELA-NEXT:0000000000000008  0000000100000000 R_X86_64_NONE          0000000000000000 foo + 0
# GNU-RELOCS-EMPTY:
#   GNU-RELOCS-NOT:{{.}}

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_DYN
  Machine: EM_X86_64
Sections:
  - Name: .rela.dyn
    Type: SHT_RELA
    Relocations:
      - Type:   R_X86_64_NONE
        Offset: 0x1
        Symbol: foo
  - Name: .rel.dyn
    Type: SHT_REL
    Relocations:
      - Type:   R_X86_64_NONE
        Offset: 0x2
        Symbol: foo
  - Name:    .relr.dyn
    Type:    SHT_RELR
    Flags:   [ SHF_ALLOC ]
    Entries: [ 0x0000000000000004 ]
  - Name:    .crel.dyn
    Type:    SHT_CREL
    Relocations:
      - Type:   R_X86_64_64
        Offset: 0x8
        Symbol: foo
  - Name:    .plt
    Type:    [[PLTTYPE=SHT_REL]]
    Relocations:
      - Type:   R_X86_64_NONE
        Offset: 0x8
        Symbol: foo
  - Name: .dynamic
    Type: SHT_DYNAMIC
    Entries:
      - Tag:   DT_RELA
        Value: 0x0
      - Tag:   DT_RELASZ
        Value: 0x18
      - Tag:   DT_RELAENT
        Value: 0x18
## 0x18 == offset of .rel.dyn in the segment.
      - Tag:   DT_REL
        Value: 0x18
      - Tag:   DT_RELSZ
        Value: 0x10
      - Tag:   DT_RELENT
        Value: 0x10
## 0x28 == offset of .relr.dyn section in the segment.
      - Tag:   DT_RELR
        Value: 0x28
      - Tag:   DT_RELRSZ
        Value: 0x8
      - Tag:   DT_RELRENT
        Value: 0x8
## 0x30 == offset of .crel.dyn section in the segment.
      - Tag:   DT_CREL
        Value: 0x30
## 0x34 == offset of .plt section in the segment.
      - Tag:   DT_JMPREL
        Value: 0x34
      - Tag:   DT_PLTREL
        Value: [[DTPLTREL=17]] ## 17 == DT_REL
      - Tag:   DT_PLTRELSZ
        Value: [[PLTRELSZ=0x10]]
      - Tag:   DT_NULL
        Value: 0x0
Symbols:
  - Name: foo
DynamicSymbols:
  - Name: foo
ProgramHeaders:
  - Type:     PT_LOAD
    FirstSec: .rela.dyn
    LastSec:  .dynamic

## Check we report a warning when the value of the DT_PLTREL dynamic tag is invalid.
## We currently accept DT_RELA(7) and DT_REL(17) values. This test case uses 0xff.

# RUN: yaml2obj --docnum=2 %s -DDTPLTREL=0xFF -o %t3
# RUN: llvm-readobj --dyn-relocations %t3 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t3 --implicit-check-not=warning: --check-prefix=PLTRELUNKNOWN-LLVM
# RUN: llvm-readelf --dyn-relocations %t3 2>&1 | \
# RUN:   FileCheck %s -DFILE=%t3 --implicit-check-not=warning: --check-prefix=PLTRELUNKNOWN-GNU

# PLTRELUNKNOWN-LLVM:      warning: '[[FILE]]': unknown DT_PLTREL value of 255
# PLTRELUNKNOWN-LLVM:      Dynamic Relocations {
# PLTRELUNKNOWN-LLVM-NEXT:   0x8 R_X86_64_64 foo 0x0
# PLTRELUNKNOWN-LLVM-NEXT:   0x1 R_X86_64_NONE foo 0x0
# PLTRELUNKNOWN-LLVM-NEXT:   0x2 R_X86_64_NONE foo{{$}}
# PLTRELUNKNOWN-LLVM-NEXT:   0x4 R_X86_64_RELATIVE -{{$}}
# PLTRELUNKNOWN-LLVM-NEXT: warning: '[[FILE]]': invalid DT_PLTRELSZ value (0x10) or PLTREL entry size (0x0)
# PLTRELUNKNOWN-LLVM-NEXT: }

# PLTRELUNKNOWN-GNU:        warning: '[[FILE]]': unknown DT_PLTREL value of 255
# PLTRELUNKNOWN-GNU-EMPTY:
# PLTRELUNKNOWN-GNU-NEXT:   'CREL' relocation section at offset 0xa8:
# PLTRELUNKNOWN-GNU-NEXT:       Offset             Info             Type               Symbol's Value  Symbol's Name
# PLTRELUNKNOWN-GNU-NEXT:   0000000000000008  0000000100000001 R_X86_64_64            0000000000000000 foo + 0
# PLTRELUNKNOWN-GNU-EMPTY:
# PLTRELUNKNOWN-GNU-NEXT:   'RELA' relocation section at offset 0x78 contains 24 bytes:
# PLTRELUNKNOWN-GNU-NEXT:       Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
# PLTRELUNKNOWN-GNU-NEXT:   0000000000000001  0000000100000000 R_X86_64_NONE          0000000000000000 foo + 0
# PLTRELUNKNOWN-GNU-EMPTY:
# PLTRELUNKNOWN-GNU-NEXT:   'REL' relocation section at offset 0x90 contains 16 bytes:
# PLTRELUNKNOWN-GNU-NEXT:       Offset             Info             Type               Symbol's Value  Symbol's Name
# PLTRELUNKNOWN-GNU-NEXT:   0000000000000002  0000000100000000 R_X86_64_NONE          0000000000000000 foo
# PLTRELUNKNOWN-GNU-EMPTY:
# PLTRELUNKNOWN-GNU-NEXT:   'RELR' relocation section at offset 0xa0 contains 8 bytes:
# PLTRELUNKNOWN-GNU-NEXT:       Offset             Info             Type               Symbol's Value  Symbol's Name
# PLTRELUNKNOWN-GNU-NEXT:   0000000000000004  0000000000000008 R_X86_64_RELATIVE
# PLTRELUNKNOWN-GNU-EMPTY:
# PLTRELUNKNOWN-GNU-NEXT:   'PLT' relocation section at offset 0xac contains 16 bytes:
# PLTRELUNKNOWN-GNU-NEXT:       Offset             Info             Type               Symbol's Value  Symbol's Name
# PLTRELUNKNOWN-GNU-NEXT:   warning: '[[FILE]]': invalid DT_PLTRELSZ value (0x10) or PLTREL entry size (0x0)