RTEMS CPU Kit with SuperCore  4.11.3
Data Structures | Typedefs | Enumerations | Functions
rtl-unresolved.h File Reference

RTEMS Run-Time Linker Object File Unresolved Relocations Table. More...

#include <rtems.h>
#include "rtl-obj-fwd.h"
Include dependency graph for rtl-unresolved.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  rtems_rtl_unresolv_name_s
 Unresolved externals symbol names. More...
 
struct  rtems_rtl_unresolv_reloc_s
 Unresolved externals symbols require the relocation records to be held and references. More...
 
struct  rtems_rtl_unresolv_rec_s
 Unresolved externals records. More...
 
struct  rtems_rtl_unresolv_block_s
 Unresolved blocks. More...
 
struct  rtems_rtl_unresolved_s
 Unresolved table holds the names and relocations. More...
 

Typedefs

typedef uint32_t rtems_rtl_word_t
 Hack to work around machine size. More...
 
typedef enum rtems_rtl_unresolved_rtype_e rtems_rtl_unresolved_rtype_t
 The types of records in the blocks.
 
typedef struct rtems_rtl_unresolv_name_s rtems_rtl_unresolv_name_t
 Unresolved externals symbol names. More...
 
typedef struct rtems_rtl_unresolv_reloc_s rtems_rtl_unresolv_reloc_t
 Unresolved externals symbols require the relocation records to be held and references.
 
typedef struct rtems_rtl_unresolv_rec_s rtems_rtl_unresolv_rec_t
 Unresolved externals records.
 
typedef struct rtems_rtl_unresolv_block_s rtems_rtl_unresolv_block_t
 Unresolved blocks.
 
typedef struct rtems_rtl_unresolved_s rtems_rtl_unresolved_t
 Unresolved table holds the names and relocations.
 
typedef bool rtems_rtl_unresolved_iterator_t(rtems_rtl_unresolv_rec_t *rec, void *data)
 The iterator function used to iterate over the unresolved table. More...
 

Enumerations

enum  rtems_rtl_unresolved_rtype_e { rtems_rtl_unresolved_empty = 0, rtems_rtl_unresolved_name = 1, rtems_rtl_unresolved_reloc = 2 }
 The types of records in the blocks. More...
 

Functions

bool rtems_rtl_unresolved_table_open (rtems_rtl_unresolved_t *unresolved, size_t block_records)
 Open an unresolved relocation table. More...
 
void rtems_rtl_unresolved_table_close (rtems_rtl_unresolved_t *unresolved)
 Close the table and erase the blocks. More...
 
bool rtems_rtl_unresolved_interate (rtems_rtl_unresolved_iterator_t iterator, void *data)
 Iterate over the table of unresolved entries.
 
bool rtems_rtl_unresolved_add (rtems_rtl_obj_t *obj, const uint16_t flags, const char *name, const uint16_t sect, const rtems_rtl_word_t *rel)
 Add a relocation to the list of unresolved relocations. More...
 
void rtems_rtl_unresolved_resolve (void)
 Resolve the unresolved symbols.
 
bool rtems_rtl_unresolved_remove (rtems_rtl_obj_t *obj, const char *name, const uint16_t sect, const rtems_rtl_word_t *rel)
 Remove a relocation from the list of unresolved relocations. More...
 

Detailed Description

RTEMS Run-Time Linker Object File Unresolved Relocations Table.

The unresolved relocation table holds relocations in a loaded object file which reference unresolved external symbols. The support is needed to allow dependent object files to load. In the case of dependent object files one will have unresolved externals until the dependent object file is also loaded. There is no load order that resolves this.

The unresolved relocation table is a single table used by all object files with unresolved symbols. It made of blocks linked together where blocks are allocated as requiered. The table is always maintained compacted. That is as relocations are resolved and removed the table is compacted. The only pointer in the table is the object file poniter. This is used to identify which object the relocation belongs to. There are no linking or back pointers in the unresolved relocations table. The table is scanned for each object file's relocations. This is not fast but the table should be small and if it happens to grow large you have other more pressing issues to resolve in your application.

The table holds two (2) types of records:

Symbol name strings.

Relocations.

The symbol name a relocation references is held in a specific symbol name string record in the table the relocation record references. The record counts the number of references and the string is removed from the table when the reference count reaches 0. There can be many relocations referencing the symbol. The strings are referenced by a single 16bit unsigned integer which is the count of the string in the table.

The section the relocation is for in the object is the section number. The relocation data is series of machine word sized fields:

Offset in the section.

Relocation info (format specific)

Additional format specific data.

Typedef Documentation

◆ rtems_rtl_unresolv_name_t

Unresolved externals symbol names.

The names are reference counted and separate from the relocation records because a number of records could reference the same symbol name.

◆ rtems_rtl_unresolved_iterator_t

typedef bool rtems_rtl_unresolved_iterator_t(rtems_rtl_unresolv_rec_t *rec, void *data)

The iterator function used to iterate over the unresolved table.

Parameters
recThe current iterator.
dataThe user data.
Return values
trueThe iterator has finished.
falseThe iterator has not finished. Keep iterating.

◆ rtems_rtl_word_t

typedef uint32_t rtems_rtl_word_t

Hack to work around machine size.

This needs to be cleaned up to better support 64bit targets.

Enumeration Type Documentation

◆ rtems_rtl_unresolved_rtype_e

The types of records in the blocks.

Enumerator
rtems_rtl_unresolved_empty 

The records is empty.

Must always be 0

rtems_rtl_unresolved_name 

The record is a name.

rtems_rtl_unresolved_reloc 

The record is a relocation record.

Function Documentation

◆ rtems_rtl_unresolved_add()

bool rtems_rtl_unresolved_add ( rtems_rtl_obj_t obj,
const uint16_t  flags,
const char *  name,
const uint16_t  sect,
const rtems_rtl_word_t rel 
)

Add a relocation to the list of unresolved relocations.

Parameters
unresolvedThe unresolved symbol table.
objThe object table the symbols are for.
flagsFormat specific flags.
nameThe symbol name the relocation references.
sectThe target section number the relocation references.
relThe format specific relocation data.
Return values
trueThe relocation has been added.
falseThe relocation could not be added.

◆ rtems_rtl_unresolved_remove()

bool rtems_rtl_unresolved_remove ( rtems_rtl_obj_t obj,
const char *  name,
const uint16_t  sect,
const rtems_rtl_word_t rel 
)

Remove a relocation from the list of unresolved relocations.

Parameters
unresolvedThe unresolved symbol table.
objThe object table the symbols are for.
esymsThe exported symbol table.
sizeThe size of the table in bytes.

References rtems_rtl_unresolved().

◆ rtems_rtl_unresolved_table_close()

void rtems_rtl_unresolved_table_close ( rtems_rtl_unresolved_t unresolved)

Close the table and erase the blocks.

Parameters
unreolvedClose the unresolved table.

References rtems_rtl_unresolved_s::blocks, rtems_chain_first(), and rtems_chain_is_tail().

◆ rtems_rtl_unresolved_table_open()

bool rtems_rtl_unresolved_table_open ( rtems_rtl_unresolved_t unresolved,
size_t  block_records 
)

Open an unresolved relocation table.

Parameters
unresolvThe unresolved table to open.
block_recordsThe number of records per block allocated.
Return values
trueThe table is open.
falseThe unresolved relocation table could not created. The RTL error has the error.

References rtems_rtl_unresolved_s::block_recs, rtems_rtl_unresolved_s::blocks, and rtems_chain_initialize_empty().