/* * COPYRIGHT (c) 2012,2019 Chris Johns * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. */ /** * @file * * @ingroup rtems_rtl * * @brief RTEMS Run-Time Linker Object Support. */ #if !defined (_RTEMS_RTL_OBJ_H_) #define _RTEMS_RTL_OBJ_H_ #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * Loader format flags. */ #define RTEMS_RTL_FMT_ELF (1 << 0) #define RTEMS_RTL_FMT_COMP (1 << 1) #define RTEMS_RTL_FMT_PRIVATE (1 << 16) /** * Loader format definition. */ typedef struct rtems_rtl_loader_format { /** * The format label. This can be used to determine and manage * specific formats. */ const char* label; /** * The format flags. */ uint32_t flags; } rtems_rtl_loader_format; /** * The type of the format loader check handler. This handler checks the format * and if it is detected as suitable it returns true. */ typedef bool (*rtems_rtl_loader_check) (rtems_rtl_obj* obj, int fd); /** * The type of the format loader load handler. This handler loads the specific * format. */ typedef bool (*rtems_rtl_loader_load) (rtems_rtl_obj* obj, int fd); /** * The type of the format loader unload handler. This handler unloads the * specific format. */ typedef bool (*rtems_rtl_loader_unload) (rtems_rtl_obj* obj); /** * The type of the format loader signature handler. This handler checks the * format signature. */ typedef rtems_rtl_loader_format* (*rtems_rtl_loader_sig) (void); /** * Table for supported loadable formats. */ typedef struct rtems_rtl_loader_table { rtems_rtl_loader_check check; /**< The check handler. */ rtems_rtl_loader_load load; /**< The loader. */ rtems_rtl_loader_unload unload; /**< The unloader. */ rtems_rtl_loader_sig signature; /**< The loader's signature. */ } rtems_rtl_loader_table; /** * Flags for the various section types. */ #define RTEMS_RTL_OBJ_SECT_TEXT (1 << 0) /**< Section holds program text. */ #define RTEMS_RTL_OBJ_SECT_CONST (1 << 1) /**< Section holds program text. */ #define RTEMS_RTL_OBJ_SECT_DATA (1 << 2) /**< Section holds program data. */ #define RTEMS_RTL_OBJ_SECT_BSS (1 << 3) /**< Section holds program bss. */ #define RTEMS_RTL_OBJ_SECT_EH (1 << 4) /**< Section holds exception data. */ #define RTEMS_RTL_OBJ_SECT_TLS (1 << 5) /**< Section holds TLS data. */ #define RTEMS_RTL_OBJ_SECT_REL (1 << 6) /**< Section holds relocation recs. */ #define RTEMS_RTL_OBJ_SECT_RELA (1 << 7) /**< Section holds reloc addend recs. */ #define RTEMS_RTL_OBJ_SECT_SYM (1 << 8) /**< Section holds symbols. */ #define RTEMS_RTL_OBJ_SECT_STR (1 << 9) /**< Section holds strings. */ #define RTEMS_RTL_OBJ_SECT_ALLOC (1 << 10 /**< Section allocates runtime memory. */ #define RTEMS_RTL_OBJ_SECT_LOAD (1 << 11) /**< Section is loaded from object file. */ #define RTEMS_RTL_OBJ_SECT_WRITE (1 << 12) /**< Section is writable, ie data. */ #define RTEMS_RTL_OBJ_SECT_EXEC (1 << 13) /**< Section is executable. */ #define RTEMS_RTL_OBJ_SECT_ZERO (1 << 14) /**< Section is preset to zero. */ #define RTEMS_RTL_OBJ_SECT_LINK (1 << 15) /**< Section is link-ordered. */ #define RTEMS_RTL_OBJ_SECT_CTOR (1 << 16) /**< Section contains constructors. */ #define RTEMS_RTL_OBJ_SECT_DTOR (1 << 17) /**< Section contains destructors. */ #define RTEMS_RTL_OBJ_SECT_LOCD (1 << 18) /**< Section has been located. */ #define RTEMS_RTL_OBJ_SECT_ARCH_ALLOC (1 << 19) /**< Section use arch allocator. */ /** * Section types mask. */ #define RTEMS_RTL_OBJ_SECT_TYPES (RTEMS_RTL_OBJ_SECT_TEXT | \ RTEMS_RTL_OBJ_SECT_CONST | \ RTEMS_RTL_OBJ_SECT_DATA | \ RTEMS_RTL_OBJ_SECT_BSS | \ RTEMS_RTL_OBJ_SECT_TLS | \ RTEMS_RTL_OBJ_SECT_EH) /** * An object file is made up of sections and the can be more than * one of a specific type of sections. All sections and grouped * together in memory. */ struct rtems_rtl_obj_sect { rtems_chain_node node; /**< The node's link in the chain. */ int section; /**< The section number. */ const char* name; /**< The section's name. */ size_t size; /**< The size of the section in memory. */ off_t offset; /**< Offset into the object file. Relative to * the start of the object file. */ uint32_t alignment; /**< Alignment of this section. */ int link; /**< Section link field. */ int info; /**< Secfion info field. */ uint32_t flags; /**< The section's flags. */ void* base; /**< The base address of the section in * memory. */ int load_order; /**< Order we load sections. */ }; /** * Object file dependents. This is a list of tables of pointers to the object * modules the object file depends on. The table is a list of tables because * unresolved externals can exist when an object file is loaded and resolved * later when the dependent object file is loaded. */ struct rtems_rtl_obj_depends { rtems_chain_node node; /**< The node's link in the chain. */ size_t dependents; /**< The number of dependent object pointers. */ rtems_rtl_obj* depends[]; /**< Dependtent objects. More follow. */ }; /** * Dependency iterator. */ typedef bool (*rtems_rtl_obj_depends_iterator) (rtems_rtl_obj* obj, rtems_rtl_obj* dependent, void* data); /** * Object file descriptor flags. */ #define RTEMS_RTL_OBJ_LOCKED (1 << 0) /**< Lock the object file so it cannot * be unloaded. */ #define RTEMS_RTL_OBJ_UNRESOLVED (1 << 1) /**< The object file has unresolved * external symbols. */ #define RTEMS_RTL_OBJ_BASE (1 << 2) /**< The base image. */ #define RTEMS_RTL_OBJ_RELOC_TAG (1 << 3) /**< Tag the object as visited when reloc * parsing. */ #define RTEMS_RTL_OBJ_DEP_VISITED (1 << 4) /**< Dependency loop detection. */ #define RTEMS_RTL_OBJ_CTOR_RUN (1 << 5) /**< Constructors have been called. */ /** * RTL Object. There is one for each object module loaded plus one for the base * kernel image. */ struct rtems_rtl_obj { rtems_chain_node link; /**< The node's link in the chain. */ uint32_t flags; /**< The status of the object file. */ size_t users; /**< Users of this object file, number of loads. */ size_t refs; /**< References to the object file. */ int format; /**< The format of the object file. */ const char* fname; /**< The file name for the object. */ const char* oname; /**< The object file name. Can be * relative. */ const char* aname; /**< The archive name containing the * object. NULL means the object is not * in a lib */ off_t ooffset; /**< The object offset in the archive. */ size_t fsize; /**< Size of the object file. */ rtems_chain_control sections; /**< The sections of interest in the object * file. */ rtems_chain_control dependents; /**< The dependent object files. */ rtems_rtl_obj_sym* local_table; /**< Local symbol table. */ size_t local_syms; /**< Local symbol count. */ size_t local_size; /**< Local symbol memory usage. */ rtems_rtl_obj_sym* global_table; /**< Global symbol table. */ size_t global_syms; /**< Global symbol count. */ size_t global_size; /**< Global symbol memory usage. */ size_t unresolved; /**< The number of unresolved relocations. */ void* text_base; /**< The base address of the text section * in memory. */ size_t text_size; /**< The size of the text section. */ void* const_base; /**< The base address of the const section * in memory. */ size_t const_size; /**< The size of the const section. */ void* eh_base; /**< The base address of the eh section in * memory. */ size_t eh_size; /**< The size of the eh section. */ void* data_base; /**< The base address of the data section * in memory. */ size_t data_size; /**< The size of the data section. */ void* bss_base; /**< The base address of the bss section in * memory. */ size_t bss_size; /**< The size of the bss section. */ size_t exec_size; /**< The amount of executable memory * allocated */ void* entry; /**< The entry point of the module. */ uint32_t checksum; /**< The checksum of the text sections. A * zero means do not checksum. */ uint32_t* sec_num; /**< The sec nums of each obj. */ uint32_t obj_num; /**< The count of elf files in an rtl * obj. */ void* trampoline; /**< Trampoline memory. Used for fixups or * veneers */ size_t tramp_size; /**< Size of a tramopline slot. */ size_t tramps_size; /**< Size of the trampoline memory. */ void* tramp_brk; /**< Trampoline memory allocator. MD * relocators can take memory from the * break upto the size. */ size_t tramp_relocs; /**< Number of slots reserved for * relocs. The remainder are for * unresolved symbols. */ struct link_map* linkmap; /**< For GDB. */ void* loader; /**< The file details specific to a * loader. */ }; /** * A section handler is called once for each section that needs to be * processed by this handler. The handler is specific to a task. * * @param obj The object file's descriptor the section belongs too. * @param fd The file descriptor of the object file beling loaded. * @param sect The section the handler is being invoked to handle. * @param data A user supplied data variable. * @retval true The operation was successful. * @retval false The operation failed and the RTL has been set. */ typedef bool (*rtems_rtl_obj_sect_handler)(rtems_rtl_obj* obj, int fd, rtems_rtl_obj_sect* sect, void* data); /** * Get the file name. * * @param obj The object file. * @return const char* The string. */ static inline const char* rtems_rtl_obj_fname (const rtems_rtl_obj* obj) { return obj->fname; } /** * Is the file name valid ? * * @param obj The object file. * @return bool There is a file name */ static inline bool rtems_rtl_obj_fname_valid (const rtems_rtl_obj* obj) { return obj->fname; } /** * Get the object name. * * @param obj The object file. * @return const char* The string. */ static inline const char* rtems_rtl_obj_oname (const rtems_rtl_obj* obj) { return obj->oname; } /** * Is the object name valid ? * * @param obj The object file. * @return bool There is an object name */ static inline bool rtems_rtl_obj_oname_valid (const rtems_rtl_obj* obj) { return obj->oname; } /** * Get the archive name. * * @param obj The object file. * @return const char* The string. */ static inline const char* rtems_rtl_obj_aname (const rtems_rtl_obj* obj) { return obj->aname; } /** * Is the archive name valid ? * * @param obj The object file. * @return bool There is an archive name */ static inline bool rtems_rtl_obj_aname_valid (const rtems_rtl_obj* obj) { return obj->aname; } /** * Is the address inside the text section? * * @param obj The object file. * @return bool There is an archive name */ static inline bool rtems_rtl_obj_text_inside (const rtems_rtl_obj* obj, const void* address) { return (address >= obj->text_base) && (address < (obj->text_base + obj->text_size)); } /** * Align the size to the next alignment point. Assume the alignment is a * positive integral power of 2 if not 0 or 1. If 0 or 1 then there is no * alignment. * * @param offset Offset to align up from. * @param alignment The alignment. * @return size_t Aligned offset. */ static inline size_t rtems_rtl_obj_align (size_t offset, uint32_t alignment) { if ((alignment > 1) && ((offset & (alignment - 1)) != 0)) offset = (offset + alignment) & ~(alignment - 1); return offset; } /** * Is the symbol in this object's files globa symbol table? * * @param obj The object file's descriptor to search. * @param sym The symbol to check. * @retval bool Returns @true if present else @false is returned. */ static inline bool rtems_rtl_obj_has_symbol (const rtems_rtl_obj* obj, const rtems_rtl_obj_sym* sym) { return (sym >= obj->global_table && sym < (obj->global_table + obj->global_syms)); } /** * Is there space in the trampoline memory for a trapoline. * * @param obj The object file's descriptor to check for available space. * @param size The size to be allocated. * @retval bool Returns @true if the space is available. */ static inline bool rtems_rtl_obj_has_tramp_space (const rtems_rtl_obj* obj, const size_t size) { return (obj->trampoline != NULL && ((obj->tramp_brk - obj->trampoline) + size) <= obj->tramps_size); } /** * Trampoline slots. * * @param obj The object file's descriptor. * @retval size_t The number of trampoline slots. */ static inline size_t rtems_rtl_obj_trampoline_slots (const rtems_rtl_obj* obj) { return obj->trampoline == NULL || obj->tramp_size == 0 ? 0 : obj->tramps_size / obj->tramp_size; } /** * Number of trampolines. * * @param obj The object file's descriptor. * @retval size_t The number of trampolines. */ static inline size_t rtems_rtl_obj_trampolines (const rtems_rtl_obj* obj) { return obj->trampoline == NULL || obj->tramp_size == 0 ? 0 : (obj->tramp_brk - obj->trampoline) / obj->tramp_size; } /** * Does the section require architecture specific allocations? * * @param sect The section. * @retval bool Returns @true if the section requires arch allocation. */ static inline bool rtems_rtl_obj_sect_is_arch_alloc (rtems_rtl_obj_sect* sect) { return (sect->flags & RTEMS_RTL_OBJ_SECT_ARCH_ALLOC) != 0; } /** * Allocate an object structure on the heap. * * @retval NULL No memory for the object. */ rtems_rtl_obj* rtems_rtl_obj_alloc (void); /** * Free the object structure and related resources. * * @param obj The object file's descriptor to free. * @retval false The object has dependences. * @retval true The object has been freed. */ bool rtems_rtl_obj_free (rtems_rtl_obj* obj); /** * Does the object file have unresolved external references ? If it does the * results of executing code is unpredictable. * * @param obj The object file's descriptor. * @retval true The object file has unresolved externals. * @retval false The object file has all external references resolved. */ bool rtems_rtl_obj_unresolved (rtems_rtl_obj* obj); /** * Parses a filename and returns newly allocated strings with the archive name, * object name, and the object's offset * * @param name The filename of the object * @param aname Address of a string pointer that holds the archive name * @param oname Address of a string pointer that holds the object name * @param ooffset Address of an int that holds the object offset * @retval true The parsing was successful * @retval false The parsing was unsuccessful */ bool rtems_rtl_parse_name (const char* name, const char** aname, const char** oname, off_t* ooffset); /** * Find an object file on disk that matches the name. The object descriptor is * fill in with the various parts of a name. A name can have archive, object * file and offset components. The search path in the RTL is searched. * * @param obj The object file's descriptor. * @param name The name to locate on disk. * @retval true The file has been found. * @retval false The file could not be located. The RTL error has been set. */ bool rtems_rtl_obj_find_file (rtems_rtl_obj* obj, const char* name); /** * Add a section to the object descriptor. * * @param obj The object file's descriptor. * @param section The section's index number. * @param name The name of the section. * @param size The size of the section in memory. * @param offset The offset of the section in the object file. * @param alignment The alignment of the section in memory. * @param link The section's link field (from the ELF format). * @param info The section's info field (from the ELF format). * @param flags The section's flags. * @retval true The section has been added. * @retval false The section has not been added. See the RTL error. */ 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); /** * Erase the object file descriptor's sections. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_erase_sections (rtems_rtl_obj* obj); /** * Find the section given a name. * * @param obj The object file's descriptor. * @param name The name of the section to find. * @retval NULL The section was not found. * @return rtems_rtl_obj_sect_t* The named section. */ rtems_rtl_obj_sect* rtems_rtl_obj_find_section (const rtems_rtl_obj* obj, const char* name); /** * Find a section given a section's index number. * * @param obj The object file's descriptor. * @param index The section's index to find. * @retval NULL The section was not found. * @return rtems_rtl_obj_sect_t* The found section. */ rtems_rtl_obj_sect* rtems_rtl_obj_find_section_by_index (const rtems_rtl_obj* obj, int index); /** * Find a section given a section's mask. The index is the section after which * the mask is matched. An index of -1 starts the search from the beginning of * the section list. You can find multiple matches for a mask by passing the * index of the last section that matched the mask on a subsequent call. * * @param obj The object file's descriptor. * @param index The section's index to start searching from, -1 for the start. * @param mask The section's mask to match against the section's flags. * @retval NULL The section was not found. * @return rtems_rtl_obj_sect_t* The found section. */ rtems_rtl_obj_sect* rtems_rtl_obj_find_section_by_mask (const rtems_rtl_obj* obj, int index, uint32_t mask); /** * Allocate a table for trampoline fixup calls. * * @param obj The object file's descriptor. * @retval true The table was allocated. * @retval false The alloction failed. */ bool rtems_rtl_obj_alloc_trampoline (rtems_rtl_obj* obj); /** * Erase the object file descriptor's trampoline table.. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_erase_trampoline (rtems_rtl_obj* obj); /** * Allocate a table for dependent objects. * * @param obj The object file's descriptor. * @param dependents The size of the table. * @retval true The table was allocated. * @retval false The alloction failed. */ bool rtems_rtl_obj_alloc_dependents (rtems_rtl_obj* obj, size_t dependents); /** * Erase the object file descriptor's dependents. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_erase_dependents (rtems_rtl_obj* obj); /** * Add an object file to the dependents table. * * @param obj The object file's descriptor. * @param dependent The dependent object file to add. * @retval true The dependent has been added to the table. * @retval false There is no space in the table. */ bool rtems_rtl_obj_add_dependent (rtems_rtl_obj* obj, rtems_rtl_obj* dependent); /** * Remove dependencies. This decrements the dependent object file references. * * @param obj The object file's descriptor. * @retval true The dependencies have been removed. * @retval false There is no space in the table. */ bool rtems_rtl_obj_remove_dependencies (rtems_rtl_obj* obj); /** * Iterate over the module dependenices. * * @param obj The object file's descriptor. * @param handler The iterator handler. Returns true to end. * @param data User data passed to the iterator. * @retval true The iterator handler returned true. * @retval false The iterator handler returned false. */ bool rtems_rtl_obj_iterate_dependents (rtems_rtl_obj* obj, rtems_rtl_obj_depends_iterator iterator, void* data); /** * The text section size. Only use once all the sections has been added. It * includes alignments between sections that are part of the object's text * area. The consts sections are included in this section. * * @param obj The object file's descriptor. * @return size_t The size of the text area of the object file. */ size_t rtems_rtl_obj_text_size (const rtems_rtl_obj* obj); /** * The text section alignment for the object file. Only use once all the * sections has been added. The section alignment is the alignment of the first * text type section loaded the text section. * * You can assume the alignment is a positive integral power of 2 if not 0 or * 1. If 0 or 1 then there is no alignment. * * @param obj The object file's descriptor. * @return uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment. */ uint32_t rtems_rtl_obj_text_alignment (const rtems_rtl_obj* obj); /** * The const section size. Only use once all the sections has been added. It * includes alignments between sections that are part of the object's const * area. The consts sections are included in this section. * * @param obj The object file's descriptor. * @return size_t The size of the const area of the object file. */ size_t rtems_rtl_obj_const_size (const rtems_rtl_obj* obj); /** * The const section alignment for the object file. Only use once all the * sections has been added. The section alignment is the alignment of the first * const type section loaded the const section. * * You can assume the alignment is a positive integral power of 2 if not 0 or * 1. If 0 or 1 then there is no alignment. * * @param obj The object file's descriptor. * @return uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment. */ uint32_t rtems_rtl_obj_const_alignment (const rtems_rtl_obj* obj); /** * The eh section size. Only use once all the sections has been added. It * includes alignments between sections that are part of the object's bss area. * * @param obj The object file's descriptor. * @return size_t The size of the bss area of the object file. */ size_t rtems_rtl_obj_eh_size (const rtems_rtl_obj* obj); /** * The eh section alignment for the object file. Only use once all the sections * has been added. The section alignment is the alignment of the first bss type * section loaded the bss section. * * You can assume the alignment is a positive integral power of 2 if not 0 or * 1. If 0 or 1 then there is no alignment. * * @param obj The object file's descriptor. * @return uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment. */ uint32_t rtems_rtl_obj_eh_alignment (const rtems_rtl_obj* obj); /** * The data section size. Only use once all the sections has been added. It * includes alignments between sections that are part of the object's data * area. * * @param obj The object file's descriptor. * @return size_t The size of the data area of the object file. */ size_t rtems_rtl_obj_data_size (const rtems_rtl_obj* obj); /** * The data section alignment for the object file. Only use once all the * sections has been added. The section alignment is the alignment of the first * data type section loaded the data section. * * You can assume the alignment is a positive integral power of 2 if not 0 or * 1. If 0 or 1 then there is no alignment. * * @param obj The object file's descriptor. * @return uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment. */ uint32_t rtems_rtl_obj_data_alignment (const rtems_rtl_obj* obj); /** * The bss section size. Only use once all the sections has been added. It * includes alignments between sections that are part of the object's bss area. * * @param obj The object file's descriptor. * @return size_t The size of the bss area of the object file. */ size_t rtems_rtl_obj_bss_size (const rtems_rtl_obj* obj); /** * The bss section alignment for the object file. Only use once all the * sections has been added. The section alignment is the alignment of the first * bss type section loaded the bss section. * * You can assume the alignment is a positive integral power of 2 if not 0 or * 1. If 0 or 1 then there is no alignment. * * @param obj The object file's descriptor. * @return uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment. */ uint32_t rtems_rtl_obj_bss_alignment (const rtems_rtl_obj* obj); /** * Relocate the object file. The object file's section are parsed for any * relocation type sections. * * @param obj The object file's descriptor. * @param fd The object file's file descriptor. * @param handler The object file's format specific relocation handler. * @param data User specific data handle. * @retval true The object file was relocated. * @retval false The relocation failed. The RTL error is set. */ bool rtems_rtl_obj_relocate (rtems_rtl_obj* obj, int fd, rtems_rtl_obj_sect_handler handler, void* data); /** * Synchronize caches to make code visible to CPU(s) * * @param obj The object file's descriptor. */ void rtems_rtl_obj_synchronize_cache (rtems_rtl_obj* obj); /** * Relocate an object file's unresolved reference. * * @param rec The unresolved relocation record. * @param sym The unresolved relocation's referenced symbol. * @retval true The object file record was relocated. * @retval false The relocation failed. The RTL error is set. */ bool rtems_rtl_obj_relocate_unresolved (rtems_rtl_unresolv_reloc* reloc, rtems_rtl_obj_sym* sym); /** * Load the symbols from the object file. Only the exported or public symbols * are read into memory and held in the global symbol table. * * @param obj The object file's descriptor. * @param fd The object file's file descriptor. * @param handler The object file's format specific symbol handler. * @param data User specific data handle. * @retval true The object file's symbol where loaded. * @retval false The symbol loading failed. The RTL error is set. */ bool rtems_rtl_obj_load_symbols (rtems_rtl_obj* obj, int fd, rtems_rtl_obj_sect_handler handler, void* data); /** * Allocate the sections. If a handler is provided (not NULL) it is called for * all section. * * @param obj The object file's descriptor. * @param fd The object file's file descriptor. * @param handler The object file's format specific allocation handler. * @param data User specific data handle. * @retval true The object has been sucessfully loaded. * @retval false The load failed. The RTL error has been set. */ bool rtems_rtl_obj_alloc_sections (rtems_rtl_obj* obj, int fd, rtems_rtl_obj_sect_handler handler, void* data); /** * Load the sections that have been allocated memory in the target. The bss * type section does not load any data, it is set to 0. The text and data * sections read the detault data from the object file into the target memory. * * @param obj The object file's descriptor. * @param fd The object file's file descriptor. * @param handler The object file's format specific load handler. * @param data User specific data handle. * @retval true The object has been sucessfully loaded. * @retval false The load failed. The RTL error has been set. */ bool rtems_rtl_obj_load_sections (rtems_rtl_obj* obj, int fd, rtems_rtl_obj_sect_handler handler, void* data); /** * Does the object have constructors to run? * * @return bool True if there are constructors to run. */ bool rtems_rtl_obj_ctors_to_run (rtems_rtl_obj* obj); /** * Invoke the constructors the object has. Constructors are a table of pointers * to "void (*)(void);" where NULL pointers are skipped. The table's size is * taken from the section's size. The objet ELF specific code is responisble * for flagging which sections contain constructors. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_run_ctors (rtems_rtl_obj* obj); /** * Does the object have destructors to run? * * @return bool True if there are destructors to run. */ bool rtems_rtl_obj_dtors_to_run (rtems_rtl_obj* obj); /** * Invoke the destructors the object has. Destructors are a table of pointers * to "void (*)(void);" where NULL pointers are skipped. The table's size is * taken from the section's size. The objet ELF specific code is responisble * for flagging which sections contain destructors. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_run_dtors (rtems_rtl_obj* obj); /** * Get the object file reference count. * * @retval int The object file's reference count. */ size_t rtems_rtl_obj_get_reference (rtems_rtl_obj* obj); /** * Increment the object file reference count. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_inc_reference (rtems_rtl_obj* obj); /** * Decrement the object file reference count. * * @param obj The object file's descriptor. */ void rtems_rtl_obj_dec_reference (rtems_rtl_obj* obj); /** * Is the object file orphaned? An orphaned object file is not locked, has no * users and it not being referenced. * * @param obj The object file's descriptor. */ bool rtems_rtl_obj_orphaned (rtems_rtl_obj* obj); /** * Load the object file, reading all sections into memory, symbols and * performing any relocation fixups. * * @param obj The object file's descriptor. * @retval true The object file has been loaded. * @retval false The load failed. The RTL error has been set. */ bool rtems_rtl_obj_load (rtems_rtl_obj* obj); /** * Unload the object file, erasing all symbols and releasing all memory. * * @param obj The object file's descriptor. * @retval true The object file has been unloaded. * @retval false The unload failed. The RTL error has been set. */ bool rtems_rtl_obj_unload (rtems_rtl_obj* obj); #ifdef __cplusplus } #endif /* __cplusplus */ #endif