diff options
| -rw-r--r-- | llvm/test/Object/X86/obj2yaml-dup-symbol-name.s | 9 | ||||
| -rw-r--r-- | llvm/test/Object/obj2yaml.test | 53 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/elf2yaml.cpp | 25 |
3 files changed, 66 insertions, 21 deletions
diff --git a/llvm/test/Object/X86/obj2yaml-dup-symbol-name.s b/llvm/test/Object/X86/obj2yaml-dup-symbol-name.s new file mode 100644 index 00000000000..4cc175a19fc --- /dev/null +++ b/llvm/test/Object/X86/obj2yaml-dup-symbol-name.s @@ -0,0 +1,9 @@ +# RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux +# RUN: obj2yaml %t.o | FileCheck %s + +# CHECK: Relocations: +# CHECK: Symbol: .text +# CHECK: Symbols: +# CHECK: - Name: .text + + .quad .text diff --git a/llvm/test/Object/obj2yaml.test b/llvm/test/Object/obj2yaml.test index 73d466cc499..3d89f53bafc 100644 --- a/llvm/test/Object/obj2yaml.test +++ b/llvm/test/Object/obj2yaml.test @@ -268,19 +268,26 @@ ELF-MIPSEL-NEXT: - Name: '$.str' ELF-MIPSEL-NEXT: Type: STT_OBJECT ELF-MIPSEL-NEXT: Section: .rodata.str1.1 ELF-MIPSEL-NEXT: Size: 0x000000000000000D -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .text +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .text -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .data +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .data -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .bss +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .bss -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .mdebug.abi32 +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .mdebug.abi32 -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .rodata.str1.1 +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .rodata.str1.1 -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .reginfo +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .reginfo -ELF-MIPSEL-NEXT: - Type: STT_SECTION +ELF-MIPSEL-NEXT: - Name: .MIPS.abiflags +ELF-MIPSEL-NEXT: Type: STT_SECTION ELF-MIPSEL-NEXT: Section: .MIPS.abiflags ELF-MIPSEL-NEXT: Global: ELF-MIPSEL-NEXT: - Name: main @@ -336,17 +343,22 @@ ELF-MIPS64EL-NEXT: AddressAlign: 0x0000000000000004 ELF-MIPS64EL-NEXT: Content: '' ELF-MIPS64EL-NEXT: Symbols: ELF-MIPS64EL-NEXT: Local: -ELF-MIPS64EL-NEXT: - Type: STT_SECTION +ELF-MIPS64EL-NEXT: - Name: .text +ELF-MIPS64EL-NEXT: Type: STT_SECTION ELF-MIPS64EL-NEXT: Section: .text -ELF-MIPS64EL-NEXT: - Type: STT_SECTION +ELF-MIPS64EL-NEXT: - Name: .data +ELF-MIPS64EL-NEXT: Type: STT_SECTION ELF-MIPS64EL-NEXT: Section: .data -ELF-MIPS64EL-NEXT: - Type: STT_SECTION +ELF-MIPS64EL-NEXT: - Name: .bss +ELF-MIPS64EL-NEXT: Type: STT_SECTION ELF-MIPS64EL-NEXT: Section: .bss ELF-MIPS64EL-NEXT: - Name: bar ELF-MIPS64EL-NEXT: Section: .data -ELF-MIPS64EL-NEXT: - Type: STT_SECTION +ELF-MIPS64EL-NEXT: - Name: .MIPS.options +ELF-MIPS64EL-NEXT: Type: STT_SECTION ELF-MIPS64EL-NEXT: Section: .MIPS.options -ELF-MIPS64EL-NEXT: - Type: STT_SECTION +ELF-MIPS64EL-NEXT: - Name: .pdr +ELF-MIPS64EL-NEXT: Type: STT_SECTION ELF-MIPS64EL-NEXT: Section: .pdr ELF-MIPS64EL-NEXT: Global: ELF-MIPS64EL-NEXT: - Name: zed @@ -382,7 +394,7 @@ ELF-X86-64-NEXT: AddressAlign: 0x0000000000000008 ELF-X86-64-NEXT: Info: .text ELF-X86-64-NEXT: Relocations: ELF-X86-64-NEXT: - Offset: 0x000000000000000D -ELF-X86-64-NEXT: Symbol: '' +ELF-X86-64-NEXT: Symbol: .rodata.str1.1 ELF-X86-64-NEXT: Type: R_X86_64_32S ELF-X86-64-NEXT: - Offset: 0x0000000000000012 ELF-X86-64-NEXT: Symbol: puts @@ -396,11 +408,14 @@ ELF-X86-64-NEXT: Symbols: ELF-X86-64-NEXT: Local: ELF-X86-64-NEXT: - Name: trivial-object-test.s ELF-X86-64-NEXT: Type: STT_FILE -ELF-X86-64-NEXT: - Type: STT_SECTION +ELF-X86-64-NEXT: - Name: .text +ELF-X86-64-NEXT: Type: STT_SECTION ELF-X86-64-NEXT: Section: .text -ELF-X86-64-NEXT: - Type: STT_SECTION +ELF-X86-64-NEXT: - Name: .rodata.str1.1 +ELF-X86-64-NEXT: Type: STT_SECTION ELF-X86-64-NEXT: Section: .rodata.str1.1 -ELF-X86-64-NEXT: - Type: STT_SECTION +ELF-X86-64-NEXT: - Name: .note.GNU-stack +ELF-X86-64-NEXT: Type: STT_SECTION ELF-X86-64-NEXT: Section: .note.GNU-stack ELF-X86-64-NEXT: Global: ELF-X86-64-NEXT: - Name: main @@ -431,9 +446,11 @@ ELF-AVR-NEXT: AddressAlign: 0x0000000000000001 ELF-AVR-NEXT: Content: '' ELF-AVR-NEXT: Symbols: ELF-AVR-NEXT: Local: -ELF-AVR-NEXT: - Type: STT_SECTION +ELF-AVR-NEXT: - Name: .text +ELF-AVR-NEXT: Type: STT_SECTION ELF-AVR-NEXT: Section: .text -ELF-AVR-NEXT: - Type: STT_SECTION +ELF-AVR-NEXT: - Name: .data +ELF-AVR-NEXT: Type: STT_SECTION ELF-AVR-NEXT: Section: .data ELF-AVR-NEXT: Value: 0x0000000000800060 ELF-AVR-NEXT: - Name: a.o diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp index b603cb84aea..8997a5c4211 100644 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -36,6 +36,8 @@ class ELFDumper { DenseSet<StringRef> UsedSectionNames; std::vector<std::string> SectionNames; Expected<StringRef> getUniquedSectionName(const Elf_Shdr *Sec); + Expected<StringRef> getSymbolName(const Elf_Sym *Sym, StringRef StrTable, + const Elf_Shdr *SymTab); const object::ELFFile<ELFT> &Obj; ArrayRef<Elf_Word> ShndxTable; @@ -87,6 +89,23 @@ ELFDumper<ELFT>::getUniquedSectionName(const Elf_Shdr *Sec) { return Ret; } +template <class ELFT> +Expected<StringRef> ELFDumper<ELFT>::getSymbolName(const Elf_Sym *Sym, + StringRef StrTable, + const Elf_Shdr *SymTab) { + Expected<StringRef> SymbolNameOrErr = Sym->getName(StrTable); + if (!SymbolNameOrErr) + return SymbolNameOrErr; + StringRef Name = *SymbolNameOrErr; + if (Name.empty() && Sym->getType() == ELF::STT_SECTION) { + auto ShdrOrErr = Obj.getSection(Sym, SymTab, ShndxTable); + if (!ShdrOrErr) + return ShdrOrErr.takeError(); + return getUniquedSectionName(*ShdrOrErr); + } + return Name; +} + template <class ELFT> ErrorOr<ELFYAML::Object *> ELFDumper<ELFT>::dump() { auto Y = make_unique<ELFYAML::Object>(); @@ -217,7 +236,7 @@ ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab, S.Size = Sym->st_size; S.Other = Sym->st_other; - Expected<StringRef> SymbolNameOrErr = Sym->getName(StrTable); + Expected<StringRef> SymbolNameOrErr = getSymbolName(Sym, StrTable, SymTab); if (!SymbolNameOrErr) return errorToErrorCode(SymbolNameOrErr.takeError()); S.Name = SymbolNameOrErr.get(); @@ -259,7 +278,7 @@ std::error_code ELFDumper<ELFT>::dumpRelocation(const RelT *Rel, StringRef StrTab = *StrTabOrErr; if (Sym) { - Expected<StringRef> NameOrErr = Sym->getName(StrTab); + Expected<StringRef> NameOrErr = getSymbolName(Sym, StrTab, SymTab); if (!NameOrErr) return errorToErrorCode(NameOrErr.takeError()); R.Symbol = NameOrErr.get(); @@ -425,7 +444,7 @@ ErrorOr<ELFYAML::Group *> ELFDumper<ELFT>::dumpGroup(const Elf_Shdr *Shdr) { auto sectionContents = Obj.getSectionContents(Shdr); if (!sectionContents) return errorToErrorCode(sectionContents.takeError()); - Expected<StringRef> symbolName = symbol->getName(StrTab); + Expected<StringRef> symbolName = getSymbolName(symbol, StrTab, Symtab); if (!symbolName) return errorToErrorCode(symbolName.takeError()); S->Info = *symbolName; |

