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