Added debug_get_symbol_iterator_image_info() to get an image_info from a

symbol iterator.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30168 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2009-04-15 13:30:14 +00:00
parent 0e9ddc9350
commit 39df634176
4 changed files with 69 additions and 82 deletions

View File

@ -39,7 +39,6 @@ Image::~Image()
SymbolTableBasedImage::SymbolTableBasedImage()
:
fInfo(),
fLoadDelta(0),
fSymbolTable(NULL),
fStringTable(NULL),
@ -54,34 +53,6 @@ SymbolTableBasedImage::~SymbolTableBasedImage()
}
image_id
SymbolTableBasedImage::ID() const
{
return fInfo.id;
}
const char*
SymbolTableBasedImage::Name() const
{
return fInfo.name;
}
addr_t
SymbolTableBasedImage::TextAddress() const
{
return (addr_t)fInfo.text;
}
size_t
SymbolTableBasedImage::TextSize() const
{
return fInfo.text_size;
}
const Elf32_Sym*
SymbolTableBasedImage::LookupSymbol(addr_t address, addr_t* _baseAddress,
const char** _symbolName, size_t *_symbolNameLen, bool *_exactMatch) const
@ -205,7 +176,10 @@ ImageFile::Init(const image_info& info)
// load the file
addr_t textAddress;
size_t textSize;
status_t error = _LoadFile(info.name, &textAddress, &textSize);
addr_t dataAddress;
size_t dataSize;
status_t error = _LoadFile(info.name, &textAddress, &textSize, &dataAddress,
&dataSize);
if (error != B_OK)
return error;
@ -222,15 +196,27 @@ ImageFile::Init(const char* path)
// load the file
addr_t textAddress;
size_t textSize;
status_t error = _LoadFile(path, &textAddress, &textSize);
addr_t dataAddress;
size_t dataSize;
status_t error = _LoadFile(path, &textAddress, &textSize, &dataAddress,
&dataSize);
if (error != B_OK)
return error;
// init the image info -- at least the part we use
// init the image info
fInfo.id = -1;
fInfo.type = B_LIBRARY_IMAGE;
fInfo.sequence = 0;
fInfo.init_order = 0;
fInfo.init_routine = 0;
fInfo.term_routine = 0;
fInfo.device = -1;
fInfo.node = -1;
strlcpy(fInfo.name, path, sizeof(fInfo.name));
fInfo.text = (void*)textAddress;
fInfo.text = (void*)textAddress;
fInfo.data = (void*)dataAddress;
fInfo.text_size = textSize;
fInfo.data_size = dataSize;
// the image isn't loaded, so no delta
fLoadDelta = 0;
@ -240,7 +226,8 @@ ImageFile::Init(const char* path)
status_t
ImageFile::_LoadFile(const char* path, addr_t* _textAddress, size_t* _textSize)
ImageFile::_LoadFile(const char* path, addr_t* _textAddress, size_t* _textSize,
addr_t* _dataAddress, size_t* _dataSize)
{
// open and stat() the file
fFD = open(path, O_RDONLY);
@ -292,16 +279,23 @@ ImageFile::_LoadFile(const char* path, addr_t* _textAddress, size_t* _textSize)
Elf32_Shdr* sectionHeaders
= (Elf32_Shdr*)(fMappedFile + elfHeader->e_shoff);
// find the first segment -- we need its load address
// find the text and data segment -- we need load address and size
*_textAddress = 0;
*_textSize = 0;
*_dataAddress = 0;
*_dataSize = 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) {
*_textAddress = header->p_vaddr;
*_textSize = header->p_memsz;
break;
if ((header->p_flags & PF_WRITE) == 0) {
*_textAddress = header->p_vaddr;
*_textSize = header->p_memsz;
} else {
*_dataAddress = header->p_vaddr;
*_dataSize = header->p_memsz;
break;
}
}
}

View File

