Now only uses the file name instead of the full path as area base name.

Calls set_area_protection() after relocating the images to make them
read-only for real.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10212 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-11-24 18:15:20 +00:00
parent bb59e8a636
commit 983377dc3d
+44 -10
View File
@@ -1,15 +1,14 @@
/* /*
** Copyright 2003-2004, Axel Dörfler, [email protected]. All rights reserved. * Copyright 2003-2004, Axel Dörfler, [email protected].
** Distributed under the terms of the Haiku License. * Distributed under the terms of the MIT License.
*
* Copyright 2002, Manuel J. Petit. All rights reserved.
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/ */
/*
** Copyright 2002, Manuel J. Petit. All rights reserved.
** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License.
*/
// ToDo: this should not really be build with the kernel build rules... // ToDo: this should not really be built with the kernel build rules...
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
# undef _KERNEL_MODE # undef _KERNEL_MODE
#endif #endif
@@ -60,7 +59,7 @@ enum {
RFLAG_RELOCATED = 0x1000, RFLAG_RELOCATED = 0x1000,
RFLAG_PROTECTED = 0x2000, RFLAG_PROTECTED = 0x2000,
RFLAG_INITIALIZED = 0x4000, RFLAG_INITIALIZED = 0x4000,
RFLAG_NEEDAGIRLFRIEND = 0x8000 RFLAG_REMAPPED = 0x8000
}; };
@@ -509,13 +508,45 @@ assert_dynamic_loadable(image_t *image)
} }
/** This function will change the protection of all read-only segments
* to really be read-only.
* The areas have to be read/write first, so that they can be relocated.
*/
static void
remap_images(void)
{
image_t *image;
uint32 i;
for (image = gLoadedImages.head; image != NULL; image = image->next) {
for (i = 0; i < image->num_regions; i++) {
if ((image->regions[i].flags & RFLAG_RW) == 0
&& (image->regions[i].flags & RFLAG_REMAPPED) == 0) {
// we only need to do this once, so we remember those we've already mapped
_kern_set_area_protection(image->regions[i].id, B_READ_AREA | B_EXECUTE_AREA);
image->regions[i].flags |= RFLAG_REMAPPED;
}
}
}
}
static bool static bool
map_image(int fd, char const *path, image_t *image, bool fixed) map_image(int fd, char const *path, image_t *image, bool fixed)
{ {
const char *baseName;
uint32 i; uint32 i;
(void)(fd); (void)(fd);
// cut the file name from the path as base name for the created areas
baseName = strrchr(path, '/');
if (baseName != NULL)
baseName++;
else
baseName = path;
for (i = 0; i < image->num_regions; i++) { for (i = 0; i < image->num_regions; i++) {
char regionName[B_OS_NAME_LENGTH]; char regionName[B_OS_NAME_LENGTH];
addr_t loadAddress; addr_t loadAddress;
@@ -528,7 +559,7 @@ map_image(int fd, char const *path, image_t *image, bool fixed)
fixed = false; fixed = false;
snprintf(regionName, sizeof(regionName), "%s_seg%lu%s", snprintf(regionName, sizeof(regionName), "%s_seg%lu%s",
path, i, (image->regions[i].flags & RFLAG_RW) ? "rw" : "ro"); baseName, i, (image->regions[i].flags & RFLAG_RW) ? "rw" : "ro");
if (image->dynamic_ptr && !fixed) { if (image->dynamic_ptr && !fixed) {
/* /*
@@ -1164,6 +1195,8 @@ load_program(char const *path, void **_entry)
} }
init_dependencies(gLoadedImages.head, false); init_dependencies(gLoadedImages.head, false);
remap_images();
// ToDo: once setup_system_time() is fixed, move this one line higher!
*_entry = (void *)(image->entry_point); *_entry = (void *)(image->entry_point);
@@ -1207,6 +1240,7 @@ load_library(char const *path, uint32 flags)
FATAL(!relocateSuccess, "troubles relocating\n"); FATAL(!relocateSuccess, "troubles relocating\n");
} }
remap_images();
init_dependencies(image, true); init_dependencies(image, true);
rld_unlock(); rld_unlock();