60 lines
2.0 KiB
C++
60 lines
2.0 KiB
C++
//===--------- 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<ELF32LE> {
|
|
public:
|
|
typedef llvm::object::Elf_Sym_Impl<ELF32LE> 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<ELF32LE>::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<int64_t>(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
|