RTEMS  5.1
Data Structures | Macros | Typedefs | Functions
rtl-obj.c File Reference

RTEMS Run-Time Linker Error. More...

#include <errno.h>
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <rtems/libio_.h>
#include <rtems/rtl/rtl.h>
#include "rtl-chain-iterator.h"
#include <rtems/rtl/rtl-obj.h>
#include "rtl-error.h"
#include "rtl-find-file.h"
#include "rtl-string.h"
#include <rtems/rtl/rtl-trace.h>
#include "rtl-rap.h"
#include "rtl-elf.h"

Data Structures

struct  rtems_rtl_obj_unresolved_data
 
struct  rtems_rtl_obj_sect_summer_data
 
struct  rtems_rtl_obj_sect_aligner_data
 
struct  rtems_rtl_obj_sect_finder
 
struct  rtems_rtl_obj_sect_sync_ctx
 

Macros

#define RTEMS_RTL_ELF_LOADER   1
 
#define RTEMS_RTL_RAP_LOADER   1
 
#define RTEMS_RTL_RAP_LOADER_COUNT   1
 
#define RTEMS_RTL_ELF_LOADER_COUNT   1
 
#define RTEMS_RTL_LOADERS   (RTEMS_RTL_ELF_LOADER_COUNT + RTEMS_RTL_RAP_LOADER_COUNT)
 

Typedefs

typedef struct rtems_rtl_obj_unresolved_data rtems_rtl_obj_unresolved_data
 

Functions

rtems_rtl_objrtems_rtl_obj_alloc (void)
 
