blob: 7f6ea300a39b84a701e3242340743d4ba94d63db (
plain) (
tree)
|
|
/*
* 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
|