From ae5fe7e6bca2874c5f1ef077204bb63124fb3db3 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Sun, 26 Oct 2014 18:09:41 -0700 Subject: cpukit: Add libdl with the Runtime Loader (RTL) code. This is a merge of the RTL project. --- cpukit/libdl/rtl-elf.h | 165 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 cpukit/libdl/rtl-elf.h (limited to 'cpukit/libdl/rtl-elf.h') diff --git a/cpukit/libdl/rtl-elf.h b/cpukit/libdl/rtl-elf.h new file mode 100644 index 0000000000..115c05aef9 --- /dev/null +++ b/cpukit/libdl/rtl-elf.h @@ -0,0 +1,165 @@ +/* + * COPYRIGHT (c) 2012 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.com/license/LICENSE. + */ +/** + * @file + * + * @ingroup rtems_rtl + * + * @brief RTEMS Run-Time Linker ELF Headers + */ + +#if !defined (_RTEMS_RTL_ELF_H_) +#define _RTEMS_RTL_ELF_H_ + +#include "rtl-fwd.h" +#include "rtl-obj-fwd.h" +#include "rtl-sym.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + ** Imported NetBSD ELF Specifics Start. + **/ + +/* + * Always 32bit for RTEMS at the moment. Do not add '()'. Leave plain. + */ +#define ELFSIZE 32 + +/* + * Define _STANDALONE then remove after. + */ +#define _STANDALONE 1 + +#include +#include + +#undef _STANDALONE + +/** + ** Imported NetBSD ELF Specifics End. + **/ + +/** + * Maximum string length. This a read buffering limit rather than a + * specific ELF length. I hope this is ok as I am concerned about + * some C++ symbol lengths. + */ +#define RTEMS_RTL_ELF_STRING_MAX (256) + +/** + * Architecture specific handler to check is a relocation record's type is + * required to resolve a symbol. + * + * @param type The type field in the relocation record. + * @retval true The relocation record require symbol resolution. + * @retval false The relocation record does not require symbol resolution. + */ +bool rtems_rtl_elf_rel_resolve_sym (Elf_Word type); + +/** + * Architecture specific relocation handler compiled in for a specific + * architecture by the build system. The handler applies the relocation + * to the target. + * + * @param obj The object file being relocated. + * @param rel The ELF relocation record. + * @param sect The section of the object file the relocation is for. + * @param symname The symbol's name. + * @param syminfo The ELF symbol info field. + * @param symvalue If a symbol is referenced, this is the symbols value. + * @retval bool The relocation has been applied. + * @retval bool The relocation could not be applied. + */ +bool rtems_rtl_elf_relocate_rel (const rtems_rtl_obj_t* obj, + const Elf_Rel* rel, + const rtems_rtl_obj_sect_t* sect, + const char* symname, + const Elf_Byte syminfo, + const Elf_Word symvalue); + +/** + * Architecture specific relocation handler compiled in for a specific + * architecture by the build system. The handler applies the relocation + * to the target. + * + * @param obj The object file being relocated. + * @param rela The ELF addend relocation record. + * @param sect The section of the object file the relocation is for. + * @param symname The symbol's name. + * @param syminfo The ELF symbol info field. + * @param symvalue If a symbol is referenced, this is the symbols value. + * @retval bool The relocation has been applied. + * @retval bool The relocation could not be applied. + */ +bool rtems_rtl_elf_relocate_rela (const rtems_rtl_obj_t* obj, + const Elf_Rela* rela, + const rtems_rtl_obj_sect_t* sect, + const char* symname, + const Elf_Byte syminfo, + const Elf_Word symvalue); + +/** + * Find the symbol. The symbol is passed as an ELF type symbol with the name + * and the value returned is the absolute address of the symbol. + * + * If the symbol type is STT_NOTYPE the symbol references a global symbol. The + * gobal symbol table is searched to find it and that value returned. If the + * symbol is local to the object module the section for the symbol is located + * and it's base added to the symbol's value giving an absolute location. + * + * @param obj The object the symbol is being resolved for. + * @param sym The ELF type symbol. + * @param symname The sym's name read from the symbol string table. + * @param value Return the value of the symbol. Only valid if the return value + * is true. + * @retval true The symbol resolved. + * @retval false The symbol could not be result. The RTL error is set. + */ +bool rtems_rtl_elf_find_symbol (rtems_rtl_obj_t* obj, + const Elf_Sym* sym, + const char* symname, + Elf_Word* value); + +/** + * The ELF format check handler. + * + * @param obj The object being checked. + * @param fd The file descriptor. + */ +bool rtems_rtl_elf_file_check (rtems_rtl_obj_t* obj, int fd); + +/** + * The ELF file details handler. + * + * @param obj Load the details of the obj. + */ +bool rtems_rtl_elf_load_details (rtems_rtl_obj_t* obj); + +/** + * The ELF format load handler. + * + * @param obj The object to load. + * @param fd The file descriptor. + */ +bool rtems_rtl_elf_file_load (rtems_rtl_obj_t* obj, int fd); + +/** + * The ELF format signature handler. + * + * @return rtems_rtl_loader_format_t* The format's signature. + */ +rtems_rtl_loader_format_t* rtems_rtl_elf_file_sig (void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif -- cgit v1.2.3