23 #ifndef ELF_HEADER_HPP
24 #define ELF_HEADER_HPP
33 virtual bool load(std::istream& stream) = 0;
34 virtual bool save(std::ostream& stream)
const = 0;
37 ELFIO_GET_ACCESS_DECL(
unsigned char,
class);
38 ELFIO_GET_ACCESS_DECL(
unsigned char, elf_version);
39 ELFIO_GET_ACCESS_DECL(
unsigned char, encoding);
40 ELFIO_GET_ACCESS_DECL(Elf_Word, version);
41 ELFIO_GET_ACCESS_DECL(Elf_Half, header_size);
42 ELFIO_GET_ACCESS_DECL(Elf_Half, section_entry_size);
43 ELFIO_GET_ACCESS_DECL(Elf_Half, segment_entry_size);
45 ELFIO_GET_SET_ACCESS_DECL(
unsigned char, os_abi);
46 ELFIO_GET_SET_ACCESS_DECL(
unsigned char, abi_version);
47 ELFIO_GET_SET_ACCESS_DECL(Elf_Half, type);
48 ELFIO_GET_SET_ACCESS_DECL(Elf_Half, machine);
49 ELFIO_GET_SET_ACCESS_DECL(Elf_Word, flags);
50 ELFIO_GET_SET_ACCESS_DECL(Elf64_Addr, entry);
51 ELFIO_GET_SET_ACCESS_DECL(Elf_Half, sections_num);
52 ELFIO_GET_SET_ACCESS_DECL(Elf64_Off, sections_offset);
53 ELFIO_GET_SET_ACCESS_DECL(Elf_Half, segments_num);
54 ELFIO_GET_SET_ACCESS_DECL(Elf64_Off, segments_offset);
55 ELFIO_GET_SET_ACCESS_DECL(Elf_Half, section_name_str_index);
65 static const unsigned char file_class = ELFCLASS32;
71 static const unsigned char file_class = ELFCLASS64;
78 convertor = convertor_;
80 std::fill_n(
reinterpret_cast<char*
>(&header),
sizeof(header),
'\0');
82 header.e_ident[EI_MAG0] = ELFMAG0;
83 header.e_ident[EI_MAG1] = ELFMAG1;
84 header.e_ident[EI_MAG2] = ELFMAG2;
85 header.e_ident[EI_MAG3] = ELFMAG3;
87 header.e_ident[EI_DATA] = encoding;
88 header.e_ident[EI_VERSION] = EV_CURRENT;
89 header.e_version = EV_CURRENT;
90 header.e_version = (*convertor)(header.e_version);
91 header.e_ehsize = (
sizeof(header));
92 header.e_ehsize = (*convertor)(header.e_ehsize);
93 header.e_shstrndx = (*convertor)((Elf_Half)1);
96 header.e_phentsize = (*convertor)(header.e_phentsize);
97 header.e_shentsize = (*convertor)(header.e_shentsize);
100 bool load(std::istream& stream) {
102 stream.read(
reinterpret_cast<char*
>(&header),
sizeof(header));
104 return (stream.gcount() ==
sizeof(header));
107 bool save(std::ostream& stream)
const {
109 stream.write(
reinterpret_cast<const char*
>(&header),
sizeof(header));
111 return stream.good();
115 ELFIO_GET_ACCESS(
unsigned char,
class, header.e_ident[EI_CLASS]);
116 ELFIO_GET_ACCESS(
unsigned char, elf_version, header.e_ident[EI_VERSION]);
117 ELFIO_GET_ACCESS(
unsigned char, encoding, header.e_ident[EI_DATA]);
118 ELFIO_GET_ACCESS(Elf_Word, version, header.e_version);
119 ELFIO_GET_ACCESS(Elf_Half, header_size, header.e_ehsize);
120 ELFIO_GET_ACCESS(Elf_Half, section_entry_size, header.e_shentsize);
121 ELFIO_GET_ACCESS(Elf_Half, segment_entry_size, header.e_phentsize);
123 ELFIO_GET_SET_ACCESS(
unsigned char, os_abi, header.e_ident[EI_OSABI]);
124 ELFIO_GET_SET_ACCESS(
unsigned char, abi_version, header.e_ident[EI_ABIVERSION]);
125 ELFIO_GET_SET_ACCESS(Elf_Half, type, header.e_type);
126 ELFIO_GET_SET_ACCESS(Elf_Half, machine, header.e_machine);
127 ELFIO_GET_SET_ACCESS(Elf_Word, flags, header.e_flags);
128 ELFIO_GET_SET_ACCESS(Elf_Half, section_name_str_index, header.e_shstrndx);
129 ELFIO_GET_SET_ACCESS(Elf64_Addr, entry, header.e_entry);
130 ELFIO_GET_SET_ACCESS(Elf_Half, sections_num, header.e_shnum);
131 ELFIO_GET_SET_ACCESS(Elf64_Off, sections_offset, header.e_shoff);
132 ELFIO_GET_SET_ACCESS(Elf_Half, segments_num, header.e_phnum);
133 ELFIO_GET_SET_ACCESS(Elf64_Off, segments_offset, header.e_phoff);
142 #endif // ELF_HEADER_HPP