00001
00002
00003
00004
00005
00006
00007
00008 #include <utility/elf.h>
00009 #include <utility/string.h>
00010
00011 __BEGIN_SYS
00012
00013 int ELF::load_segment(int i, void * addr)
00014 {
00015 if((i > segments()) || (segment_type(i) != PT_LOAD))
00016 return -1;
00017
00018 void * src = ((char *) this) + seg(i)->p_offset;
00019 void * dst = (addr)? addr : segment_address(i);
00020
00021 memcpy(dst, src, seg(i)->p_filesz);
00022 memset((char *)dst + seg(i)->p_filesz, 0,
00023 seg(i)->p_memsz - seg(i)->p_filesz);
00024
00025 return seg(i)->p_memsz;
00026 }
00027
00028 __END_SYS
00029