Generic


Files

file  bitops.h
file  dynamic.h
file  elf.h
file  elf.h
file  elf_dyn.h
file  elf_load.c
 Userspace ELF loader.
file  elf_load.h
 ELF loader structures and public functions.
file  printf_core.c
 Printing functions.

Data Structures

struct  dyn_info_arch_t
struct  elf32_header
 ELF header. More...
struct  elf32_header
 ELF header. More...
struct  elf32_section_header
struct  elf32_section_header
struct  elf32_segment_header
struct  elf32_segment_header
struct  elf32_symbol
struct  elf32_symbol
struct  elf64_header
struct  elf64_header
struct  elf64_section_header
struct  elf64_section_header
struct  elf64_segment_header
struct  elf64_segment_header
struct  elf64_symbol
struct  elf64_symbol
struct  elf_info_t
 Some data extracted from the headers are stored here. More...
struct  elf_ld_t
 Holds information about an ELF binary being loaded. More...

Defines

#define __PRINTF_FLAG_BIGCHARS   0x00000080
 show big characters
#define __PRINTF_FLAG_LEFTALIGNED   0x00000010
 align to left
#define __PRINTF_FLAG_NEGATIVE   0x00000100
 number has - sign
#define __PRINTF_FLAG_PREFIX   0x00000001
 show prefixes 0x or 0
#define __PRINTF_FLAG_SHOWPLUS   0x00000020
 always show + sign
#define __PRINTF_FLAG_SIGNED   0x00000002
 signed / unsigned number
#define __PRINTF_FLAG_SPACESIGN   0x00000040
 print space instead of plus
#define __PRINTF_FLAG_ZEROPADDED   0x00000004
 print leading zeroes
#define DPRINTF()
#define EE_INCOMPATIBLE   3
#define EE_INCOMPATIBLE   3
#define EE_INVALID   1
#define EE_INVALID   1
#define EE_IRRECOVERABLE   5
#define EE_IRRECOVERABLE   5
#define EE_MEMORY   2
#define EE_MEMORY   2
#define EE_OK   0
 ELF error return codes.
#define EE_OK   0
 ELF error return codes.
#define EE_UNSUPPORTED   4
#define EE_UNSUPPORTED   4
#define EI_ABIVERSION   8
#define EI_ABIVERSION   8
#define EI_CLASS   4
#define EI_CLASS   4
#define EI_DATA   5
#define EI_DATA   5
#define EI_MAG0   0
 ELF identification indexes.
#define EI_MAG0   0
 ELF identification indexes.
#define EI_MAG1   1
#define EI_MAG1   1
#define EI_MAG2   2
#define EI_MAG2   2
#define EI_MAG3   3
#define EI_MAG3   3
#define EI_NIDENT   16
#define EI_NIDENT   16
#define EI_OSABI   7
#define EI_OSABI   7
#define EI_PAD   9
#define EI_PAD   9
#define EI_VERSION   6
#define EI_VERSION   6
#define ELF_ST_BIND(i)   ((i) >> 4)
 Macros for decomposing elf_symbol.st_info into binging and type.
#define ELF_ST_INFO(b, t)   (((b) << 4) + ((t) & 0x0f))
#define ELF_ST_TYPE(i)   ((i) & 0x0f)
#define ELFCLASS32   1
#define ELFCLASS32   1
#define ELFCLASS64   2
#define ELFCLASS64   2
#define ELFCLASSNONE   0
 ELF file classes.
#define ELFCLASSNONE   0
 ELF file classes.
#define ELFDATA2LSB   1
#define ELFDATA2LSB   1
#define ELFDATA2MSB   2
#define ELFDATA2MSB   2
#define ELFDATANONE   0
 ELF data encoding types.
#define ELFDATANONE   0
 ELF data encoding types.
#define ELFMAG0   0x7f
 ELF magic number.
#define ELFMAG0   0x7f
 ELF magic number.
#define ELFMAG1   'E'
#define ELFMAG1   'E'
#define ELFMAG2   'L'
#define ELFMAG2   'L'
#define ELFMAG3   'F'
#define ELFMAG3   'F'
#define EM_386   3
#define EM_386   3
#define EM_ARM   40
#define EM_ARM   40
#define EM_IA_64   50
#define EM_IA_64   50
#define EM_MIPS   8
#define EM_MIPS   8
#define EM_MIPS_RS3_LE   10
#define EM_MIPS_RS3_LE   10
#define EM_NO   0
 ELF machine types.