bool rtems_rtl_obj_free (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_unresolved (rtems_rtl_obj *obj)
 
bool rtems_rtl_parse_name (const char *name, const char **aname, const char **oname, off_t *ooffset)
 
bool rtems_rtl_obj_find_file (rtems_rtl_obj *obj, const char *name)
 
bool rtems_rtl_obj_add_section (rtems_rtl_obj *obj, int section, const char *name, size_t size, off_t offset, uint32_t alignment, int link, int info, uint32_t flags)
 
void rtems_rtl_obj_erase_sections (rtems_rtl_obj *obj)
 
rtems_rtl_obj_sectrtems_rtl_obj_find_section (const rtems_rtl_obj *obj, const char *name)
 
rtems_rtl_obj_sectrtems_rtl_obj_find_section_by_index (const rtems_rtl_obj *obj, int index)
 
rtems_rtl_obj_sectrtems_rtl_obj_find_section_by_mask (const rtems_rtl_obj *obj, int index, uint32_t mask)
 
bool rtems_rtl_obj_alloc_trampoline (rtems_rtl_obj *obj)
 
void rtems_rtl_obj_erase_trampoline (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_alloc_dependents (rtems_rtl_obj *obj, size_t dependents)
 
void rtems_rtl_obj_erase_dependents (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_add_dependent (rtems_rtl_obj *obj, rtems_rtl_obj *dependent)
 
bool rtems_rtl_obj_remove_dependencies (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_iterate_dependents (rtems_rtl_obj *obj, rtems_rtl_obj_depends_iterator iterator, void *data)
 
size_t rtems_rtl_obj_text_size (const rtems_rtl_obj *obj)
 
uint32_t rtems_rtl_obj_text_alignment (const rtems_rtl_obj *obj)
 
size_t rtems_rtl_obj_const_size (const rtems_rtl_obj *obj)
 
uint32_t rtems_rtl_obj_const_alignment (const rtems_rtl_obj *obj)
 
uint32_t rtems_rtl_obj_eh_alignment (const rtems_rtl_obj *obj)
 
size_t rtems_rtl_obj_eh_size (const rtems_rtl_obj *obj)
 
size_t rtems_rtl_obj_data_size (const rtems_rtl_obj *obj)
 
uint32_t rtems_rtl_obj_data_alignment (const rtems_rtl_obj *obj)
 
size_t rtems_rtl_obj_bss_size (const rtems_rtl_obj *obj)
 
uint32_t rtems_rtl_obj_bss_alignment (const rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_relocate (rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
 
void rtems_rtl_obj_synchronize_cache (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_load_symbols (rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
 
bool rtems_rtl_obj_alloc_sections (rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
 
bool rtems_rtl_obj_load_sections (rtems_rtl_obj *obj, int fd, rtems_rtl_obj_sect_handler handler, void *data)
 
bool rtems_rtl_obj_ctors_to_run (rtems_rtl_obj *obj)
 
void rtems_rtl_obj_run_ctors (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_dtors_to_run (rtems_rtl_obj *obj)
 
void rtems_rtl_obj_run_dtors (rtems_rtl_obj *obj)
 
size_t rtems_rtl_obj_get_reference (rtems_rtl_obj *obj)
 
void rtems_rtl_obj_inc_reference (rtems_rtl_obj *obj)
 
void rtems_rtl_obj_dec_reference (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_orphaned (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_load (rtems_rtl_obj *obj)
 
bool rtems_rtl_obj_unload (rtems_rtl_obj *obj)
 

Detailed Description

RTEMS Run-Time Linker Error.

Macro Definition Documentation

◆ RTEMS_RTL_LOADERS

#define RTEMS_RTL_LOADERS   (RTEMS_RTL_ELF_LOADER_COUNT + RTEMS_RTL_RAP_LOADER_COUNT)

The table of supported loader formats.

Function Documentation

◆ rtems_rtl_obj_add_dependent()

bool rtems_rtl_obj_add_dependent ( rtems_rtl_obj obj,
rtems_rtl_obj dependent 
)

Add an object file to the dependents table.

Parameters
objThe object file's descriptor.
dependentThe dependent object file to add.
Return values
trueThe dependent has been added to the table.
falseThere is no space in the table.

◆ rtems_rtl_obj_add_section()

bool rtems_rtl_obj_add_section ( rtems_rtl_obj obj,
int  section,
const char *  name,
size_t  size,
off_t  offset,
uint32_t  alignment,
int  link,
int  info,
uint32_t  flags 
)

Add a section to the object descriptor.

Parameters
objThe object file's descriptor.
sectionThe section's index number.
nameThe name of the section.
sizeThe size of the section in memory.
offsetThe offset of the section in the object file.
alignmentThe alignment of the section in memory.
linkThe section's link field (from the ELF format).
infoThe section's info field (from the ELF format).
flagsThe section's flags.
Return values
trueThe section has been added.
falseThe section has not been added. See the RTL error.

◆ rtems_rtl_obj_alloc()

rtems_rtl_obj* rtems_rtl_obj_alloc ( void  )

Allocate an object structure on the heap.

Return values
NULLNo memory for the object.

◆ rtems_rtl_obj_alloc_dependents()

bool rtems_rtl_obj_alloc_dependents ( rtems_rtl_obj obj,
size_t  dependents 
)

Allocate a table for dependent objects.

Parameters
objThe object file's descriptor.
dependentsThe size of the table.
Return values
trueThe table was allocated.
falseThe alloction failed.

◆ rtems_rtl_obj_alloc_sections()

bool rtems_rtl_obj_alloc_sections ( rtems_rtl_obj obj,
int  fd,
rtems_rtl_obj_sect_handler  handler,
void *  data 
)

Allocate the sections. If a handler is provided (not NULL) it is called for all section.

Parameters
objThe object file's descriptor.
fdThe object file's file descriptor.
handlerThe object file's format specific allocation handler.
dataUser specific data handle.
Return values
trueThe object has been sucessfully loaded.
falseThe load failed. The RTL error has been set.

◆ rtems_rtl_obj_alloc_trampoline()

bool rtems_rtl_obj_alloc_trampoline ( rtems_rtl_obj obj)

Allocate a table for trampoline fixup calls.

Parameters
objThe object file's descriptor.
Return values
trueThe table was allocated.
falseThe alloction failed.

◆ rtems_rtl_obj_bss_alignment()

uint32_t rtems_rtl_obj_bss_alignment ( const rtems_rtl_obj obj)

The bss section alignment for the object file. Only use once all the sections has been added. The section alignment is the alignment of the first bss type section loaded the bss section.

You can assume the alignment is a positive integral power of 2 if not 0 or

  1. If 0 or 1 then there is no alignment.
Parameters
objThe object file's descriptor.
Returns
uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment.

◆ rtems_rtl_obj_bss_size()

size_t rtems_rtl_obj_bss_size ( const rtems_rtl_obj obj)

The bss section size. Only use once all the sections has been added. It includes alignments between sections that are part of the object's bss area.

Parameters
objThe object file's descriptor.
Returns
size_t The size of the bss area of the object file.

◆ rtems_rtl_obj_const_alignment()

uint32_t rtems_rtl_obj_const_alignment ( const rtems_rtl_obj obj)

The const section alignment for the object file. Only use once all the sections has been added. The section alignment is the alignment of the first const type section loaded the const section.

You can assume the alignment is a positive integral power of 2 if not 0 or

  1. If 0 or 1 then there is no alignment.
Parameters
objThe object file's descriptor.
Returns
uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment.

◆ rtems_rtl_obj_const_size()

size_t rtems_rtl_obj_const_size ( const rtems_rtl_obj obj)

The const section size. Only use once all the sections has been added. It includes alignments between sections that are part of the object's const area. The consts sections are included in this section.

Parameters
objThe object file's descriptor.
Returns
size_t The size of the const area of the object file.

◆ rtems_rtl_obj_ctors_to_run()

bool rtems_rtl_obj_ctors_to_run ( rtems_rtl_obj obj)

Does the object have constructors to run?

Returns
bool True if there are constructors to run.

◆ rtems_rtl_obj_data_alignment()

uint32_t rtems_rtl_obj_data_alignment ( const rtems_rtl_obj obj)

The data section alignment for the object file. Only use once all the sections has been added. The section alignment is the alignment of the first data type section loaded the data section.

You can assume the alignment is a positive integral power of 2 if not 0 or

  1. If 0 or 1 then there is no alignment.
Parameters
objThe object file's descriptor.
Returns
uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment.

◆ rtems_rtl_obj_data_size()

size_t rtems_rtl_obj_data_size ( const rtems_rtl_obj obj)

The data section size. Only use once all the sections has been added. It includes alignments between sections that are part of the object's data area.

Parameters
objThe object file's descriptor.
Returns
size_t The size of the data area of the object file.

◆ rtems_rtl_obj_dec_reference()

void rtems_rtl_obj_dec_reference ( rtems_rtl_obj obj)

Decrement the object file reference count.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_dtors_to_run()

bool rtems_rtl_obj_dtors_to_run ( rtems_rtl_obj obj)

Does the object have destructors to run?

Returns
bool True if there are destructors to run.

◆ rtems_rtl_obj_eh_alignment()

uint32_t rtems_rtl_obj_eh_alignment ( const rtems_rtl_obj obj)

The eh section alignment for the object file. Only use once all the sections has been added. The section alignment is the alignment of the first bss type section loaded the bss section.

You can assume the alignment is a positive integral power of 2 if not 0 or

  1. If 0 or 1 then there is no alignment.
Parameters
objThe object file's descriptor.
Returns
uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment.

◆ rtems_rtl_obj_eh_size()

size_t rtems_rtl_obj_eh_size ( const rtems_rtl_obj obj)

The eh section size. Only use once all the sections has been added. It includes alignments between sections that are part of the object's bss area.

Parameters
objThe object file's descriptor.
Returns
size_t The size of the bss area of the object file.

◆ rtems_rtl_obj_erase_dependents()

void rtems_rtl_obj_erase_dependents ( rtems_rtl_obj obj)

Erase the object file descriptor's dependents.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_erase_sections()

void rtems_rtl_obj_erase_sections ( rtems_rtl_obj obj)

Erase the object file descriptor's sections.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_erase_trampoline()

void rtems_rtl_obj_erase_trampoline ( rtems_rtl_obj obj)

Erase the object file descriptor's trampoline table..

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_find_file()

bool rtems_rtl_obj_find_file ( rtems_rtl_obj obj,
const char *  name 
)

Find an object file on disk that matches the name. The object descriptor is fill in with the various parts of a name. A name can have archive, object file and offset components. The search path in the RTL is searched.

Parameters
objThe object file's descriptor.
nameThe name to locate on disk.
Return values
trueThe file has been found.
falseThe file could not be located. The RTL error has been set.

◆ rtems_rtl_obj_find_section()

rtems_rtl_obj_sect* rtems_rtl_obj_find_section ( const rtems_rtl_obj obj,
const char *  name 
)

Find the section given a name.

Parameters
objThe object file's descriptor.
nameThe name of the section to find.
Return values
NULLThe section was not found.
Returns
rtems_rtl_obj_sect_t* The named section.

◆ rtems_rtl_obj_find_section_by_index()

rtems_rtl_obj_sect* rtems_rtl_obj_find_section_by_index ( const rtems_rtl_obj obj,
int  index 
)

Find a section given a section's index number.

Parameters
objThe object file's descriptor.
indexThe section's index to find.
Return values
NULLThe section was not found.
Returns
rtems_rtl_obj_sect_t* The found section.

◆ rtems_rtl_obj_find_section_by_mask()

rtems_rtl_obj_sect* rtems_rtl_obj_find_section_by_mask ( const rtems_rtl_obj obj,
int  index,
uint32_t  mask 
)

Find a section given a section's mask. The index is the section after which the mask is matched. An index of -1 starts the search from the beginning of the section list. You can find multiple matches for a mask by passing the index of the last section that matched the mask on a subsequent call.

Parameters
objThe object file's descriptor.
indexThe section's index to start searching from, -1 for the start.
maskThe section's mask to match against the section's flags.
Return values
NULLThe section was not found.
Returns
rtems_rtl_obj_sect_t* The found section.

◆ rtems_rtl_obj_free()

bool rtems_rtl_obj_free ( rtems_rtl_obj obj)

Free the object structure and related resources.

Parameters
objThe object file's descriptor to free.
Return values
falseThe object has dependences.
trueThe object has been freed.

◆ rtems_rtl_obj_get_reference()

size_t rtems_rtl_obj_get_reference ( rtems_rtl_obj obj)

Get the object file reference count.

Return values
intThe object file's reference count.

◆ rtems_rtl_obj_inc_reference()

void rtems_rtl_obj_inc_reference ( rtems_rtl_obj obj)

Increment the object file reference count.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_iterate_dependents()

bool rtems_rtl_obj_iterate_dependents ( rtems_rtl_obj obj,
rtems_rtl_obj_depends_iterator  iterator,
void *  data 
)

Iterate over the module dependenices.

Parameters
objThe object file's descriptor.
handlerThe iterator handler. Returns true to end.
dataUser data passed to the iterator.
Return values
trueThe iterator handler returned true.
falseThe iterator handler returned false.

◆ rtems_rtl_obj_load()

bool rtems_rtl_obj_load ( rtems_rtl_obj obj)

Load the object file, reading all sections into memory, symbols and performing any relocation fixups.

Parameters
objThe object file's descriptor.
Return values
trueThe object file has been loaded.
falseThe load failed. The RTL error has been set.

◆ rtems_rtl_obj_load_sections()

bool rtems_rtl_obj_load_sections ( rtems_rtl_obj obj,
int  fd,
rtems_rtl_obj_sect_handler  handler,
void *  data 
)

Load the sections that have been allocated memory in the target. The bss type section does not load any data, it is set to 0. The text and data sections read the detault data from the object file into the target memory.

Parameters
objThe object file's descriptor.
fdThe object file's file descriptor.
handlerThe object file's format specific load handler.
dataUser specific data handle.
Return values
trueThe object has been sucessfully loaded.
falseThe load failed. The RTL error has been set.

◆ rtems_rtl_obj_load_symbols()

bool rtems_rtl_obj_load_symbols ( rtems_rtl_obj obj,
int  fd,
rtems_rtl_obj_sect_handler  handler,
void *  data 
)

Load the symbols from the object file. Only the exported or public symbols are read into memory and held in the global symbol table.

Parameters
objThe object file's descriptor.
fdThe object file's file descriptor.
handlerThe object file's format specific symbol handler.
dataUser specific data handle.
Return values
trueThe object file's symbol where loaded.
falseThe symbol loading failed. The RTL error is set.

◆ rtems_rtl_obj_orphaned()

bool rtems_rtl_obj_orphaned ( rtems_rtl_obj obj)

Is the object file orphaned? An orphaned object file is not locked, has no users and it not being referenced.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_relocate()

bool rtems_rtl_obj_relocate ( rtems_rtl_obj obj,
int  fd,
rtems_rtl_obj_sect_handler  handler,
void *  data 
)

Relocate the object file. The object file's section are parsed for any relocation type sections.

Parameters
objThe object file's descriptor.
fdThe object file's file descriptor.
handlerThe object file's format specific relocation handler.
dataUser specific data handle.
Return values
trueThe object file was relocated.
falseThe relocation failed. The RTL error is set.

◆ rtems_rtl_obj_remove_dependencies()

bool rtems_rtl_obj_remove_dependencies ( rtems_rtl_obj obj)

Remove dependencies. This decrements the dependent object file references.

Parameters
objThe object file's descriptor.
Return values
trueThe dependencies have been removed.
falseThere is no space in the table.

◆ rtems_rtl_obj_run_ctors()

void rtems_rtl_obj_run_ctors ( rtems_rtl_obj obj)

Invoke the constructors the object has. Constructors are a table of pointers to "void (*)(void);" where NULL pointers are skipped. The table's size is taken from the section's size. The objet ELF specific code is responisble for flagging which sections contain constructors.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_run_dtors()

void rtems_rtl_obj_run_dtors ( rtems_rtl_obj obj)

Invoke the destructors the object has. Destructors are a table of pointers to "void (*)(void);" where NULL pointers are skipped. The table's size is taken from the section's size. The objet ELF specific code is responisble for flagging which sections contain destructors.

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_synchronize_cache()

void rtems_rtl_obj_synchronize_cache ( rtems_rtl_obj obj)

Synchronize caches to make code visible to CPU(s)

Parameters
objThe object file's descriptor.

◆ rtems_rtl_obj_text_alignment()

uint32_t rtems_rtl_obj_text_alignment ( const rtems_rtl_obj obj)

The text section alignment for the object file. Only use once all the sections has been added. The section alignment is the alignment of the first text type section loaded the text section.

You can assume the alignment is a positive integral power of 2 if not 0 or

  1. If 0 or 1 then there is no alignment.
Parameters
objThe object file's descriptor.
Returns
uint32_t The alignment. Can be 0 or 1 for not aligned or the alignment.

◆ rtems_rtl_obj_text_size()

size_t rtems_rtl_obj_text_size ( const rtems_rtl_obj obj)

The text section size. Only use once all the sections has been added. It includes alignments between sections that are part of the object's text area. The consts sections are included in this section.

Parameters
objThe object file's descriptor.
Returns
size_t The size of the text area of the object file.

◆ rtems_rtl_obj_unload()

bool rtems_rtl_obj_unload ( rtems_rtl_obj obj)

Unload the object file, erasing all symbols and releasing all memory.

Parameters
objThe object file's descriptor.
Return values
trueThe object file has been unloaded.
falseThe unload failed. The RTL error has been set.

◆ rtems_rtl_obj_unresolved()

bool rtems_rtl_obj_unresolved ( rtems_rtl_obj obj)

Does the object file have unresolved external references ? If it does the results of executing code is unpredictable.

Parameters
objThe object file's descriptor.
Return values
trueThe object file has unresolved externals.
falseThe object file has all external references resolved.

◆ rtems_rtl_parse_name()

bool rtems_rtl_parse_name ( const char *  name,
const char **  aname,
const char **  oname,
off_t *  ooffset 
)

Parses a filename and returns newly allocated strings with the archive name, object name, and the object's offset

Parameters
nameThe filename of the object
anameAddress of a string pointer that holds the archive name
onameAddress of a string pointer that holds the object name
ooffsetAddress of an int that holds the object offset
Return values
trueThe parsing was successful
falseThe parsing was unsuccessful