forked from OSchip/llvm-project
Move ELFObjHandler to TextAPI library
This change moves ELFObjHandler to llvm/TextAPI library so it can be used by different llvm tools.
This commit is contained in:
parent
4514a3cfa4
commit
e6f8ba12e6
|
@ -10,8 +10,8 @@
|
|||
///
|
||||
//===-----------------------------------------------------------------------===/
|
||||
|
||||
#ifndef LLVM_TOOLS_ELFABI_ELFOBJHANDLER_H
|
||||
#define LLVM_TOOLS_ELFABI_ELFOBJHANDLER_H
|
||||
#ifndef LLVM_TEXTAPI_ELF_ELFOBJHANDLER_H
|
||||
#define LLVM_TEXTAPI_ELF_ELFOBJHANDLER_H
|
||||
|
||||
#include "llvm/Object/ELFObjectFile.h"
|
||||
#include "llvm/Object/ELFTypes.h"
|
||||
|
@ -29,4 +29,4 @@ Expected<std::unique_ptr<ELFStub>> readELFFile(MemoryBufferRef Buf);
|
|||
} // end namespace elfabi
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_TOOLS_ELFABI_ELFOBJHANDLER_H
|
||||
#endif // LLVM_TEXTAPI_ELF_ELFOBJHANDLER_H
|
|
@ -1,4 +1,5 @@
|
|||
add_llvm_component_library(LLVMTextAPI
|
||||
ELF/ELFObjHandler.cpp
|
||||
ELF/ELFStub.cpp
|
||||
ELF/TBEHandler.cpp
|
||||
MachO/Architecture.cpp
|
||||
|
@ -13,6 +14,6 @@ add_llvm_component_library(LLVMTextAPI
|
|||
|
||||
ADDITIONAL_HEADER_DIRS
|
||||
"${LLVM_MAIN_INCLUDE_DIR}/llvm/TextAPI"
|
||||
"${LLVM_MAIN_INCLUDE_DIR}/llvm/TextAPI/Elf"
|
||||
"${LLVM_MAIN_INCLUDE_DIR}/llvm/TextAPI/ELF"
|
||||
"${LLVM_MAIN_INCLUDE_DIR}/llvm/TextAPI/MachO"
|
||||
)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
//
|
||||
//===-----------------------------------------------------------------------===/
|
||||
|
||||
#include "ELFObjHandler.h"
|
||||
#include "llvm/TextAPI/ELF/ELFObjHandler.h"
|
||||
#include "llvm/Object/Binary.h"
|
||||
#include "llvm/Object/ELFObjectFile.h"
|
||||
#include "llvm/Object/ELFTypes.h"
|
||||
|
@ -128,19 +128,17 @@ static Error populateDynamic(DynamicEntries &Dyn,
|
|||
"Couldn't locate dynamic symbol table (no DT_SYMTAB entry)");
|
||||
}
|
||||
if (Dyn.SONameOffset.hasValue() && *Dyn.SONameOffset >= Dyn.StrSize) {
|
||||
return createStringError(
|
||||
object_error::parse_failed,
|
||||
"DT_SONAME string offset (0x%016" PRIx64
|
||||
") outside of dynamic string table",
|
||||
*Dyn.SONameOffset);
|
||||
return createStringError(object_error::parse_failed,
|
||||
"DT_SONAME string offset (0x%016" PRIx64
|
||||
") outside of dynamic string table",
|
||||
*Dyn.SONameOffset);
|
||||
}
|
||||
for (uint64_t Offset : Dyn.NeededLibNames) {
|
||||
if (Offset >= Dyn.StrSize) {
|
||||
return createStringError(
|
||||
object_error::parse_failed,
|
||||
"DT_NEEDED string offset (0x%016" PRIx64
|
||||
") outside of dynamic string table",
|
||||
Offset);
|
||||
return createStringError(object_error::parse_failed,
|
||||
"DT_NEEDED string offset (0x%016" PRIx64
|
||||
") outside of dynamic string table",
|
||||
Offset);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -212,16 +210,16 @@ static Expected<uint64_t> getNumSyms(DynamicEntries &Dyn,
|
|||
static ELFSymbolType convertInfoToType(uint8_t Info) {
|
||||
Info = Info & 0xf;
|
||||
switch (Info) {
|
||||
case ELF::STT_NOTYPE:
|
||||
return ELFSymbolType::NoType;
|
||||
case ELF::STT_OBJECT:
|
||||
return ELFSymbolType::Object;
|
||||
case ELF::STT_FUNC:
|
||||
return ELFSymbolType::Func;
|
||||
case ELF::STT_TLS:
|
||||
return ELFSymbolType::TLS;
|
||||
default:
|
||||
return ELFSymbolType::Unknown;
|
||||
case ELF::STT_NOTYPE:
|
||||
return ELFSymbolType::NoType;
|
||||
case ELF::STT_OBJECT:
|
||||
return ELFSymbolType::Object;
|
||||
case ELF::STT_FUNC:
|
||||
return ELFSymbolType::Func;
|
||||
case ELF::STT_TLS:
|
||||
return ELFSymbolType::TLS;
|
||||
default:
|
||||
return ELFSymbolType::Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -259,8 +257,8 @@ static ELFSymbol createELFSym(StringRef SymName,
|
|||
/// @param DynStr StringRef to the dynamic string table.
|
||||
template <class ELFT>
|
||||
static Error populateSymbols(ELFStub &TargetStub,
|
||||
const typename ELFT::SymRange DynSym,
|
||||
StringRef DynStr) {
|
||||
const typename ELFT::SymRange DynSym,
|
||||
StringRef DynStr) {
|
||||
// Skips the first symbol since it's the NULL symbol.
|
||||
for (auto RawSym : DynSym.drop_front(1)) {
|
||||
// If a symbol does not have global or weak binding, ignore it.
|
||||
|
@ -311,7 +309,7 @@ buildStub(const ELFObjectFile<ELFT> &ElfObj) {
|
|||
if (Error Err = populateDynamic<ELFT>(DynEnt, *DynTable))
|
||||
return std::move(Err);
|
||||
|
||||
// Get pointer to in-memory location of .dynstr section.
|
||||
// Get pointer to in-memory location of .dynstr section.
|
||||
Expected<const uint8_t *> DynStrPtr =
|
||||
ElfFile->toMappedAddr(DynEnt.StrTabAddr);
|
||||
if (!DynStrPtr)
|
||||
|
@ -355,9 +353,8 @@ buildStub(const ELFObjectFile<ELFT> &ElfObj) {
|
|||
if (!DynSymPtr)
|
||||
return appendToError(DynSymPtr.takeError(),
|
||||
"when locating .dynsym section contents");
|
||||
Elf_Sym_Range DynSyms =
|
||||
ArrayRef<Elf_Sym>(reinterpret_cast<const Elf_Sym *>(*DynSymPtr),
|
||||
*SymCount);
|
||||
Elf_Sym_Range DynSyms = ArrayRef<Elf_Sym>(
|
||||
reinterpret_cast<const Elf_Sym *>(*DynSymPtr), *SymCount);
|
||||
Error SymReadError = populateSymbols<ELFT>(*DestStub, DynSyms, DynStr);
|
||||
if (SymReadError)
|
||||
return appendToError(std::move(SymReadError),
|
|
@ -5,7 +5,6 @@ set(LLVM_LINK_COMPONENTS
|
|||
)
|
||||
|
||||
add_llvm_tool(llvm-elfabi
|
||||
ELFObjHandler.cpp
|
||||
ErrorCollector.cpp
|
||||
llvm-elfabi.cpp
|
||||
)
|
||||
|
|
|
@ -6,15 +6,15 @@
|
|||
//
|
||||
//===-----------------------------------------------------------------------===/
|
||||
|
||||
#include "ELFObjHandler.h"
|
||||
#include "ErrorCollector.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Errc.h"
|
||||
#include "llvm/Support/FileOutputBuffer.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Support/WithColor.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/TextAPI/ELF/ELFObjHandler.h"
|
||||
#include "llvm/TextAPI/ELF/TBEHandler.h"
|
||||
#include <string>
|
||||
|
||||
|
|
Loading…
Reference in New Issue