#define EM_NO   0
 ELF machine types.
#define EM_PPC   20
#define EM_PPC   20
#define EM_PPC64   21
#define EM_PPC64   21
#define EM_SPARC   2
#define EM_SPARC   2
#define EM_SPARCV9   43
#define EM_SPARCV9   43
#define EM_X86_64   62
#define EM_X86_64   62
#define ET_CORE   4
#define ET_CORE   4
#define ET_DYN   3
#define ET_DYN   3
#define ET_EXEC   2
#define ET_EXEC   2
#define ET_HIPROC   0xffff
#define ET_HIPROC   0xffff
#define ET_LOPROC   0xff00
#define ET_LOPROC   0xff00
#define ET_NONE   0
 ELF types.
#define ET_NONE   0
 ELF types.
#define ET_REL   1
#define ET_REL   1
#define EV_CURRENT   1
 current ELF version
#define EV_CURRENT   1
 current ELF version
#define PF_R   4
#define PF_R   4
#define PF_W   2
#define PF_W   2
#define PF_X   1
 Program segment attributes.
#define PF_X   1
 Program segment attributes.
#define PRINT_NUMBER_BUFFER_SIZE   (64 + 5)
 Buffer big enough for 64-bit number printed in base 2, sign, prefix and 0 to terminate string.
#define PT_DYNAMIC   2
#define PT_DYNAMIC   2
#define PT_HIPROC   0x7fffffff
#define PT_HIPROC   0x7fffffff
#define PT_INTERP   3
#define PT_INTERP   3
#define PT_LOAD   1
#define PT_LOAD   1
#define PT_LOPROC   0x70000000
#define PT_LOPROC   0x70000000
#define PT_NOTE   4
#define PT_NOTE   4
#define PT_NULL   0
 Program segment types.
#define PT_NULL   0
 Program segment types.
#define PT_PHDR   6
#define PT_PHDR   6
#define PT_SHLIB   5
#define PT_SHLIB   5
#define R_386_32   1
#define R_386_COPY   5
#define R_386_GLOB_DAT   6
#define R_386_JUMP_SLOT   7
#define R_386_PC32   2
#define R_386_RELATIVE   8
#define R_386_TLS_DTPMOD32   35
#define SHF_ALLOC   0x2
#define SHF_ALLOC   0x2
#define SHF_EXECINSTR   0x4
#define SHF_EXECINSTR   0x4
#define SHF_MASKPROC   0xf0000000
#define SHF_MASKPROC   0xf0000000
#define SHF_TLS   0x400
#define SHF_TLS   0x400
#define SHF_WRITE   0x1
 ELF section flags.
#define SHF_WRITE   0x1
 ELF section flags.
#define SHT_DYNAMIC   6
#define SHT_DYNAMIC   6
#define SHT_DYNSYM   11
#define SHT_DYNSYM   11
#define SHT_HASH   5
#define SHT_HASH   5
#define SHT_HIOS   0x6fffffff
#define SHT_HIOS   0x6fffffff
#define SHT_HIPROC   0x7fffffff
#define SHT_HIPROC   0x7fffffff
#define SHT_HIUSER   0xffffffff
#define SHT_HIUSER   0xffffffff
#define SHT_LOOS   0x60000000
#define SHT_LOOS   0x60000000
#define SHT_LOPROC   0x70000000
#define SHT_LOPROC   0x70000000
#define SHT_LOUSER   0x80000000
#define SHT_LOUSER   0x80000000
#define SHT_NOBITS   8
#define SHT_NOBITS   8
#define SHT_NOTE   7
#define SHT_NOTE   7
#define SHT_NULL   0
 ELF section types.
#define SHT_NULL   0
 ELF section types.
#define SHT_PROGBITS   1
#define SHT_PROGBITS   1
#define SHT_REL   9
#define SHT_REL   9
#define SHT_RELA   4
#define SHT_RELA   4
#define SHT_SHLIB   10
#define SHT_SHLIB   10
#define SHT_STRTAB   3
#define SHT_STRTAB   3
#define SHT_SYMTAB   2
#define SHT_SYMTAB   2
#define STB_GLOBAL   1
#define STB_GLOBAL   1
#define STB_HIPROC   15
#define STB_HIPROC   15
#define STB_LOCAL   0
 Symbol binding.
