[llvm-nm] Fix Bug 41353 - unique symbols printed as D instead of u

Summary:
https://bugs.llvm.org/show_bug.cgi?id=41353

I'm new to LLVM and C++ so please do not hesitate to iterate with me on this fix.

Patch by Mike Pozulp!

Reviewers: rupprecht, zbrid, grimar, jhenderson

Reviewed By: rupprecht, jhenderson

Subscribers: jhenderson, chrisjackson, MaskRay, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D61117

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361595 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jordan Rupprecht 2019-05-24 04:02:05 +00:00
parent aad362fafd
commit bcb935c900
3 changed files with 70 additions and 3 deletions

View File

@ -56,6 +56,7 @@ protected:
virtual uint16_t getEMachine() const = 0;
virtual uint64_t getSymbolSize(DataRefImpl Symb) const = 0;
virtual uint8_t getSymbolBinding(DataRefImpl Symb) const = 0;
virtual uint8_t getSymbolOther(DataRefImpl Symb) const = 0;
virtual uint8_t getSymbolELFType(DataRefImpl Symb) const = 0;
@ -145,6 +146,10 @@ public:
return getObject()->getSymbolSize(getRawDataRefImpl());
}
uint8_t getBinding() const {
return getObject()->getSymbolBinding(getRawDataRefImpl());
}
uint8_t getOther() const {
return getObject()->getSymbolOther(getRawDataRefImpl());
}
@ -252,6 +257,7 @@ protected:
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
uint32_t getSymbolFlags(DataRefImpl Symb) const override;
uint8_t getSymbolBinding(DataRefImpl Symb) const override;
uint8_t getSymbolOther(DataRefImpl Symb) const override;
uint8_t getSymbolELFType(DataRefImpl Symb) const override;
Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const override;
@ -553,6 +559,11 @@ uint64_t ELFObjectFile<ELFT>::getCommonSymbolSizeImpl(DataRefImpl Symb) const {
return getSymbol(Symb)->st_size;
}
template <class ELFT>
uint8_t ELFObjectFile<ELFT>::getSymbolBinding(DataRefImpl Symb) const {
return getSymbol(Symb)->getBinding();
}
template <class ELFT>
uint8_t ELFObjectFile<ELFT>::getSymbolOther(DataRefImpl Symb) const {
return getSymbol(Symb)->st_other;

View File

@ -0,0 +1,50 @@
## Check that we print 'u' for unique symbols
## and 'U' for a unique symbol without a section.
# RUN: yaml2obj %s | llvm-nm - | FileCheck %s
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .nobits
Type: SHT_NOBITS
- Name: .progbits
Type: SHT_PROGBITS
- Name: .progbits_alloc
Type: SHT_PROGBITS
Flags: [SHF_ALLOC]
- Name: .progbits_alloc_write
Type: SHT_PROGBITS
Flags: [SHF_ALLOC, SHF_WRITE]
- Name: .progbits_execinstr
Type: SHT_PROGBITS
Flags: [SHF_EXECINSTR]
Symbols:
- Name: nosection
Binding: STB_GNU_UNIQUE
- Name: nobits
Section: .nobits
Binding: STB_GNU_UNIQUE
- Name: progbits
Section: .progbits
Binding: STB_GNU_UNIQUE
- Name: progbits_alloc
Section: .progbits_alloc
Binding: STB_GNU_UNIQUE
- Name: progbits_alloc_write
Section: .progbits_alloc_write
Binding: STB_GNU_UNIQUE
- Name: progbits_execinstr
Section: .progbits_execinstr
Binding: STB_GNU_UNIQUE
...
# CHECK: 0000000000000000 u nobits
# CHECK: U nosection
# CHECK: 0000000000000000 u progbits
# CHECK: 0000000000000000 u progbits_alloc
# CHECK: 0000000000000000 u progbits_alloc_write
# CHECK: 0000000000000000 u progbits_execinstr

View File

@ -894,6 +894,9 @@ static char getSymbolNMTypeChar(ELFObjectFileBase &Obj,
return '?';
}
if (SymI->getBinding() == ELF::STB_GNU_UNIQUE)
return 'u';
elf_section_iterator SecI = *SecIOrErr;
if (SecI != Obj.section_end()) {
uint32_t Type = SecI->getType();
@ -1119,10 +1122,13 @@ static char getNMSectionTagAndName(SymbolicFile &Obj, basic_symbol_iterator I,
else
Ret = getSymbolNMTypeChar(cast<ELFObjectFileBase>(Obj), I);
if (Symflags & object::SymbolRef::SF_Global)
Ret = toupper(Ret);
if (!(Symflags & object::SymbolRef::SF_Global))
return Ret;
return Ret;
if (Obj.isELF() && ELFSymbolRef(*I).getBinding() == ELF::STB_GNU_UNIQUE)
return Ret;
return toupper(Ret);
}
// getNsectForSegSect() is used to implement the Mach-O "-s segname sectname"