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