From 4e3480c6166509ee5f14deba7ed5d53cd1907558 Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Sat, 4 Sep 2004 19:02:17 +0000 Subject: [PATCH] Fixed rare bug in the user space loader where it would decide to create an extra region to map the file but with bogus values. The line between .data and .bss would have to be perfectly page aligned for it to happen. git-svn-id: svn+ssh://newos.org/var/svn/newos/newos@1119 c25cc9d1-44fa-0310-b259-ad778cb1d433 --- apps/rld/rld0.c | 6 +++--- apps/rld/rldelf.c | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/rld/rld0.c b/apps/rld/rld0.c index 990b8ec..b3fa659 100644 --- a/apps/rld/rld0.c +++ b/apps/rld/rld0.c @@ -9,9 +9,9 @@ int RLD_STARTUP(void *args) { #if DEBUG_RLD - sys_close(0); open("/dev/dprint", 0); /* stdin */ - sys_close(1); open("/dev/dprint", 0); /* stdout */ - sys_close(2); open("/dev/dprint", 0); /* stderr */ + _kern_close(0); _kern_open("/dev/dprint", 0); /* stdin */ + _kern_close(1); _kern_open("/dev/dprint", 0); /* stdout */ + _kern_close(2); _kern_open("/dev/dprint", 0); /* stderr */ #endif return rldmain(args); } diff --git a/apps/rld/rldelf.c b/apps/rld/rldelf.c index a8b569d..9a71727 100644 --- a/apps/rld/rldelf.c +++ b/apps/rld/rldelf.c @@ -247,7 +247,7 @@ count_regions(char const *buff, int phnum, int phentsize) case PT_LOAD: retval+= 1; if(pheaders->p_memsz!= pheaders->p_filesz) { - unsigned A= pheaders->p_vaddr+pheaders->p_memsz; + unsigned A= pheaders->p_vaddr+pheaders->p_memsz-1; unsigned B= pheaders->p_vaddr+pheaders->p_filesz-1; A= PAGE_BASE(A); @@ -367,7 +367,7 @@ parse_program_headers(image_t *image, char *buff, int phnum, int phentsize) /* * may require splitting */ - unsigned A= pheaders->p_vaddr+pheaders->p_memsz; + unsigned A= pheaders->p_vaddr+pheaders->p_memsz-1; unsigned B= pheaders->p_vaddr+pheaders->p_filesz-1; A= PAGE_BASE(A); @@ -494,6 +494,10 @@ map_image(int fd, char const *path, image_t *image, bool fixed) } if(image->regions[i].flags & RFLAG_ANON) { +#if DEBUG_RLD + printf("rld map_image: creating anon region: name '%s' address 0x%x specifier 0x%x size 0x%x\n", + region_name, load_address, addr_specifier, image->regions[i].vmsize); +#endif image->regions[i].id= _kern_vm_create_anonymous_region( region_name, (void **)&load_address, @@ -504,11 +508,17 @@ map_image(int fd, char const *path, image_t *image, bool fixed) ); if(image->regions[i].id < 0) { + printf("rld map_image: err %d from create_anon_region\n", image->regions[i].id); goto error; } image->regions[i].delta = load_address - image->regions[i].vmstart; image->regions[i].vmstart= load_address; } else { +#if DEBUG_RLD + printf("rld map_image: mapping file: name '%s' address 0x%x specifier 0x%x size 0x%x path '%s' offset 0x%Lx\n", + region_name, load_address, addr_specifier, image->regions[i].vmsize, + path, ROUNDOWN(image->regions[i].fdstart, PAGE_SIZE)); +#endif image->regions[i].id= _kern_vm_map_file( region_name, (void **)&load_address, @@ -520,6 +530,7 @@ map_image(int fd, char const *path, image_t *image, bool fixed) ROUNDOWN(image->regions[i].fdstart, PAGE_SIZE) ); if(image->regions[i].id < 0) { + printf("rld map_image: err %d from map_file (address 0x%x)\n", image->regions[i].id, load_address); goto error; } image->regions[i].delta = load_address - image->regions[i].vmstart; -- 2.11.4.GIT