object_file.hh revision 2472
16691Stjones1@inf.ed.ac.uk/* 26691Stjones1@inf.ed.ac.uk * Copyright (c) 2002-2004 The Regents of The University of Michigan 36691Stjones1@inf.ed.ac.uk * All rights reserved. 46691Stjones1@inf.ed.ac.uk * 56691Stjones1@inf.ed.ac.uk * Redistribution and use in source and binary forms, with or without 66691Stjones1@inf.ed.ac.uk * modification, are permitted provided that the following conditions are 76691Stjones1@inf.ed.ac.uk * met: redistributions of source code must retain the above copyright 86691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer; 96691Stjones1@inf.ed.ac.uk * redistributions in binary form must reproduce the above copyright 106691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer in the 116691Stjones1@inf.ed.ac.uk * documentation and/or other materials provided with the distribution; 126691Stjones1@inf.ed.ac.uk * neither the name of the copyright holders nor the names of its 136691Stjones1@inf.ed.ac.uk * contributors may be used to endorse or promote products derived from 146691Stjones1@inf.ed.ac.uk * this software without specific prior written permission. 156691Stjones1@inf.ed.ac.uk * 166691Stjones1@inf.ed.ac.uk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176691Stjones1@inf.ed.ac.uk * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186691Stjones1@inf.ed.ac.uk * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196691Stjones1@inf.ed.ac.uk * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206691Stjones1@inf.ed.ac.uk * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216691Stjones1@inf.ed.ac.uk * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226691Stjones1@inf.ed.ac.uk * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236691Stjones1@inf.ed.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246691Stjones1@inf.ed.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256691Stjones1@inf.ed.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266691Stjones1@inf.ed.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276691Stjones1@inf.ed.ac.uk */ 286691Stjones1@inf.ed.ac.uk 296691Stjones1@inf.ed.ac.uk#ifndef __OBJECT_FILE_HH__ 306691Stjones1@inf.ed.ac.uk#define __OBJECT_FILE_HH__ 316691Stjones1@inf.ed.ac.uk 326691Stjones1@inf.ed.ac.uk#include <string> 336691Stjones1@inf.ed.ac.uk 346691Stjones1@inf.ed.ac.uk#include "sim/host.hh" // for Addr 356691Stjones1@inf.ed.ac.uk 366691Stjones1@inf.ed.ac.ukclass TranslatingPort; 376691Stjones1@inf.ed.ac.ukclass SymbolTable; 386691Stjones1@inf.ed.ac.uk 396691Stjones1@inf.ed.ac.ukclass ObjectFile 406691Stjones1@inf.ed.ac.uk{ 416691Stjones1@inf.ed.ac.uk public: 426691Stjones1@inf.ed.ac.uk 436691Stjones1@inf.ed.ac.uk enum Arch { 446691Stjones1@inf.ed.ac.uk UnknownArch, 456691Stjones1@inf.ed.ac.uk Alpha, 466691Stjones1@inf.ed.ac.uk SPARC, 476691Stjones1@inf.ed.ac.uk Mips 486691Stjones1@inf.ed.ac.uk }; 496691Stjones1@inf.ed.ac.uk 506691Stjones1@inf.ed.ac.uk enum OpSys { 516691Stjones1@inf.ed.ac.uk UnknownOpSys, 526691Stjones1@inf.ed.ac.uk Tru64, 536691Stjones1@inf.ed.ac.uk Linux, 546691Stjones1@inf.ed.ac.uk Solaris 556691Stjones1@inf.ed.ac.uk }; 566691Stjones1@inf.ed.ac.uk 576691Stjones1@inf.ed.ac.uk protected: 586691Stjones1@inf.ed.ac.uk const std::string filename; 596691Stjones1@inf.ed.ac.uk int descriptor; 606691Stjones1@inf.ed.ac.uk uint8_t *fileData; 616691Stjones1@inf.ed.ac.uk size_t len; 626691Stjones1@inf.ed.ac.uk 636691Stjones1@inf.ed.ac.uk Arch arch; 646691Stjones1@inf.ed.ac.uk OpSys opSys; 656691Stjones1@inf.ed.ac.uk 667532Ssteve.reinhardt@amd.com ObjectFile(const std::string &_filename, int _fd, 676691Stjones1@inf.ed.ac.uk size_t _len, uint8_t *_data, 687532Ssteve.reinhardt@amd.com Arch _arch, OpSys _opSys); 697532Ssteve.reinhardt@amd.com 706691Stjones1@inf.ed.ac.uk public: 716691Stjones1@inf.ed.ac.uk virtual ~ObjectFile(); 726691Stjones1@inf.ed.ac.uk 736691Stjones1@inf.ed.ac.uk void close(); 746691Stjones1@inf.ed.ac.uk 756691Stjones1@inf.ed.ac.uk virtual bool loadSections(TranslatingPort *memPort, bool loadPhys = false); 766691Stjones1@inf.ed.ac.uk virtual bool loadGlobalSymbols(SymbolTable *symtab) = 0; 776691Stjones1@inf.ed.ac.uk virtual bool loadLocalSymbols(SymbolTable *symtab) = 0; 786691Stjones1@inf.ed.ac.uk 796691Stjones1@inf.ed.ac.uk Arch getArch() const { return arch; } 806691Stjones1@inf.ed.ac.uk OpSys getOpSys() const { return opSys; } 816691Stjones1@inf.ed.ac.uk 826691Stjones1@inf.ed.ac.uk protected: 836691Stjones1@inf.ed.ac.uk 846691Stjones1@inf.ed.ac.uk struct Section { 856691Stjones1@inf.ed.ac.uk Addr baseAddr; 866691Stjones1@inf.ed.ac.uk uint8_t *fileImage; 876691Stjones1@inf.ed.ac.uk size_t size; 886691Stjones1@inf.ed.ac.uk }; 896691Stjones1@inf.ed.ac.uk 906691Stjones1@inf.ed.ac.uk Addr entry; 916691Stjones1@inf.ed.ac.uk Addr globalPtr; 926691Stjones1@inf.ed.ac.uk 936691Stjones1@inf.ed.ac.uk Section text; 946691Stjones1@inf.ed.ac.uk Section data; 956691Stjones1@inf.ed.ac.uk Section bss; 966691Stjones1@inf.ed.ac.uk 976691Stjones1@inf.ed.ac.uk bool loadSection(Section *sec, TranslatingPort *memPort, bool loadPhys); 986691Stjones1@inf.ed.ac.uk void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; } 996691Stjones1@inf.ed.ac.uk 1006691Stjones1@inf.ed.ac.uk public: 1016691Stjones1@inf.ed.ac.uk Addr entryPoint() const { return entry; } 1026691Stjones1@inf.ed.ac.uk 1036691Stjones1@inf.ed.ac.uk Addr globalPointer() const { return globalPtr; } 1046691Stjones1@inf.ed.ac.uk 1056691Stjones1@inf.ed.ac.uk Addr textBase() const { return text.baseAddr; } 1066691Stjones1@inf.ed.ac.uk Addr dataBase() const { return data.baseAddr; } 1076691Stjones1@inf.ed.ac.uk Addr bssBase() const { return bss.baseAddr; } 1086691Stjones1@inf.ed.ac.uk 1096691Stjones1@inf.ed.ac.uk size_t textSize() const { return text.size; } 1106691Stjones1@inf.ed.ac.uk size_t dataSize() const { return data.size; } 1116691Stjones1@inf.ed.ac.uk size_t bssSize() const { return bss.size; } 1126691Stjones1@inf.ed.ac.uk}; 1136691Stjones1@inf.ed.ac.uk 1146691Stjones1@inf.ed.ac.ukObjectFile *createObjectFile(const std::string &fname); 1156691Stjones1@inf.ed.ac.uk 1166691Stjones1@inf.ed.ac.uk 1176691Stjones1@inf.ed.ac.uk#endif // __OBJECT_FILE_HH__ 1186691Stjones1@inf.ed.ac.uk