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




                                                           
                                         






























































































































































                                                                              
/*
 *  COPYRIGHT (c) 2012 Chris Johns <chrisj@rtems.org>
 *
 *  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 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 <sys/cdefs.h>
#include <sys/exec_elf.h>

#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