RTEMS 5.2
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
rtl-obj.h
Go to the documentation of this file.
1/*
2 * COPYRIGHT (c) 2012,2019 Chris Johns <chrisj@rtems.org>
3 *
4 * The license and distribution terms for this file may be
5 * found in the file LICENSE in this distribution or at
6 * http://www.rtems.org/license/LICENSE.
7 */
16#if !defined (_RTEMS_RTL_OBJ_H_)
17#define _RTEMS_RTL_OBJ_H_
18
19#include <rtems.h>
20#include <rtems/chain.h>
21#include <rtems/rtl/rtl-sym.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif /* __cplusplus */
27
31#define RTEMS_RTL_FMT_ELF (1 << 0)
32#define RTEMS_RTL_FMT_COMP (1 << 1)
33#define RTEMS_RTL_FMT_PRIVATE (1 << 16)
34
39{
44 const char* label;
45
49 uint32_t flags;
51
56typedef bool (*rtems_rtl_loader_check) (rtems_rtl_obj* obj, int fd);
57
62typedef bool (*rtems_rtl_loader_load) (rtems_rtl_obj* obj, int fd);
63
69
74typedef rtems_rtl_loader_format* (*rtems_rtl_loader_sig) (void);
75
80{
86
90#define RTEMS_RTL_OBJ_SECT_TEXT (1 << 0)
91#define RTEMS_RTL_OBJ_SECT_CONST (1 << 1)
92#define RTEMS_RTL_OBJ_SECT_DATA (1 << 2)
93#define RTEMS_RTL_OBJ_SECT_BSS (1 << 3)
94#define RTEMS_RTL_OBJ_SECT_EH (1 << 4)
95#define RTEMS_RTL_OBJ_SECT_TLS (1 << 5)
96#define RTEMS_RTL_OBJ_SECT_REL (1 << 6)
97#define RTEMS_RTL_OBJ_SECT_RELA (1 << 7)
98#define RTEMS_RTL_OBJ_SECT_SYM (1 << 8)
99#define RTEMS_RTL_OBJ_SECT_STR (1 << 9)
100#define RTEMS_RTL_OBJ_SECT_ALLOC (1 << 10
101#define RTEMS_RTL_OBJ_SECT_LOAD (1 << 11)
102#define RTEMS_RTL_OBJ_SECT_WRITE (1 << 12)
103#define RTEMS_RTL_OBJ_SECT_EXEC (1 << 13)
104#define RTEMS_RTL_OBJ_SECT_ZERO (1 << 14)
105#define RTEMS_RTL_OBJ_SECT_LINK (1 << 15)
106#define RTEMS_RTL_OBJ_SECT_CTOR (1 << 16)
107#define RTEMS_RTL_OBJ_SECT_DTOR (1 << 17)
108#define RTEMS_RTL_OBJ_SECT_LOCD (1 << 18)
109#define RTEMS_RTL_OBJ_SECT_ARCH_ALLOC (1 << 19)
114#define RTEMS_RTL_OBJ_SECT_TYPES (RTEMS_RTL_OBJ_SECT_TEXT | \
115 RTEMS_RTL_OBJ_SECT_CONST | \
116 RTEMS_RTL_OBJ_SECT_DATA | \
117 RTEMS_RTL_OBJ_SECT_BSS | \
118 RTEMS_RTL_OBJ_SECT_TLS | \
119 RTEMS_RTL_OBJ_SECT_EH)
120
127{
130 const char* name;
131 size_t size;
132 off_t offset;
134 uint32_t alignment;
135 int link;
136 int info;
137 uint32_t flags;
138 void* base;
141};
142
150{
152 size_t dependents;
154};
155
160 rtems_rtl_obj* dependent,
161 void* data);
162
166#define RTEMS_RTL_OBJ_LOCKED (1 << 0)
168#define RTEMS_RTL_OBJ_UNRESOLVED (1 << 1)
170#define RTEMS_RTL_OBJ_BASE (1 << 2)
171#define RTEMS_RTL_OBJ_RELOC_TAG (1 << 3)
173#define RTEMS_RTL_OBJ_DEP_VISITED (1 << 4)
174#define RTEMS_RTL_OBJ_CTOR_RUN (1 << 5)
181{
183 uint32_t flags;
184 size_t users;
185 size_t refs;
186 int format;
187 const char* fname;
188 const char* oname;
190 const char* aname;
193 off_t ooffset;
194 size_t fsize;
199 size_t local_syms;
200 size_t local_size;
202 size_t global_syms;
203 size_t global_size;
204 size_t unresolved;
205 void* text_base;
207 size_t text_size;
210 size_t const_size;
211 void* eh_base;
213 size_t eh_size;
214 void* data_base;
216 size_t data_size;
217 void* bss_base;
219 size_t bss_size;
220 size_t exec_size;
222 void* entry;
223 uint32_t checksum;
225 uint32_t* sec_num;
226 uint32_t obj_num;
230 size_t tramp_size;
231 size_t tramps_size;
232 void* tramp_brk;
239 void* loader;
241};
242
255 int fd,
256 rtems_rtl_obj_sect* sect,
257 void* data);
258
265static inline const char* rtems_rtl_obj_fname (const rtems_rtl_obj* obj)
266{
267 return obj->fname;
268}
269
276static inline bool rtems_rtl_obj_fname_valid (const rtems_rtl_obj* obj)
277{
278 return obj->fname;
279}
280
287static inline const char* rtems_rtl_obj_oname (const rtems_rtl_obj* obj)
288{
289 return obj->oname;
290}
291
298static inline bool rtems_rtl_obj_oname_valid (const rtems_rtl_obj* obj)
299{
300 return obj->oname;
301}
302
309static inline const char* rtems_rtl_obj_aname (const rtems_rtl_obj* obj)
310{
311 return obj->aname;
312}
313
320static inline bool rtems_rtl_obj_aname_valid (const rtems_rtl_obj* obj)
321{
322 return obj->aname;
323}
324
331static inline bool rtems_rtl_obj_text_inside (const rtems_rtl_obj* obj,
332 const void* address)
333{
334 return
335 (address >= obj->text_base) &&
336 ((char*) address < ((char*) obj->text_base + obj->text_size));
337}
338
348static inline size_t rtems_rtl_obj_align (size_t offset,
349 uint32_t alignment)
350{
351 if ((alignment > 1) && ((offset & (alignment - 1)) != 0))
352 offset = (offset + alignment) & ~(alignment - 1);
353 return offset;
354}
355
363static inline bool rtems_rtl_obj_has_symbol (const rtems_rtl_obj* obj,
364 const rtems_rtl_obj_sym* sym)
365{
366 return (sym >= obj->global_table &&
367 sym < (obj->global_table + obj->global_syms));
368}
369
377static inline size_t rtems_rtl_obj_tramp_avail_space (const rtems_rtl_obj* obj)
378{
379 return (char*) obj->tramp_brk - (char*) obj->trampoline;
380}
381
389static inline bool rtems_rtl_obj_has_tramp_space (const rtems_rtl_obj* obj,
390 const size_t size)
391{
392 return (obj->trampoline != NULL &&
393 (rtems_rtl_obj_tramp_avail_space (obj) + size) <= obj->tramps_size);
394}
395
402static inline size_t rtems_rtl_obj_trampoline_slots (const rtems_rtl_obj* obj)
403{
404 return obj->trampoline == NULL || obj->tramp_size == 0 ?
405 0 : obj->tramps_size / obj->tramp_size;
406}
407
414static inline size_t rtems_rtl_obj_trampolines (const rtems_rtl_obj* obj)
415{
416 return obj->trampoline == NULL || obj->tramp_size == 0 ?
417 0 : rtems_rtl_obj_tramp_avail_space (obj) / obj->tramp_size;
418}
419
426static inline bool rtems_rtl_obj_sect_is_arch_alloc (rtems_rtl_obj_sect* sect)
427{
428 return (sect->flags & RTEMS_RTL_OBJ_SECT_ARCH_ALLOC) != 0;
429}
430
437
446
456
468bool rtems_rtl_parse_name (const char* name,
469 const char** aname,
470 const char** oname,
471 off_t* ooffset);
472
483bool rtems_rtl_obj_find_file (rtems_rtl_obj* obj, const char* name);
484
501 int section,
502 const char* name,
503 size_t size,
504 off_t offset,
505 uint32_t alignment,
506 int link,
507 int info,
508 uint32_t flags);
509
516
526 const char* name);
527
537 int index);
538
552 int index,
553 uint32_t mask);
554
563
570
579bool rtems_rtl_obj_alloc_dependents (rtems_rtl_obj* obj, size_t dependents);
580
587
597
606
618 void* data);
619
628size_t rtems_rtl_obj_text_size (const rtems_rtl_obj* obj);
629
641uint32_t rtems_rtl_obj_text_alignment (const rtems_rtl_obj* obj);
642
651size_t rtems_rtl_obj_const_size (const rtems_rtl_obj* obj);
652
664uint32_t rtems_rtl_obj_const_alignment (const rtems_rtl_obj* obj);
665
673size_t rtems_rtl_obj_eh_size (const rtems_rtl_obj* obj);
674
686uint32_t rtems_rtl_obj_eh_alignment (const rtems_rtl_obj* obj);
687
696size_t rtems_rtl_obj_data_size (const rtems_rtl_obj* obj);
697
709uint32_t rtems_rtl_obj_data_alignment (const rtems_rtl_obj* obj);
710
718size_t rtems_rtl_obj_bss_size (const rtems_rtl_obj* obj);
719
731uint32_t rtems_rtl_obj_bss_alignment (const rtems_rtl_obj* obj);
732
745 int fd,
747 void* data);
748
755
765 rtems_rtl_obj_sym* sym);
766
779 int fd,
781 void* data);
782
794bool
796 int fd,
798 void* data);
799
813 int fd,
815 void* data);
816
823
833
840
850
857
864
871
879
889
898
899#ifdef __cplusplus
900}
901#endif /* __cplusplus */
902
903#endif
#define NULL
Requests a GPIO pin group configuration.
Definition: bestcomm_api.h:77
Chain API.
bool rtems_rtl_obj_find_file(rtems_rtl_obj *obj, const char *name)
Definition: rtl-obj.c:385
rtems_rtl_loader_format *(* rtems_rtl_loader_sig)(void)
Definition: rtl-obj.h:74
uint32_t rtems_rtl_obj_bss_alignment(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:812
bool rtems_rtl_obj_add_section(rtems_rtl_obj *obj, int section, const char *name, size_t size, off_t offset, uint32_t alignment, int link, int info, uint32_t flags)
Definition: rtl-obj.c:425
bool(* rtems_rtl_obj_depends_iterator)(rtems_rtl_obj *obj, rtems_rtl_obj *dependent, void *data)
Definition: rtl-obj.h:159
bool rtems_rtl_obj_ctors_to_run(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1297
size_t rtems_rtl_obj_get_reference(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1345
uint32_t rtems_rtl_obj_text_alignment(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:757
size_t rtems_rtl_obj_const_size(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:764
struct rtems_rtl_loader_table rtems_rtl_loader_table
rtems_rtl_obj_sect * rtems_rtl_obj_find_section(const rtems_rtl_obj *obj, const char *name)
Definition: rtl-obj.c:504
void rtems_rtl_obj_erase_sections(rtems_rtl_obj *obj)
Definition: rtl-obj.c:464
bool rtems_rtl_obj_load(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1372
bool rtems_rtl_obj_relocate(rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
Definition: rtl-obj.c:818
#define RTEMS_RTL_OBJ_SECT_ARCH_ALLOC
Definition: rtl-obj.h:109
void rtems_rtl_obj_run_dtors(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1315
bool rtems_rtl_obj_add_dependent(rtems_rtl_obj *obj, rtems_rtl_obj *dependent)
Definition: rtl-obj.c:641
size_t rtems_rtl_obj_eh_size(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:785
size_t rtems_rtl_obj_text_size(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:750
void rtems_rtl_obj_erase_trampoline(rtems_rtl_obj *obj)
Definition: rtl-obj.c:597
size_t rtems_rtl_obj_data_size(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:792
size_t rtems_rtl_obj_bss_size(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:806
bool rtems_rtl_obj_remove_dependencies(rtems_rtl_obj *obj)
Definition: rtl-obj.c:694
bool rtems_rtl_obj_unresolved(rtems_rtl_obj *obj)
Definition: rtl-obj.c:171
bool(* rtems_rtl_loader_load)(rtems_rtl_obj *obj, int fd)
Definition: rtl-obj.h:62
bool rtems_rtl_obj_free(rtems_rtl_obj *obj)
Definition: rtl-obj.c:106
void rtems_rtl_obj_dec_reference(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1357
bool rtems_rtl_parse_name(const char *name, const char **aname, const char **oname, off_t *ooffset)
Definition: rtl-obj.c:202
bool(* rtems_rtl_obj_sect_handler)(rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect *sect, void *data)
Definition: rtl-obj.h:254
bool rtems_rtl_obj_alloc_trampoline(rtems_rtl_obj *obj)
Definition: rtl-obj.c:583
rtems_rtl_obj_sect * rtems_rtl_obj_find_section_by_mask(const rtems_rtl_obj *obj, int index, uint32_t mask)
Definition: rtl-obj.c:567
void rtems_rtl_obj_inc_reference(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1351
bool rtems_rtl_obj_unload(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1433
bool rtems_rtl_obj_alloc_dependents(rtems_rtl_obj *obj, size_t dependents)
Definition: rtl-obj.c:603
void rtems_rtl_obj_synchronize_cache(rtems_rtl_obj *obj)
Definition: rtl-obj.c:876
uint32_t rtems_rtl_obj_data_alignment(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:799
uint32_t rtems_rtl_obj_eh_alignment(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:778
rtems_rtl_obj * rtems_rtl_obj_alloc(void)
Definition: rtl-obj.c:74
bool rtems_rtl_obj_load_sections(rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
Definition: rtl-obj.c:1227
void rtems_rtl_obj_run_ctors(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1303
bool rtems_rtl_obj_alloc_sections(rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
Definition: rtl-obj.c:1053
bool rtems_rtl_obj_load_symbols(rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
Definition: rtl-obj.c:910
bool rtems_rtl_obj_relocate_unresolved(rtems_rtl_unresolv_reloc *reloc, rtems_rtl_obj_sym *sym)
Definition: rtl-elf.c:565
bool rtems_rtl_obj_dtors_to_run(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1309
bool(* rtems_rtl_loader_check)(rtems_rtl_obj *obj, int fd)
Definition: rtl-obj.h:56
rtems_rtl_obj_sect * rtems_rtl_obj_find_section_by_index(const rtems_rtl_obj *obj, int index)
Definition: rtl-obj.c:532
void rtems_rtl_obj_erase_dependents(rtems_rtl_obj *obj)
Definition: rtl-obj.c:627
struct rtems_rtl_loader_format rtems_rtl_loader_format
uint32_t rtems_rtl_obj_const_alignment(const rtems_rtl_obj *obj)
Definition: rtl-obj.c:771
bool rtems_rtl_obj_orphaned(rtems_rtl_obj *obj)
Definition: rtl-obj.c:1364
bool(* rtems_rtl_loader_unload)(rtems_rtl_obj *obj)
Definition: rtl-obj.h:68
bool rtems_rtl_obj_iterate_dependents(rtems_rtl_obj *obj, rtems_rtl_obj_depends_iterator iterator, void *data)
Definition: rtl-obj.c:727
RTEMS Run-Time Linker Object File Symbol Table.
RTEMS Run-Time Linker Object File Unresolved Relocations Table.
Definition: chain.h:68
Definition: rtl-obj.h:39
const char * label
Definition: rtl-obj.h:44
uint32_t flags
Definition: rtl-obj.h:49
Definition: rtl-obj.h:80
rtems_rtl_loader_load load
Definition: rtl-obj.h:82
rtems_rtl_loader_sig signature
Definition: rtl-obj.h:84
rtems_rtl_loader_unload unload
Definition: rtl-obj.h:83
rtems_rtl_loader_check check
Definition: rtl-obj.h:81
Definition: rtl-obj.h:150
rtems_chain_node node
Definition: rtl-obj.h:151
rtems_rtl_obj * depends[]
Definition: rtl-obj.h:153
size_t dependents
Definition: rtl-obj.h:152
Definition: rtl-obj.h:127
off_t offset
Definition: rtl-obj.h:132
const char * name
Definition: rtl-obj.h:130
int section
Definition: rtl-obj.h:129
int info
Definition: rtl-obj.h:136
uint32_t flags
Definition: rtl-obj.h:137
uint32_t alignment
Definition: rtl-obj.h:134
size_t size
Definition: rtl-obj.h:131
void * base
Definition: rtl-obj.h:138
int link
Definition: rtl-obj.h:135
int load_order
Definition: rtl-obj.h:140
rtems_chain_node node
Definition: rtl-obj.h:128
Definition: rtl-sym.h:30
Definition: rtl-obj.h:181
void * bss_base
Definition: rtl-obj.h:217
off_t ooffset
Definition: rtl-obj.h:193
const char * fname
Definition: rtl-obj.h:187
rtems_chain_node link
Definition: rtl-obj.h:182
size_t const_size
Definition: rtl-obj.h:210
size_t tramp_relocs
Definition: rtl-obj.h:235
size_t tramps_size
Definition: rtl-obj.h:231
size_t local_syms
Definition: rtl-obj.h:199
size_t eh_size
Definition: rtl-obj.h:213
size_t bss_size
Definition: rtl-obj.h:219
void * trampoline
Definition: rtl-obj.h:228
void * data_base
Definition: rtl-obj.h:214
size_t text_size
Definition: rtl-obj.h:207
rtems_rtl_obj_sym * global_table
Definition: rtl-obj.h:201
void * entry
Definition: rtl-obj.h:222
size_t users
Definition: rtl-obj.h:184
uint32_t * sec_num
Definition: rtl-obj.h:225
void * loader
Definition: rtl-obj.h:239
size_t unresolved
Definition: rtl-obj.h:204
uint32_t flags
Definition: rtl-obj.h:183
size_t global_size
Definition: rtl-obj.h:203
void * tramp_brk
Definition: rtl-obj.h:232
int format
Definition: rtl-obj.h:186
size_t tramp_size
Definition: rtl-obj.h:230
uint32_t obj_num
Definition: rtl-obj.h:226
size_t local_size
Definition: rtl-obj.h:200
struct link_map * linkmap
Definition: rtl-obj.h:238
size_t fsize
Definition: rtl-obj.h:194
void * text_base
Definition: rtl-obj.h:205
rtems_chain_control dependents
Definition: rtl-obj.h:197
size_t global_syms
Definition: rtl-obj.h:202
void * eh_base
Definition: rtl-obj.h:211
rtems_rtl_obj_sym * local_table
Definition: rtl-obj.h:198
size_t exec_size
Definition: rtl-obj.h:220
void * const_base
Definition: rtl-obj.h:208
size_t data_size
Definition: rtl-obj.h:216
rtems_chain_control sections
Definition: rtl-obj.h:195
size_t refs
Definition: rtl-obj.h:185
const char * oname
Definition: rtl-obj.h:188
uint32_t checksum
Definition: rtl-obj.h:223
const char * aname
Definition: rtl-obj.h:190
Definition: rtl-unresolved.h:108
unsigned size
Definition: tte.h:1
Definition: chain.h:86