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