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 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines std::string mangled_name = pInput.path().filename().string(); 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (std::string::iterator it = mangled_name.begin(), 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ie = mangled_name.end(); it != ie; ++it) { 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (isalnum(*it) == 0) 926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines *it = '_'; 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 95d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // symbol: _start 96d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Builder.AddSymbol(pInput, 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines "_binary_" + mangled_name + "_start", 98d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::NoType, 99d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::Define, 100d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::Global, 101d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x0, 102d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x0, 103d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao data_sect); 104d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 105d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // symbol: _end 106d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Builder.AddSymbol(pInput, 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines "_binary_" + mangled_name + "_end", 108d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::NoType, 109d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::Define, 110d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::Global, 111d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x0, 112d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao data_size, 113d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao data_sect); 114d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 115d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // symbol: _size 116d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Builder.AddSymbol(pInput, 1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines "_binary_" + mangled_name + "_size", 118d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::NoType, 119d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::Define, 120d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ResolveInfo::Global, 121d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x0, 122d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao data_size, 123d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao data_sect); 124d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 125d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao // section: .strtab 126d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao m_Builder.CreateELFHeader(pInput, 127d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ".strtab", 128d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao LDFileFormat::NamePool, 129d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao llvm::ELF::SHT_STRTAB, 130d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 0x1); 131d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 132d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao return true; 133d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} 134