insert_preloaded_image() now copies the debug symbols and string table

over to the kernel heap. This allows us to simply free them in
unload_elf_image(). Now we no longer leak the memory for non-preloaded
images. On my T61 this amounted to more than 10 MB of kernel heap after
booting.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26343 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2008-07-09 15:17:39 +00:00
parent daa861bc29
commit fa0a5cd0e8
+23 -7
View File
@@ -752,11 +752,8 @@ unload_elf_image(struct elf_image_info *image)
unregister_elf_image(image); unregister_elf_image(image);
// TODO: We're leaking memory here. We can't just free those, since in case of free(image->debug_symbols);
// pre-loaded images they have been allocated by the bootloader via free((void*)image->debug_string_table);
// kernel_args_malloc().
// free(image->debug_symbols);
// free((void*)image->debug_string_table);
free(image->elf_header); free(image->elf_header);
free(image->name); free(image->name);
free(image); free(image);
@@ -897,9 +894,28 @@ insert_preloaded_image(struct preloaded_image *preloadedImage, bool kernel)
} else } else
sKernelImage = image; sKernelImage = image;
image->debug_symbols = preloadedImage->debug_symbols; // copy debug symbols to the kernel heap
if (preloadedImage->debug_symbols != NULL) {
int32 debugSymbolsSize = sizeof(Elf32_Sym)
* preloadedImage->num_debug_symbols;
image->debug_symbols = (Elf32_Sym*)malloc(debugSymbolsSize);
if (image->debug_symbols != NULL) {
memcpy(image->debug_symbols, preloadedImage->debug_symbols,
debugSymbolsSize);
}
}
image->num_debug_symbols = preloadedImage->num_debug_symbols; image->num_debug_symbols = preloadedImage->num_debug_symbols;
image->debug_string_table = preloadedImage->debug_string_table;
// copy debug string table to the kernel heap
if (preloadedImage->debug_string_table != NULL) {
image->debug_string_table = (char*)malloc(
preloadedImage->debug_string_table_size);
if (image->debug_string_table != NULL) {
memcpy((void*)image->debug_string_table,
preloadedImage->debug_string_table,
preloadedImage->debug_string_table_size);
}
}
register_elf_image(image); register_elf_image(image);
preloadedImage->id = image->id; preloadedImage->id = image->id;