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_OBJECT_H 18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_OBJECT_H 19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "ELFTypes.h" 21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "MemChunk.h" 22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "utils/rsl_assert.h" 24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <llvm/ADT/OwningPtr.h> 26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <string> 28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <vector> 29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth> 31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFObject { 32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth); 34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines llvm::OwningPtr<ELFHeaderTy> header; 37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines llvm::OwningPtr<ELFSectionHeaderTableTy> shtab; 38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines std::vector<ELFSectionTy *> stab; 39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines MemChunk SHNCommonData; 41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines unsigned char *SHNCommonDataPtr; 42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t SHNCommonDataFreeSize; 43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 44b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines bool missingSymbols; 45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // TODO: Need refactor! 47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines bool initSHNCommonDataSize(size_t SHNCommonDataSize) { 48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines rsl_assert(!SHNCommonDataPtr && "Can't init twice."); 49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (!SHNCommonData.allocate(SHNCommonDataSize)) { 50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return false; 51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines SHNCommonDataPtr = SHNCommonData.getBuffer(); 54b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines SHNCommonDataFreeSize = SHNCommonDataSize; 55b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return true; 56b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 57b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 58b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 59b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFObject() : SHNCommonDataPtr(NULL), missingSymbols(false) { } 60b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 61b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic: 62b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines template <typename Archiver> 63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines static ELFObject *read(Archiver &AR); 64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFHeaderTy const *getHeader() const { 66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return header.get(); 67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionHeaderTableTy const *getSectionHeaderTable() const { 70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return shtab.get(); 71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 72b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 73b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines char const *getSectionName(size_t i) const; 74b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionTy const *getSectionByIndex(size_t i) const; 75b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionTy *getSectionByIndex(size_t i); 76b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionTy const *getSectionByName(std::string const &str) const; 77b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionTy *getSectionByName(std::string const &str); 78b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 79b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines inline bool getMissingSymbols() const { 80b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return missingSymbols; 81b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 82b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 83b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *allocateSHNCommonData(size_t size, size_t align = 1) { 84b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines rsl_assert(size > 0 && align != 0); 85b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 86b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines rsl_assert(SHNCommonDataPtr && "Must init common data size before use!"); 87b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 88b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Ensure alignment 89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines size_t rem = ((uintptr_t)SHNCommonDataPtr) % align; 90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (rem != 0) { 91b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines SHNCommonDataPtr += align - rem; 92b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines SHNCommonDataFreeSize -= align - rem; 93b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 94b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 95b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Ensure the free size is sufficient 96b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines if (SHNCommonDataFreeSize < size) { 97b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return NULL; 98b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 99b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 100b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Allcoate 101b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *result = SHNCommonDataPtr; 102b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines SHNCommonDataPtr += size; 103b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines SHNCommonDataFreeSize -= size; 104b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 105b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines return result; 106b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 107b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 108b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void relocate(void *(*find_sym)(void *context, char const *name), 109b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *context); 110b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 111b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void print() const; 112b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 113b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ~ELFObject() { 114b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines for (size_t i = 0; i < stab.size(); ++i) { 115b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines // Delete will check the pointer is nullptr or not by himself. 116b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines delete stab[i]; 117b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 118b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines } 119b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 120b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate: 121b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void relocateARM(void *(*find_sym)(void *context, char const *name), 122b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *context, 123b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionRelTableTy *reltab, 124b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionProgBitsTy *text); 125b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 126b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void relocateX86_32(void *(*find_sym)(void *context, char const *name), 127b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *context, 128b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionRelTableTy *reltab, 129b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionProgBitsTy *text); 130b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 131b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void relocateX86_64(void *(*find_sym)(void *context, char const *name), 132b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *context, 133b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionRelTableTy *reltab, 134b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionProgBitsTy *text); 135b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 136b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void relocateMIPS(void *(*find_sym)(void *context, char const *name), 137b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines void *context, 138b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionRelTableTy *reltab, 139b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines ELFSectionProgBitsTy *text); 140b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines}; 141b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 142b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "impl/ELFObject.hxx" 143b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines 144b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // ELF_OBJECT_H 145