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