//===--------- lib/ReaderWriter/ELF/ARM/ARMSymbolTable.h ------------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_ELF_ARM_ARM_SYMBOL_TABLE_H #define LLD_READER_WRITER_ELF_ARM_ARM_SYMBOL_TABLE_H #include "SectionChunks.h" #include "TargetLayout.h" #include "ARMELFFile.h" namespace lld { namespace elf { /// \brief The SymbolTable class represents the symbol table in a ELF file class ARMSymbolTable : public SymbolTable { public: typedef llvm::object::Elf_Sym_Impl Elf_Sym; ARMSymbolTable(const ELFLinkingContext &ctx); void addDefinedAtom(Elf_Sym &sym, const DefinedAtom *da, int64_t addr) override; }; ARMSymbolTable::ARMSymbolTable(const ELFLinkingContext &ctx) : SymbolTable(ctx, ".symtab", TargetLayout::ORDER_SYMBOL_TABLE) {} void ARMSymbolTable::addDefinedAtom(Elf_Sym &sym, const DefinedAtom *da, int64_t addr) { SymbolTable::addDefinedAtom(sym, da, addr); if ((ARMELFDefinedAtom::ARMContentType)da->contentType() == ARMELFDefinedAtom::typeARMExidx) sym.st_value = addr; // Set zero bit to distinguish real symbols addressing Thumb instructions. // Don't care about mapping symbols like $t and others. if (DefinedAtom::codeARMThumb == da->codeModel()) sym.st_value = static_cast(sym.st_value) | 0x1; // Mapping symbols should have special values of binding, type and size set. if ((DefinedAtom::codeARM_a == da->codeModel()) || (DefinedAtom::codeARM_d == da->codeModel()) || (DefinedAtom::codeARM_t == da->codeModel())) { sym.setBindingAndType(llvm::ELF::STB_LOCAL, llvm::ELF::STT_NOTYPE); sym.st_size = 0; } } } // elf } // lld #endif // LLD_READER_WRITER_ELF_ARM_ARM_SYMBOL_TABLE_H