23 #ifndef ELFIO_SECTION_HPP
24 #define ELFIO_SECTION_HPP
37 ELFIO_GET_ACCESS_DECL(Elf_Half, index);
38 ELFIO_GET_SET_ACCESS_DECL(std::string, name);
39 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, type);
40 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, flags);
41 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, info);
42 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, link);
43 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, addr_align);
44 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, entry_size);
45 ELFIO_GET_SET_ACCESS_DECL(Elf64_Addr, address);
46 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, size);
47 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, name_string_offset);
49 virtual const char* get_data()
const = 0;
50 virtual void set_data(
const char* pData, Elf_Word size) = 0;
51 virtual void set_data(
const std::string& data) = 0;
52 virtual void append_data(
const char* pData, Elf_Word size) = 0;
53 virtual void append_data(
const std::string& data) = 0;
56 ELFIO_GET_SET_ACCESS_DECL(Elf64_Off, offset);
57 ELFIO_SET_ACCESS_DECL(Elf_Half, index);
59 virtual void load(std::istream& f, std::streampos header_offset) = 0;
60 virtual void save(std::ostream& f, std::streampos header_offset,
61 std::streampos data_offset) = 0;
62 virtual bool is_address_initialized()
const = 0;
71 std::fill_n(
reinterpret_cast<char*
>(&header),
sizeof(header),
'\0');
72 is_address_set =
false;
82 ELFIO_GET_SET_ACCESS(Elf_Word, type, header.sh_type);
83 ELFIO_GET_SET_ACCESS(Elf_Xword, flags, header.sh_flags);
84 ELFIO_GET_SET_ACCESS(Elf_Xword, size, header.sh_size);
85 ELFIO_GET_SET_ACCESS(Elf_Word, link, header.sh_link);
86 ELFIO_GET_SET_ACCESS(Elf_Word, info, header.sh_info);
87 ELFIO_GET_SET_ACCESS(Elf_Xword, addr_align, header.sh_addralign);
88 ELFIO_GET_SET_ACCESS(Elf_Xword, entry_size, header.sh_entsize);
89 ELFIO_GET_SET_ACCESS(Elf_Word, name_string_offset, header.sh_name);
90 ELFIO_GET_ACCESS(Elf64_Addr, address, header.sh_addr);
93 Elf_Half get_index()
const {
return index; }
97 std::string get_name()
const {
return name; }
100 void set_name(std::string name_) { name = name_; }
103 void set_address(Elf64_Addr value) {
104 header.sh_addr = value;
105 header.sh_addr = (*convertor)(header.sh_addr);
106 is_address_set =
true;
110 bool is_address_initialized()
const {
return is_address_set; }
113 const char* get_data()
const {
return data; }
116 void set_data(
const char* raw_data, Elf_Word size) {
117 if (get_type() != SHT_NOBITS) {
120 data =
new char[size];
121 }
catch (
const std::bad_alloc&) {
126 if (0 != data && 0 != raw_data) {
128 std::copy(raw_data, raw_data + size, data);
136 void set_data(
const std::string& str_data) {
137 return set_data(str_data.c_str(), (Elf_Word)str_data.size());
141 void append_data(
const char* raw_data, Elf_Word size) {
142 if (get_type() != SHT_NOBITS) {
143 if (get_size() + size < data_size) {
144 std::copy(raw_data, raw_data + size, data + get_size());
146 data_size = 2 * (data_size + size);
149 new_data =
new char[data_size];
150 }
catch (
const std::bad_alloc&) {
155 std::copy(data, data + get_size(), new_data);
156 std::copy(raw_data, raw_data + size, new_data + get_size());
161 set_size(get_size() + size);
166 void append_data(
const std::string& str_data) {
167 return append_data(str_data.c_str(), (Elf_Word)str_data.size());
173 ELFIO_GET_SET_ACCESS(Elf64_Off, offset, header.sh_offset);
176 void set_index(Elf_Half value) { index = value; }
179 void load(std::istream& stream, std::streampos header_offset) {
180 std::fill_n(
reinterpret_cast<char*
>(&header),
sizeof(header),
'\0');
181 stream.seekg(header_offset);
182 stream.read(
reinterpret_cast<char*
>(&header),
sizeof(header));
184 Elf_Xword size = get_size();
185 if (0 == data && SHT_NULL != get_type() && SHT_NOBITS != get_type()) {
187 data =
new char[size];
188 }
catch (
const std::bad_alloc&) {
193 stream.seekg((*convertor)(header.sh_offset));
194 stream.read(data, size);
201 void save(std::ostream& f, std::streampos header_offset, std::streampos data_offset) {
202 if (0 != get_index()) {
203 header.sh_offset = data_offset;
204 header.sh_offset = (*convertor)(header.sh_offset);
207 save_header(f, header_offset);
208 if (get_type() != SHT_NOBITS && get_type() != SHT_NULL && get_size() != 0 && data != 0) {
209 save_data(f, data_offset);
216 void save_header(std::ostream& f, std::streampos header_offset)
const {
217 f.seekp(header_offset);
218 f.write(
reinterpret_cast<const char*
>(&header),
sizeof(header));
222 void save_data(std::ostream& f, std::streampos data_offset)
const {
223 f.seekp(data_offset);
224 f.write(get_data(), get_size());
240 #endif // ELFIO_SECTION_HPP