James Henderson | e50d9cb | 2019-01-17 15:34:12 +0000 | [diff] [blame^] | 1 | ## Show that llvm-readelf + llvm-readobj demangle symbol names in symbol tables |
| 2 | ## (including dynamic symbols), relocations (including dynamic relocations), and groups. |
| 3 | |
| 4 | # RUN: yaml2obj %s > %t.so |
| 5 | |
| 6 | ## Check LLVM output style. |
| 7 | # RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ |
| 8 | # RUN: --elf-section-groups --elf-cg-profile --addrsig \ |
| 9 | # RUN: --demangle %t.so > %t.llvm.long |
| 10 | # RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ |
| 11 | # RUN: --elf-section-groups --elf-cg-profile --addrsig \ |
| 12 | # RUN: -C %t.so > %t.llvm.short |
| 13 | # RUN: FileCheck %s --input-file %t.llvm.long --check-prefixes=LLVM-COMMON,LLVM-DEMANGLE |
| 14 | # RUN: diff %t.llvm.long %t.llvm.short |
| 15 | |
| 16 | ## Check that default is no demangling. |
| 17 | # RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ |
| 18 | # RUN: --elf-section-groups --elf-cg-profile --addrsig \ |
| 19 | # RUN: %t.so > %t.llvm.default |
| 20 | # RUN: llvm-readobj --symbols --relocations --dyn-symbols --dyn-relocations \ |
| 21 | # RUN: --elf-section-groups --elf-cg-profile --addrsig \ |
| 22 | # RUN: --demangle=false %t.so > %t.llvm.nodemangle |
| 23 | # RUN: FileCheck %s --input-file %t.llvm.default --check-prefixes=LLVM-COMMON,LLVM-MANGLED |
| 24 | # RUN: diff %t.llvm.default %t.llvm.nodemangle |
| 25 | |
| 26 | # LLVM-COMMON: Relocations [ |
| 27 | # LLVM-COMMON: Section {{.*}} .rela.text.foo { |
| 28 | # LLVM-DEMANGLE-NEXT: {{ }}foo(char){{ }} |
| 29 | # LLVM-MANGLED-NEXT: {{ }}_Z3fooc{{ }} |
| 30 | # LLVM-COMMON-NEXT: } |
| 31 | # LLVM-COMMON: ] |
| 32 | |
| 33 | # LLVM-COMMON: Dynamic Relocations { |
| 34 | # LLVM-DEMANGLE-NEXT: {{ }}foo(int){{ }} |
| 35 | # LLVM-MANGLED-NEXT: {{ }}_Z3fooi{{ }} |
| 36 | # LLVM-COMMON-NEXT: } |
| 37 | |
| 38 | # LLVM-COMMON: Symbols [ |
| 39 | # LLVM-DEMANGLE: Name: foo(char){{ }} |
| 40 | # LLVM-DEMANGLE: Name: blah(float){{ }} |
| 41 | # LLVM-MANGLED: Name: _Z3fooc{{ }} |
| 42 | # LLVM-MANGLED: Name: _Z4blahf{{ }} |
| 43 | # LLVM-COMMON: ] |
| 44 | |
| 45 | # LLVM-COMMON: DynamicSymbols [ |
| 46 | # LLVM-DEMANGLE: Name: foo(int){{ }} |
| 47 | # LLVM-MANGLED: Name: _Z3fooi{{ }} |
| 48 | # LLVM-COMMON: ] |
| 49 | |
| 50 | # LLVM-COMMON: Groups { |
| 51 | # LLVM-DEMANGLE: Signature: foo(char){{$}} |
| 52 | # LLVM-MANGLED: Signature: _Z3fooc{{$}} |
| 53 | # LLVM-COMMON: } |
| 54 | |
| 55 | # LLVM-COMMON: CGProfile [ |
| 56 | # LLVM-DEMANGLE: From: foo(char){{ }} |
| 57 | # LLVM-DEMANGLE: To: blah(float){{ }} |
| 58 | # LLVM-MANGLED: From: _Z3fooc{{ }} |
| 59 | # LLVM-MANGLED: To: _Z4blahf{{ }} |
| 60 | # LLVM-COMMON: ] |
| 61 | |
| 62 | # LLVM-COMMON: Addrsig [ |
| 63 | # LLVM-DEMANGLE-NEXT: Sym: foo(char){{ }} |
| 64 | # LLVM-DEMANGLE-NEXT: Sym: blah(float){{ }} |
| 65 | # LLVM-MANGLED-NEXT: Sym: _Z3fooc{{ }} |
| 66 | # LLVM-MANGLED-NEXT: Sym: _Z4blahf{{ }} |
| 67 | # LLVM-COMMON-NEXT: ] |
| 68 | |
| 69 | ## Check GNU output style. |
| 70 | ## FIXME: The extra run for --symbols is because GNU mode only prints the dynamic symbols, |
| 71 | ## if --dyn-symbols is specified, even if --symbols is specified. |
| 72 | # RUN: llvm-readelf --relocations --dyn-symbols --dyn-relocations \ |
| 73 | # RUN: --elf-section-groups --demangle %t.so > %t.gnu.long |
| 74 | # RUN: llvm-readelf --symbols --demangle %t.so >> %t.gnu.long |
| 75 | # RUN: llvm-readelf --relocations --dyn-symbols --dyn-relocations \ |
| 76 | # RUN: --elf-section-groups -C %t.so > %t.gnu.short |
| 77 | # RUN: llvm-readelf --symbols -C %t.so >> %t.gnu.short |
| 78 | # RUN: FileCheck %s --input-file %t.gnu.long --check-prefixes=GNU-COMMON,GNU-DEMANGLE |
| 79 | # RUN: diff %t.gnu.long %t.gnu.short |
| 80 | |
| 81 | ## Check that default is no demangling. |
| 82 | # RUN: llvm-readelf --relocations --dyn-symbols --dyn-relocations \ |
| 83 | # RUN: --elf-section-groups %t.so > %t.gnu.default |
| 84 | # RUN: llvm-readelf --symbols %t.so >> %t.gnu.default |
| 85 | # RUN: llvm-readelf --relocations --dyn-symbols --dyn-relocations \ |
| 86 | # RUN: --elf-section-groups --demangle=false %t.so > %t.gnu.nodemangle |
| 87 | # RUN: llvm-readelf --symbols --demangle=false %t.so >> %t.gnu.nodemangle |
| 88 | # RUN: FileCheck %s --input-file %t.gnu.default --check-prefixes=GNU-COMMON,GNU-MANGLED |
| 89 | # RUN: diff %t.gnu.default %t.gnu.nodemangle |
| 90 | |
| 91 | # GNU-COMMON: Relocation section '.rela.text.foo' at offset {{.*}} contains 1 entries: |
| 92 | # GNU-COMMON-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend |
| 93 | # GNU-DEMANGLE-NEXT: foo(char){{ }} |
| 94 | # GNU-MANGLED-NEXT: _Z3fooc{{ }} |
| 95 | |
| 96 | # GNU-COMMON: 'RELA' relocation section at offset {{.*}} contains 24 bytes: |
| 97 | # GNU-COMMON-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend |
| 98 | # GNU-DEMANGLE-NEXT: foo(int){{ }} |
| 99 | # GNU-MANGLED-NEXT: _Z3fooi{{ }} |
| 100 | |
| 101 | # GNU-COMMON: Symbol table '.dynsym' contains 2 entries: |
| 102 | # GNU-COMMON-NEXT: Num: Value Size Type Bind Vis Ndx Name |
| 103 | # GNU-COMMON-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND |
| 104 | # GNU-DEMANGLE-NEXT: foo(int){{$}} |
| 105 | # GNU-MANGLED-NEXT: _Z3fooi{{$}} |
| 106 | |
| 107 | # GNU-COMMON: COMDAT group section [{{.*}}] `.group' |
| 108 | # GNU-DEMANGLE-SAME: [foo(char)] |
| 109 | # GNU-MANGLED-SAME: [_Z3fooc] |
| 110 | |
| 111 | # GNU-COMMON: Symbol table '.symtab' contains 3 entries: |
| 112 | # GNU-COMMON-NEXT: Num: Value Size Type Bind Vis Ndx Name |
| 113 | # GNU-COMMON-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND |
| 114 | # GNU-DEMANGLE-NEXT: foo(char){{$}} |
| 115 | # GNU-DEMANGLE-NEXT: blah(float){{$}} |
| 116 | # GNU-MANGLED-NEXT: _Z3fooc{{$}} |
| 117 | # GNU-MANGLED-NEXT: _Z4blahf{{$}} |
| 118 | |
| 119 | !ELF |
| 120 | FileHeader: |
| 121 | Class: ELFCLASS64 |
| 122 | Data: ELFDATA2LSB |
| 123 | Type: ET_DYN |
| 124 | Machine: EM_X86_64 |
| 125 | Sections: |
| 126 | ## TODO: Replace the raw section contents with more meaningful dynamic |
| 127 | ## tags/symbols/etc, once yaml2obj supports it. |
| 128 | ## FIXME: yaml2obj does not currently allow custom addresses for .dynstr and |
| 129 | ## .dynsym if DynamicSymbols are specified. |
| 130 | ## See https://bugs.llvm.org/show_bug.cgi?id=40339 |
| 131 | - Name: .dynstr |
| 132 | Type: SHT_STRTAB |
| 133 | Flags: [ SHF_ALLOC ] |
| 134 | AddressAlign: 0x100 |
| 135 | EntSize: 0x1 |
| 136 | ## "\0_Z3fooi\0" |
| 137 | Content: "005f5a33666f6f6900" |
| 138 | - Name: .dynsym |
| 139 | Type: SHT_DYNSYM |
| 140 | Flags: [ SHF_ALLOC ] |
| 141 | Link: .dynstr |
| 142 | Info: 1 |
| 143 | Address: 0x100 |
| 144 | AddressAlign: 0x100 |
| 145 | EntSize: 0x18 |
| 146 | ## Null symbol; |
| 147 | ## st_name: 1; st_info: Global | Func; st_other: 0; |
| 148 | ## st_shndx: .text.foo; st_value: 0x2000; st_size: 0 |
| 149 | Content: "000000000000000000000000000000000000000000000000010000001200050000200000000000000000000000000000" |
| 150 | - Name: .rela.dyn |
| 151 | Type: SHT_RELA |
| 152 | Flags: [ SHF_ALLOC ] |
| 153 | Link: .dynsym |
| 154 | Info: .text.foo |
| 155 | Address: 0x200 |
| 156 | AddressAlign: 0x100 |
| 157 | EntSize: 0x18 |
| 158 | Relocations: |
| 159 | - Offset: 0x10 |
| 160 | ## FIXME: This should be a lookup in the corresponding symbol table, not necessarily the static symbol table. |
| 161 | ## See https://bugs.llvm.org/show_bug.cgi?id=40337. |
| 162 | Symbol: _Z3fooc |
| 163 | Type: R_X86_64_PC32 |
| 164 | Addend: 0x4 |
| 165 | - Name: .dynamic |
| 166 | Type: SHT_DYNAMIC |
| 167 | Flags: [ SHF_ALLOC ] |
| 168 | Link: .dynstr |
| 169 | Address: 0x1000 |
| 170 | AddressAlign: 0x1000 |
| 171 | ## DT_STRTAB - 0x0 |
| 172 | ## DT_STRSZ - 0x9 |
| 173 | ## DT_SYMTAB - 0x100 |
| 174 | ## DT_SYMENT - 0x18 |
| 175 | ## DT_RELA - 0x200 |
| 176 | ## DT_RELASZ - 0x18 |
| 177 | ## DT_RELAENT - 0x18 |
| 178 | ## DT_NULL - 0x0 |
| 179 | Content: "050000000000000000000000000000000a000000000000000900000000000000060000000000000000010000000000000b00000000000000180000000000000007000000000000000002000000000000080000000000000018000000000000000900000000000000180000000000000000000000000000000000000000000000" |
| 180 | - Name: .text.foo |
| 181 | Type: SHT_PROGBITS |
| 182 | Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] |
| 183 | Size: 0x40 |
| 184 | Address: 0x2000 |
| 185 | AddressAlign: 0x2000 |
| 186 | - Name: .group |
| 187 | Type: SHT_GROUP |
| 188 | Link: .symtab |
| 189 | Info: _Z3fooc |
| 190 | Members: |
| 191 | - SectionOrType: GRP_COMDAT |
| 192 | - SectionOrType: .text.foo |
| 193 | - Name: .rela.text.foo |
| 194 | Type: SHT_RELA |
| 195 | Link: .symtab |
| 196 | Info: .text.foo |
| 197 | Relocations: |
| 198 | - Offset: 0x10 |
| 199 | Symbol: _Z3fooc |
| 200 | Type: R_X86_64_PC32 |
| 201 | - Name: .llvm.call-graph-profile |
| 202 | Type: SHT_LLVM_CALL_GRAPH_PROFILE |
| 203 | Link: .symtab |
| 204 | EntSize: 16 |
| 205 | Content: "01000000020000002000000000000000" |
| 206 | - Name: .llvm_addrsig |
| 207 | Type: SHT_LLVM_ADDRSIG |
| 208 | Link: .symtab |
| 209 | Content: "0102" |
| 210 | Symbols: |
| 211 | Global: |
| 212 | - Name: _Z3fooc |
| 213 | Type: STT_FUNC |
| 214 | Section: .text.foo |
| 215 | - Name: _Z4blahf |
| 216 | Type: STT_FUNC |
| 217 | Section: .text.foo |
| 218 | ProgramHeaders: |
| 219 | - Type: PT_LOAD |
| 220 | Flags: [ PF_R, PF_X ] |
| 221 | VAddr: 0x0 |
| 222 | PAddr: 0x0 |
| 223 | Sections: |
| 224 | - Section: .dynsym |
| 225 | - Section: .dynstr |
| 226 | - Section: .rela.dyn |
| 227 | - Section: .dynamic |
| 228 | - Section: .text.foo |
| 229 | - Type: PT_DYNAMIC |
| 230 | Flags: [ PF_R ] |
| 231 | VAddr: 0x1000 |
| 232 | PAddr: 0x1000 |
| 233 | Sections: |
| 234 | - Section: .dynamic |