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