Index: test/tools/yaml2obj/abs-common-symbols.yaml =================================================================== --- /dev/null +++ test/tools/yaml2obj/abs-common-symbols.yaml @@ -0,0 +1,41 @@ +# RUN: yaml2obj %s > %t +# RUN: obj2yaml %t | FileCheck %s + +# CHECK: Symbols: +# CHECK-NEXT: Global: +# CHECK-NEXT: - Name: absolute1 +# CHECK-NEXT: Index: SHN_ABS +# CHECK-NEXT: Value: 0x0000000000001234 +# CHECK-NEXT: - Name: absolute2 +# CHECK-NEXT: Index: SHN_ABS +# CHECK-NEXT: Value: 0x0000000000004321 +# CHECK-NEXT: - Name: common1 +# CHECK-NEXT: Index: SHN_COMMON +# CHECK-NEXT: - Name: common2 +# CHECK-NEXT: Index: SHN_COMMON +# CHECK-NEXT: - Name: valid_index +# CHECK-NEXT: Section: .text + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS +Symbols: + Global: + - Name: absolute1 + Index: SHN_ABS + Value: 0x1234 + - Name: absolute2 + Index: 0xfff1 + Value: 0x4321 + - Name: common1 + Index: SHN_COMMON + - Name: common2 + Index: 0xfff2 + - Name: valid_index + Index: 0x1 Index: tools/obj2yaml/elf2yaml.cpp =================================================================== --- tools/obj2yaml/elf2yaml.cpp +++ tools/obj2yaml/elf2yaml.cpp @@ -276,6 +276,11 @@ return errorToErrorCode(SymbolNameOrErr.takeError()); S.Name = SymbolNameOrErr.get(); + if (Sym->st_shndx == ELF::SHN_ABS || Sym->st_shndx == ELF::SHN_COMMON) { + 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());