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