summaryrefslogblamecommitdiffstats
path: root/cpukit/libdl/rtl-elf.h
blob: 0476c1ecd7c4125feec06854e9f3005bde8f850b (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                           







                                           
  
                                                          
  



















                                                                              
   



                                


                                  









                                        
                                
   
                                                                          

                  
                  
      















                                        










                                                                                   









                                                                 






                                                                   
                                                                          
                                                                





                                              

                                                                 

   






































                                                                            









                                                                          












                                                                               
                                         



                                                                        
                                                                         
   





                                                                                               











                                                                        
                                                                         
   





                                                                                                 

   









                                                                        
                                                                         
   





                                                                                         











                                                                        
                                                                         
   





                                                                                          

   




                                       
                                                           

   




                                 
                                                          

   



                                   
                                                    

   

                                    
                                                           
   
                                                       





                        
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup rtems_rtl
 *
 * @brief RTEMS Run-Time Linker ELF Headers
 */

/*
 *  COPYRIGHT (c) 2012-2018 Chris Johns <chrisj@rtems.org>
 *
 * 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 <rtems/rtl/rtl-fwd.h>
#include <rtems/rtl/rtl-obj-fwd.h>
#include <rtems/rtl/rtl-sym.h>

#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 <sys/cdefs.h>
#include <sys/exec_elf.h>

#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