namespace llvm {
namespace object {
-extern const llvm::EnumEntry<unsigned> ElfSymbolTypes[8];
-
class elf_symbol_iterator;
class ELFObjectFileBase : public ObjectFile {
uint8_t getELFType() const {
return getObject()->getSymbolELFType(getRawDataRefImpl());
}
-
- void getELFTypeName(StringRef &TN) const {
- uint8_t et = getELFType();
- TN = "";
- for (auto &ee : ElfSymbolTypes) {
- if (ee.Value == et) {
- TN = ee.AltName;
- break;
- }
- }
- }
};
class elf_symbol_iterator : public symbol_iterator {
Expected<section_iterator> getSymbolSection(const Elf_Sym *Symb,
const Elf_Shdr *SymTab) const;
Expected<section_iterator> getSymbolSection(DataRefImpl Symb) const override;
- int getSymbolSectionIndex(DataRefImpl Symb) const override;
void moveSectionNext(DataRefImpl &Sec) const override;
std::error_code getSectionName(DataRefImpl Sec,
return getSymbolSection(Sym, SymTab);
}
-template <class ELFT>
-int
-ELFObjectFile<ELFT>::getSymbolSectionIndex(DataRefImpl Symb) const {
- const Elf_Sym *Sym = getSymbol(Symb);
- return Sym->st_shndx;
-}
-
template <class ELFT>
void ELFObjectFile<ELFT>::moveSectionNext(DataRefImpl &Sec) const {
const Elf_Shdr *ESec = getSection(Sec);
/// end_sections() if it is undefined or is an absolute symbol.
Expected<section_iterator> getSection() const;
- // Get the section index of the section of this symbol
- int getSectionIndex() const;
-
const ObjectFile *getObject() const;
};
virtual Expected<SymbolRef::Type> getSymbolType(DataRefImpl Symb) const = 0;
virtual Expected<section_iterator>
getSymbolSection(DataRefImpl Symb) const = 0;
- virtual int getSymbolSectionIndex(DataRefImpl Symb) const { return -1; }
// Same as above for SectionRef.
friend class SectionRef;
return getObject()->getCommonSymbolSize(getRawDataRefImpl());
}
-inline int SymbolRef::getSectionIndex() const {
- return getObject()->getSymbolSectionIndex(getRawDataRefImpl());
-}
-
inline Expected<section_iterator> SymbolRef::getSection() const {
return getObject()->getSymbolSection(getRawDataRefImpl());
}
using namespace llvm;
using namespace object;
-const EnumEntry<unsigned> llvm::object::ElfSymbolTypes[8] = {
- {"None", "NOTYPE", ELF::STT_NOTYPE},
- {"Object", "OBJECT", ELF::STT_OBJECT},
- {"Function", "FUNC", ELF::STT_FUNC},
- {"Section", "SECTION", ELF::STT_SECTION},
- {"File", "FILE", ELF::STT_FILE},
- {"Common", "COMMON", ELF::STT_COMMON},
- {"TLS", "TLS", ELF::STT_TLS},
- {"GNU_IFunc", "IFUNC", ELF::STT_GNU_IFUNC}};
-
ELFObjectFileBase::ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source)
: ObjectFile(Type, Source) {}
RUN: llvm-nm -f sysv %p/Inputs/hello.obj.elf-i386 | FileCheck %s --strict-whitespace
CHECK: Name Value Class Type Size Line Section
-CHECK: .L.str |00000000| r | OBJECT|0000000f| |.rodata.str1.1
-CHECK: main |00000000| T | FUNC|00000015| |.text
-CHECK: puts | | U | NOTYPE| | |*UND*
+CHECK: .L.str |00000000| r | |0000000f| |
+CHECK: main |00000000| T | |00000015| |
+CHECK: puts | | U | | | |
RUN: llvm-nm -f sysv %p/Inputs/hello.obj.macho-x86_64 2>&1 | FileCheck %s --check-prefix=MACHO --strict-whitespace
ELF: Name Value Class Type Size Line Section
-ELF: main |0000000000000000| T | FUNC|0000000000000015| |.text
-ELF: puts | | U | NOTYPE| | |*UND*
+ELF: main |0000000000000000| T | |0000000000000015| |
+ELF: puts | | U | | | |
MACHO: Name Value Class Type Size Line Section
MACHO: EH_frame0 |0000000000000068| s | |0000000000000000| |
uint64_t Size;
char TypeChar;
StringRef Name;
- StringRef SectionName;
- StringRef TypeName;
BasicSymbolRef Sym;
// The Sym field above points to the native symbol in the object file,
// for Mach-O when we are creating symbols from the dyld info the above
std::string PaddedName(Name);
while (PaddedName.length() < 20)
PaddedName += " ";
- std::string TNPad = "";
- int TNL = I->TypeName.size();
- while ((TNPad.length() + TNL) < 18)
- TNPad += " ";
outs() << PaddedName << "|" << SymbolAddrStr << "| " << I->TypeChar
- << " |" << TNPad << I->TypeName << "|" << SymbolSizeStr
- << "| |" << I->SectionName << "\n";
+ << " | |" << SymbolSizeStr << "| |\n";
}
}
: elf_symbol_iterator(I)->getELFType() == ELF::STT_OBJECT;
}
-// For ELF object files, Set TypeName to the symbol typename, to be printed
-// in the 'Type' column of the SYSV format output.
-static void getNMTypeName(SymbolicFile &Obj, basic_symbol_iterator I,
- StringRef &TypeName) {
- if (isa<ELFObjectFileBase>(&Obj)) {
- elf_symbol_iterator SymI(I);
- SymI->getELFTypeName(TypeName);
- }
-}
-
-// Return Posix nm class type tag (single letter), but also set SecName and
-// section and name, to be used in format=sysv output.
-static char getNMClassTagAndSectionName(SymbolicFile &Obj,
- basic_symbol_iterator I,
- StringRef &SecName) {
- if (isa<ELFObjectFileBase>(&Obj)) {
- elf_symbol_iterator SymI(I);
-
- Expected<elf_section_iterator> SecIOrErr = SymI->getSection();
- if (!SecIOrErr) {
- consumeError(SecIOrErr.takeError());
- return '?';
- }
- int SI = SymI->getSectionIndex();
- if (SI == 0) {
- SecName = "*UND*";
- } else {
- elf_section_iterator secT = *SecIOrErr;
- secT->getName(SecName);
- }
- }
+static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) {
uint32_t Symflags = I->getFlags();
if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj)) {
char Ret = isObject(Obj, I) ? 'v' : 'w';
if (Symflags & object::SymbolRef::SF_Undefined)
return 'U';
- if (Symflags & object::SymbolRef::SF_Common) {
- SecName = "*COM*";
+ if (Symflags & object::SymbolRef::SF_Common)
return 'C';
- }
char Ret = '?';
if (Symflags & object::SymbolRef::SF_Absolute)
}
S.Address = *AddressOrErr;
}
- getNMTypeName(Obj, Sym, S.TypeName);
- S.TypeChar = getNMClassTagAndSectionName(Obj, Sym, S.SectionName);
+ S.TypeChar = getNMTypeChar(Obj, Sym);
std::error_code EC = Sym.printName(OS);
if (EC && MachO)
OS << "bad string index";
{"HIDDEN", "HIDDEN", ELF::STV_HIDDEN},
{"PROTECTED", "PROTECTED", ELF::STV_PROTECTED}};
+static const EnumEntry<unsigned> ElfSymbolTypes[] = {
+ {"None", "NOTYPE", ELF::STT_NOTYPE},
+ {"Object", "OBJECT", ELF::STT_OBJECT},
+ {"Function", "FUNC", ELF::STT_FUNC},
+ {"Section", "SECTION", ELF::STT_SECTION},
+ {"File", "FILE", ELF::STT_FILE},
+ {"Common", "COMMON", ELF::STT_COMMON},
+ {"TLS", "TLS", ELF::STT_TLS},
+ {"GNU_IFunc", "IFUNC", ELF::STT_GNU_IFUNC}};
+
static const EnumEntry<unsigned> AMDGPUSymbolTypes[] = {
{ "AMDGPU_HSA_KERNEL", ELF::STT_AMDGPU_HSA_KERNEL }
};