1b60a18deSMichael J. Spencer //===- ELFObjectFile.cpp - ELF object file implementation -------*- C++ -*-===// 2b60a18deSMichael J. Spencer // 3b60a18deSMichael J. Spencer // The LLVM Compiler Infrastructure 4b60a18deSMichael J. Spencer // 5b60a18deSMichael J. Spencer // This file is distributed under the University of Illinois Open Source 6b60a18deSMichael J. Spencer // License. See LICENSE.TXT for details. 7b60a18deSMichael J. Spencer // 8b60a18deSMichael J. Spencer //===----------------------------------------------------------------------===// 9b60a18deSMichael J. Spencer // 10*c7d23ddbSEli Bendersky // Part of the ELFObjectFile class implementation. 11b60a18deSMichael J. Spencer // 12b60a18deSMichael J. Spencer //===----------------------------------------------------------------------===// 13b60a18deSMichael J. Spencer 14*c7d23ddbSEli Bendersky #include "llvm/Object/ELF.h" 15b60a18deSMichael J. Spencer 16*c7d23ddbSEli Bendersky namespace llvm { 17*c7d23ddbSEli Bendersky 18b60a18deSMichael J. Spencer using namespace object; 19b60a18deSMichael J. Spencer 20b60a18deSMichael J. Spencer namespace { 21*c7d23ddbSEli Bendersky std::pair<unsigned char, unsigned char> 22b60a18deSMichael J. Spencer getElfArchType(MemoryBuffer *Object) { 23b60a18deSMichael J. Spencer if (Object->getBufferSize() < ELF::EI_NIDENT) 24b60a18deSMichael J. Spencer return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE); 25b60a18deSMichael J. Spencer return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS] 26b60a18deSMichael J. Spencer , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]); 27b60a18deSMichael J. Spencer } 28c3c80f09SEli Bendersky } 29b60a18deSMichael J. Spencer 30c3c80f09SEli Bendersky // Creates an in-memory object-file by default: createELFObjectFile(Buffer) 31*c7d23ddbSEli Bendersky ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) { 32b60a18deSMichael J. Spencer std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object); 33ec29b121SMichael J. Spencer error_code ec; 34c3c80f09SEli Bendersky 35b60a18deSMichael J. Spencer if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) 36ec29b121SMichael J. Spencer return new ELFObjectFile<support::little, false>(Object, ec); 37b60a18deSMichael J. Spencer else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) 38ec29b121SMichael J. Spencer return new ELFObjectFile<support::big, false>(Object, ec); 39b60a18deSMichael J. Spencer else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) 40ec29b121SMichael J. Spencer return new ELFObjectFile<support::big, true>(Object, ec); 41c3c80f09SEli Bendersky else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) { 42c3c80f09SEli Bendersky ELFObjectFile<support::little, true> *result = 43c3c80f09SEli Bendersky new ELFObjectFile<support::little, true>(Object, ec); 44c3c80f09SEli Bendersky return result; 45c3c80f09SEli Bendersky } 46c3c80f09SEli Bendersky 47c3c80f09SEli Bendersky report_fatal_error("Buffer is not an ELF object file!"); 48b60a18deSMichael J. Spencer } 49b60a18deSMichael J. Spencer 50b60a18deSMichael J. Spencer } // end namespace llvm 51