Contiki 2.6

The Contiki ELF loader

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.

Detailed Description

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 Documentation

#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.


Function Documentation

void* elfloader_allocate_segment ( struct elfloader_output output,
unsigned int  type,
int  size 
)

Allocate a new segment.

Parameters:
inputThe output object
typeType of segment
sizeSize of segment in bytes
Returns:
A pointer to the start of the segment.

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.

Parameters:
inputThe output object
Returns:
Zero if successful
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, and NULL.

int elfloader_load ( int  input_fd,
struct elfloader_output output 
)

Load and relocate an ELF file.

Parameters:
inputInput object defining how to read from the ELF file
outputOutput object defining how to create and write to seegments.
Returns:
ELFLOADER_OK if loading and relocation worked. Otherwise an error value.

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, elfloader_unknown, and NULL.

int elfloader_load ( int  fd)

Load and relocate an ELF file.

Parameters:
fdAn open CFS file descriptor.
Returns:
ELFLOADER_OK if loading and relocation worked. Otherwise an error value.

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.

Note:
This function modifies the ELF file opened with cfs_open()! If the contents of the file is required to be intact, the file must be backed up first.

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, elfloader_unknown, and NULL.

unsigned int elfloader_segment_offset ( struct elfloader_output output)

Get the current offset in the file where the next data will be written.

Parameters:
inputThe output object
Returns:
The current offset.
int elfloader_start_segment ( struct elfloader_output output,
unsigned int  type,
void *  addr,
int  size 
)

Start writing to a new segment.

Parameters:
inputThe output object
typeType of segment
addrAddress of segment from elfloader_allocate_segment
sizeSize of segment in bytes
Returns:
Returns ELFLOADER_OK if successful, otherwise an error code
int elfloader_write_segment ( struct elfloader_output output,
const char *  buf,
unsigned int  len 
)

Write data to a segment.

Parameters:
inputThe output object
bufData to be written
lenLength of data
Returns:
The number of bytes actually written, or negative if failed.