#include <limits>
#include <string>
+#include "base/misc.hh"
#include "base/types.hh"
class PortProxy;
Mips,
X86_64,
I386,
+ Arm64,
Arm,
Thumb,
- Power
+ Power,
+ Riscv
};
enum OpSys {
Tru64,
Linux,
Solaris,
- LinuxArmOABI
+ LinuxArmOABI,
+ FreeBSD
};
protected:
const std::string filename;
- int descriptor;
uint8_t *fileData;
size_t len;
Arch arch;
OpSys opSys;
- ObjectFile(const std::string &_filename, int _fd,
- size_t _len, uint8_t *_data,
+ ObjectFile(const std::string &_filename, size_t _len, uint8_t *_data,
Arch _arch, OpSys _opSys);
public:
virtual ~ObjectFile();
- void close();
+ static const Addr maxAddr = std::numeric_limits<Addr>::max();
+
+ virtual bool loadSections(PortProxy& mem_proxy,
+ Addr mask = maxAddr, Addr offset = 0);
+
+ virtual bool loadAllSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr mask = maxAddr) = 0;
+ virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr mask = maxAddr) = 0;
+ virtual bool loadLocalSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr mask = maxAddr) = 0;
+ virtual bool loadWeakSymbols(SymbolTable *symtab, Addr base = 0,
+ Addr offset = 0, Addr mask = maxAddr)
+ { return false; }
+
+ virtual ObjectFile *getInterpreter() const { return nullptr; }
+ virtual bool relocatable() const { return false; }
+ virtual Addr mapSize() const
+ { panic("mapSize() should only be called on relocatable objects\n"); }
+ virtual void updateBias(Addr bias_addr)
+ { panic("updateBias() should only be called on relocatable objects\n"); }
+ virtual Addr bias() const { return 0; }
- virtual bool loadSections(PortProxy *memProxy, Addr addrMask =
- std::numeric_limits<Addr>::max());
- virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max()) = 0;
- virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
- std::numeric_limits<Addr>::max()) = 0;
-
- virtual bool isDynamic() { return false; }
virtual bool hasTLS() { return false; }
Arch getArch() const { return arch; }
Section data;
Section bss;
- bool loadSection(Section *sec, PortProxy* memProxy, Addr addrMask);
+ bool loadSection(Section *sec, PortProxy& mem_proxy, Addr mask,
+ Addr offset = 0);
void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; }
public:
size_t dataSize() const { return data.size; }
size_t bssSize() const { return bss.size; }
+ /* This function allows you to override the base address where
+ * a binary is going to be loaded or set it if the binary is just a
+ * blob that doesn't include an object header.
+ * @param a address to load the binary/text section at
+ */
void setTextBase(Addr a) { text.baseAddr = a; }
};