From 56d9da61e3c165e839f97bfeffb69d5bf85b361d Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Fri, 1 Mar 2019 17:31:32 +0000 Subject: [PATCH] [llvm-readobj] Display section names for STT_SECTION symbols. Summary: This patch will obtain the section name for symbols that refer to a section. Prior to this patch the Name field for STT_SECTIONs was blank, now it is populated. Before: ``` Symbol table '.symtab' contains 6 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym ``` With this patch: ``` Symbol table '.symtab' contains 6 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .data 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym ``` This fixes PR40788 Reviewers: jhenderson, rupprecht, espindola Reviewed By: rupprecht Subscribers: emaste, javed.absar, arichardson, MaskRay, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58796 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355207 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/MC/ARM/arm-elf-symver.s | 2 +- test/MC/ELF/alias.s | 2 +- test/MC/ELF/many-sections-2.s | 2 +- test/MC/ELF/section-sym.s | 2 +- test/MC/ELF/symver.s | 2 +- test/MC/ELF/weakref.s | 2 +- test/Object/readobj-shared-object.test | 20 ++++++++++---------- test/tools/llvm-readobj/gnu-symbols.test | 16 ++++++++-------- test/tools/llvm-readobj/sections-ext.test | 2 +- tools/llvm-readobj/ELFDumper.cpp | 10 ++++++++++ 10 files changed, 35 insertions(+), 25 deletions(-) diff --git a/test/MC/ARM/arm-elf-symver.s b/test/MC/ARM/arm-elf-symver.s index ce9c4fe5f00..8a0aefc68f6 100644 --- a/test/MC/ARM/arm-elf-symver.s +++ b/test/MC/ARM/arm-elf-symver.s @@ -78,7 +78,7 @@ global1: @ CHECK-NEXT: Section: .text @ CHECK-NEXT: } @ CHECK-NEXT: Symbol { -@ CHECK-NEXT: Name: (0) +@ CHECK-NEXT: Name: .text (0) @ CHECK-NEXT: Value: 0x0 @ CHECK-NEXT: Size: 0 @ CHECK-NEXT: Binding: Local (0x0) diff --git a/test/MC/ELF/alias.s b/test/MC/ELF/alias.s index df39fd4be14..c575ce81b41 100644 --- a/test/MC/ELF/alias.s +++ b/test/MC/ELF/alias.s @@ -107,7 +107,7 @@ leaq .Llocal1(%rip), %rdi // CHECK-NEXT: Section: .text // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: (0) +// CHECK-NEXT: Name: .data (0) // CHECK-NOT: Symbol { // CHECK: } // CHECK-NEXT: Symbol { diff --git a/test/MC/ELF/many-sections-2.s b/test/MC/ELF/many-sections-2.s index 2c3e4b87bb8..71ac870c8bc 100644 --- a/test/MC/ELF/many-sections-2.s +++ b/test/MC/ELF/many-sections-2.s @@ -32,7 +32,7 @@ // Test that this file has one section too many. -// SYMBOLS: Name: (0) +// SYMBOLS: Name: dm (0) // SYMBOLS: Value: 0x0 // SYMBOLS: Size: 0 // SYMBOLS: Binding: Local (0x0) diff --git a/test/MC/ELF/section-sym.s b/test/MC/ELF/section-sym.s index 9e660526b7a..5d5486f9f7a 100644 --- a/test/MC/ELF/section-sym.s +++ b/test/MC/ELF/section-sym.s @@ -82,7 +82,7 @@ // CHECK-NEXT: Section: .group // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: (0) +// CHECK-NEXT: Name: foo (0) // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local (0x0) diff --git a/test/MC/ELF/symver.s b/test/MC/ELF/symver.s index 0f434dd859d..8883d192d28 100644 --- a/test/MC/ELF/symver.s +++ b/test/MC/ELF/symver.s @@ -77,7 +77,7 @@ global1: // CHECK-NEXT: Section: .text // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: (0) +// CHECK-NEXT: Name: .text (0) // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local diff --git a/test/MC/ELF/weakref.s b/test/MC/ELF/weakref.s index d342c61f745..986e92d1d47 100644 --- a/test/MC/ELF/weakref.s +++ b/test/MC/ELF/weakref.s @@ -116,7 +116,7 @@ bar15: // CHECK-NEXT: Section: .text // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: (0) +// CHECK-NEXT: Name: .text (0) // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local diff --git a/test/Object/readobj-shared-object.test b/test/Object/readobj-shared-object.test index 59f5ff127cf..da594af799e 100644 --- a/test/Object/readobj-shared-object.test +++ b/test/Object/readobj-shared-object.test @@ -128,61 +128,61 @@ ELF: ] ELF: Symbols [ ELF: Symbol { -ELF: Name: (0) +ELF: Name: .hash (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .hash ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .dynsym (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .dynsym ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .dynstr (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .dynstr ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .text (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .text ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .eh_frame (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .eh_frame ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .tdata (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .tdata ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .dynamic (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .dynamic ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .got.plt (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .got.plt ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .data (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .data ELF: } ELF: Symbol { -ELF: Name: (0) +ELF: Name: .bss (0) ELF: Binding: Local ELF: Type: Section ELF: Section: .bss diff --git a/test/tools/llvm-readobj/gnu-symbols.test b/test/tools/llvm-readobj/gnu-symbols.test index 18d43f6290d..2d864d426c5 100644 --- a/test/tools/llvm-readobj/gnu-symbols.test +++ b/test/tools/llvm-readobj/gnu-symbols.test @@ -20,9 +20,9 @@ ELF32-NEXT: 4: 00000000 4 OBJECT GLOBAL DEFAULT 3 y ELF64: Symbol table '.symtab' contains 6 entries: ELF64-NEXT: Num: Value Size Type Bind Vis Ndx Name ELF64-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -ELF64-NEXT: 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 -ELF64-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 -ELF64-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 +ELF64-NEXT: 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text +ELF64-NEXT: 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .data +ELF64-NEXT: 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss ELF64-NEXT: 4: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _GLOBAL_OFFSET_TABLE_ ELF64-NEXT: 5: 0000000000000000 0 TLS GLOBAL DEFAULT UND sym @@ -42,11 +42,11 @@ NO-SYMTAB-NOT: Symbol table '.symtab' SYMTAB: Symbol table '.symtab' contains 12 entries: SYMTAB-NEXT: Num: Value Size Type Bind Vis Ndx Name SYMTAB-NEXT: 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -SYMTAB-NEXT: 1: 00000000000000e8 0 SECTION LOCAL DEFAULT 1 -SYMTAB-NEXT: 2: 0000000000000120 0 SECTION LOCAL DEFAULT 2 -SYMTAB-NEXT: 3: 0000000000000198 0 SECTION LOCAL DEFAULT 3 -SYMTAB-NEXT: 4: 00000000000001b8 0 SECTION LOCAL DEFAULT 4 -SYMTAB-NEXT: 5: 00000000002001b8 0 SECTION LOCAL DEFAULT 5 +SYMTAB-NEXT: 1: 00000000000000e8 0 SECTION LOCAL DEFAULT 1 .gnu.hash +SYMTAB-NEXT: 2: 0000000000000120 0 SECTION LOCAL DEFAULT 2 .dynsym +SYMTAB-NEXT: 3: 0000000000000198 0 SECTION LOCAL DEFAULT 3 .dynstr +SYMTAB-NEXT: 4: 00000000000001b8 0 SECTION LOCAL DEFAULT 4 .eh_frame +SYMTAB-NEXT: 5: 00000000002001b8 0 SECTION LOCAL DEFAULT 5 .dynamic SYMTAB-NEXT: 6: 00000000002001b8 0 OBJECT LOCAL DEFAULT 5 _DYNAMIC SYMTAB-NEXT: 7: 0000000000200268 0 OBJECT LOCAL DEFAULT 5 _GLOBAL_OFFSET_TABLE_ SYMTAB-NEXT: 8: 0000000000200268 0 NOTYPE GLOBAL DEFAULT 5 __bss_start diff --git a/test/tools/llvm-readobj/sections-ext.test b/test/tools/llvm-readobj/sections-ext.test index 085693829c3..e9849a67a31 100644 --- a/test/tools/llvm-readobj/sections-ext.test +++ b/test/tools/llvm-readobj/sections-ext.test @@ -124,7 +124,7 @@ ELF-NEXT: Relocations [ ELF-NEXT: ] ELF-NEXT: Symbols [ ELF-NEXT: Symbol { -ELF-NEXT: Name: (0) +ELF-NEXT: Name: .text (0) ELF-NEXT: Value: 0x0 ELF-NEXT: Size: 0 ELF-NEXT: Binding: Local (0x0) diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 6428e9926ef..786a028035f 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -814,6 +814,16 @@ std::string ELFDumper::getFullSymbolName(const Elf_Sym *Symbol, bool IsDynamic) const { std::string SymbolName = maybeDemangle(unwrapOrError(Symbol->getName(StrTable))); + + if (SymbolName.empty() && Symbol->getType() == ELF::STT_SECTION) { + unsigned SectionIndex; + StringRef SectionName; + Elf_Sym_Range Syms = + unwrapOrError(ObjF->getELFFile()->symbols(DotSymtabSec)); + getSectionNameIndex(Symbol, Syms.begin(), SectionName, SectionIndex); + return SectionName; + } + if (!IsDynamic) return SymbolName; -- 2.50.1