aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/tools/llvm-objdump/ELF/dynsym-version.test
blob: e21b3544be8543026f3289dd1f816b524ae00fbe (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
## Check we print symbol versions, when they are available.

## Test undefined symbols.
# RUN: yaml2obj %s -o %t-undef.o
# RUN: llvm-objdump -T %t-undef.o 2>&1 | tr '\t' '|' | FileCheck %s \
# RUN:   -DFILE=%t-undef.o --check-prefix=UNDEF --match-full-lines --strict-whitespace

## version2sym and version3sym are invalid: undefined symbols cannot refer to .gnu.version_d.
## We still check their behaviors.
#      UNDEF:DYNAMIC SYMBOL TABLE:
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000              localversym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000              globalversym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v2)         version2sym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v3hidden)   version3sym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v4)         version4sym
# UNDEF-NEXT:0000000000000000      D  *UND*|0000000000000000 (v5hidden)   .hidden version5sym

## Test defined symbols.
# RUN: yaml2obj -DINDEX=0x1 %s -o %t-def.o
# RUN: llvm-objdump -T %t-def.o 2>&1 | tr '\t' '|' | FileCheck %s \
# RUN:   -DFILE=%t-def.o --check-prefix=DEF --match-full-lines --strict-whitespace

#      DEF:DYNAMIC SYMBOL TABLE:
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000              localversym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000              globalversym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000  v2          version2sym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000 (v3hidden)   version3sym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000 (v4)         version4sym
# DEF-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000 (v5hidden)   .hidden version5sym

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name:    .gnu.version
    Type:    SHT_GNU_versym
    Flags:   [ SHF_ALLOC ]
## 0x8000 is a special VERSYM_HIDDEN bit.
    Entries: [ 0, 0, 1, 2, 0x8003, 4, 0x8005 ]
    ShSize:  [[VERSYMSIZE=<none>]]
  - Name:         .gnu.version_d
    Type:         SHT_GNU_verdef
    Flags:        [ SHF_ALLOC ]
    Link:         .dynstr
    AddressAlign: 0x4
    Info:         0x2
    ShOffset:     [[VERDEFOFFSET=<none>]]
    Entries:
      - VersionNdx: 2
        Names:
          - v2
      - VersionNdx: 3
        Names:
          - v3hidden
  - Name:  .gnu.version_r
    Type:  SHT_GNU_verneed
    Flags: [ SHF_ALLOC ]
    Link:  .dynstr
    Info:  0x2
    Dependencies:
      - Version: 1
        File:    file1.so
        Entries:
          - Name:  v4
            Hash:  0
            Flags: 0
            Other: 4
      - Version: 1
        File:    file2.0
        Entries:
          - Name:  v5hidden
            Hash:  0
            Flags: 0
            Other: 5
  - Name:    .dynsym
    Type:    SHT_DYNSYM
    EntSize: [[ENTSIZE=<none>]]
DynamicSymbols:
  - Name:  localversym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  globalversym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version2sym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version3sym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version4sym
    Index: [[INDEX=<none>]]
    Binding: STB_GLOBAL
  - Name:  version5sym
    Index: [[INDEX=<none>]]
    Other: [ STV_HIDDEN ]
    Binding: STB_GLOBAL

## Test the output with a long version name.
# RUN: yaml2obj --docnum=2 %s -o %t2
# RUN: llvm-objdump -T %t2 2>&1 | tr '\t' '|' | FileCheck %s \
# RUN:   --check-prefix=LONGNAME --match-full-lines --strict-whitespace

#      LONGNAME:DYNAMIC SYMBOL TABLE:
# LONGNAME-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000  v2          sym1
# LONGNAME-NEXT:0000000000000000 g    D  .gnu.version|0000000000000000  v3withverylongname sym2

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name:    .gnu.version
    Type:    SHT_GNU_versym
    Flags:   [ SHF_ALLOC ]
    Entries: [ 1, 2, 3 ]
  - Name:         .gnu.version_d
    Type:         SHT_GNU_verdef
    Flags:        [ SHF_ALLOC ]
    Link:         .dynstr
    AddressAlign: 0x4
    Info:         0x2
    Entries:
      - VersionNdx: 2
        Names:
          - v2
      - VersionNdx: 3
        Names:
          - v3withverylongname
  - Name:    .dynsym
    Type:    SHT_DYNSYM
DynamicSymbols:
  - Name:  sym1
    Index: 1
    Binding: STB_GLOBAL
  - Name:  sym2
    Index: 1
    Binding: STB_GLOBAL

## Check we report a warning when we are unable to read a SHT_GNU_versym section entry.
## In this case, the section has a size that is not a multiple of its sh_entsize.

# RUN: yaml2obj -DVERSYMSIZE=0xff %s -o %t2-broken-versym.o
# RUN: llvm-objdump -T %t2-broken-versym.o 2>&1 | FileCheck %s --check-prefixes=VERSION-ERR1,NOVER

# VERSION-ERR1:warning: {{.*}}: unable to read an entry with index 1 from SHT_GNU_versym section
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 localversym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 globalversym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 version2sym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 version3sym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 version4sym
# NOVER-NEXT:0000000000000000      D  *UND*  0000000000000000 .hidden version5sym