1 /* 2 Copyright (C) 2001-present by Serge Lamikhov-Center 3 4 Permission is hereby granted, free of charge, to any person obtaining a copy 5 of this software and associated documentation files (the "Software"), to deal 6 in the Software without restriction, including without limitation the rights 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 copies of the Software, and to permit persons to whom the Software is 9 furnished to do so, subject to the following conditions: 10 11 The above copyright notice and this permission notice shall be included in 12 all copies or substantial portions of the Software. 13 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 THE SOFTWARE. 21 */ 22 23 #ifndef ELFIO_C_WRAPPER_H 24 #define ELFIO_C_WRAPPER_H 25 #include "elf_types_c_wrapper.hpp" 26 #define ELFIO_C_HEADER_ACCESS_GET( TYPE, FNAME ) \ 27 TYPE elfio_get_##FNAME( pelfio_t pelfio ); 28 29 #define ELFIO_C_HEADER_ACCESS_GET_SET( TYPE, FNAME ) \ 30 TYPE elfio_get_##FNAME( pelfio_t pelfio ); \ 31 void elfio_set_##FNAME( pelfio_t pelfio, TYPE val ); 32 33 #define ELFIO_C_HEADER_ACCESS_GET_IMPL( TYPE, FNAME ) \ 34 TYPE elfio_get_##FNAME( pelfio_t pelfio ) { return pelfio->get_##FNAME(); } 35 36 #define ELFIO_C_HEADER_ACCESS_GET_SET_IMPL( TYPE, FNAME ) \ 37 TYPE elfio_get_##FNAME( pelfio_t pelfio ) \ 38 { \ 39 return pelfio->get_##FNAME(); \ 40 } \ 41 void elfio_set_##FNAME( pelfio_t pelfio, TYPE val ) \ 42 { \ 43 pelfio->set_##FNAME( val ); \ 44 } 45 46 #define ELFIO_C_GET_ACCESS_IMPL( CLASS, TYPE, NAME ) \ 47 TYPE elfio_##CLASS##_get_##NAME( p##CLASS##_t p##CLASS ) \ 48 { \ 49 return p##CLASS->get_##NAME(); \ 50 } 51 52 #define ELFIO_C_SET_ACCESS_IMPL( CLASS, TYPE, NAME ) \ 53 void elfio_##CLASS##_set_##NAME( p##CLASS##_t p##CLASS, TYPE value ) \ 54 { \ 55 p##CLASS->set_##NAME( value ); \ 56 } 57 58 #define ELFIO_C_GET_SET_ACCESS_IMPL( CLASS, TYPE, NAME ) \ 59 TYPE elfio_##CLASS##_get_##NAME( p##CLASS##_t p##CLASS ) \ 60 { \ 61 return p##CLASS->get_##NAME(); \ 62 } \ 63 void elfio_##CLASS##_set_##NAME( p##CLASS##_t p##CLASS, TYPE value ) \ 64 { \ 65 p##CLASS->set_##NAME( value ); \ 66 } 67 68 #define ELFIO_C_GET_ACCESS( CLASS, TYPE, NAME ) \ 69 TYPE elfio_##CLASS##_get_##NAME( p##CLASS##_t p##CLASS ); 70 71 #define ELFIO_C_SET_ACCESS( CLASS, TYPE, NAME ) \ 72 void elfio_##CLASS##_set_##NAME( p##CLASS##_t p##CLASS, TYPE value ); 73 74 #define ELFIO_C_GET_SET_ACCESS( CLASS, TYPE, NAME ) \ 75 TYPE elfio_##CLASS##_get_##NAME( p##CLASS##_t p##CLASS ); \ 76 void elfio_##CLASS##_set_##NAME( p##CLASS##_t p##CLASS, TYPE value ) 77 78 #ifdef __cplusplus 79 typedef ELFIO::elfio* pelfio_t; 80 typedef ELFIO::section* psection_t; 81 typedef ELFIO::segment* psegment_t; 82 typedef ELFIO::symbol_section_accessor* psymbol_t; 83 typedef ELFIO::relocation_section_accessor* prelocation_t; 84 typedef ELFIO::string_section_accessor* pstring_t; 85 typedef ELFIO::note_section_accessor* pnote_t; 86 typedef ELFIO::modinfo_section_accessor* pmodinfo_t; 87 typedef ELFIO::dynamic_section_accessor* pdynamic_t; 88 typedef ELFIO::array_section_accessor<Elf32_Word>* parray_t; 89 90 extern "C" 91 { 92 #else 93 typedef void* pelfio_t; 94 typedef void* psection_t; 95 typedef void* psegment_t; 96 typedef void* psymbol_t; 97 typedef void* prelocation_t; 98 typedef void* pstring_t; 99 typedef void* pnote_t; 100 typedef void* pmodinfo_t; 101 typedef void* pdynamic_t; 102 typedef void* parray_t; 103 #ifndef bool 104 typedef int bool; 105 #endif 106 #endif 107 108 //----------------------------------------------------------------------------- 109 // elfio 110 //----------------------------------------------------------------------------- 111 pelfio_t elfio_new(); 112 void elfio_delete( pelfio_t pelfio ); 113 void elfio_create( pelfio_t pelfio, 114 unsigned char file_class, 115 unsigned char encoding ); 116 bool elfio_load( pelfio_t pelfio, const char* file_name ); 117 bool elfio_save( pelfio_t pelfio, const char* file_name ); 118 ELFIO_C_HEADER_ACCESS_GET( unsigned char, class ); 119 ELFIO_C_HEADER_ACCESS_GET( unsigned char, elf_version ); 120 ELFIO_C_HEADER_ACCESS_GET( unsigned char, encoding ); 121 ELFIO_C_HEADER_ACCESS_GET( Elf_Word, version ); 122 ELFIO_C_HEADER_ACCESS_GET( Elf_Half, header_size ); 123 ELFIO_C_HEADER_ACCESS_GET( Elf_Half, section_entry_size ); 124 ELFIO_C_HEADER_ACCESS_GET( Elf_Half, segment_entry_size ); 125 ELFIO_C_HEADER_ACCESS_GET_SET( unsigned char, os_abi ); 126 ELFIO_C_HEADER_ACCESS_GET_SET( unsigned char, abi_version ); 127 ELFIO_C_HEADER_ACCESS_GET_SET( Elf_Half, type ); 128 ELFIO_C_HEADER_ACCESS_GET_SET( Elf_Half, machine ); 129 ELFIO_C_HEADER_ACCESS_GET_SET( Elf_Word, flags ); 130 ELFIO_C_HEADER_ACCESS_GET_SET( Elf64_Addr, entry ); 131 ELFIO_C_HEADER_ACCESS_GET_SET( Elf64_Off, sections_offset ); 132 ELFIO_C_HEADER_ACCESS_GET_SET( Elf64_Off, segments_offset ); 133 ELFIO_C_HEADER_ACCESS_GET_SET( Elf_Half, section_name_str_index ); 134 Elf_Half elfio_get_sections_num( pelfio_t pelfio ); 135 psection_t elfio_get_section_by_index( pelfio_t pelfio, int index ); 136 psection_t elfio_get_section_by_name( pelfio_t pelfio, char* name ); 137 psection_t elfio_add_section( pelfio_t pelfio, char* name ); 138 Elf_Half elfio_get_segments_num( pelfio_t pelfio ); 139 psegment_t elfio_get_segment_by_index( pelfio_t pelfio, int index ); 140 psegment_t elfio_add_segment( pelfio_t pelfio ); 141 bool elfio_validate( pelfio_t pelfio, char* msg, int msg_len ); 142 143 //----------------------------------------------------------------------------- 144 // section 145 //----------------------------------------------------------------------------- 146 ELFIO_C_GET_ACCESS( section, Elf_Half, index ); 147 ELFIO_C_GET_SET_ACCESS( section, Elf_Word, type ); 148 ELFIO_C_GET_SET_ACCESS( section, Elf_Xword, flags ); 149 ELFIO_C_GET_SET_ACCESS( section, Elf_Word, info ); 150 ELFIO_C_GET_SET_ACCESS( section, Elf_Word, link ); 151 ELFIO_C_GET_SET_ACCESS( section, Elf_Xword, addr_align ); 152 ELFIO_C_GET_SET_ACCESS( section, Elf_Xword, entry_size ); 153 ELFIO_C_GET_SET_ACCESS( section, Elf64_Addr, address ); 154 ELFIO_C_GET_SET_ACCESS( section, Elf_Xword, size ); 155 ELFIO_C_GET_SET_ACCESS( section, Elf_Word, name_string_offset ); 156 ELFIO_C_GET_ACCESS( section, Elf64_Off, offset ); 157 void elfio_section_get_name( psection_t psection, char* buffer, int len ); 158 void elfio_section_set_name( psection_t psection, char* buffer ); 159 char* elfio_section_get_data( psection_t psection ); 160 void elfio_section_set_data( psection_t psection, 161 const char* pData, 162 Elf_Word size ); 163 void elfio_section_append_data( psection_t psection, 164 const char* pData, 165 Elf_Word size ); 166 167 //----------------------------------------------------------------------------- 168 // segment 169 //----------------------------------------------------------------------------- 170 ELFIO_C_GET_ACCESS( segment, Elf_Half, index ); 171 ELFIO_C_GET_SET_ACCESS( segment, Elf_Word, type ); 172 ELFIO_C_GET_SET_ACCESS( segment, Elf_Word, flags ); 173 ELFIO_C_GET_SET_ACCESS( segment, Elf_Xword, align ); 174 ELFIO_C_GET_SET_ACCESS( segment, Elf_Xword, memory_size ); 175 ELFIO_C_GET_SET_ACCESS( segment, Elf64_Addr, virtual_address ); 176 ELFIO_C_GET_SET_ACCESS( segment, Elf64_Addr, physical_address ); 177 ELFIO_C_GET_SET_ACCESS( segment, Elf_Xword, file_size ); 178 ELFIO_C_GET_ACCESS( segment, Elf64_Off, offset ); 179 char* elfio_segment_get_data( psegment_t psegment ); 180 Elf_Half elfio_segment_add_section_index( psegment_t psegment, 181 Elf_Half index, 182 Elf_Xword addr_align ); 183 Elf_Half elfio_segment_get_sections_num( psegment_t psegment ); 184 Elf_Half elfio_segment_get_section_index_at( psegment_t psegment, 185 Elf_Half num ); 186 bool elfio_segment_is_offset_initialized( psegment_t psegment ); 187 188 //----------------------------------------------------------------------------- 189 // symbol 190 //----------------------------------------------------------------------------- 191 psymbol_t elfio_symbol_section_accessor_new( pelfio_t pelfio, 192 psection_t psection ); 193 void elfio_symbol_section_accessor_delete( psymbol_t psymbol ); 194 Elf_Xword elfio_symbol_get_symbols_num( psymbol_t psymbol ); 195 bool elfio_symbol_get_symbol( psymbol_t psymbol, 196 Elf_Xword index, 197 char* name, 198 int name_len, 199 Elf64_Addr* value, 200 Elf_Xword* size, 201 unsigned char* bind, 202 unsigned char* type, 203 Elf_Half* section_index, 204 unsigned char* other ); 205 Elf_Word elfio_symbol_add_symbol( psymbol_t psymbol, 206 Elf_Word name, 207 Elf64_Addr value, 208 Elf_Xword size, 209 unsigned char info, 210 unsigned char other, 211 Elf_Half shndx ); 212 Elf_Xword elfio_symbol_arrange_local_symbols( 213 psymbol_t psymbol, 214 void ( *func )( Elf_Xword first, Elf_Xword second ) ); 215 216 //----------------------------------------------------------------------------- 217 // relocation 218 //----------------------------------------------------------------------------- 219 prelocation_t elfio_relocation_section_accessor_new( pelfio_t pelfio, 220 psection_t psection ); 221 void elfio_relocation_section_accessor_delete( prelocation_t prelocation ); 222 Elf_Xword elfio_relocation_get_entries_num( prelocation_t prelocation ); 223 bool elfio_relocation_get_entry( prelocation_t prelocation, 224 Elf_Xword index, 225 Elf64_Addr* offset, 226 Elf_Word* symbol, 227 Elf_Word* type, 228 Elf_Sxword* addend ); 229 bool elfio_relocation_set_entry( prelocation_t prelocation, 230 Elf_Xword index, 231 Elf64_Addr offset, 232 Elf_Word symbol, 233 Elf_Word type, 234 Elf_Sxword addend ); 235 void elfio_relocation_add_entry( prelocation_t prelocation, 236 Elf64_Addr offset, 237 Elf_Word symbol, 238 unsigned char type, 239 Elf_Sxword addend ); 240 void elfio_relocation_swap_symbols( prelocation_t prelocation, 241 Elf_Xword first, 242 Elf_Xword second ); 243 244 //----------------------------------------------------------------------------- 245 // string 246 //----------------------------------------------------------------------------- 247 pstring_t elfio_string_section_accessor_new( psection_t psection ); 248 void elfio_string_section_accessor_delete( pstring_t pstring ); 249 const char* elfio_string_get_string( pstring_t pstring, Elf_Word index ); 250 Elf_Word elfio_string_add_string( pstring_t pstring, char* str ); 251 252 //----------------------------------------------------------------------------- 253 // note 254 //----------------------------------------------------------------------------- 255 pnote_t elfio_note_section_accessor_new( pelfio_t pelfio, 256 psection_t psection ); 257 void elfio_note_section_accessor_delete( pnote_t pstring ); 258 Elf_Word elfio_note_get_notes_num( pnote_t pnote ); 259 bool elfio_note_get_note( pnote_t pnote, 260 Elf_Word index, 261 Elf_Word* type, 262 char* name, 263 int name_len, 264 void** desc, 265 Elf_Word* descSize ); 266 void elfio_note_add_note( pnote_t pnote, 267 Elf_Word type, 268 const char* name, 269 const void* desc, 270 Elf_Word descSize ); 271 272 //----------------------------------------------------------------------------- 273 // modinfo 274 //----------------------------------------------------------------------------- 275 pmodinfo_t elfio_modinfo_section_accessor_new( psection_t psection ); 276 void elfio_modinfo_section_accessor_delete( pmodinfo_t pmodinfo ); 277 Elf_Word elfio_modinfo_get_attribute_num( pmodinfo_t pmodinfo ); 278 bool elfio_modinfo_get_attribute( pmodinfo_t pmodinfo, 279 Elf_Word no, 280 char* field, 281 int field_len, 282 char* value, 283 int value_len ); 284 bool elfio_modinfo_get_attribute_by_name( pmodinfo_t pmodinfo, 285 char* field_name, 286 char* value, 287 int value_len ); 288 Elf_Word elfio_modinfo_add_attribute( pmodinfo_t pmodinfo, 289 char* field, 290 char* value ); 291 292 //----------------------------------------------------------------------------- 293 // dynamic 294 //----------------------------------------------------------------------------- 295 pdynamic_t elfio_dynamic_section_accessor_new( pelfio_t pelfio, 296 psection_t psection ); 297 void elfio_dynamic_section_accessor_delete( pdynamic_t pdynamic ); 298 Elf_Xword elfio_dynamic_get_entries_num( pdynamic_t pdynamic ); 299 bool elfio_dynamic_get_entry( pdynamic_t pdynamic, 300 Elf_Xword index, 301 Elf_Xword* tag, 302 Elf_Xword* value, 303 char* str, 304 int str_len ); 305 void elfio_dynamic_add_entry( pdynamic_t pdynamic, 306 Elf_Xword tag, 307 Elf_Xword value ); 308 309 //----------------------------------------------------------------------------- 310 // array 311 //----------------------------------------------------------------------------- 312 parray_t elfio_array_section_accessor_new( pelfio_t pelfio, 313 psection_t psection ); 314 void elfio_array_section_accessor_delete( parray_t parray ); 315 Elf_Xword elfio_array_get_entries_num( parray_t parray ); 316 bool elfio_array_get_entry( parray_t parray, 317 Elf_Xword index, 318 Elf64_Addr* paddress ); 319 void elfio_array_add_entry( parray_t parray, Elf64_Addr address ); 320 321 #ifdef __cplusplus 322 } 323 #endif 324 325 #endif // ELFIO_C_WRAPPER_H 326