object_file.cc revision 8229
12929Sktlim@umich.edu/* 22929Sktlim@umich.edu * Copyright (c) 2002-2004 The Regents of The University of Michigan 32932Sktlim@umich.edu * All rights reserved. 42929Sktlim@umich.edu * 52929Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 62929Sktlim@umich.edu * modification, are permitted provided that the following conditions are 72929Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 82929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 92929Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 102929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 112929Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 122929Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 132929Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 142929Sktlim@umich.edu * this software without specific prior written permission. 152929Sktlim@umich.edu * 162929Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172929Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182929Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192929Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202929Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212929Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222929Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232929Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242929Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252929Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262929Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272929Sktlim@umich.edu * 282932Sktlim@umich.edu * Authors: Nathan Binkert 292932Sktlim@umich.edu * Steve Reinhardt 302932Sktlim@umich.edu */ 312929Sktlim@umich.edu 326007Ssteve.reinhardt@amd.com#include <sys/mman.h> 337735SAli.Saidi@ARM.com#include <sys/types.h> 342929Sktlim@umich.edu#include <fcntl.h> 352929Sktlim@umich.edu#include <unistd.h> 362929Sktlim@umich.edu 372929Sktlim@umich.edu#include <cstdio> 382929Sktlim@umich.edu#include <list> 392929Sktlim@umich.edu#include <string> 402929Sktlim@umich.edu 412929Sktlim@umich.edu#include "base/loader/aout_object.hh" 422929Sktlim@umich.edu#include "base/loader/ecoff_object.hh" 432929Sktlim@umich.edu#include "base/loader/elf_object.hh" 442929Sktlim@umich.edu#include "base/loader/object_file.hh" 452929Sktlim@umich.edu#include "base/loader/raw_object.hh" 462929Sktlim@umich.edu#include "base/loader/symtab.hh" 476007Ssteve.reinhardt@amd.com#include "base/cprintf.hh" 486007Ssteve.reinhardt@amd.com#include "mem/translating_port.hh" 496007Ssteve.reinhardt@amd.com 506007Ssteve.reinhardt@amd.comusing namespace std; 516007Ssteve.reinhardt@amd.com 526007Ssteve.reinhardt@amd.comObjectFile::ObjectFile(const string &_filename, int _fd, 536007Ssteve.reinhardt@amd.com size_t _len, uint8_t *_data, 546007Ssteve.reinhardt@amd.com Arch _arch, OpSys _opSys) 556007Ssteve.reinhardt@amd.com : filename(_filename), descriptor(_fd), fileData(_data), len(_len), 566007Ssteve.reinhardt@amd.com arch(_arch), opSys(_opSys) 576007Ssteve.reinhardt@amd.com{ 586007Ssteve.reinhardt@amd.com} 596007Ssteve.reinhardt@amd.com 606007Ssteve.reinhardt@amd.com 616007Ssteve.reinhardt@amd.comObjectFile::~ObjectFile() 626007Ssteve.reinhardt@amd.com{ 636007Ssteve.reinhardt@amd.com close(); 646007Ssteve.reinhardt@amd.com} 656007Ssteve.reinhardt@amd.com 666007Ssteve.reinhardt@amd.com 676007Ssteve.reinhardt@amd.combool 686007Ssteve.reinhardt@amd.comObjectFile::loadSection(Section *sec, Port *memPort, Addr addrMask) 696007Ssteve.reinhardt@amd.com{ 706007Ssteve.reinhardt@amd.com if (sec->size != 0) { 716007Ssteve.reinhardt@amd.com Addr addr = sec->baseAddr & addrMask; 726007Ssteve.reinhardt@amd.com if (sec->fileImage) { 736007Ssteve.reinhardt@amd.com memPort->writeBlob(addr, sec->fileImage, sec->size); 746007Ssteve.reinhardt@amd.com } 756007Ssteve.reinhardt@amd.com else { 762929Sktlim@umich.edu // no image: must be bss 772929Sktlim@umich.edu memPort->memsetBlob(addr, 0, sec->size); 782929Sktlim@umich.edu } 796007Ssteve.reinhardt@amd.com } 806007Ssteve.reinhardt@amd.com return true; 816007Ssteve.reinhardt@amd.com} 826007Ssteve.reinhardt@amd.com 836007Ssteve.reinhardt@amd.com 846007Ssteve.reinhardt@amd.combool 852929Sktlim@umich.eduObjectFile::loadSections(Port *memPort, Addr addrMask) 862929Sktlim@umich.edu{ 872929Sktlim@umich.edu return (loadSection(&text, memPort, addrMask) 882929Sktlim@umich.edu && loadSection(&data, memPort, addrMask) 892929Sktlim@umich.edu && loadSection(&bss, memPort, addrMask)); 906011Ssteve.reinhardt@amd.com} 916007Ssteve.reinhardt@amd.com 926007Ssteve.reinhardt@amd.com 936007Ssteve.reinhardt@amd.comvoid 946007Ssteve.reinhardt@amd.comObjectFile::close() 956007Ssteve.reinhardt@amd.com{ 966007Ssteve.reinhardt@amd.com if (descriptor >= 0) { 976007Ssteve.reinhardt@amd.com ::close(descriptor); 986007Ssteve.reinhardt@amd.com descriptor = -1; 996007Ssteve.reinhardt@amd.com } 1006007Ssteve.reinhardt@amd.com 1016007Ssteve.reinhardt@amd.com if (fileData) { 1026007Ssteve.reinhardt@amd.com ::munmap((char*)fileData, len); 1036007Ssteve.reinhardt@amd.com fileData = NULL; 1046007Ssteve.reinhardt@amd.com } 1057735SAli.Saidi@ARM.com} 1066011Ssteve.reinhardt@amd.com 1076007Ssteve.reinhardt@amd.com 1086007Ssteve.reinhardt@amd.comObjectFile * 1096007Ssteve.reinhardt@amd.comcreateObjectFile(const string &fname, bool raw) 1106007Ssteve.reinhardt@amd.com{ 1117735SAli.Saidi@ARM.com // open the file 1127735SAli.Saidi@ARM.com int fd = open(fname.c_str(), O_RDONLY); 1137735SAli.Saidi@ARM.com if (fd < 0) { 1147735SAli.Saidi@ARM.com return NULL; 1157735SAli.Saidi@ARM.com } 1167735SAli.Saidi@ARM.com 1177735SAli.Saidi@ARM.com // find the length of the file by seeking to the end 1187735SAli.Saidi@ARM.com size_t len = (size_t)lseek(fd, 0, SEEK_END); 1197735SAli.Saidi@ARM.com 1207735SAli.Saidi@ARM.com // mmap the whole shebang 1217735SAli.Saidi@ARM.com uint8_t *fileData = 1227735SAli.Saidi@ARM.com (uint8_t *)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0); 1237735SAli.Saidi@ARM.com if (fileData == MAP_FAILED) { 1247735SAli.Saidi@ARM.com close(fd); 1256007Ssteve.reinhardt@amd.com return NULL; 1267685Ssteve.reinhardt@amd.com } 1276007Ssteve.reinhardt@amd.com 1286011Ssteve.reinhardt@amd.com ObjectFile *fileObj = NULL; 1296007Ssteve.reinhardt@amd.com 1306007Ssteve.reinhardt@amd.com // figure out what we have here 1316007Ssteve.reinhardt@amd.com if ((fileObj = EcoffObject::tryFile(fname, fd, len, fileData)) != NULL) { 1326007Ssteve.reinhardt@amd.com return fileObj; 1336007Ssteve.reinhardt@amd.com } 1346007Ssteve.reinhardt@amd.com 1356011Ssteve.reinhardt@amd.com if ((fileObj = AoutObject::tryFile(fname, fd, len, fileData)) != NULL) { 1366007Ssteve.reinhardt@amd.com return fileObj; 1376007Ssteve.reinhardt@amd.com } 1386007Ssteve.reinhardt@amd.com 1396007Ssteve.reinhardt@amd.com if ((fileObj = ElfObject::tryFile(fname, fd, len, fileData)) != NULL) { 1406007Ssteve.reinhardt@amd.com return fileObj; 1416008Ssteve.reinhardt@amd.com } 1426007Ssteve.reinhardt@amd.com 1436008Ssteve.reinhardt@amd.com if (raw) 1446008Ssteve.reinhardt@amd.com return RawObject::tryFile(fname, fd, len, fileData); 1456008Ssteve.reinhardt@amd.com 1466008Ssteve.reinhardt@amd.com // don't know what it is 1476008Ssteve.reinhardt@amd.com close(fd); 1486008Ssteve.reinhardt@amd.com munmap((char*)fileData, len); 1496008Ssteve.reinhardt@amd.com return NULL; 1506007Ssteve.reinhardt@amd.com} 1516007Ssteve.reinhardt@amd.com