object_file.hh revision 5874
110388SAndreas.Sandberg@ARM.com/* 210388SAndreas.Sandberg@ARM.com * Copyright (c) 2002-2004 The Regents of The University of Michigan 310388SAndreas.Sandberg@ARM.com * All rights reserved. 410388SAndreas.Sandberg@ARM.com * 510388SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without 610388SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are 710388SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright 810388SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer; 910388SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright 1010388SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the 1110388SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution; 1210388SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its 1310388SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from 1410388SAndreas.Sandberg@ARM.com * this software without specific prior written permission. 1510388SAndreas.Sandberg@ARM.com * 1610388SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710388SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810388SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910388SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010388SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110388SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210388SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310388SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410388SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510388SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610388SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710388SAndreas.Sandberg@ARM.com * 2810388SAndreas.Sandberg@ARM.com * Authors: Nathan Binkert 2910388SAndreas.Sandberg@ARM.com * Steve Reinhardt 3010388SAndreas.Sandberg@ARM.com */ 3110388SAndreas.Sandberg@ARM.com 3210388SAndreas.Sandberg@ARM.com#ifndef __OBJECT_FILE_HH__ 3310388SAndreas.Sandberg@ARM.com#define __OBJECT_FILE_HH__ 3410388SAndreas.Sandberg@ARM.com 3510388SAndreas.Sandberg@ARM.com#include <limits> 3610388SAndreas.Sandberg@ARM.com#include <string> 3710388SAndreas.Sandberg@ARM.com 3810388SAndreas.Sandberg@ARM.com#include "sim/host.hh" // for Addr 3910388SAndreas.Sandberg@ARM.com 4010388SAndreas.Sandberg@ARM.comclass Port; 4110388SAndreas.Sandberg@ARM.comclass SymbolTable; 4210388SAndreas.Sandberg@ARM.com 4310388SAndreas.Sandberg@ARM.comclass ObjectFile 4410388SAndreas.Sandberg@ARM.com{ 4510388SAndreas.Sandberg@ARM.com public: 4610559Sandreas.hansson@arm.com 4710559Sandreas.hansson@arm.com enum Arch { 4810388SAndreas.Sandberg@ARM.com UnknownArch, 4910388SAndreas.Sandberg@ARM.com Alpha, 5010388SAndreas.Sandberg@ARM.com SPARC64, 5110388SAndreas.Sandberg@ARM.com SPARC32, 5210388SAndreas.Sandberg@ARM.com Mips, 5310388SAndreas.Sandberg@ARM.com X86_64, 5410388SAndreas.Sandberg@ARM.com I386, 5510388SAndreas.Sandberg@ARM.com Arm 5610388SAndreas.Sandberg@ARM.com }; 5710388SAndreas.Sandberg@ARM.com 5810388SAndreas.Sandberg@ARM.com enum OpSys { 5910388SAndreas.Sandberg@ARM.com UnknownOpSys, 6010388SAndreas.Sandberg@ARM.com Tru64, 6110388SAndreas.Sandberg@ARM.com Linux, 6210388SAndreas.Sandberg@ARM.com Solaris 6310388SAndreas.Sandberg@ARM.com }; 6410388SAndreas.Sandberg@ARM.com 6510388SAndreas.Sandberg@ARM.com protected: 6610388SAndreas.Sandberg@ARM.com const std::string filename; 6710388SAndreas.Sandberg@ARM.com int descriptor; 6810388SAndreas.Sandberg@ARM.com uint8_t *fileData; 6910388SAndreas.Sandberg@ARM.com size_t len; 7010388SAndreas.Sandberg@ARM.com 7110388SAndreas.Sandberg@ARM.com Arch arch; 7210388SAndreas.Sandberg@ARM.com OpSys opSys; 7310388SAndreas.Sandberg@ARM.com 7410388SAndreas.Sandberg@ARM.com ObjectFile(const std::string &_filename, int _fd, 7510388SAndreas.Sandberg@ARM.com size_t _len, uint8_t *_data, 7610388SAndreas.Sandberg@ARM.com Arch _arch, OpSys _opSys); 7710388SAndreas.Sandberg@ARM.com 7810388SAndreas.Sandberg@ARM.com public: 7910388SAndreas.Sandberg@ARM.com virtual ~ObjectFile(); 8010388SAndreas.Sandberg@ARM.com 8110388SAndreas.Sandberg@ARM.com void close(); 8210388SAndreas.Sandberg@ARM.com 8310388SAndreas.Sandberg@ARM.com virtual bool loadSections(Port *memPort, Addr addrMask = 8410388SAndreas.Sandberg@ARM.com std::numeric_limits<Addr>::max()); 8510388SAndreas.Sandberg@ARM.com virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask = 8610388SAndreas.Sandberg@ARM.com std::numeric_limits<Addr>::max()) = 0; 8710388SAndreas.Sandberg@ARM.com virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask = 8810388SAndreas.Sandberg@ARM.com std::numeric_limits<Addr>::max()) = 0; 8910388SAndreas.Sandberg@ARM.com 9010388SAndreas.Sandberg@ARM.com virtual bool isDynamic() { return false; } 9110388SAndreas.Sandberg@ARM.com virtual bool hasTLS() { return false; } 9210388SAndreas.Sandberg@ARM.com 9310388SAndreas.Sandberg@ARM.com Arch getArch() const { return arch; } 9410388SAndreas.Sandberg@ARM.com OpSys getOpSys() const { return opSys; } 9510388SAndreas.Sandberg@ARM.com 9610388SAndreas.Sandberg@ARM.com protected: 9710388SAndreas.Sandberg@ARM.com 9810388SAndreas.Sandberg@ARM.com struct Section { 9910388SAndreas.Sandberg@ARM.com Addr baseAddr; 10010388SAndreas.Sandberg@ARM.com uint8_t *fileImage; 10110388SAndreas.Sandberg@ARM.com size_t size; 10210388SAndreas.Sandberg@ARM.com }; 10310388SAndreas.Sandberg@ARM.com 10410388SAndreas.Sandberg@ARM.com Addr entry; 10510388SAndreas.Sandberg@ARM.com Addr globalPtr; 10610388SAndreas.Sandberg@ARM.com 10710388SAndreas.Sandberg@ARM.com Section text; 10810388SAndreas.Sandberg@ARM.com Section data; 10910388SAndreas.Sandberg@ARM.com Section bss; 11010388SAndreas.Sandberg@ARM.com 11110388SAndreas.Sandberg@ARM.com bool loadSection(Section *sec, Port *memPort, Addr addrMask); 11210388SAndreas.Sandberg@ARM.com void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; } 11310388SAndreas.Sandberg@ARM.com 11410388SAndreas.Sandberg@ARM.com public: 11510388SAndreas.Sandberg@ARM.com Addr entryPoint() const { return entry; } 11610388SAndreas.Sandberg@ARM.com 11710388SAndreas.Sandberg@ARM.com Addr globalPointer() const { return globalPtr; } 11810388SAndreas.Sandberg@ARM.com 11910388SAndreas.Sandberg@ARM.com Addr textBase() const { return text.baseAddr; } 12010388SAndreas.Sandberg@ARM.com Addr dataBase() const { return data.baseAddr; } 12110388SAndreas.Sandberg@ARM.com Addr bssBase() const { return bss.baseAddr; } 12210388SAndreas.Sandberg@ARM.com 12310388SAndreas.Sandberg@ARM.com size_t textSize() const { return text.size; } 12410388SAndreas.Sandberg@ARM.com size_t dataSize() const { return data.size; } 12510388SAndreas.Sandberg@ARM.com size_t bssSize() const { return bss.size; } 12610388SAndreas.Sandberg@ARM.com 12710388SAndreas.Sandberg@ARM.com void setTextBase(Addr a) { text.baseAddr = a; } 12810388SAndreas.Sandberg@ARM.com}; 12910388SAndreas.Sandberg@ARM.com 13010388SAndreas.Sandberg@ARM.comObjectFile *createObjectFile(const std::string &fname, bool raw = false); 13110388SAndreas.Sandberg@ARM.com 13210388SAndreas.Sandberg@ARM.com 13310388SAndreas.Sandberg@ARM.com#endif // __OBJECT_FILE_HH__ 13410388SAndreas.Sandberg@ARM.com