#include <limits>
#include <string>
-#include "sim/host.hh" // for Addr
+#include "base/misc.hh"
+#include "base/types.hh"
-class Port;
+class PortProxy;
class SymbolTable;
class ObjectFile
enum Arch {
UnknownArch,
Alpha,
- SPARC,
- Mips
+ SPARC64,
+ SPARC32,
+ Mips,
+ X86_64,
+ I386,
+ Arm64,
+ Arm,
+ Thumb,
+ Power,
+ Riscv
};
enum OpSys {
UnknownOpSys,
Tru64,
Linux,
- Solaris
+ Solaris,
+ 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(Port *memPort, 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 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 hasTLS() { return false; }
Arch getArch() const { return arch; }
OpSys getOpSys() const { return opSys; }
Section data;
Section bss;
- bool loadSection(Section *sec, Port *memPort, 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; }
};