From fa0a5cd0e867824fdc375da59860db7423d2e054 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 9 Jul 2008 15:17:39 +0000 Subject: [PATCH] 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 --- src/system/kernel/elf.cpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/system/kernel/elf.cpp b/src/system/kernel/elf.cpp index 6fc4c54acc..2c1834a9d9 100644 --- a/src/system/kernel/elf.cpp +++ b/src/system/kernel/elf.cpp @@ -752,11 +752,8 @@ unload_elf_image(struct elf_image_info *image) unregister_elf_image(image); -// TODO: We're leaking memory here. We can't just free those, since in case of -// pre-loaded images they have been allocated by the bootloader via -// kernel_args_malloc(). -// free(image->debug_symbols); -// free((void*)image->debug_string_table); + free(image->debug_symbols); + free((void*)image->debug_string_table); free(image->elf_header); free(image->name); free(image); @@ -897,9 +894,28 @@ insert_preloaded_image(struct preloaded_image *preloadedImage, bool kernel) } else 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->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); preloadedImage->id = image->id;