#include <limits>
#include <string>
-#include "sim/host.hh" // for Addr
+#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
};
enum OpSys {
UnknownOpSys,
Tru64,
Linux,
- Solaris
+ Solaris,
+ LinuxArmOABI,
+ FreeBSD
};
protected:
void close();
- virtual bool loadSections(Port *memPort, Addr addrMask =
- std::numeric_limits<Addr>::max());
+ virtual bool loadSections(PortProxy& memProxy, Addr addrMask =
+ std::numeric_limits<Addr>::max(),
+ Addr offset = 0);
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 loadWeakSymbols(SymbolTable *symtab, Addr addrMask =
+ std::numeric_limits<Addr>::max())
+ { return false; }
+
+ virtual bool isDynamic() { return false; }
+ 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& memProxy, Addr addrMask,
+ 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; }
};