Index: llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml =================================================================== --- llvm/trunk/test/tools/obj2yaml/special-symbol-indices.yaml +++ llvm/trunk/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. Index: llvm/trunk/tools/obj2yaml/elf2yaml.cpp =================================================================== --- llvm/trunk/tools/obj2yaml/elf2yaml.cpp +++ llvm/trunk/tools/obj2yaml/elf2yaml.cpp @@ -284,6 +284,13 @@ 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());