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