object_file.hh revision 6214
12SN/A/* 211856Sbrandon.potter@amd.com * Copyright (c) 2002-2004 The Regents of The University of Michigan 38852Sandreas.hansson@arm.com * All rights reserved. 48852Sandreas.hansson@arm.com * 58852Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 68852Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 78852Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 88852Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 98852Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 108852Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 118852Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 128852Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 138852Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 148852Sandreas.hansson@arm.com * this software without specific prior written permission. 151762SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272SN/A * 282SN/A * Authors: Nathan Binkert 292SN/A * Steve Reinhardt 302SN/A */ 312SN/A 322SN/A#ifndef __OBJECT_FILE_HH__ 332SN/A#define __OBJECT_FILE_HH__ 342SN/A 352SN/A#include <limits> 362SN/A#include <string> 372SN/A 382SN/A#include "base/types.hh" 392SN/A 402665Ssaidi@eecs.umich.educlass Port; 412665Ssaidi@eecs.umich.educlass SymbolTable; 422665Ssaidi@eecs.umich.edu 432665Ssaidi@eecs.umich.educlass ObjectFile 4411856Sbrandon.potter@amd.com{ 452SN/A public: 462SN/A 4711793Sbrandon.potter@amd.com enum Arch { 4811793Sbrandon.potter@amd.com UnknownArch, 498229Snate@binkert.org Alpha, 502SN/A SPARC64, 516712Snate@binkert.org SPARC32, 5211800Sbrandon.potter@amd.com Mips, 5311911SBrandon.Potter@amd.com X86_64, 5410930Sbrandon.potter@amd.com I386, 552SN/A Arm 5611800Sbrandon.potter@amd.com }; 572SN/A 5811793Sbrandon.potter@amd.com enum OpSys { 5956SN/A UnknownOpSys, 601158SN/A Tru64, 61146SN/A Linux, 626658Snate@binkert.org Solaris 632680Sktlim@umich.edu }; 642378SN/A 658706Sandreas.hansson@arm.com protected: 665154Sgblack@eecs.umich.edu const std::string filename; 6711800Sbrandon.potter@amd.com int descriptor; 6811856Sbrandon.potter@amd.com uint8_t *fileData; 6911856Sbrandon.potter@amd.com size_t len; 7011794Sbrandon.potter@amd.com 712378SN/A Arch arch; 722SN/A OpSys opSys; 732715Sstever@eecs.umich.edu 742715Sstever@eecs.umich.edu ObjectFile(const std::string &_filename, int _fd, 7511911SBrandon.Potter@amd.com size_t _len, uint8_t *_data, 762715Sstever@eecs.umich.edu Arch _arch, OpSys _opSys); 772715Sstever@eecs.umich.edu 782715Sstever@eecs.umich.edu public: 7911911SBrandon.Potter@amd.com virtual ~ObjectFile(); 802715Sstever@eecs.umich.edu 812715Sstever@eecs.umich.edu void close(); 8211911SBrandon.Potter@amd.com 835335Shines@cs.fsu.edu virtual bool loadSections(Port *memPort, Addr addrMask = 8411911SBrandon.Potter@amd.com std::numeric_limits<Addr>::max()); 855335Shines@cs.fsu.edu virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask = 8611911SBrandon.Potter@amd.com std::numeric_limits<Addr>::max()) = 0; 874157Sgblack@eecs.umich.edu virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask = 884166Sgblack@eecs.umich.edu std::numeric_limits<Addr>::max()) = 0; 8911911SBrandon.Potter@amd.com 906691Stjones1@inf.ed.ac.uk virtual bool isDynamic() { return false; } 916691Stjones1@inf.ed.ac.uk virtual bool hasTLS() { return false; } 9211911SBrandon.Potter@amd.com 9311723Sar4jc@virginia.edu Arch getArch() const { return arch; } 9411723Sar4jc@virginia.edu OpSys getOpSys() const { return opSys; } 9511911SBrandon.Potter@amd.com 962715Sstever@eecs.umich.edu protected: 972715Sstever@eecs.umich.edu 982715Sstever@eecs.umich.edu struct Section { 992715Sstever@eecs.umich.edu Addr baseAddr; 1002715Sstever@eecs.umich.edu uint8_t *fileImage; 1012SN/A size_t size; 1022107SN/A }; 1032SN/A 10412448Sgabeblack@google.com Addr entry; 10512431Sgabeblack@google.com Addr globalPtr; 1067532Ssteve.reinhardt@amd.com 10710299Salexandru.dutu@amd.com Section text; 10810554Salexandru.dutu@amd.com Section data; 10913867Salexandru.dutu@amd.com Section bss; 11012431Sgabeblack@google.com 1118852Sandreas.hansson@arm.com bool loadSection(Section *sec, Port *memPort, Addr addrMask); 11210929Sbrandon.potter@amd.com void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; } 11311851Sbrandon.potter@amd.com 11411851Sbrandon.potter@amd.com public: 11511851Sbrandon.potter@amd.com Addr entryPoint() const { return entry; } 11611801Sbrandon.potter@amd.com 11711801Sbrandon.potter@amd.com Addr globalPointer() const { return globalPtr; } 11811851Sbrandon.potter@amd.com 11911885Sbrandon.potter@amd.com Addr textBase() const { return text.baseAddr; } 12011886Sbrandon.potter@amd.com Addr dataBase() const { return data.baseAddr; } 12111886Sbrandon.potter@amd.com Addr bssBase() const { return bss.baseAddr; } 1222SN/A 12311885Sbrandon.potter@amd.com size_t textSize() const { return text.size; } 12411885Sbrandon.potter@amd.com size_t dataSize() const { return data.size; } 12511885Sbrandon.potter@amd.com size_t bssSize() const { return bss.size; } 12611885Sbrandon.potter@amd.com 12711885Sbrandon.potter@amd.com void setTextBase(Addr a) { text.baseAddr = a; } 12811885Sbrandon.potter@amd.com}; 12911885Sbrandon.potter@amd.com 13011886Sbrandon.potter@amd.comObjectFile *createObjectFile(const std::string &fname, bool raw = false); 13111886Sbrandon.potter@amd.com 13211886Sbrandon.potter@amd.com 13311886Sbrandon.potter@amd.com#endif // __OBJECT_FILE_HH__ 13411886Sbrandon.potter@amd.com