Start library: working singleton class schema
This commit is contained in:
parent
37c54424a3
commit
3932ee09e6
3 changed files with 101 additions and 0 deletions
27
Makefile
Normal file
27
Makefile
Normal file
|
@ -0,0 +1,27 @@
|
|||
LIB_DIR=lib
|
||||
TARGET=$(LIB_DIR)/libdwarfinterpret.so
|
||||
SRC=src/DwarfInterpret.cpp
|
||||
|
||||
INCLUDE_DIR=include
|
||||
|
||||
CXX=g++
|
||||
CXXFLAGS=-Wall -Wextra -O2 --std=c++14
|
||||
CXXLIBS=-ldwarfpp -ldwarf -lelf -lc++fileno
|
||||
CXXINCLUDE=-I$(INCLUDE_DIR)
|
||||
|
||||
|
||||
OBJS = $(SRC:.cpp=.o)
|
||||
|
||||
###############################################################################
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): $(OBJS)
|
||||
mkdir -p "$$(dirname "$@")"
|
||||
$(CXX) $(CXXFLAGS) $(CXXLIBS) $(CXXINCLUDE) $^ -shared -o "$@"
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CXXFLAGS) $(CXXINCLUDE) -fPIC -c "$<" -o "$@"
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) $(TARGET)
|
35
include/DwarfInterpret.hpp
Normal file
35
include/DwarfInterpret.hpp
Normal file
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
#include <dwarfpp/root.hpp>
|
||||
|
||||
class DwarfInterpret {
|
||||
/** Singleton class holding a Dwarf interpret.
|
||||
* Must be first instanciated with the path to the binary being run, with a
|
||||
* call to `instanciate`, and can afterwards be accessed with calls to
|
||||
* `acquire`.
|
||||
*/
|
||||
|
||||
public:
|
||||
class NotInstanciated: public std::exception {};
|
||||
class AlreadyInstanciated: public std::exception {};
|
||||
|
||||
DwarfInterpret(DwarfInterpret const&) = delete;
|
||||
void operator=(DwarfInterpret const&) = delete;
|
||||
|
||||
static DwarfInterpret& acquire();
|
||||
static DwarfInterpret& instanciate(const std::string& elf_path);
|
||||
|
||||
private:
|
||||
DwarfInterpret(const std::string& elf_path);
|
||||
|
||||
private: // members
|
||||
static std::unique_ptr<DwarfInterpret> instance;
|
||||
|
||||
dwarf::core::root_die root_die;
|
||||
int elf_machine;
|
||||
|
||||
friend class std::unique_ptr<DwarfInterpret>;
|
||||
};
|
39
src/DwarfInterpret.cpp
Normal file
39
src/DwarfInterpret.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include <DwarfInterpret.hpp>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
#include <fileno.hpp>
|
||||
#include <dwarfpp/lib.hpp>
|
||||
#include <dwarfpp/regs.hpp>
|
||||
#include <dwarfpp/frame.hpp>
|
||||
#include <dwarfpp/attr.hpp>
|
||||
#include <dwarfpp/frame.hpp>
|
||||
#include <dwarfpp/root.hpp>
|
||||
#include <gelf.h>
|
||||
|
||||
DwarfInterpret::DwarfInterpret(const std::string& elf_path)
|
||||
: root_die(fileno(std::ifstream(elf_path)))
|
||||
{
|
||||
//std::ifstream file_in(elf_path);
|
||||
//root_die = dwarf::core::root_die(fileno(file_in));
|
||||
// FIXME this ^ deserves some checks. But this looks tedious.
|
||||
|
||||
GElf_Ehdr ehdr;
|
||||
GElf_Ehdr *ret = gelf_getehdr(root_die.get_elf(), &ehdr);
|
||||
assert(ret != 0);
|
||||
elf_machine = ehdr.e_machine;
|
||||
}
|
||||
|
||||
DwarfInterpret& DwarfInterpret::acquire() {
|
||||
if(DwarfInterpret::instance == nullptr)
|
||||
throw NotInstanciated();
|
||||
return *(DwarfInterpret::instance);
|
||||
}
|
||||
|
||||
DwarfInterpret& DwarfInterpret::instanciate(const std::string& elf_path) {
|
||||
if(DwarfInterpret::instance != nullptr)
|
||||
throw AlreadyInstanciated();
|
||||
DwarfInterpret::instance = std::unique_ptr<DwarfInterpret>(
|
||||
new DwarfInterpret(elf_path));
|
||||
return *(DwarfInterpret::instance);
|
||||
}
|
Loading…
Reference in a new issue