@ -28,10 +28,12 @@ public:
Image();
virtual ~Image();
virtual image_id ID() const = 0;
virtual const char* Name() const = 0;
virtual addr_t TextAddress() const = 0;
virtual size_t TextSize() const = 0;
const image_info& Info() const { return fInfo; }
image_id ID() const { return fInfo.id; }
const char* Name() const { return fInfo.name; }
addr_t TextAddress() const
{ return (addr_t)fInfo.text; }
size_t TextSize() const { return fInfo.text_size; }
virtual const Elf32_Sym* LookupSymbol(addr_t address,
addr_t* _baseAddress,
@ -43,6 +45,9 @@ public:
size_t* _symbolNameLen,
addr_t* _symbolAddress, size_t* _symbolSize,
int32* _symbolType) const = 0;
protected:
image_info fInfo;
};
@ -51,11 +56,6 @@ public:
SymbolTableBasedImage();
virtual ~SymbolTableBasedImage();
virtual image_id ID() const ;
virtual const char* Name() const;
virtual addr_t TextAddress() const;
virtual size_t TextSize() const;
virtual const Elf32_Sym* LookupSymbol(addr_t address,
addr_t* _baseAddress,
const char** _symbolName,
@ -71,7 +71,6 @@ protected:
size_t _SymbolNameLen(const char* symbolName) const;
protected:
image_info fInfo;
addr_t fLoadDelta;
Elf32_Sym* fSymbolTable;
char* fStringTable;
@ -90,7 +89,8 @@ public:
private:
status_t _LoadFile(const char* path,
addr_t* _textAddress, size_t* _textSize);
addr_t* _textAddress, size_t* _textSize,
addr_t* _dataAddress, size_t* _dataSize);
private:
int fFD;

View File

@ -196,11 +196,6 @@ public:
const image_t* image, int32 symbolCount);
virtual ~LoadedImage();
virtual image_id ID() const;
virtual const char* Name() const;
virtual addr_t TextAddress() const;
virtual size_t TextSize() const;
virtual const Elf32_Sym* LookupSymbol(addr_t address,
addr_t* _baseAddress,
const char** _symbolName,
@ -526,6 +521,20 @@ SymbolLookup::LoadedImage::LoadedImage(SymbolLookup* symbolLookup,
fSymbolCount(symbolCount),
fTextDelta(image->regions[0].delta)
{
// init info
fInfo.id = fImage->id;
fInfo.type = fImage->type;
fInfo.sequence = 0;
fInfo.init_order = 0;
fInfo.init_routine = (void (*)())fImage->init_routine;
fInfo.term_routine = (void (*)())fImage->term_routine;
fInfo.device = -1;
fInfo.node = -1;
strlcpy(fInfo.name, fImage->path, sizeof(fInfo.name));
fInfo.text = (void*)fImage->regions[0].vmstart;
fInfo.data = (void*)fImage->regions[1].vmstart;
fInfo.text_size = fImage->regions[0].vmsize;
fInfo.data_size = fImage->regions[1].vmsize;
}
@ -534,34 +543,6 @@ SymbolLookup::LoadedImage::~LoadedImage()
}
image_id
SymbolLookup::LoadedImage::ID() const
{
return fImage->id;
}
const char*
SymbolLookup::LoadedImage::Name() const
{
return fImage->path;
}
addr_t
SymbolLookup::LoadedImage::TextAddress() const
{
return fImage->regions[0].vmstart;
}
size_t
SymbolLookup::LoadedImage::TextSize() const
{
return fImage->regions[0].vmsize;
}
const Elf32_Sym*
SymbolLookup::LoadedImage::LookupSymbol(addr_t address, addr_t* _baseAddress,
const char** _symbolName, size_t *_symbolNameLen, bool *_exactMatch) const

View File

@ -490,3 +490,15 @@ debug_next_image_symbol(debug_symbol_iterator* iterator, char* nameBuffer,
return B_OK;
}
status_t
debug_get_symbol_iterator_image_info(debug_symbol_iterator* iterator,
image_info* info)
{
if (iterator == NULL || iterator->image == NULL || info == NULL)
return B_BAD_VALUE;
*info = iterator->image->Info();
return B_OK;
}