From e52c3559d3c6e675c66a013d34f6a4523c669885 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Tue, 14 Apr 2009 18:03:24 +0000 Subject: [PATCH] * Renamed debug_delete_image_symbol_iterator() to debug_delete_symbol_iterator(). * Added debug_create_file_symbol_iterator() which opens a shared object file. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30162 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/debug/debug_support.h | 4 ++- src/bin/debug/profile/Image.cpp | 4 +-- src/kits/debug/Image.cpp | 50 +++++++++++++++++++++++++-- src/kits/debug/Image.h | 5 +++ src/kits/debug/debug_support.cpp | 50 ++++++++++++++++++++++++++- 5 files changed, 106 insertions(+), 7 deletions(-) diff --git a/headers/private/debug/debug_support.h b/headers/private/debug/debug_support.h index f2f8c572a6..dabb52de3a 100644 --- a/headers/private/debug/debug_support.h +++ b/headers/private/debug/debug_support.h @@ -70,7 +70,9 @@ status_t debug_lookup_symbol_address(debug_symbol_lookup_context *lookupContext, status_t debug_create_image_symbol_iterator( debug_symbol_lookup_context* lookupContext, image_id imageID, debug_symbol_iterator** _iterator); -void debug_delete_image_symbol_iterator(debug_symbol_iterator* iterator); +status_t debug_create_file_symbol_iterator(const char* path, + debug_symbol_iterator** _iterator); +void debug_delete_symbol_iterator(debug_symbol_iterator* iterator); status_t debug_next_image_symbol(debug_symbol_iterator* iterator, char* nameBuffer, size_t nameBufferLength, int32* _symbolType, diff --git a/src/bin/debug/profile/Image.cpp b/src/bin/debug/profile/Image.cpp index 1ba956d09a..2d1b051bbf 100644 --- a/src/bin/debug/profile/Image.cpp +++ b/src/bin/debug/profile/Image.cpp @@ -71,13 +71,13 @@ Image::LoadSymbols(debug_symbol_lookup_context* lookupContext) if (symbol == NULL || !symbols.AddItem(symbol)) { delete symbol; fprintf(stderr, "%s: Out of memory\n", kCommandName); - debug_delete_image_symbol_iterator(iterator); + debug_delete_symbol_iterator(iterator); return B_NO_MEMORY; } } } - debug_delete_image_symbol_iterator(iterator); + debug_delete_symbol_iterator(iterator); // sort the symbols fSymbolCount = symbols.CountItems(); diff --git a/src/kits/debug/Image.cpp b/src/kits/debug/Image.cpp index 819ccc680f..2df6158e81 100644 --- a/src/kits/debug/Image.cpp +++ b/src/kits/debug/Image.cpp @@ -199,10 +199,51 @@ ImageFile::~ImageFile() status_t ImageFile::Init(const image_info& info) { + // just copy the image info fInfo = info; + // load the file + addr_t textAddress; + size_t textSize; + status_t error = _LoadFile(info.name, &textAddress, &textSize); + if (error != B_OK) + return error; + + // compute the load delta + fLoadDelta = (addr_t)fInfo.text - textAddress; + + return B_OK; +} + + +status_t +ImageFile::Init(const char* path) +{ + // load the file + addr_t textAddress; + size_t textSize; + status_t error = _LoadFile(path, &textAddress, &textSize); + if (error != B_OK) + return error; + + // init the image info -- at least the part we use + fInfo.id = -1; + strlcpy(fInfo.name, path, sizeof(fInfo.name)); + fInfo.text = (void*)textAddress; + fInfo.text_size = textSize; + + // the image isn't loaded, so no delta + fLoadDelta = 0; + + return B_OK; +} + + +status_t +ImageFile::_LoadFile(const char* path, addr_t* _textAddress, size_t* _textSize) +{ // open and stat() the file - fFD = open(fInfo.name, O_RDONLY); + fFD = open(path, O_RDONLY); if (fFD < 0) return errno; @@ -251,12 +292,15 @@ ImageFile::Init(const image_info& info) Elf32_Shdr* sectionHeaders = (Elf32_Shdr*)(fMappedFile + elfHeader->e_shoff); - // find the first segment -- we need its relative offset + // find the first segment -- we need its load address + *_textAddress = 0; + *_textSize = 0; for (int32 i = 0; i < programHeaderCount; i++) { Elf32_Phdr* header = (Elf32_Phdr*) ((uint8*)programHeaders + i * elfHeader->e_phentsize); if (header->p_type == PT_LOAD) { - fLoadDelta = (addr_t)fInfo.text - header->p_vaddr; + *_textAddress = header->p_vaddr; + *_textSize = header->p_memsz; break; } } diff --git a/src/kits/debug/Image.h b/src/kits/debug/Image.h index 0d2c20033a..0c83fbfa8e 100644 --- a/src/kits/debug/Image.h +++ b/src/kits/debug/Image.h @@ -86,6 +86,11 @@ public: virtual ~ImageFile(); status_t Init(const image_info& info); + status_t Init(const char* path); + +private: + status_t _LoadFile(const char* path, + addr_t* _textAddress, size_t* _textSize); private: int fFD; diff --git a/src/kits/debug/debug_support.cpp b/src/kits/debug/debug_support.cpp index b922413198..84b774e393 100644 --- a/src/kits/debug/debug_support.cpp +++ b/src/kits/debug/debug_support.cpp @@ -23,6 +23,19 @@ struct debug_symbol_lookup_context { }; struct debug_symbol_iterator : BPrivate::Debug::SymbolIterator { + bool ownsImage; + + debug_symbol_iterator() + : + ownsImage(false) + { + } + + ~debug_symbol_iterator() + { + if (ownsImage) + delete image; + } }; @@ -402,8 +415,43 @@ debug_create_image_symbol_iterator(debug_symbol_lookup_context* lookupContext, } +status_t +debug_create_file_symbol_iterator(const char* path, + debug_symbol_iterator** _iterator) +{ + if (path == NULL) + return B_BAD_VALUE; + + // create the iterator + debug_symbol_iterator* iterator = new(std::nothrow) debug_symbol_iterator; + if (iterator == NULL) + return B_NO_MEMORY; + ObjectDeleter iteratorDeleter(iterator); + + // create the image file + ImageFile* imageFile = new(std::nothrow) ImageFile; + if (imageFile == NULL) + return B_NO_MEMORY; + + // init the iterator + iterator->image = imageFile; + iterator->ownsImage = true; + iterator->currentIndex = -1; + + // init the image file + status_t error = imageFile->Init(path); + if (error != B_OK) + return error; + + iteratorDeleter.Detach(); + *_iterator = iterator; + + return B_OK; +} + + void -debug_delete_image_symbol_iterator(debug_symbol_iterator* iterator) +debug_delete_symbol_iterator(debug_symbol_iterator* iterator) { delete iterator; }