iPXE
Macros | Typedefs | Functions
elf.h File Reference

ELF image format. More...

#include <stdint.h>
#include <ipxe/image.h>
#include <elf.h>

Go to the source code of this file.

Macros

#define ELFCLASS   ELFCLASS32
 

Typedefs

typedef Elf32_Ehdr Elf_Ehdr
 
typedef Elf32_Phdr Elf_Phdr
 
typedef Elf32_Off Elf_Off
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int elf_segments (struct image *image, Elf_Ehdr *ehdr, int(*process)(struct image *image, Elf_Phdr *phdr, physaddr_t dest), physaddr_t *entry, physaddr_t *max)
 Process ELF segments. More...
 
int elf_load (struct image *image, physaddr_t *entry, physaddr_t *max)
 Load ELF image into memory. More...
 

Detailed Description

ELF image format.

Definition in file elf.h.

Macro Definition Documentation

◆ ELFCLASS

#define ELFCLASS   ELFCLASS32

Definition at line 20 of file elf.h.

Typedef Documentation

◆ Elf_Ehdr

Definition at line 17 of file elf.h.

◆ Elf_Phdr

Definition at line 18 of file elf.h.

◆ Elf_Off

typedef Elf32_Off Elf_Off

Definition at line 19 of file elf.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ elf_segments()

