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_H
18b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#define ELF_SECTION_HEADER_H
19b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
20b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "ELFTypes.h"
21b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
22b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include <stdint.h>
23b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
24b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeaderHelperMixin {
25b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected:
26b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static char const *getSectionTypeStr(uint32_t type);
27b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
28b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
29b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <unsigned Bitwidth>
30b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeader_CRTP : private ELFSectionHeaderHelperMixin {
31b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic:
32b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELF_TYPE_INTRO_TO_TEMPLATE_SCOPE(Bitwidth);
33b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
34b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected:
35b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFObjectTy const *owner;
36b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
37b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  size_t index;
38b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
39b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_name;
40b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_type;
41b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  addr_t sh_addr;
42b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  offset_t sh_offset;
43b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_link;
44b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_info;
45b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
46b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprotected:
47b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFSectionHeader_CRTP() { }
48b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ~ELFSectionHeader_CRTP() { }
49b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
50b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic:
51b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  size_t getIndex() const {
52b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return index;
53b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
54b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
55b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getNameIndex() const {
56b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_name;
57b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
58b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
59b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  char const *getName() const;
60b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
61b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getType() const {
62b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_type;
63b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
64b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
65b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  addr_t getAddress() const {
66b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_addr;
67b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
68b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
69b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  offset_t getOffset() const {
70b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_offset;
71b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
72b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
73b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getLink() const {
74b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_link;
75b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
76b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
77b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getExtraInfo() const {
78b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_info;
79b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
80b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
81b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool isValid() const {
82b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    // FIXME: Should check the correctness of the section header.
83b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return true;
84b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
85b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
86b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  template <typename Archiver>
87b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  static ELFSectionHeaderTy *
88b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  read(Archiver &AR, ELFObjectTy const *owner, size_t index = 0);
89b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
90b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  void print(bool shouldPrintHeader = false) const;
91b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
92b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate:
93b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFSectionHeaderTy *concrete() {
94b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return static_cast<ELFSectionHeaderTy *>(this);
95b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
96b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
97b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFSectionHeaderTy const *concrete() const {
98b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return static_cast<ELFSectionHeaderTy const *>(this);
99b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
100b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
101b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
102b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
103b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#include "impl/ELFSectionHeader.hxx"
104b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
105b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <>
106b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeader<32> : public ELFSectionHeader_CRTP<32> {
107b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  friend class ELFSectionHeader_CRTP<32>;
108b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
109b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate:
110b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_flags;
111b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_size;
112b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_addralign;
113b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t sh_entsize;
114b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
115b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate:
116b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFSectionHeader() {
117b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
118b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
119b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  template <typename Archiver>
120b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool serialize(Archiver &AR) {
121b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR.prologue(TypeTraits<ELFSectionHeader>::size);
122b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
123b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_name;
124b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_type;
125b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_flags;
126b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_addr;
127b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_offset;
128b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_size;
129b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_link;
130b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_info;
131b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_addralign;
132b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_entsize;
133b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
134b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR.epilogue(TypeTraits<ELFSectionHeader>::size);
135b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return AR;
136b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
137b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
138b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic:
139b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getFlags() const {
140b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_flags;
141b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
142b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
143b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getSize() const {
144b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_size;
145b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
146b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
147b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getAddressAlign() const {
148b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_addralign;
149b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
150b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
151b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  word_t getEntrySize() const {
152b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_entsize;
153b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
154b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
155b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
156b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinestemplate <>
157b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesclass ELFSectionHeader<64> : public ELFSectionHeader_CRTP<64> {
158b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  friend class ELFSectionHeader_CRTP<64>;
159b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
160b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate:
161b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t sh_flags;
162b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t sh_size;
163b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t sh_addralign;
164b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t sh_entsize;
165b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
166b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinesprivate:
167b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  ELFSectionHeader() {
168b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
169b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
170b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  template <typename Archiver>
171b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  bool serialize(Archiver &AR) {
172b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR.prologue(TypeTraits<ELFSectionHeader>::size);
173b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
174b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_name;
175b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_type;
176b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_flags;
177b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_addr;
178b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_offset;
179b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_size;
180b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_link;
181b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_info;
182b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_addralign;
183b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR & sh_entsize;
184b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
185b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    AR.epilogue(TypeTraits<ELFSectionHeader>::size);
186b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return AR;
187b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
188b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
189b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hinespublic:
190b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t getFlags() const {
191b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_flags;
192b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
193b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
194b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t getSize() const {
195b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_size;
196b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
197b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
198b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t getAddressAlign() const {
199b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_addralign;
200b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
201b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
202b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  xword_t getEntrySize() const {
203b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines    return sh_entsize;
204b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines  }
205b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines};
206b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines
207b53c8a59e6f21ed36a0c3d9d4ce5834d4cc3c298Stephen Hines#endif // ELF_SECTION_HEADER_H
208