summaryrefslogtreecommitdiff
path: root/fs/elf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/elf.c')
-rw-r--r--fs/elf.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/fs/elf.c b/fs/elf.c
index dc5f472..73570d9 100644
--- a/fs/elf.c
+++ b/fs/elf.c
@@ -81,7 +81,7 @@ uint32_t load_elf(char *name, uint32_t *alloc)
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading %s",name);
ext2_check(ext2_ramimage);
- ext2_inode_content(ext2_ramimage,inode_nr,vaddr,0x100000); // load 1mb;
+ ext2_inode_content(ext2_ramimage,inode_nr,vaddr,0x100000); // max ignored??
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"ELF File loaded to final destination.");
@@ -144,15 +144,20 @@ uint32_t load_elf(char *name, uint32_t *alloc)
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
// let's copy the rw- data block
- uint32_t *data=vaddr+phdr->p_offset;
- for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++)
+ // from right to left so we not overwrite ourselves!!
+
+ //for(uint8_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++) // this was wrong!
+ //uint8_t *data=vaddr+phdr->p_offset;
+ uint8_t *data=vaddr+phdr->p_offset+phdr->p_filesz-1;
+
+ for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz-1; addr>=phdr->p_vaddr; addr--)
{
*addr=*data;
- data++;
+ data--;
}
// let's zero init bss and set alloc (heap) just right after it!
- for(uint32_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++)
+ for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++)
{
*addr=0;
}
@@ -162,6 +167,7 @@ uint32_t load_elf(char *name, uint32_t *alloc)
}
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"heap starts at: 0x%08X",*alloc);
return elf->e_entry;