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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user