object_file.cc revision 1762
112855Sgabeblack@google.com/* 212855Sgabeblack@google.com * Copyright (c) 2002-2004 The Regents of The University of Michigan 312855Sgabeblack@google.com * All rights reserved. 412855Sgabeblack@google.com * 512855Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 612855Sgabeblack@google.com * modification, are permitted provided that the following conditions are 712855Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 812855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 912855Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1012855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1112855Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1212855Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1312855Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1412855Sgabeblack@google.com * this software without specific prior written permission. 1512855Sgabeblack@google.com * 1612855Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712855Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812855Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912855Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012855Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112855Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212855Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312855Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412855Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512855Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612855Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712855Sgabeblack@google.com */ 2812855Sgabeblack@google.com 2912855Sgabeblack@google.com#include <list> 3012855Sgabeblack@google.com#include <string> 3112855Sgabeblack@google.com 3212855Sgabeblack@google.com#include <sys/types.h> 3312855Sgabeblack@google.com#include <sys/mman.h> 3412855Sgabeblack@google.com#include <fcntl.h> 3512855Sgabeblack@google.com#include <stdio.h> 3612855Sgabeblack@google.com#include <unistd.h> 3712855Sgabeblack@google.com 3812855Sgabeblack@google.com#include "base/cprintf.hh" 3912855Sgabeblack@google.com#include "base/loader/object_file.hh" 4012855Sgabeblack@google.com#include "base/loader/symtab.hh" 4112855Sgabeblack@google.com 4212855Sgabeblack@google.com#include "base/loader/ecoff_object.hh" 4312855Sgabeblack@google.com#include "base/loader/aout_object.hh" 4412855Sgabeblack@google.com#include "base/loader/elf_object.hh" 4512855Sgabeblack@google.com 4612855Sgabeblack@google.comusing namespace std; 4712855Sgabeblack@google.com 4812855Sgabeblack@google.comObjectFile::ObjectFile(const string &_filename, int _fd, 4912855Sgabeblack@google.com size_t _len, uint8_t *_data, 5012855Sgabeblack@google.com Arch _arch, OpSys _opSys) 5112855Sgabeblack@google.com : filename(_filename), descriptor(_fd), fileData(_data), len(_len), 5212855Sgabeblack@google.com arch(_arch), opSys(_opSys) 5312855Sgabeblack@google.com{ 5412855Sgabeblack@google.com} 5512855Sgabeblack@google.com 5612855Sgabeblack@google.com 5712855Sgabeblack@google.comObjectFile::~ObjectFile() 5812855Sgabeblack@google.com{ 5912855Sgabeblack@google.com close(); 6012855Sgabeblack@google.com} 6112855Sgabeblack@google.com 6212855Sgabeblack@google.com 6312855Sgabeblack@google.comvoid 6412855Sgabeblack@google.comObjectFile::close() 6512855Sgabeblack@google.com{ 6612855Sgabeblack@google.com if (descriptor >= 0) { 6712855Sgabeblack@google.com ::close(descriptor); 68 descriptor = -1; 69 } 70 71 if (fileData) { 72 ::munmap(fileData, len); 73 fileData = NULL; 74 } 75} 76 77 78ObjectFile * 79createObjectFile(const string &fname) 80{ 81 // open the file 82 int fd = open(fname.c_str(), O_RDONLY); 83 if (fd < 0) { 84 return NULL; 85 } 86 87 // find the length of the file by seeking to the end 88 size_t len = (size_t)lseek(fd, 0, SEEK_END); 89 90 // mmap the whole shebang 91 uint8_t *fileData = 92 (uint8_t *)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0); 93 if (fileData == MAP_FAILED) { 94 close(fd); 95 return NULL; 96 } 97 98 ObjectFile *fileObj = NULL; 99 100 // figure out what we have here 101 if ((fileObj = EcoffObject::tryFile(fname, fd, len, fileData)) != NULL) { 102 return fileObj; 103 } 104 105 if ((fileObj = AoutObject::tryFile(fname, fd, len, fileData)) != NULL) { 106 return fileObj; 107 } 108 109 if ((fileObj = ElfObject::tryFile(fname, fd, len, fileData)) != NULL) { 110 return fileObj; 111 } 112 113 // don't know what it is 114 close(fd); 115 munmap(fileData, len); 116 return NULL; 117} 118