forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadd-symbol-no-symtab.test
130 lines (114 loc) · 3.72 KB
/
add-symbol-no-symtab.test
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
## Test --add-symbol creates .symtab if it does not exist.
# RUN: yaml2obj --docnum=1 %s -o %t
## If a non-SHF_ALLOC SHT_STRTAB exists but SHT_SYMTAB does not, create .symtab
## and set its sh_link to the SHT_STRTAB.
# RUN: llvm-objcopy --remove-section=.symtab %t %t.no.symtab
# RUN: llvm-objcopy --add-symbol='abs1=1' %t.no.symtab %t.add.both
# RUN: llvm-readobj -S %t.add.both | FileCheck --check-prefix=SEC %s
# RUN: llvm-readelf -s %t.add.both | FileCheck %s
# SEC: Index: 1
# SEC-NEXT: Name: .strtab
# SEC-NEXT: Type: SHT_STRTAB
# SEC: Index: 2
# SEC-NEXT: Name: .shstrtab
# SEC-NEXT: Type: SHT_STRTAB
# SEC: Index: 3
# SEC-NEXT: Name: .symtab
# SEC-NEXT: Type: SHT_SYMTAB
# SEC-NOT: }
# SEC: Link: 1
# CHECK: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
# CHECK-NEXT: 1: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS abs1
## Don't create .symtab if --add-symbol is not specified.
# RUN: llvm-objcopy --remove-section=.symtab --remove-section=.strtab %t %t.no
# RUN: llvm-objcopy %t.no %t.nop
# RUN: llvm-readobj -S %t.nop | FileCheck --implicit-check-not=.symtab --implicit-check-not=.strtab /dev/null
## Reuse the existing .shstrtab (section names) for symbol names.
## This may look strange but it works.
# RUN: llvm-objcopy --add-symbol='abs1=1' %t.no %t.add.symtab
# RUN: llvm-readobj -S %t.add.symtab | FileCheck --check-prefix=SEC2 %s --implicit-check-not=.strtab
# RUN: llvm-readelf -s %t.add.symtab | FileCheck %s
# SEC2: Index: 1
# SEC2-NEXT: Name: .shstrtab
# SEC2-NEXT: Type: SHT_STRTAB
# SEC2: Index: 2
# SEC2-NEXT: Name: .symtab
# SEC2-NEXT: Type: SHT_SYMTAB
# SEC2-NOT: }
# SEC2: Link: 1
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .strtab
Type: SHT_STRTAB
- Name: .shstrtab
Type: SHT_STRTAB
Symbols: []
...
## Check that we prefer the string table that is not the section header string table.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-objcopy --remove-section=.symtab --remove-section=.strtab %t2 %t2.no
# RUN: llvm-objcopy --add-symbol='abs1=1' %t2.no %t2.add.symtab
# RUN: llvm-readobj -S %t2.add.symtab | FileCheck --check-prefix=SEC2 %s
# RUN: llvm-readelf -s %t2.add.symtab | FileCheck %s
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
# .shstrtab is reordered before .strtab
- Name: .shstrtab
Type: SHT_STRTAB
- Name: .strtab
Type: SHT_STRTAB
Symbols: []
...
## Check the created .symtab does not link to .dynstr (SHF_ALLOC).
# RUN: yaml2obj --docnum=3 %s -o %t3
# RUN: llvm-objcopy --remove-section=.symtab --remove-section=.strtab %t3 %t3.no
# RUN: llvm-objcopy --add-symbol='abs1=1' %t3.no %t3.not.dynstr
# RUN: llvm-readobj -S %t3.not.dynstr | FileCheck --check-prefix=SEC3 %s
# SEC3: Index: 3
# SEC3-NEXT: Name: .shstrtab
# SEC3-NEXT: Type: SHT_STRTAB
# SEC3: Name: .symtab
# SEC3-NEXT: Type: SHT_SYMTAB
# SEC3-NOT: }
# SEC3: Link: 3
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
DynamicSymbols:
- Name: dummy
Binding: STB_GLOBAL
Symbols: []
...
## Check the created .symtab is correct when there are program headers.
# RUN: yaml2obj --docnum=4 %s -o %t4
# RUN: llvm-objcopy %t4 %t4.add --add-symbol foo=1234
# RUN: llvm-readelf -s %t4.add | FileCheck --check-prefix=SEC4 %s
# SEC4: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
# SEC4-NEXT: 1: 00000000000004d2 0 NOTYPE GLOBAL DEFAULT ABS foo
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
Sections:
- Name: .foo
Type: SHT_PROGBITS
ProgramHeaders:
- Type: PT_LOAD
FirstSec: .foo
LastSec: .foo
...