The Contiki ELF loader links, relocates, and loads ELF (Executable Linkable Format) object files into a running Contiki system. More...
Data Structures | |
struct | elfloader_output |
elfloader output object More... | |
Modules | |
Architecture specific functionality for the ELF loader. | |
The architecture specific functionality for the Contiki ELF loader has to be implemented for each processor type Contiki runs on. | |
Files | |
file | elfloader.h |
Header file for the Contiki ELF loader. | |
file | elfloader-otf.h |
Header file for the Contiki ELF loader. | |
Defines | |
#define | ELFLOADER_OK 0 |
Return value from elfloader_load() indicating that loading worked. | |
#define | ELFLOADER_BAD_ELF_HEADER 1 |
Return value from elfloader_load() indicating that the ELF file had a bad header. | |
#define | ELFLOADER_NO_SYMTAB 2 |
Return value from elfloader_load() indicating that no symbol table could be found in the ELF file. | |
#define | ELFLOADER_NO_STRTAB 3 |
Return value from elfloader_load() indicating that no string table could be found in the ELF file. | |
#define | ELFLOADER_NO_TEXT 4 |
Return value from elfloader_load() indicating that the size of the .text segment was zero. | |
#define | ELFLOADER_SYMBOL_NOT_FOUND 5 |
Return value from elfloader_load() indicating that a symbol specific symbol could not be found. | |
#define | ELFLOADER_SEGMENT_NOT_FOUND 6 |
Return value from elfloader_load() indicating that one of the required segments (.data, .bss, or .text) could not be found. | |
#define | ELFLOADER_NO_STARTPOINT 7 |
Return value from elfloader_load() indicating that no starting point could be found in the loaded module. | |
#define | ELFLOADER_OK 0 |
Return value from elfloader_load() indicating that loading worked. | |
#define | ELFLOADER_BAD_ELF_HEADER 1 |
Return value from elfloader_load() indicating that the ELF file had a bad header. | |
#define | ELFLOADER_NO_SYMTAB 2 |
Return value from elfloader_load() indicating that no symbol table could be find in the ELF file. | |
#define | ELFLOADER_NO_STRTAB 3 |
Return value from elfloader_load() indicating that no string table could be find in the ELF file. | |
#define | ELFLOADER_NO_TEXT 4 |
Return value from elfloader_load() indicating that the size of the .text segment was zero. | |
#define | ELFLOADER_SYMBOL_NOT_FOUND 5 |
Return value from elfloader_load() indicating that a symbol specific symbol could not be found. | |
#define | ELFLOADER_SEGMENT_NOT_FOUND 6 |
Return value from elfloader_load() indicating that one of the required segments (.data, .bss, or .text) could not be found. | |
#define | ELFLOADER_NO_STARTPOINT 7 |
Return value from elfloader_load() indicating that no starting point could be found in the loaded module. | |
#define | ELFLOADER_UNHANDLED_RELOC 8 |
Return value from elfloader_load() indicating that the ELF file contained a relocation type that the implementation can't handle. | |
#define | ELFLOADER_OUTOF_RANGE 9 |
Return value from elfloader_load() indicating that the offset for a relative addressing mode was too big. | |
#define | ELFLOADER_RELOC_NOT_SORTED 10 |
Return value from elfloader_load() indicating that the relocations where not sorted by offset. | |
#define | ELFLOADER_INPUT_ERROR 11 |
Return value from elfloader_load() indicating that reading from the ELF file failed in some way. | |
#define | ELFLOADER_OUTPUT_ERROR 12 |
Return value from elfloader_load() indicating that writing to a segment failed. | |
Functions | |
void | elfloader_init (void) |
elfloader initialization function. | |
int | elfloader_load (int fd) |
Load and relocate an ELF file. | |
void * | elfloader_allocate_segment (struct elfloader_output *output, unsigned int type, int size) |
Allocate a new segment. | |
int | elfloader_start_segment (struct elfloader_output *output, unsigned int type, void *addr, int size) |
Start writing to a new segment. | |
int | elfloader_end_segment (struct elfloader_output *output) |
Mark end of segment. | |
int | elfloader_write_segment (struct elfloader_output *output, const char *buf, unsigned int len) |
Write data to a segment. | |
unsigned int | elfloader_segment_offset (struct elfloader_output *output) |
Get the current offset in the file where the next data will be written. | |
int | elfloader_load (int input_fd, struct elfloader_output *output) |
Load and relocate an ELF file. | |
Variables | |
struct process *const * | elfloader_autostart_processes |
A pointer to the processes loaded with elfloader_load(). | |
char | elfloader_unknown [30] |
If elfloader_load() could not find a specific symbol, it is copied into this array. | |
struct process ** | elfloader_autostart_processes |
A pointer to the processes loaded with elfloader_load(). | |
char | elfloader_unknown [30] |
If elfloader_load() could not find a specific symbol, it is copied into this array. |
The Contiki ELF loader links, relocates, and loads ELF (Executable Linkable Format) object files into a running Contiki system.
ELF is a standard format for relocatable object code and executable files. ELF is the standard program format for Linux, Solaris, and other operating systems.
An ELF file contains either a standalone executable program or a program module. The file contains both the program code, the program data, as well as information about how to link, relocate, and load the program into a running system.
The ELF file is composed of a set of sections. The sections contain program code, data, or relocation information, but can also contain debugging information.
To link and relocate an ELF file, the Contiki ELF loader first parses the ELF file structure to find the appropriate ELF sections. It then allocates memory for the program code and data in ROM and RAM, respectively. After allocating memory, the Contiki ELF loader starts relocating the code found in the ELF file.
#define ELFLOADER_SYMBOL_NOT_FOUND 5 |
Return value from elfloader_load() indicating that a symbol specific symbol could not be found.
If this value is returned from elfloader_load(), the symbol has been copied into the elfloader_unknown[] array.
Definition at line 113 of file elfloader-otf.h.
#define ELFLOADER_SYMBOL_NOT_FOUND 5 |
Return value from elfloader_load() indicating that a symbol specific symbol could not be found.
If this value is returned from elfloader_load(), the symbol has been copied into the elfloader_unknown[] array.
Definition at line 111 of file elfloader.h.
void* elfloader_allocate_segment | ( | struct elfloader_output * | output, | |
unsigned int | type, | |||
int | size | |||
) |
Allocate a new segment.
input | The output object | |
type | Type of segment | |
size | Size of segment in bytes |
The returned address doesn't need to correspond to any real memory, since it's only used for calculating the relocations.
int elfloader_end_segment | ( | struct elfloader_output * | output | ) |
Mark end of segment.
input | The output object |
void elfloader_init | ( | void | ) |
elfloader initialization function.
This function should be called at boot up to initialize the elfloader.
This function should be called at boot up to initilize the elfloader.
Definition at line 316 of file elfloader.c.
References elfloader_autostart_processes.
int elfloader_load | ( | int | input_fd, | |
struct elfloader_output * | output | |||
) |
Load and relocate an ELF file.
input | Input object defining how to read from the ELF file | |
output | Output object defining how to create and write to seegments. |
If the function is able to load the ELF file, a pointer to the process structure in the model is stored in the elfloader_loaded_process variable.
Definition at line 398 of file elfloader-otf.c.
References elfloader_autostart_processes, ELFLOADER_BAD_ELF_HEADER, ELFLOADER_INPUT_ERROR, ELFLOADER_NO_STARTPOINT, ELFLOADER_NO_STRTAB, ELFLOADER_NO_SYMTAB, ELFLOADER_NO_TEXT, ELFLOADER_OK, ELFLOADER_OUTPUT_ERROR, and elfloader_unknown.
int elfloader_load | ( | int | fd | ) |
Load and relocate an ELF file.
fd | An open CFS file descriptor. |
This function loads and relocates an ELF file. The ELF file must have been opened with cfs_open() prior to calling this function.
If the function is able to load the ELF file, a pointer to the process structure in the model is stored in the elfloader_loaded_process variable.
Definition at line 338 of file elfloader.c.
References elfloader_arch_allocate_ram(), elfloader_arch_allocate_rom(), elfloader_arch_write_rom(), elfloader_autostart_processes, ELFLOADER_BAD_ELF_HEADER, ELFLOADER_NO_STARTPOINT, ELFLOADER_NO_STRTAB, ELFLOADER_NO_SYMTAB, ELFLOADER_NO_TEXT, ELFLOADER_OK, and elfloader_unknown.
unsigned int elfloader_segment_offset | ( | struct elfloader_output * | output | ) |
Get the current offset in the file where the next data will be written.
input | The output object |
int elfloader_start_segment | ( | struct elfloader_output * | output, | |
unsigned int | type, | |||
void * | addr, | |||
int | size | |||
) |
Start writing to a new segment.
input | The output object | |
type | Type of segment | |
addr | Address of segment from elfloader_allocate_segment | |
size | Size of segment in bytes |
int elfloader_write_segment | ( | struct elfloader_output * | output, | |
const char * | buf, | |||
unsigned int | len | |||
) |
Write data to a segment.
input | The output object | |
buf | Data to be written | |
len | Length of data |