• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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