int elf_segments ( struct image image,
Elf_Ehdr ehdr,
int(*)(struct image *image, Elf_Phdr *phdr, physaddr_t dest process,
physaddr_t entry,
physaddr_t max 
)

Process ELF segments.

Parameters
imageELF file
ehdrELF executable header
processSegment processor
Return values
entryEntry point, if found
maxMaximum used address
rcReturn status code

Definition at line 154 of file elf.c.

157  {
158  Elf_Phdr phdr;
159  Elf_Off phoff;
160  unsigned int phnum;
161  int rc;
162 
163  /* Initialise maximum used address */
164  *max = 0;
165 
166  /* Invalidate entry point */
167  *entry = 0;
168 
169  /* Read and process ELF program headers */
170  for ( phoff = ehdr->e_phoff , phnum = ehdr->e_phnum ; phnum ;
171  phoff += ehdr->e_phentsize, phnum-- ) {
172  if ( phoff > image->len ) {
173  DBGC ( image, "ELF %p program header %d outside "
174  "image\n", image, phnum );
175  return -ENOEXEC;
176  }
177  copy_from_user ( &phdr, image->data, phoff, sizeof ( phdr ) );
178  if ( ( rc = elf_segment ( image, ehdr, &phdr, process,
179  entry, max ) ) != 0 )
180  return rc;
181  }
182 
183  /* Check for a valid execution address */
184  if ( ! *entry ) {
185  DBGC ( image, "ELF %p entry point %lx outside image\n",
186  image, ( ( unsigned long ) ehdr->e_entry ) );
187  return -ENOEXEC;
188  }
189 
190  return 0;
191 }
A process.
Definition: process.h:17
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
userptr_t data
Raw file image.
Definition: image.h:41
#define max(x, y)
Definition: ath.h:39
#define ENOEXEC
Exec format error.
Definition: errno.h:519
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
Definition: uaccess.h:337
#define DBGC(...)
Definition: compiler.h:505
Elf32_Half e_phentsize
Definition: elf.h:35
An executable image.
Definition: image.h:24
Elf32_Off e_phoff
Definition: elf.h:31
union aes_table_entry entry[256]
Table entries, indexed by S(N)
Definition: aes.c:26
size_t len
Length of raw file image.
Definition: image.h:43
Elf32_Addr e_entry
Definition: elf.h:30
static int elf_segment(struct image *image, Elf_Ehdr *ehdr, Elf_Phdr *phdr, int(*process)(struct image *image, Elf_Phdr *phdr, physaddr_t dest), physaddr_t *entry, physaddr_t *max)
Process ELF segment.
Definition: elf.c:85
Elf32_Half e_phnum
Definition: elf.h:36
Elf32_Off Elf_Off
Definition: elf.h:19
ELF program header.
Definition: elf.h:67

References copy_from_user(), image::data, DBGC, Elf32_Ehdr::e_entry, Elf32_Ehdr::e_phentsize, Elf32_Ehdr::e_phnum, Elf32_Ehdr::e_phoff, elf_segment(), ENOEXEC, entry, image::len, max, and rc.

Referenced by elf_load(), and elfboot_probe().

◆ elf_load()

int elf_load ( struct image image,
physaddr_t entry,
physaddr_t max 
)

Load ELF image into memory.

Parameters
imageELF file
Return values
entryEntry point
maxMaximum used address
rcReturn status code

Definition at line 201 of file elf.c.

201  {
202  static const uint8_t e_ident[] = {
203  [EI_MAG0] = ELFMAG0,
204  [EI_MAG1] = ELFMAG1,
205  [EI_MAG2] = ELFMAG2,
206  [EI_MAG3] = ELFMAG3,
207  [EI_CLASS] = ELFCLASS,
208  };
209  Elf_Ehdr ehdr;
210  int rc;
211 
212  /* Read ELF header */
213  copy_from_user ( &ehdr, image->data, 0, sizeof ( ehdr ) );
214  if ( memcmp ( &ehdr.e_ident[EI_MAG0], e_ident,
215  sizeof ( e_ident ) ) != 0 ) {
216  DBGC ( image, "ELF %p has invalid signature\n", image );
217  return -ENOEXEC;
218  }
219 
220  /* Load ELF segments into memory */
221  if ( ( rc = elf_segments ( image, &ehdr, elf_load_segment,
222  entry, max ) ) != 0 )
223  return rc;
224 
225  return 0;
226 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
ELF header.
Definition: elf.h:25
userptr_t data
Raw file image.
Definition: image.h:41
#define max(x, y)
Definition: ath.h:39
#define ELFMAG1
Definition: elf.h:53
#define ENOEXEC
Exec format error.
Definition: errno.h:519
static __always_inline void copy_from_user(void *dest, userptr_t src, off_t src_off, size_t len)
Copy data from user buffer.
Definition: uaccess.h:337
static int elf_load_segment(struct image *image, Elf_Phdr *phdr, physaddr_t dest)
Load ELF segment into memory.
Definition: elf.c:51
#define DBGC(...)
Definition: compiler.h:505
An executable image.
Definition: image.h:24
#define ELFMAG2
Definition: elf.h:54
unsigned char e_ident[EI_NIDENT]
Definition: elf.h:26
#define EI_MAG2
Definition: elf.h:45
union aes_table_entry entry[256]
Table entries, indexed by S(N)
Definition: aes.c:26
#define ELFCLASS
Definition: elf.h:20
unsigned char uint8_t
Definition: stdint.h:10
int elf_segments(struct image *image, Elf_Ehdr *ehdr, int(*process)(struct image *image, Elf_Phdr *phdr, physaddr_t dest), physaddr_t *entry, physaddr_t *max)
Process ELF segments.
Definition: elf.c:154
#define EI_CLASS
Definition: elf.h:47
#define ELFMAG3
Definition: elf.h:55
#define EI_MAG3
Definition: elf.h:46
#define ELFMAG0
Definition: elf.h:52
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:98
#define EI_MAG1
Definition: elf.h:44
#define EI_MAG0
Definition: elf.h:43

References copy_from_user(), image::data, DBGC, Elf32_Ehdr::e_ident, EI_CLASS, EI_MAG0, EI_MAG1, EI_MAG2, EI_MAG3, elf_load_segment(), elf_segments(), ELFCLASS, ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, ENOEXEC, entry, max, memcmp(), and rc.

Referenced by elfboot_exec(), and multiboot_load_elf().