elf_object.hh revision 10880
14104Ssaidi@eecs.umich.edu/*
24104Ssaidi@eecs.umich.edu * Copyright (c) 2013 ARM Limited
34104Ssaidi@eecs.umich.edu * All rights reserved
44104Ssaidi@eecs.umich.edu *
54104Ssaidi@eecs.umich.edu * The license below extends only to copyright in the software and shall
64104Ssaidi@eecs.umich.edu * not be construed as granting a license to any other intellectual
74104Ssaidi@eecs.umich.edu * property including but not limited to intellectual property relating
84104Ssaidi@eecs.umich.edu * to a hardware implementation of the functionality of the software
94104Ssaidi@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
104104Ssaidi@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
114104Ssaidi@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
124104Ssaidi@eecs.umich.edu * modified or unmodified, in source code or in binary form.
134104Ssaidi@eecs.umich.edu *
144104Ssaidi@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
154104Ssaidi@eecs.umich.edu * All rights reserved.
164104Ssaidi@eecs.umich.edu *
174104Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
184104Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
194104Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
204104Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
214104Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
224104Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
234104Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
244104Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
254104Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
264104Ssaidi@eecs.umich.edu * this software without specific prior written permission.
274104Ssaidi@eecs.umich.edu *
284104Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
294104Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
304104Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
314104Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
324104Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
334104Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
344104Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
354104Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
364104Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
374104Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
384104Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
394104Ssaidi@eecs.umich.edu *
404104Ssaidi@eecs.umich.edu * Authors: Steve Reinhardt
414104Ssaidi@eecs.umich.edu */
424104Ssaidi@eecs.umich.edu
434104Ssaidi@eecs.umich.edu#ifndef __ELF_OBJECT_HH__
444104Ssaidi@eecs.umich.edu#define __ELF_OBJECT_HH__
454104Ssaidi@eecs.umich.edu
464104Ssaidi@eecs.umich.edu#include <set>
474104Ssaidi@eecs.umich.edu#include <vector>
484104Ssaidi@eecs.umich.edu
494104Ssaidi@eecs.umich.edu#include "base/loader/object_file.hh"
504104Ssaidi@eecs.umich.edu
514104Ssaidi@eecs.umich.educlass ElfObject : public ObjectFile
524104Ssaidi@eecs.umich.edu{
534104Ssaidi@eecs.umich.edu  protected:
544104Ssaidi@eecs.umich.edu
554104Ssaidi@eecs.umich.edu    //The global definition of a "Section" is closest to elf's segments.
564104Ssaidi@eecs.umich.edu    typedef ObjectFile::Section Segment;
574104Ssaidi@eecs.umich.edu
584104Ssaidi@eecs.umich.edu    //These values are provided to a linux process by the kernel, so we
594104Ssaidi@eecs.umich.edu    //need to keep them around.
604104Ssaidi@eecs.umich.edu    Addr _programHeaderTable;
614104Ssaidi@eecs.umich.edu    uint16_t _programHeaderSize;
624104Ssaidi@eecs.umich.edu    uint16_t _programHeaderCount;
634104Ssaidi@eecs.umich.edu    std::set<std::string> sectionNames;
644104Ssaidi@eecs.umich.edu
654104Ssaidi@eecs.umich.edu    /// Helper functions for loadGlobalSymbols() and loadLocalSymbols().
664104Ssaidi@eecs.umich.edu    bool loadSomeSymbols(SymbolTable *symtab, int binding, Addr mask);
674104Ssaidi@eecs.umich.edu
684104Ssaidi@eecs.umich.edu    ElfObject(const std::string &_filename, size_t _len, uint8_t *_data,
694104Ssaidi@eecs.umich.edu              Arch _arch, OpSys _opSys);
704104Ssaidi@eecs.umich.edu
714104Ssaidi@eecs.umich.edu    void getSections();
724104Ssaidi@eecs.umich.edu    bool sectionExists(std::string sec);
734104Ssaidi@eecs.umich.edu
744104Ssaidi@eecs.umich.edu    std::vector<Segment> extraSegments;
754104Ssaidi@eecs.umich.edu
764104Ssaidi@eecs.umich.edu  public:
774104Ssaidi@eecs.umich.edu    virtual ~ElfObject() {}
784104Ssaidi@eecs.umich.edu
794104Ssaidi@eecs.umich.edu    bool loadSections(PortProxy& memProxy,
804104Ssaidi@eecs.umich.edu            Addr addrMask = std::numeric_limits<Addr>::max(),
814104Ssaidi@eecs.umich.edu            Addr offset = 0);
824104Ssaidi@eecs.umich.edu    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
834104Ssaidi@eecs.umich.edu            std::numeric_limits<Addr>::max());
844104Ssaidi@eecs.umich.edu    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
854104Ssaidi@eecs.umich.edu            std::numeric_limits<Addr>::max());
864104Ssaidi@eecs.umich.edu    virtual bool loadWeakSymbols(SymbolTable *symtab, Addr addrMask =
874104Ssaidi@eecs.umich.edu            std::numeric_limits<Addr>::max());
884104Ssaidi@eecs.umich.edu
894104Ssaidi@eecs.umich.edu    virtual bool isDynamic() { return sectionExists(".interp"); }
904104Ssaidi@eecs.umich.edu    virtual bool hasTLS() { return sectionExists(".tbss"); }
914104Ssaidi@eecs.umich.edu
924104Ssaidi@eecs.umich.edu    static ObjectFile *tryFile(const std::string &fname,
934104Ssaidi@eecs.umich.edu                               size_t len, uint8_t *data);
944104Ssaidi@eecs.umich.edu    Addr programHeaderTable() {return _programHeaderTable;}
954104Ssaidi@eecs.umich.edu    uint16_t programHeaderSize() {return _programHeaderSize;}
964104Ssaidi@eecs.umich.edu    uint16_t programHeaderCount() {return _programHeaderCount;}
974104Ssaidi@eecs.umich.edu};
984104Ssaidi@eecs.umich.edu
994104Ssaidi@eecs.umich.edu#endif // __ELF_OBJECT_HH__
1004104Ssaidi@eecs.umich.edu