object_file.hh revision 7095
112855Sgabeblack@google.com/*
212855Sgabeblack@google.com * Copyright (c) 2002-2004 The Regents of The University of Michigan
312855Sgabeblack@google.com * All rights reserved.
412855Sgabeblack@google.com *
512855Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
612855Sgabeblack@google.com * modification, are permitted provided that the following conditions are
712855Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
812855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
912855Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
1012855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1112855Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1212855Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1312855Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1412855Sgabeblack@google.com * this software without specific prior written permission.
1512855Sgabeblack@google.com *
1612855Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712855Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812855Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912855Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2012855Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2112855Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2212855Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2312855Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2412855Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2512855Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2612855Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2712855Sgabeblack@google.com *
2812855Sgabeblack@google.com * Authors: Nathan Binkert
2912855Sgabeblack@google.com *          Steve Reinhardt
3012855Sgabeblack@google.com */
3112855Sgabeblack@google.com
3212855Sgabeblack@google.com#ifndef __OBJECT_FILE_HH__
3312855Sgabeblack@google.com#define __OBJECT_FILE_HH__
3412855Sgabeblack@google.com
3512855Sgabeblack@google.com#include <limits>
3612855Sgabeblack@google.com#include <string>
3712855Sgabeblack@google.com
3812855Sgabeblack@google.com#include "base/types.hh"
3912855Sgabeblack@google.com
4012855Sgabeblack@google.comclass Port;
4112855Sgabeblack@google.comclass SymbolTable;
4212855Sgabeblack@google.com
4312855Sgabeblack@google.comclass ObjectFile
4412855Sgabeblack@google.com{
4512855Sgabeblack@google.com  public:
4612855Sgabeblack@google.com
4712855Sgabeblack@google.com    enum Arch {
4812855Sgabeblack@google.com        UnknownArch,
4912855Sgabeblack@google.com        Alpha,
5012855Sgabeblack@google.com        SPARC64,
5112855Sgabeblack@google.com        SPARC32,
5212855Sgabeblack@google.com        Mips,
5312855Sgabeblack@google.com        X86_64,
5412855Sgabeblack@google.com        I386,
5512855Sgabeblack@google.com        Arm,
5612855Sgabeblack@google.com        Thumb,
5712855Sgabeblack@google.com        Power
5812855Sgabeblack@google.com    };
5912855Sgabeblack@google.com
6012855Sgabeblack@google.com    enum OpSys {
6112855Sgabeblack@google.com        UnknownOpSys,
6212855Sgabeblack@google.com        Tru64,
6312855Sgabeblack@google.com        Linux,
6412855Sgabeblack@google.com        Solaris,
6512855Sgabeblack@google.com        LinuxArmOABI
6612855Sgabeblack@google.com    };
6712855Sgabeblack@google.com
6812855Sgabeblack@google.com  protected:
69    const std::string filename;
70    int descriptor;
71    uint8_t *fileData;
72    size_t len;
73
74    Arch  arch;
75    OpSys opSys;
76
77    ObjectFile(const std::string &_filename, int _fd,
78               size_t _len, uint8_t *_data,
79               Arch _arch, OpSys _opSys);
80
81  public:
82    virtual ~ObjectFile();
83
84    void close();
85
86    virtual bool loadSections(Port *memPort, Addr addrMask =
87            std::numeric_limits<Addr>::max());
88    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
89            std::numeric_limits<Addr>::max()) = 0;
90    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
91            std::numeric_limits<Addr>::max()) = 0;
92
93    virtual bool isDynamic() { return false; }
94    virtual bool hasTLS() { return false; }
95
96    Arch  getArch()  const { return arch; }
97    OpSys getOpSys() const { return opSys; }
98
99  protected:
100
101    struct Section {
102        Addr     baseAddr;
103        uint8_t *fileImage;
104        size_t   size;
105    };
106
107    Addr entry;
108    Addr globalPtr;
109
110    Section text;
111    Section data;
112    Section bss;
113
114    bool loadSection(Section *sec, Port *memPort, Addr addrMask);
115    void setGlobalPointer(Addr global_ptr) { globalPtr = global_ptr; }
116
117  public:
118    Addr entryPoint() const { return entry; }
119
120    Addr globalPointer() const { return globalPtr; }
121
122    Addr textBase() const { return text.baseAddr; }
123    Addr dataBase() const { return data.baseAddr; }
124    Addr bssBase() const { return bss.baseAddr; }
125
126    size_t textSize() const { return text.size; }
127    size_t dataSize() const { return data.size; }
128    size_t bssSize() const { return bss.size; }
129
130    void setTextBase(Addr a) { text.baseAddr = a; }
131};
132
133ObjectFile *createObjectFile(const std::string &fname, bool raw = false);
134
135
136#endif // __OBJECT_FILE_HH__
137