diff options
| -rw-r--r-- | llvm/test/tools/obj2yaml/Inputs/shn_xindex.o | bin | 0 -> 403 bytes | |||
| -rw-r--r-- | llvm/test/tools/obj2yaml/special-symbol-indices.yaml | 46 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/elf2yaml.cpp | 7 |
3 files changed, 53 insertions, 0 deletions
diff --git a/llvm/test/tools/obj2yaml/Inputs/shn_xindex.o b/llvm/test/tools/obj2yaml/Inputs/shn_xindex.o Binary files differnew file mode 100644 index 00000000000..73e2b60ba1e --- /dev/null +++ b/llvm/test/tools/obj2yaml/Inputs/shn_xindex.o diff --git a/llvm/test/tools/obj2yaml/special-symbol-indices.yaml b/llvm/test/tools/obj2yaml/special-symbol-indices.yaml new file mode 100644 index 00000000000..127dc25a0df --- /dev/null +++ b/llvm/test/tools/obj2yaml/special-symbol-indices.yaml @@ -0,0 +1,46 @@ +# RUN: yaml2obj %s > %t +# RUN: obj2yaml %t | FileCheck %s + +## Test checks that we are able to handle symbols with special/reserved indices. + +# CHECK: Symbols: +# CHECK-NEXT: Global: +# CHECK-NEXT: - Name: absolute +# CHECK-NEXT: Index: SHN_ABS +# CHECK-NEXT: Value: 0x0000000000001234 +# CHECK-NEXT: - Name: common +# CHECK-NEXT: Index: SHN_COMMON +# CHECK-NEXT: - Name: valid_index +# CHECK-NEXT: Section: .text +# CHECK-NEXT: - Name: processor_specific_index +# CHECK-NEXT: Index: SHN_HEXAGON_SCOMMON_1 +# CHECK-NEXT: - Name: unknown_index +# CHECK-NEXT: Index: 0x0000FFFE + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_HEXAGON +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + Global: + - Name: absolute + Index: SHN_ABS + Value: 0x1234 + - Name: common + Index: SHN_COMMON + - Name: valid_index + Index: 0x1 + - Name: processor_specific_index + Index: SHN_HEXAGON_SCOMMON_1 + - Name: unknown_index + Index: 0xfffe + +## shn_xindex.o contains a symbol with st_shndx == SHN_XINDEX. +## We do not support it at this moment. +# RUN: not obj2yaml %S/Inputs/shn_xindex.o 2>&1 | FileCheck %s --check-prefix=ERR +# ERR: Error reading file: {{.*}}shn_xindex.o: Feature not yet implemented. diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp index b02c25ad153..7f5e9a28d72 100644 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -284,6 +284,13 @@ ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab, return errorToErrorCode(SymbolNameOrErr.takeError()); S.Name = SymbolNameOrErr.get(); + if (Sym->st_shndx >= ELF::SHN_LORESERVE) { + if (Sym->st_shndx == ELF::SHN_XINDEX) + return obj2yaml_error::not_implemented; + S.Index = (ELFYAML::ELF_SHN)Sym->st_shndx; + return obj2yaml_error::success; + } + auto ShdrOrErr = Obj.getSection(Sym, SymTab, ShndxTable); if (!ShdrOrErr) return errorToErrorCode(ShdrOrErr.takeError()); |

