1e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao/* 2e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Copyright 2011, The Android Open Source Project 3e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 4e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 5e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * you may not use this file except in compliance with the License. 6e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * You may obtain a copy of the License at 7e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 8e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * 10e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * Unless required by applicable law or agreed to in writing, software 11e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS, 12e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * See the License for the specific language governing permissions and 14e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao * limitations under the License. 15e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao */ 16e2cdbc6710aa43475f17e73aba143ceb786e968cShih-wei Liao 17a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYa#ifndef ELF_SECTION_PROGBITS_H 18a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYa#define ELF_SECTION_PROGBITS_H 19a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYa 2058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien#include "ELFTypes.h" 21fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa#include "ELFSectionBits.h" 22fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa#include "ELFSectionHeader.h" 2374f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien#include "MemChunk.h" 24fa06e91015017e8d0627d26a88e2a575643bec11Shih-wei Liao#include "StubLayout.h" 25921465005aca46a100d137c9608a0aedd846e290Logan Chien 26a9ab5889e842a49ff16d06594efe96b0210fe1f7Logan Chientemplate <unsigned Bitwidth> 27a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYaclass ELFSectionProgBits : public ELFSectionBits<Bitwidth> { 28a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYapublic: 2958611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth); 3058611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chien 31fa06e91015017e8d0627d26a88e2a575643bec11Shih-wei Liaoprivate: 3272dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh StubLayout *stubs; 33fa06e91015017e8d0627d26a88e2a575643bec11Shih-wei Liao 3458611fc8193e7386698178f167a2e0cbdd6a4f6fLogan Chienpublic: 35a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYa template <typename Archiver> 3674f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien static ELFSectionProgBits *read(Archiver &AR, 372061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien ELFObjectTy *owner, 3874f7a939f44d926babd52f59978e6b093e4bb2d0Logan Chien ELFSectionHeaderTy const *sh); 39a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYa 40fa06e91015017e8d0627d26a88e2a575643bec11Shih-wei Liao StubLayout *getStubLayout() { 4172dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh return stubs; 4272dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh } 4372dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 4472dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh ELFSectionProgBits(int machine) { 4572dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh switch(machine) { 4672dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh case EM_ARM: 4772dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh stubs = new StubLayoutARM(); 4872dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh break; 4972dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 5072dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh case EM_MIPS: 5172dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh stubs = new StubLayoutMIPS(); 5272dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh break; 5372dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 5472dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh default: 5572dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh stubs = NULL; 5672dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh } 5772dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh } 5872dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh 5972dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh ~ELFSectionProgBits() { 6072dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh if (stubs) 6172dca268900fa25946bade332f0fbdc2c2ff9487Andrew Hsieh delete stubs; 62fa06e91015017e8d0627d26a88e2a575643bec11Shih-wei Liao } 63fa06e91015017e8d0627d26a88e2a575643bec11Shih-wei Liao 64fca29b439931b32ac7864d58c9a34b87ad852cb2TDYaprivate: 65fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa template <typename Archiver> 66fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa bool serialize(Archiver &AR) { 672061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien ELFSectionHeaderTy const *sh = this->sh; 682061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien MemChunk &chunk = this->chunk; 692061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien 702061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien AR.seek(sh->getOffset(), true); 712061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien AR.prologue(sh->getSize()); 722061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien AR.readBytes(chunk.getBuffer(), sh->getSize()); 732061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien AR.epilogue(sh->getSize()); 742061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien 752061b057e0922ac33b9314c1ccaa50eb7286b847Logan Chien return AR; 76fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa } 77fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa}; 78fca29b439931b32ac7864d58c9a34b87ad852cb2TDYa 796ea6f71f24bc6cf759b2458209f3ef86559c685aLogan Chien#include "impl/ELFSectionProgBits.hxx" 806ea6f71f24bc6cf759b2458209f3ef86559c685aLogan Chien 81a7b72c7a8f03b9827c2dcfdc595dc7a1c6d39893TDYa#endif // ELF_SECTION_PROGBITS_H 82