8 void load_elf(const char* buf
, size_t size
, loader_t
* loader
)
10 demand(size
>= sizeof(Elf64_Ehdr
), "truncated ELF!");
11 const Elf64_Ehdr
* eh
= (const Elf64_Ehdr
*)buf
;
13 const uint32_t* magic
= (const uint32_t*)eh
->e_ident
;
14 demand(*magic
== *(const uint32_t*)ELFMAG
, "not a host-endian ELF!");
15 demand(size
>= eh
->e_phoff
+ eh
->e_phnum
*sizeof(Elf64_Phdr
), "bad ELF!");
16 const Elf64_Phdr
* phs
= (const Elf64_Phdr
*)(buf
+eh
->e_phoff
);
18 for(int i
= 0; i
< eh
->e_phnum
; i
++)
20 const Elf64_Phdr
* ph
= &phs
[i
];
21 if(ph
->p_type
== SHT_PROGBITS
&& ph
->p_memsz
)
23 demand(size
>= ph
->p_offset
+ ph
->p_filesz
, "truncated ELF!");
24 demand(ph
->p_memsz
>= ph
->p_filesz
, "bad ELF!");
26 loader
->write(ph
->p_vaddr
, ph
->p_filesz
, buf
+ ph
->p_offset
);
27 loader
->write(ph
->p_vaddr
+ ph
->p_filesz
, ph
->p_memsz
- ph
->p_filesz
);
32 void load_elf(const char* fn
, loader_t
* loader
)
34 int fd
= open(fn
, O_RDONLY
);
35 demand(fd
!= -1, "couldn't open %s", fn
);
38 demand(fstat(fd
,&s
) != -1, "couldn't stat %s", fn
);
40 char* addr
= (char*)mmap(NULL
, s
.st_size
, PROT_READ
, MAP_PRIVATE
, fd
, 0);
41 demand(addr
!= MAP_FAILED
, "couldn't mmap %s", fn
);
45 load_elf(addr
, s
.st_size
, loader
);