#define STB_LOCAL   0
 Symbol binding.
#define STB_LOPROC   13
#define STB_LOPROC   13
#define STB_WEAK   2
#define STB_WEAK   2
#define STT_FILE   4
#define STT_FILE   4
#define STT_FUNC   2
#define STT_FUNC   2
#define STT_HIPROC   15
#define STT_HIPROC   15
#define STT_LOPROC   13
#define STT_LOPROC   13
#define STT_NOTYPE   0
 Symbol types.
#define STT_NOTYPE   0
 Symbol types.
#define STT_OBJECT   1
#define STT_OBJECT   1
#define STT_SECTION   3
#define STT_SECTION   3

Typedefs

typedef uint32_t elf32_addr
 32-bit ELF data types.
typedef uint32_t elf32_addr
 32-bit ELF data types.
typedef uint32_t elf32_off
typedef uint32_t elf32_off
typedef uint64_t elf64_addr
 64-bit ELF data types.
typedef uint64_t elf64_addr
 64-bit ELF data types.
typedef uint64_t elf64_off
typedef uint64_t elf64_off
typedef uint16_t elf_half
typedef uint16_t elf_half
typedef int32_t elf_sword
typedef int32_t elf_sword
typedef int64_t elf_sxword
typedef int64_t elf_sxword
typedef uint32_t elf_word
typedef uint32_t elf_word
typedef uint64_t elf_xword
 ELF data types.
typedef uint64_t elf_xword
 ELF data types.

Enumerations

enum  eld_flags_t { ELDF_RW = 1 }
enum  qualifier_t
 Enumeration of possible arguments types.

Functions

void elf_create_pcb (elf_info_t *info, pcb_t *pcb)
 Create the program control block (PCB).
char * elf_error (unsigned int rc)
 Print error message according to error code.
static unsigned int elf_load (elf_ld_t *elf, size_t so_bias)
 Load an ELF binary.
int elf_load_file (const char *file_name, size_t so_bias, eld_flags_t flags, elf_info_t *info)
 Load ELF binary from a file.
