/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup rtems_rtl * * @brief RTEMS Run-Time Linker ELF Headers */ /* * COPYRIGHT (c) 2012-2018 Chris Johns * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #if !defined (_RTEMS_RTL_ELF_H_) #define _RTEMS_RTL_ELF_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** ** Imported NetBSD ELF Specifics Start. **/ /* * Do not add '()'. Leave plain. */ #if defined(__powerpc64__) || defined(__aarch64__) || (__riscv_xlen == 64) #define ELFSIZE 64 #else #define ELFSIZE 32 #endif /* * Define _STANDALONE then remove after. */ #define _STANDALONE 1 #include #include #undef _STANDALONE /** ** Imported NetBSD ELF Specifics End. **/ /** * ELF Relocation status codes. */ typedef enum rtems_rtl_elf_rel_status { rtems_rtl_elf_rel_no_error, /**< There is no error processing the record. */ rtems_rtl_elf_rel_failure, /**< There was a failure processing the record. */ rtems_rtl_elf_rel_tramp_cache, /**< The reloc record may need a trampoliine. */ rtems_rtl_elf_rel_tramp_add /**< Add a trampoliine. */ } rtems_rtl_elf_rel_status; /** * Relocation trampoline relocation data. */ typedef struct rtems_rtl_mdreloc_trmap { bool parsing; /**< The reloc records are being parsed. */ void* tampolines; /**< The trampoline memory. */ size_t size; /**< The trampoline size. */ } rtems_rtl_mdreloc_tramp; /** * 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 translate unknown section flags to RTL * section flags. If this function returns 0 an error is raised. * * @param obj The object file being relocated. * @param shdr The ELF section header. * @retval 0 Unknown or unsupported flags. * @retval uint32_t RTL object file flags. */ uint32_t rtems_rtl_elf_section_flags (const rtems_rtl_obj* obj, const Elf_Shdr* shdr); /** * Architecture specific handler to parse the section and add any flags that * may be need to handle the section. * * @param obj The object file being relocated. * @param seciton The section index. * @param name The name of the section * @param shdr The ELF section header. * @param flags The standard ELF parsed flags. * @retval uint32_t Extra RTL object file flags. */ uint32_t rtems_rtl_elf_arch_parse_section (const rtems_rtl_obj* obj, int section, const char* name, const Elf_Shdr* shdr, const uint32_t flags); /** * Architecture specific handler to allocate a section. Some sections are * specific to an architecture and need special allocators. * * @param obj The object file being relocated. * @param sect The section data. * @retval true The allocator was successful. */ bool rtems_rtl_elf_arch_section_alloc (const rtems_rtl_obj* obj, rtems_rtl_obj_sect* sect); /** * Architecture specific handler to free a section. Some sections are * specific to an architecture and need special allocators. * * @param obj The object file being relocated. * @param sect The section data. * @retval true The allocator was successful. */ bool rtems_rtl_elf_arch_section_free (const rtems_rtl_obj* obj, rtems_rtl_obj_sect* sect); /** * 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 maximum trampoline size. A trampoline entry * of this size is allocated for each unresolved external. * * @return size_t The maximum size of a trampoline for this architecture. */ size_t rtems_rtl_elf_relocate_tramp_max_size (void); /** * Architecture specific relocation trampoline handler compiled in for a * specific architecture by the build system. The handler determines if the * relocation record requires a trampoline. * * @param obj The object file being relocated. * @param rela 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 rtems_rtl_elf_rel_status The result of the trampoline parsing. */ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rel_tramp (rtems_rtl_obj* obj, const Elf_Rel* rel, const rtems_rtl_obj_sect* 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 rtems_rtl_elf_rel_status The result of the trampoline parsing. */ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rela_tramp (rtems_rtl_obj* obj, const Elf_Rela* rela, const rtems_rtl_obj_sect* 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 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 rtems_rtl_elf_rel_status The result of the trampoline parsing. */ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rel (rtems_rtl_obj* obj, const Elf_Rel* rel, const rtems_rtl_obj_sect* 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 rtems_rtl_elf_rel_status The result of the trampoline parsing. */ rtems_rtl_elf_rel_status rtems_rtl_elf_relocate_rela (rtems_rtl_obj* obj, const Elf_Rela* rela, const rtems_rtl_obj_sect* sect, const char* symname, const Elf_Byte syminfo, const Elf_Word symvalue); /** * 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* obj, int fd); /** * 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* obj, int fd); /** * The ELF format unload handler. * * @param obj The object to unload. */ bool rtems_rtl_elf_file_unload (rtems_rtl_obj* obj); /** * The ELF format signature handler. * * @return rtems_rtl_loader_format* The format's signature. */ rtems_rtl_loader_format* rtems_rtl_elf_file_sig (void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif