From: Matt Davis Date: Thu, 31 Jan 2019 19:42:21 +0000 (+0000) Subject: [ELF] Return the section name when calling getSymbolName on a section symbol. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7fac036c204bd0273ecf3cb5980b8d5c06aca9f7;p=llvm [ELF] Return the section name when calling getSymbolName on a section symbol. Summary: Previously, llvm-nm would report symbols for .debug and .note sections as: '?' with an empty section name: ``` 00000000 ? 00000000 ? ... ``` With this patch the output more closely resembles GNU nm: ``` 00000000 N .debug_abbrev 00000000 n .note.GNU-stack ... ``` This patch calls `getSectionName` for sections that belong to symbols of type `ELF::STT_SECTION`, which returns the name of the section from the section string table. Reviewers: Bigcheese, davide, jhenderson Reviewed By: davide, jhenderson Subscribers: rupprecht, jhenderson, llvm-commits Differential Revision: https://reviews.llvm.org/D57105 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352785 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 67bcf519214..aab7340a9e8 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -440,7 +440,16 @@ Expected ELFObjectFile::getSymbolName(DataRefImpl Sym) const { auto SymStrTabOrErr = EF.getStringTable(StringTableSec); if (!SymStrTabOrErr) return SymStrTabOrErr.takeError(); - return ESym->getName(*SymStrTabOrErr); + Expected Name = ESym->getName(*SymStrTabOrErr); + + // If the symbol name is empty use the section name. + if ((!Name || Name->empty()) && ESym->getType() == ELF::STT_SECTION) { + StringRef SecName; + Expected Sec = getSymbolSection(Sym); + if (Sec && !(*Sec)->getName(SecName)) + return SecName; + } + return Name; } template diff --git a/test/Object/nm-trivial-object.test b/test/Object/nm-trivial-object.test index 4ecc17a15a5..1a593857f70 100644 --- a/test/Object/nm-trivial-object.test +++ b/test/Object/nm-trivial-object.test @@ -18,6 +18,8 @@ RUN: llvm-nm %p/Inputs/weak.elf-x86-64 \ RUN: | FileCheck %s -check-prefix WEAK-ELF64 RUN: llvm-nm %p/Inputs/absolute.elf-x86-64 \ RUN: | FileCheck %s -check-prefix ABSOLUTE-ELF64 +RUN: llvm-nm -a %p/Inputs/IsNAN.o \ +RUN: | FileCheck %s -check-prefix ELF64-DEBUG-SYMS RUN: llvm-nm %p/Inputs/trivial-object-test.macho-i386 \ RUN: | FileCheck %s -check-prefix macho RUN: llvm-nm -U %p/Inputs/trivial-object-test.macho-i386 \ @@ -113,6 +115,22 @@ WEAK-ELF64: 0000000000000000 V x2 ABSOLUTE-ELF64: 0000000000000123 a a1 ABSOLUTE-ELF64: 0000000000000123 A a2 +ELF64-DEBUG-SYMS: 00000000 b .bss +ELF64-DEBUG-SYMS: 00000000 d .data +ELF64-DEBUG-SYMS: 00000000 N .debug_abbrev +ELF64-DEBUG-SYMS: 00000000 N .debug_aranges +ELF64-DEBUG-SYMS: 00000000 N .debug_frame +ELF64-DEBUG-SYMS: 00000000 N .debug_info +ELF64-DEBUG-SYMS: 00000000 N .debug_line +ELF64-DEBUG-SYMS: 00000000 N .debug_pubnames +ELF64-DEBUG-SYMS: 00000000 n .note.GNU-stack +ELF64-DEBUG-SYMS: 00000000 t .text +ELF64-DEBUG-SYMS: 00000000 a IsNAN.cpp +ELF64-DEBUG-SYMS: 00000014 T _ZN4llvm5IsNANEd +ELF64-DEBUG-SYMS: 00000000 T _ZN4llvm5IsNANEf +ELF64-DEBUG-SYMS: U __isnan +ELF64-DEBUG-SYMS: U __isnanf + macho: U _SomeOtherFunction macho: 00000000 T _main macho: U _puts diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 87ed8bbe6ab..a82ed0974fb 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -941,8 +941,11 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, report_error(Obj->getFileName(), SectionOrErr.takeError()); uint8_t SymbolType = ELF::STT_NOTYPE; - if (Obj->isELF()) + if (Obj->isELF()) { SymbolType = getElfSymbolType(Obj, Symbol); + if (SymbolType == ELF::STT_SECTION) + continue; + } section_iterator SecI = *SectionOrErr; if (SecI != Obj->section_end())