1b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines/* 2b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Copyright 2011, The Android Open Source Project 3b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * 4b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * you may not use this file except in compliance with the License. 6b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * You may obtain a copy of the License at 7b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * 8b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * 10b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * Unless required by applicable law or agreed to in writing, software 11b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * See the License for the specific language governing permissions and 14b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines * limitations under the License. 15b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines */ 16b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 17b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#ifndef ELF_SECTION_HEADER_HXX 18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_SECTION_HEADER_HXX 19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "utils/raw_ostream.h" 21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <llvm/Support/Format.h> 22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <llvm/Support/raw_ostream.h> 23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "ELFObject.h" 25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> 27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hineschar const *ELFSectionHeader_CRTP<Bitwidth>::getName() const { 28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return owner->getSectionName(getNameIndex()); 29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines} 30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> 32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <typename Archiver> 33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestypename ELFSectionHeader_CRTP<Bitwidth>::ELFSectionHeaderTy * 34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen HinesELFSectionHeader_CRTP<Bitwidth>::read(Archiver &AR, 35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFObjectTy const *owner, 36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t index) { 37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (!AR) { 39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Archiver is in bad state before calling read function. 40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Return NULL and do nothing. 41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return 0; 42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 44d282991c78d1fd79a222c5f114e623da255ba8a0Stephen Hines std::unique_ptr<ELFSectionHeaderTy> sh(new ELFSectionHeaderTy()); 45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (!sh->serialize(AR)) { 47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Unable to read the structure. Return NULL. 48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return 0; 49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (!sh->isValid()) { 52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Header read from archiver is not valid. Return NULL. 53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return 0; 54b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 55b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 56b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Set the section header index 57b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines sh->index = index; 58b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 59b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Set the owner elf object 60b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines sh->owner = owner; 61b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 62d282991c78d1fd79a222c5f114e623da255ba8a0Stephen Hines return sh.release(); 63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines} 64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> 66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesvoid ELFSectionHeader_CRTP<Bitwidth>::print(bool shouldPrintHeader) const { 67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines using namespace llvm; 68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (shouldPrintHeader) { 70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << '\n' << fillformat('=', 79) << '\n'; 71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out().changeColor(raw_ostream::WHITE, true); 72b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << "ELF Section Header " 73b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines << this->getIndex() << '\n'; 74b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out().resetColor(); 75b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << fillformat('-', 79) << '\n'; 76b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } else { 77b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << fillformat('-', 79) << '\n'; 78b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out().changeColor(raw_ostream::YELLOW, true); 79b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << "ELF Section Header " 80b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines << this->getIndex() << " : " << '\n'; 81b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out().resetColor(); 82b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 83b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 84b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define PRINT_LINT(title, value) \ 85b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << format(" %-13s : ", (char const *)(title)) << (value) << '\n' 86b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Name", getName() ); 87b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Type", getSectionTypeStr(getType())); 88b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Flags", concrete()->getFlags()); 89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Address", getAddress()); 90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Offset", getOffset()); 91b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Size", concrete()->getSize()); 92b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Link", getLink()); 93b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Extra Info", getExtraInfo()); 94b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Address Align", concrete()->getAddressAlign()); 95b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines PRINT_LINT("Entry Size", concrete()->getEntrySize()); 96b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#undef PRINT_LINT 97b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 98b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (shouldPrintHeader) { 99b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines out() << fillformat('=', 79) << '\n'; 100b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 101b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines} 102b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 103b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // ELF_SECTION_HEADER_HXX 104