7. Dynamic Loader¶
7.1. Introduction¶
The RTEMS shell has the following dynamic loader commands:
rtl - Manage the Run-Time Loader (RTL)
7.2. Commands¶
This section details the Dynamic Loader Commands available. A subsection is dedicated to each of the commands and describes the behavior and configuration of that command as well as providing an example usage.
7.2.1. rtl - Manager the RTL¶
- SYNOPSYS:
rtl [-l] -[h] command [...]
- DESCRIPTION:
This command manages the Run-time Loader (RTL) using a series of sub-commands. The sub-command selected determines what is displayed or the action taken. Sub-commands can have options that modified the behaviour of the specific command.
The
-l
option lists the available commands and-h
displays a simple help message.The commands are:
list
:List the loaded object files. The executable object file’s full path is displayed. If the executable object file is loaded from an archive the archive is include in the path. If no options are provided only a list of the object file names is displayed.
The command is:
rtl list [-nlmsdb] [name]
The options are:
-n
Display all the name fields.
-l
Long display the RTL’s fields:
unresolved
- number of unresolved symbolsusers
- number of users, ie times loadedreferences
- number of referencs to symbolssymbols
- number of symbolssymbol memory
- amount of symbol memory
-m
Display the memory map. The sections listed are:
exec
- total memory allocatedtext
- size of the executable code residentconst
- size of the constants or read-only memorydata
- size of the initialised data memorybss
- size of the uninitialised data memory
-s
Display the local symbols present in the listed object file’s symbol table. List the symbol’s value.
-d
Display the loaded object files that depend on symbols provided by this object file. The object file cannot be unloaded while there are references.
-b
Include the base kernel image in the list of object modules. It is not included by default. If this option is included the base kernel module name of
rtems-kernel
can be used as aname
.name
The optional
name
argument is a regular expression filter for the object files to list. The match is partial. If no name argument is provided all object modules are listed.
sym
:List symbols in the symbol table with their value. Symbols are grouped by the object file they reside in.
The command is:
rtl sym [-bu] [-o name] [symbol]
The options are:
-u
List the system wide unresolved externals. Symbols are not displayed when displaying unresolved externals.
-o name
Display the symbols for the matching object files. The name is a regular expression and it is a partial match.
-b
Include the base kernel image in the list of object modules. It is not included by default. If this option is included the base kernel module name of
rtems-kernel
can be used as aname
.symbol
The optional
symbol
argument is a regular expression filter for the symbols. The match is partial. If no symbol argument is provided all symbols and their values are displayed.
obj
:Manage object files. The sub-commands control the operation this command performs.
The command is:
rtl obj [command] [...]
load <file>
Load the executable object file specificed by the
<file>
argument. Thefile
argument can be a file or it can be resided in archive file. The format isarchive:file
. Thearchive
is file name of the archive andfile
is the file in the archive.If the
<file>
references symbols in known archive dependent object files in the available archives they are loaded.unload <file>
Unload the executable object file specificed by the
<file>
argument. The<file>
argument can be the object files’ name or it can be a complete name including the archive.
ar
:Display details about archives known to the link editor.
The command is:
rtl ar [-lsd] [name]
The options are:
-l
Long display the RTL’s archive fields:
size
- size of the archive in the file systemsymbols
- number of symbols in the archive’s symbol search tablerefs
- number of referencs to object files in the archiveflags
- RTL specific flags
-s
Display the symbols in the archive symbol tables
-d
Display any duplicate symbols in any archives with the archive the instance of the symbol.
name
The optional
name
argument is a regular expression filter for the archive files to list. The match is partial. If no name argument is provided all archives known to the link editor are listed.
call
:Call a symbol that resides in a code (
text
) section of an object file. Arguments can be passed and there is no return value support.There are no checks made on the signature of a symbol being called. The argument signature used needs to match the symbol being called or unpredictable behaviour may result.
The reference count of the object file containing the symbol is increased while the call is active. The
-l
option locks the object by not lowering the reference count once the call completes. This is useful if the call starts a thread in the object file. The reference count cannot be lowered by the shell and the object file remains locked in memory.The call occurs on the stack of the shell so it is important to make sure there is sufficient space available to meet the needs of the call when configuring your shell.
The call blocks the shell while it is active. There is no ability to background the call.
If no arguments are provided the call signature is:
void call (void);
If no options to specify a format are provided and there are arguments the call signature is the standard
argc/argv
call signature:void call (int argc, const char* argv[]);
The command is:
rtl call [-lsui] name [args]
The options are:
-l
Leave the object file the symbol resides in locked after the call returns.
-s
Concatenate the
[args]
into a single string and pass as a singleconst char*
argument. Quoted arguments are stripped or quotes and merged into the single string. The call signature is:void call (const char* str);
-u
Pass up to four unsigned integer
[args]
arguments. The symbol’s call signature can have fewer than four arguments, the unreferenced arguments are ignored. The call signature is:void call (unsigned int u1, unsigned int u2, unsigned int u3, unsigned int u4);
-i
Pass up to four integer
[args]
arguments. The symbol’s call signature can have fewer than four arguments, the unreferenced arguments are ignored. The call signature is:void call (int i1, int i2, int i3, int i4);
name
The
name
argument is symbol name to find and call.
trace
:Clear or set trace flags. The trace flags provide details trace information from the link editor and can aid debugging. Note, some options can produce a large volume or output.
The command is:
rtl trace [-l] [-h] [set/clear] flags...
The options are:
-l
List the available flags that can be cleared or set.
-?
A
trace
command specific help
The flags are:
all
detail
warning
load
unload
section
symbol
reloc
global-sym
load-sect
allocator
unresolved
cache
archives
archive-syms
dependency
bit-alloc
- EXIT STATUS:
This command returns 0 to indicate success else it returns 1.
- NOTES:
Using this command may initialise the RTL manager if has not been used and initialised before now.
A base kernel image symbol file has to be present for base kernel symbols to be viewed and searched.
- EXAMPLES:
The following examples can be used with the testsuite’s
dl10
test.Attempt to load an object file that not exist then load an object file that exists:
SHLL [/] # rtl obj load /foo.o error: load: /foo.o: file not found SHLL [/] $ rtl obj load /dl10-o1.o
List the object files:
SHLL [/] # rtl list /dl10-o1.o /libdl10_1.a:dl10-o2.o /libdl10_2.a:dl10-o5.o /libdl10_2.a:dl10-o3.o /libdl10_1.a:dl10-o4.o
The list shows the referenced archive object files that have been loaded. Show the details for the library object file
dl10-o2.o
:SHLL [/] # rtl list -l dl10-o4.o /libdl10_1.a:dl10-o4.o unresolved : 0 users : 0 references : 1 symbols : 7 symbol memory : 250
The object file has one reference, 7 symbols and uses 250 bytes of memory. List the symbols:
SHLL [/] # rtl list -s dl10-o4.o /libdl10_1.a:dl10-o4.o rtems_main_o4 = 0x20de818 dl04_unresolv_1 = 0x20dead0 dl04_unresolv_2 = 0x20dead4 dl04_unresolv_3 = 0x20dead8 dl04_unresolv_4 = 0x20deadc dl04_unresolv_5 = 0x20deaa0 dl04_unresolv_6 = 0x20deac0
The dependents of a group of object files can be listed using a regular expression:
SHLL [/] # rtl list -d dl10-o[234].o /libdl10_1.a:dl10-o2.o dependencies : dl10-o3.o /libdl10_2.a:dl10-o3.o dependencies : dl10-o4.o : dl10-o5.o /libdl10_1.a:dl10-o4.o dependencies : dl10-o5.o
A number of flags can be selected at once:
SHLL [/] # rtl list -lmsd dl10-o1.o /dl10-o1.o exec size : 1086 text base : 0x20dbec0 (352) const base : 0x20dc028 (452) data base : 0x20dc208 (12) bss base : 0x20dc220 (266) unresolved : 0 users : 1 references : 0 symbols : 9 symbol memory : 281 dl01_func1 = 0x20dbec0 rtems_main_o1 = 0x20dbec8 dl01_bss1 = 0x20dc220 dl01_bss2 = 0x20dc224 dl01_bss3 = 0x20dc2a0 dl01_data1 = 0x20dc20c dl01_data2 = 0x20dc208 dl01_const1 = 0x20dc1e8 dl01_const2 = 0x20dc1e4 dependencies : dl10-o2.o
List all symbols that contain
main
:SHLL [/] # rtl sym main /dl10-o1.o rtems_main_o1 = 0x20dbec8 /libdl10_1.a:dl10-o2.o rtems_main_o2 = 0x20dd1a0 /libdl10_2.a:dl10-o5.o rtems_main_o5 = 0x20df280 /libdl10_2.a:dl10-o3.o rtems_main_o3 = 0x20ddc40 /libdl10_1.a:dl10-o4.o rtems_main_o4 = 0x20de818
Include the base kernel image in the search:
SHLL [/] # rtl sym -b main rtems-kernel rtems_shell_main_cp = 0x2015e9c rtems_shell_main_loop = 0x201c2bc rtems_shell_main_monitor = 0x203f070 rtems_shell_main_mv = 0x201a11c rtems_shell_main_rm = 0x201ad38 /dl10-o1.o rtems_main_o1 = 0x20dbec8 /libdl10_1.a:dl10-o2.o rtems_main_o2 = 0x20dd1a0 /libdl10_2.a:dl10-o5.o rtems_main_o5 = 0x20df280 /libdl10_2.a:dl10-o3.o rtems_main_o3 = 0x20ddc40 /libdl10_1.a:dl10-o4.o rtems_main_o4 = 0x20de818
The filter is a regular expression:
SHLL [/] # rtl sym -b ^rtems_task rtems-kernel rtems_task_create = 0x2008934 rtems_task_delete = 0x20386b8 rtems_task_exit = 0x2008a98 rtems_task_ident = 0x2038738 rtems_task_iterate = 0x2038798 rtems_task_self = 0x20387b8 rtems_task_set_priority = 0x20387c4 rtems_task_start = 0x2008b7c rtems_task_wake_after = 0x2008bd0
The search can be limited to a selection of object files:
SHLL [/] # rtl sym -o dl10-o[12].o dl01_b /dl10-o1.o dl01_bss1 = 0x20dc220 dl01_bss2 = 0x20dc224 dl01_bss3 = 0x20dc2a0 SHLL [/] # rtl sym -o dl10-o[12].o dl0[12]_b /dl10-o1.o dl01_bss1 = 0x20dc220 dl01_bss2 = 0x20dc224 dl01_bss3 = 0x20dc2a0 /libdl10_1.a:dl10-o2.o dl02_bss1 = 0x20dd400 dl02_bss2 = 0x20dd404 dl02_bss3 = 0x20dd420
List the archives known to the link editor:
SHLL [/] # rtl ar /libdl10_1.a /libdl10_2.a
A long listing of the archives provides the link editor details:
SHLL [/] # rtl ar -l /libdl10_1.a: size : 37132 symbols : 13 refs : 0 flags : 0 /libdl10_2.a: size : 53050 symbols : 8 refs : 0 flags : 0
List the symbols an archive provides using the
-s
option:SHLL [/] # rtl ar -s libdl10_1.a /libdl10_1.a: symbols : dl02_bss1 dl02_bss2 dl02_bss3 dl02_data1 dl02_data2 dl04_unresolv_1 dl04_unresolv_2 dl04_unresolv_3 dl04_unresolv_4 dl04_unresolv_5 dl04_unresolv_6 rtems_main_o2 rtems_main_o4
List the duplicate symbols in the archives using the
-d
option:SHLL [/] # rtl ar -d /libdl10_1.a: dups : /libdl10_2.a: dups : rtems_main_o5 (/libdl10_2.a)
The link editor will list the first archive if finds that has the duplicate symbol.
Call the symbol
rtems_main_o4
with no options:SHLL [/] # rtl call rtems_main_o4 dlo4: module: testsuites/libtests/dl10/dl-o4.c dlo4: dl04_unresolv_1: 4: 0x20dee68: 0 dlo4: dl04_unresolv_2: 4: 0x20dee6c: %f dlo4: dl04_unresolv_3: 1: 0x20dee70: 00 dlo4: dl04_unresolv_4: 4: 0x20dee74: 0 dlo4: dl04_unresolv_5: 4: 0x20dee38: 4 dlo4: dl04_unresolv_6: 4: 0x20dee58: dl-O4 dlo5: module: testsuites/libtests/dl10/dl-o5.c dlo5: dl05_unresolv_1: 8: 0x20df860: 0 dlo5: dl05_unresolv_2: 2: 0x20df868: 0 dlo5: dl05_unresolv_3: 4: 0x20df86c: 0 dlo5: dl05_unresolv_4: 1: 0x20df870: 0 dlo5: dl05_unresolv_5: 8: 0x20df878: 0
Call a symbol in a data section of an object file:
SHLL [/] # rtl call dl04_unresolv_3 error: symbol not in obj text: dl04_unresolv_3
Call the symbol
rtems_main_o5
with a single string:SHLL [/] # rtl call -s rtems_main_o5 arg1 arg2 "arg3 and still arg3" arg4 dlo5: module: testsuites/libtests/dl10/dl-o5.c dlo5: dl05_unresolv_1: 8: 0x20df860: 0 dlo5: dl05_unresolv_2: 2: 0x20df868: 0 dlo5: dl05_unresolv_3: 4: 0x20df86c: 0 dlo5: dl05_unresolv_4: 1: 0x20df870: 0 dlo5: dl05_unresolv_5: 8: 0x20df878: 0
Note, the call does not have any argument and the strin passed is ignored.
Call the symbol
rtems_main_o5
with three integer arguments:SHLL [/] # rtl call -i rtems_main_o5 1 22 333 dlo5: module: testsuites/libtests/dl10/dl-o5.c dlo5: dl05_unresolv_1: 8: 0x20df860: 0 dlo5: dl05_unresolv_2: 2: 0x20df868: 0 dlo5: dl05_unresolv_3: 4: 0x20df86c: 0 dlo5: dl05_unresolv_4: 1: 0x20df870: 0 dlo5: dl05_unresolv_5: 8: 0x20df878: 0
- CONFIGURATION:
This command is not included in the default shell command set. The command needs to be added with the shell’s
rtems_shell_add_cmd
.#include <rtems/rtl/rtl-shell.h> #include <rtems/shell.h> rtems_shell_init_environment (); if (rtems_shell_add_cmd ("rtl", "rtl", "rtl -?", rtems_rtl_shell_command) == NULL) printf("error: command add failed\n");
- PROGRAMMING INFORMATION:
The
rtl
commanf is implemented by a C language function which has the following prototype:int rtems_rtl_shell_command( int argc, char **argv );
The sub-command parts of the
rtl
command can be called directly. These calls all use the RTEMS Printer interface and as a result can be redirected and captured.list
The RTL list command.
#include <rtems/rtl/rtl-shell.h> int rtems_rtl_shell_list ( const rtems_printer* printer, int argc, char* argv[] );
sym
The RTL symbol command.
#include <rtems/rtl/rtl-shell.h> int rtems_rtl_shell_sym ( const rtems_printer* printer, int argc, char* argv[] );
sym
The RTL object command.
#include <rtems/rtl/rtl-shell.h> int rtems_rtl_shell_object ( const rtems_printer* printer, int argc, char* argv[] );
ar
The RTL object command.
#include <rtems/rtl/rtl-archive.h> int rtems_rtl_shell_archive ( const rtems_printer* printer, int argc, char* argv[] );
call
The RTL object command.
#include <rtems/rtl/rtl-archive.h> int rtems_rtl_shell_call ( const rtems_printer* printer, int argc, char* argv[] );