23 #ifndef ELFIO_SEGMENT_HPP
24 #define ELFIO_SEGMENT_HPP
37 ELFIO_GET_ACCESS_DECL(Elf_Half, index);
38 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, type);
39 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, flags);
40 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, align);
41 ELFIO_GET_SET_ACCESS_DECL(Elf64_Addr, virtual_address);
42 ELFIO_GET_SET_ACCESS_DECL(Elf64_Addr, physical_address);
43 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, file_size);
44 ELFIO_GET_SET_ACCESS_DECL(Elf_Xword, memory_size);
45 ELFIO_GET_ACCESS_DECL(Elf64_Off, offset);
47 virtual const char* get_data()
const = 0;
49 virtual Elf_Half add_section_index(Elf_Half index, Elf_Xword addr_align) = 0;
50 virtual Elf_Half get_sections_num()
const = 0;
51 virtual Elf_Half get_section_index_at(Elf_Half num)
const = 0;
52 virtual bool is_offset_initialized()
const = 0;
55 ELFIO_SET_ACCESS_DECL(Elf64_Off, offset);
56 ELFIO_SET_ACCESS_DECL(Elf_Half, index);
58 virtual const std::vector<Elf_Half>& get_sections()
const = 0;
59 virtual void load(std::istream& stream, std::streampos header_offset) = 0;
60 virtual void save(std::ostream& f, std::streampos header_offset,
61 std::streampos data_offset) = 0;
71 is_offset_set =
false;
72 std::fill_n(
reinterpret_cast<char*
>(&ph),
sizeof(ph),
'\0');
81 ELFIO_GET_SET_ACCESS(Elf_Word, type, ph.p_type);
82 ELFIO_GET_SET_ACCESS(Elf_Word, flags, ph.p_flags);
83 ELFIO_GET_SET_ACCESS(Elf_Xword, align, ph.p_align);
84 ELFIO_GET_SET_ACCESS(Elf64_Addr, virtual_address, ph.p_vaddr);
85 ELFIO_GET_SET_ACCESS(Elf64_Addr, physical_address, ph.p_paddr);
86 ELFIO_GET_SET_ACCESS(Elf_Xword, file_size, ph.p_filesz);
87 ELFIO_GET_SET_ACCESS(Elf_Xword, memory_size, ph.p_memsz);
88 ELFIO_GET_ACCESS(Elf64_Off, offset, ph.p_offset);
91 Elf_Half get_index()
const {
return index; }
94 const char* get_data()
const {
return data; }
97 Elf_Half add_section_index(Elf_Half sec_index, Elf_Xword addr_align) {
98 sections.push_back(sec_index);
99 if (addr_align > get_align()) {
100 set_align(addr_align);
103 return (Elf_Half)sections.size();
107 Elf_Half get_sections_num()
const {
return (Elf_Half)sections.size(); }
110 Elf_Half get_section_index_at(Elf_Half num)
const {
111 if (num < sections.size()) {
112 return sections[num];
123 void set_offset(Elf64_Off value) {
125 ph.p_offset = (*convertor)(ph.p_offset);
126 is_offset_set =
true;
130 bool is_offset_initialized()
const {
return is_offset_set; }
133 const std::vector<Elf_Half>& get_sections()
const {
return sections; }
136 void set_index(Elf_Half value) { index = value; }
139 void load(std::istream& stream, std::streampos header_offset) {
140 stream.seekg(header_offset);
141 stream.read(
reinterpret_cast<char*
>(&ph),
sizeof(ph));
142 is_offset_set =
true;
144 if (PT_NULL != get_type() && 0 != get_file_size()) {
145 stream.seekg((*convertor)(ph.p_offset));
146 Elf_Xword size = get_file_size();
148 data =
new char[size];
149 }
catch (
const std::bad_alloc&) {
153 stream.read(data, size);
159 void save(std::ostream& f, std::streampos header_offset, std::streampos data_offset) {
160 ph.p_offset = data_offset;
161 ph.p_offset = (*convertor)(ph.p_offset);
162 f.seekp(header_offset);
163 f.write(
reinterpret_cast<const char*
>(&ph),
sizeof(ph));
171 std::vector<Elf_Half> sections;
178 #endif // ELFIO_SEGMENT_HPP