Start work on object loader using llvm's RuntimeDyld api.

This commit is contained in:
Lachlan Sneff
2019-02-25 18:07:22 -08:00
parent 2a913f5663
commit 4f833876e0
9 changed files with 579 additions and 122 deletions

View File

@ -0,0 +1,96 @@
#include "object_loader.hh"
#include <llvm/ExecutionEngine/RuntimeDyld.h>
#include <iostream>
class MemoryManager : llvm::RuntimeDyld::MemoryManager {
public:
MemoryManager() {}
virtual ~MemoryManager() {}
virtual uint8_t* allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, llvm::StringRef SectionName) override {
return nullptr;
}
virtual uint8_t* allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, llvm::StringRef SectionName, bool isReadOnly) override {
return nullptr;
}
virtual void reserveAllocationSpace(
uintptr_t code_size,
uint32_t code_align,
uintptr_t read_data_size,
uint32_t read_data_align,
uintptr_t read_write_data_size,
uint32_t read_write_data_align
) override {
}
/* Turn on the `reserveAllocationSpace` callback. */
virtual bool needsToReserveAllocationSpace() override {
return true;
}
virtual void registerEHFrames(uint8_t* Addr, uint64_t LoadAddr, size_t Size) override {
}
virtual void deregisterEHFrames() override {
}
virtual bool finalizeMemory(std::string *ErrMsg = nullptr) override {
return false;
}
virtual void notifyObjectLoaded(llvm::RuntimeDyld &RTDyld, const llvm::object::ObjectFile &Obj) override {
}
private:
struct Section {
uint8_t* base;
size_t num_pages;
size_t num_commited_bytes;
};
uint8_t *image_base;
size_t num_allocated_pages;
Section code_section, read_section, readwrite_section;
};
class SymbolLookup : llvm::JITSymbolResolver {
public:
virtual llvm::Expected<LookupResult> lookup(const LookupSet& symbols) override {
LookupResult result;
for (auto symbol : symbols) {
result.emplace(symbol, symbol_lookup(symbol));
}
return result;
}
virtual llvm::Expected<LookupFlagsResult> lookupFlags(const LookupSet& symbols) override {
LookupFlagsResult result;
for (auto symbol : symbols) {
result.emplace(symbol, symbol_lookup(symbol).getFlags());
}
return result;
}
private:
llvm::JITEvaluatedSymbol symbol_lookup(llvm::StringRef name) {
std::cout << "symbol name: " << (std::string)name << std::endl;
uint64_t addr = 0;
return llvm::JITEvaluatedSymbol(addr, llvm::JITSymbolFlags::None);
}
};

View File

@ -0,0 +1,40 @@
#include <cstddef>
#include <cstdint>
typedef enum {
PROTECT_NONE,
PROTECT_READ,
PROTECT_READ_WRITE,
PROTECT_READ_EXECUTE,
} mem_protect_t;
typedef enum {
RESULT_OK,
RESULT_ALLOCATE_FAILURE,
RESULT_PROTECT_FAILURE,
RESULT_DEALLOC_FAILURE,
RESULT_OBJECT_LOAD_FAILURE,
} result_t;
typedef result_t (*alloc_memory_t)(size_t size, mem_protect_t protect, uint8_t** ptr_out, size_t* size_out);
typedef result_t (*protect_memory_t)(uint8_t* ptr, size_t size, mem_protect_t protect);
typedef result_t (*dealloc_memory_t)(uint8_t* ptr, size_t size);
typedef uintptr_t (*lookup_vm_symbol_t)(char* name_ptr, size_t name_size);
typedef struct {
/* Memory management. */
alloc_memory_t alloc_memory;
protect_memory_t protect_memory;
dealloc_memory_t dealloc_memory;
lookup_vm_symbol_t lookup_vm_symbol;
} callbacks_t;
extern "C" {
result_t object_load(uint8_t* mem_ptr, size_t mem_size, callbacks_t* callbacks) {
return RESULT_OK;
}
void test_cpp() {
}
}