object_file.hh revision 7095
15659Sgblack@eecs.umich.edu/* 25659Sgblack@eecs.umich.edu * Copyright (c) 2002-2004 The Regents of The University of Michigan 35659Sgblack@eecs.umich.edu * All rights reserved. 45659Sgblack@eecs.umich.edu * 55659Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65659Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75659Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85659Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95659Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105659Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115659Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125659Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135659Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145659Sgblack@eecs.umich.edu * this software without specific prior written permission. 155659Sgblack@eecs.umich.edu * 165659Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175659Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185659Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195659Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205659Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215659Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225659Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235659Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245659Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255659Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265659Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275659Sgblack@eecs.umich.edu * 285659Sgblack@eecs.umich.edu * Authors: Nathan Binkert 295659Sgblack@eecs.umich.edu * Steve Reinhardt 305659Sgblack@eecs.umich.edu */ 315659Sgblack@eecs.umich.edu 325659Sgblack@eecs.umich.edu#ifndef __OBJECT_FILE_HH__ 335659Sgblack@eecs.umich.edu#define __OBJECT_FILE_HH__ 345659Sgblack@eecs.umich.edu 355659Sgblack@eecs.umich.edu#include <limits> 365659Sgblack@eecs.umich.edu#include <string> 375659Sgblack@eecs.umich.edu 385659Sgblack@eecs.umich.edu#include "base/types.hh" 395659Sgblack@eecs.umich.edu 405659Sgblack@eecs.umich.educlass Port; 415659Sgblack@eecs.umich.educlass SymbolTable; 425659Sgblack@eecs.umich.edu 435659Sgblack@eecs.umich.educlass ObjectFile 445659Sgblack@eecs.umich.edu{ 455659Sgblack@eecs.umich.edu public: 465659Sgblack@eecs.umich.edu 475659Sgblack@eecs.umich.edu enum Arch { 485659Sgblack@eecs.umich.edu UnknownArch, 495659Sgblack@eecs.umich.edu Alpha, 505659Sgblack@eecs.umich.edu SPARC64, 515659Sgblack@eecs.umich.edu SPARC32, 525659Sgblack@eecs.umich.edu Mips, 535659Sgblack@eecs.umich.edu X86_64, 545659Sgblack@eecs.umich.edu I386, 555659Sgblack@eecs.umich.edu Arm, 565659Sgblack@eecs.umich.edu Thumb, 575659Sgblack@eecs.umich.edu Power 585659Sgblack@eecs.umich.edu }; 595659Sgblack@eecs.umich.edu 605659Sgblack@eecs.umich.edu enum OpSys { 615659Sgblack@eecs.umich.edu UnknownOpSys, 625659Sgblack@eecs.umich.edu Tru64, 635659Sgblack@eecs.umich.edu Linux, 645659Sgblack@eecs.umich.edu Solaris, 655659Sgblack@eecs.umich.edu LinuxArmOABI 666040Sgblack@eecs.umich.edu }; 675659Sgblack@eecs.umich.edu 685659Sgblack@eecs.umich.edu protected: 695659Sgblack@eecs.umich.edu const std::string filename; 705659Sgblack@eecs.umich.edu int descriptor; 715659Sgblack@eecs.umich.edu uint8_t *fileData; 725659Sgblack@eecs.umich.edu size_t len; 735659Sgblack@eecs.umich.edu 745659Sgblack@eecs.umich.edu Arch arch; 755659Sgblack@eecs.umich.edu OpSys opSys; 765659Sgblack@eecs.umich.edu 775659Sgblack@eecs.umich.edu ObjectFile(const std::string &_filename, int _fd, 785659Sgblack@eecs.umich.edu size_t _len, uint8_t *_data, 795659Sgblack@eecs.umich.edu Arch _arch, OpSys _opSys); 805659Sgblack@eecs.umich.edu 815659Sgblack@eecs.umich.edu public: 827072Sgblack@eecs.umich.edu virtual ~ObjectFile(); 837072Sgblack@eecs.umich.edu 845659Sgblack@eecs.umich.edu void close(); 855659Sgblack@eecs.umich.edu 865659Sgblack@eecs.umich.edu virtual bool loadSections(Port *memPort, Addr addrMask = 875659Sgblack@eecs.umich.edu std::numeric_limits<Addr>::max()); 885659Sgblack@eecs.umich.edu virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask = 895659Sgblack@eecs.umich.edu std::numeric_limits<Addr>::max()) = 0; 905659Sgblack@eecs.umich.edu virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask = 915659Sgblack@eecs.umich.edu std::numeric_limits<Addr>::max()) = 0; 925659Sgblack@eecs.umich.edu 936052Sgblack@eecs.umich.edu virtual bool isDynamic() { return false; } 945659Sgblack@eecs.umich.edu virtual bool hasTLS() { return false; } 955659Sgblack@eecs.umich.edu 965659Sgblack@eecs.umich.edu Arch getArch() const { return arch; } 975659Sgblack@eecs.umich.edu OpSys getOpSys() const { return opSys; } 985659Sgblack@eecs.umich.edu 995659Sgblack@eecs.umich.edu protected: 1005659Sgblack@eecs.umich.edu 1015659Sgblack@eecs.umich.edu struct Section { 1025659Sgblack@eecs.umich.edu Addr baseAddr; 1035659Sgblack@eecs.umich.edu uint8_t *fileImage; 1045659Sgblack@eecs.umich.edu size_t size; 1055659Sgblack@eecs.umich.edu }; 1065659Sgblack@eecs.umich.edu 1075659Sgblack@eecs.umich.edu Addr entry; 1085659Sgblack@eecs.umich.edu Addr globalPtr; 1095659Sgblack@eecs.umich.edu 1105659Sgblack@eecs.umich.edu Section text; 1115659Sgblack@eecs.umich.edu Section data; 1125659Sgblack@eecs.umich.edu Section bss; 1135659Sgblack@eecs.umich.edu 1145659Sgblack@eecs.umich.edu bool loadSection(Section *sec, Port *memPort, Addr addrMask); 1155659Sgblack@eecs.umich.edu void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; } 1165659Sgblack@eecs.umich.edu 1176068Sgblack@eecs.umich.edu public: 1186068Sgblack@eecs.umich.edu Addr entryPoint() const { return entry; } 1195659Sgblack@eecs.umich.edu 1205659Sgblack@eecs.umich.edu Addr globalPointer() const { return globalPtr; } 1215659Sgblack@eecs.umich.edu 1225659Sgblack@eecs.umich.edu Addr textBase() const { return text.baseAddr; } 1235659Sgblack@eecs.umich.edu Addr dataBase() const { return data.baseAddr; } 1245659Sgblack@eecs.umich.edu Addr bssBase() const { return bss.baseAddr; } 1255659Sgblack@eecs.umich.edu 1265659Sgblack@eecs.umich.edu size_t textSize() const { return text.size; } 1275659Sgblack@eecs.umich.edu size_t dataSize() const { return data.size; } 1285659Sgblack@eecs.umich.edu size_t bssSize() const { return bss.size; } 1295659Sgblack@eecs.umich.edu 1305659Sgblack@eecs.umich.edu void setTextBase(Addr a) { text.baseAddr = a; } 1315659Sgblack@eecs.umich.edu}; 1325659Sgblack@eecs.umich.edu 1335659Sgblack@eecs.umich.eduObjectFile *createObjectFile(const std::string &fname, bool raw = false); 1345659Sgblack@eecs.umich.edu 1355659Sgblack@eecs.umich.edu 1365659Sgblack@eecs.umich.edu#endif // __OBJECT_FILE_HH__ 1375659Sgblack@eecs.umich.edu