1d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===- ELFBinaryReader.cpp ------------------------------------------------===//
2d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//
3d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//                     The MCLinker Project
4d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//
5d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// License. See LICENSE.TXT for details.
7d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//
8d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===//
9d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LD/ELFBinaryReader.h>
10d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
11d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/IRBuilder.h>
12d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/LinkerConfig.h>
13d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/MC/MCLDInput.h>
14d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Support/MemoryArea.h>
15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <mcld/Target/GNULDBackend.h>
16d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
17d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <llvm/Support/ELF.h>
18d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <cctype>
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaousing namespace mcld;
22d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
23d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===//
24d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao// ELFBinaryReader
25d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao//===----------------------------------------------------------------------===//
26d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/// constructor
27d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei LiaoELFBinaryReader::ELFBinaryReader(GNULDBackend& pBackend,
28d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                 IRBuilder& pBuilder,
29d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                                 const LinkerConfig& pConfig)
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  : BinaryReader(),
31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_Backend(pBackend),
32d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_Builder(pBuilder),
33d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_Config(pConfig) {
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}
35d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
36d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao/// destructor
37d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei LiaoELFBinaryReader::~ELFBinaryReader()
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}
40d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
41d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liaobool ELFBinaryReader::readBinary(Input& pInput)
42d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao{
43d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // section: NULL
44d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.CreateELFHeader(pInput,
45d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            "",
46d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            LDFileFormat::Null,
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            llvm::ELF::SHT_NULL,
48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            0x0);
49d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // section: .data
51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSection* data_sect =
52d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao    m_Builder.CreateELFHeader(pInput,
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                              ".data",
54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                              LDFileFormat::Regular,
55d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                              llvm::ELF::SHF_WRITE | llvm::ELF::SHF_ALLOC,
56d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                              0x1);
57d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
58d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
59d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  SectionData* data = m_Builder.CreateSectionData(*data_sect);
60d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  size_t data_size = pInput.memArea()->handler()->size();
61d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  Fragment* frag = m_Builder.CreateRegion(pInput, 0x0, data_size);
62d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.AppendFragment(*frag, *data);
63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
64d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // section: .shstrtab
65d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.CreateELFHeader(pInput,
66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            ".shstrtab",
67d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            LDFileFormat::NamePool,
68d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            llvm::ELF::SHT_STRTAB,
69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            0x1);
70d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
71d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // section: .symtab
72d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.CreateELFHeader(pInput,
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            ".symtab",
74d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            LDFileFormat::NamePool,
75d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            llvm::ELF::SHT_SYMTAB,
76d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            m_Config.targets().bitclass() / 8);
77d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
78d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // symbol: .data
79d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.AddSymbol(pInput,
80d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ".data",
81d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Section,
82d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Define,
83d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Local,
84d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      0x0,
85d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      0x0,
86d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      data_sect);
87d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // Note: in Win32, the filename is wstring. Is it correct to convert
89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  // filename to std::string?
90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  std::string mangled_name = pInput.path().filename().native();
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  for (std::string::iterator it = mangled_name.begin(),
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    ie = mangled_name.end(); it != ie; ++it) {
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    if (isalnum(*it) == 0)
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      *it = '_';
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
97d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // symbol: _start
98d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.AddSymbol(pInput,
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                      "_binary_" + mangled_name + "_start",
100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::NoType,
101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Define,
102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Global,
103d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      0x0,
104d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      0x0,
105d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      data_sect);
106d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
107d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // symbol: _end
108d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.AddSymbol(pInput,
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                      "_binary_" + mangled_name + "_end",
110d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::NoType,
111d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Define,
112d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Global,
113d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      0x0,
114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      data_size,
115d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      data_sect);
116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
117d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // symbol: _size
118d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.AddSymbol(pInput,
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                      "_binary_" + mangled_name + "_size",
120d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::NoType,
121d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Define,
122d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      ResolveInfo::Global,
123d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      0x0,
124d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      data_size,
125d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                      data_sect);
126d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
127d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  // section: .strtab
128d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  m_Builder.CreateELFHeader(pInput,
129d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            ".strtab",
130d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            LDFileFormat::NamePool,
131d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            llvm::ELF::SHT_STRTAB,
132d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao                            0x1);
133d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
134d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  return true;
135d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao}
136