static unsigned int fnzb (size_t arg)
static unsigned int fnzb32 (uint32_t arg)
 Return position of first non-zero bit from left (i.e.
static unsigned int fnzb64 (uint64_t arg)
static int load_segment (elf_ld_t *elf, elf_segment_header_t *entry)
 Load segment described by program header entry.
static int my_read (int fd, void *buf, size_t len)
 Read until the buffer is read in its entirety.
static int print_char (const char ch, int width, uint32_t flags, printf_spec_t *ps)
 Print one formatted ASCII character.
static int print_number (uint64_t num, int width, int precision, int base, uint32_t flags, printf_spec_t *ps)
 Print a number in a given base.
static int print_str (char *str, int width, unsigned int precision, uint32_t flags, printf_spec_t *ps)
 Print string.
static int print_wchar (const wchar_t ch, int width, uint32_t flags, printf_spec_t *ps)
 Print one formatted wide character.
static int print_wstr (wchar_t *str, int width, unsigned int precision, uint32_t flags, printf_spec_t *ps)
 Print wide string.
int printf_core (const char *fmt, printf_spec_t *ps, va_list ap)
 Print formatted string.
static int printf_putchar (const char ch, printf_spec_t *ps)
 Print one ASCII character.
static int printf_putnchars (const char *buf, size_t size, printf_spec_t *ps)
 Print one or more characters without adding newline.
static int printf_putstr (const char *str, printf_spec_t *ps)
 Print string without adding a newline.
static int printf_putwchar (const wchar_t ch, printf_spec_t *ps)
 Print one wide character.
static int printf_wputnchars (const wchar_t *buf, size_t size, printf_spec_t *ps)
 Print one or more wide characters without adding newline.
static int section_header (elf_ld_t *elf, elf_section_header_t *entry)
 Process section header.
static int segment_header (elf_ld_t *elf, elf_segment_header_t *entry)
 Process segment header.

Variables

static const char * digits_big = "0123456789ABCDEF"
static const char * digits_small = "0123456789abcdef"
static const char * error_codes []
static const char invalch = U_SPECIAL
static const char * nullstr = "(NULL)"

Define Documentation

#define PRINT_NUMBER_BUFFER_SIZE   (64 + 5)

Buffer big enough for 64-bit number printed in base 2, sign, prefix and 0 to terminate string.

.. (last one is only for better testing end of buffer by zero-filling subroutine)

Definition at line 74 of file printf_core.c.


Typedef Documentation

typedef uint32_t elf32_addr

32-bit ELF data types.

These types are specific for 32-bit format.

Definition at line 208 of file elf.h.

typedef uint32_t elf32_addr

32-bit ELF data types.

These types are specific for 32-bit format.

Definition at line 213 of file elf.h.

typedef uint64_t elf64_addr

64-bit ELF data types.

These types are specific for 64-bit format.

Definition at line 216 of file elf.h.

typedef uint64_t elf64_addr

64-bit ELF data types.

These types are specific for 64-bit format.

Definition at line 221 of file elf.h.

typedef uint64_t elf_xword

ELF data types.

These types are found to be identical in both 32-bit and 64-bit ELF object file specifications. They are the only types used in ELF header.

Definition at line 197 of file elf.h.

typedef uint64_t elf_xword

ELF data types.

These types are found to be identical in both 32-bit and 64-bit ELF object file specifications. They are the only types used in ELF header.

Definition at line 202 of file elf.h.


Enumeration Type Documentation

enum eld_flags_t

Enumerator:
ELDF_RW  Leave all segments in RW access mode.

Definition at line 45 of file elf_load.h.


Function Documentation

void elf_create_pcb ( elf_info_t info,
pcb_t pcb 
)

Create the program control block (PCB).

Fills the program control block pcb with information from info.

Parameters:
info Program info structure
Returns:
EOK on success or negative error code

Definition at line 138 of file elf_load.c.

const char * elf_error ( unsigned int  rc  ) 

Print error message according to error code.

Parameters:
rc Return code returned by elf_load().
Returns:
NULL terminated description of error.

Definition at line 272 of file elf_load.c.

static unsigned int elf_load ( elf_ld_t elf,
size_t  so_bias 
) [static]

Load an ELF binary.

The elf structure contains the loader state, including an open file, from which the binary will be loaded, a pointer to the info structure etc.

Parameters:
elf Pointer to loader state buffer.
so_bias Bias to use if the file is a shared object.
Returns:
EE_OK on success or EE_xx error code.

Definition at line 156 of file elf_load.c.

int elf_load_file ( const char *  file_name,
size_t  so_bias,
eld_flags_t  flags,
elf_info_t info 
)

Load ELF binary from a file.

Load an ELF binary from the specified file. If the file is an executable program, it is loaded unbiased. If it is a shared object, it is loaded with the bias so_bias. Some information extracted from the binary is stored in a elf_info_t structure pointed to by info.

Parameters:
file_name Path to the ELF file.
so_bias Bias to use if the file is a shared object.
info Pointer to a structure for storing information extracted from the binary.
Returns:
EOK on success or negative error code.

Definition at line 105 of file elf_load.c.

static unsigned int fnzb32 ( uint32_t  arg  )  [inline, static]

Return position of first non-zero bit from left (i.e.

[log_2(arg)]).

If number is zero, it returns 0

Definition at line 45 of file bitops.h.

int load_segment ( elf_ld_t elf,
elf_segment_header_t *  entry 
) [static]

Load segment described by program header entry.

Parameters:
elf Loader state.
entry Program header entry describing segment to be loaded.
Returns:
EE_OK on success, error code otherwise.

Definition at line 327 of file elf_load.c.

static int print_char ( const char  ch,
int  width,
uint32_t  flags,
printf_spec_t ps 
) [static]

Print one formatted ASCII character.

Parameters:
ch Character to print.
width Width modifier.
flags Flags that change the way the character is printed.
Returns:
Number of characters printed, negative value on failure.

Definition at line 182 of file printf_core.c.

static int print_number ( uint64_t  num,
int  width,
int  precision,
int  base,
uint32_t  flags,
printf_spec_t ps 
) [static]

Print a number in a given base.

Print significant digits of a number in given base.

Parameters:
num Number to print.
width Width modifier.
precision Precision modifier.
base Base to print the number in (must be between 2 and 16).
flags Flags that modify the way the number is printed.
Returns:
Number of characters printed.

Definition at line 357 of file printf_core.c.

static int print_str ( char *  str,
int  width,
unsigned int  precision,
uint32_t  flags,
printf_spec_t ps 
) [static]

Print string.

Parameters:
str String to be printed.
width Width modifier.
precision Precision modifier.
flags Flags that modify the way the string is printed.
Returns:
Number of characters printed, negative value on failure.

Definition at line 258 of file printf_core.c.

static int print_wchar ( const wchar_t  ch,
int  width,
uint32_t  flags,
printf_spec_t ps 
) [static]

Print one formatted wide character.

Parameters:
ch Character to print.
width Width modifier.
flags Flags that change the way the character is printed.
Returns:
Number of characters printed, negative value on failure.

Definition at line 220 of file printf_core.c.

static int print_wstr ( wchar_t *  str,
int  width,
unsigned int  precision,
uint32_t  flags,
printf_spec_t ps 
) [static]

Print wide string.

Parameters:
str Wide string to be printed.
width Width modifier.
precision Precision modifier.
flags Flags that modify the way the string is printed.
Returns:
Number of wide characters printed, negative value on failure.

Definition at line 306 of file printf_core.c.

int printf_core ( const char *  fmt,
printf_spec_t ps,
va_list  ap 
)

Print formatted string.

Print string formatted according to the fmt parameter and variadic arguments. Each formatting directive must have the following form:

% [ FLAGS ] [ WIDTH ] [ .PRECISION ] [ TYPE ] CONVERSION

FLAGS:

WIDTH:

PRECISION:

TYPE:

CONVERSION:

All other characters from fmt except the formatting directives are printed verbatim.

Parameters:
fmt Format NULL-terminated string.
Returns:
Number of characters printed, negative value on failure.

Definition at line 599 of file printf_core.c.

static int printf_putchar ( const char  ch,
printf_spec_t ps 
) [static]

Print one ASCII character.

Parameters:
c ASCII character to be printed.
ps Output method.
Returns:
Number of characters printed.

Definition at line 149 of file printf_core.c.

static int printf_putnchars ( const char *  buf,
size_t  size,
printf_spec_t ps 
) [static]

Print one or more characters without adding newline.

Parameters:
buf Buffer holding characters with size of at least size bytes. NULL is not allowed!
size Size of the buffer in bytes.
ps Output method and its data.
Returns:
Number of characters printed.

Definition at line 103 of file printf_core.c.

static int printf_putstr ( const char *  str,
printf_spec_t ps 
) [static]

Print string without adding a newline.

Parameters:
str String to print.
ps Write function specification and support data.
Returns:
Number of characters printed.

Definition at line 133 of file printf_core.c.

static int printf_putwchar ( const wchar_t  ch,
printf_spec_t ps 
) [static]

Print one wide character.

Parameters:
c Wide character to be printed.
ps Output method.
Returns:
Number of characters printed.

Definition at line 165 of file printf_core.c.

static int printf_wputnchars ( const wchar_t *  buf,
size_t  size,
printf_spec_t ps 
) [static]

Print one or more wide characters without adding newline.

Parameters:
buf Buffer holding wide characters with size of at least size bytes. NULL is not allowed!
size Size of the buffer in bytes.
ps Output method and its data.
Returns:
Number of wide characters printed.

Definition at line 119 of file printf_core.c.

static int section_header ( elf_ld_t elf,
elf_section_header_t *  entry 
) [static]

Process section header.

Parameters:
elf Loader state.
entry Segment header.
Returns:
EE_OK on success, error code otherwise.

Definition at line 454 of file elf_load.c.

static int segment_header ( elf_ld_t elf,
elf_segment_header_t *  entry 
) [static]

Process segment header.

Parameters:
entry Segment header.
Returns:
EE_OK on success, error code otherwise.

Definition at line 285 of file elf_load.c.


Generated on Thu Jun 2 07:45:57 2011 for HelenOS/USB by  doxygen 1.4.7