Deal with address offsets. Address lookup is now:

2006-10-07  Soren Sandmann  <sandmann@daimi.au.dk>

	Deal with address offsets. Address lookup is now:

	- First convert the address to an offset into the file
	- Then convert to an offset into the text segment
	- Then add the load address of the text segment (found in the
	debug binary)
	- Then finally lookup the result in the symbol table.

	* elfparser.c (elf_parser_get_text_offset): New function

	* elfparser.c (elf_parser_lookup_symbol): Treat addresses as
	offsets into the text segment.

	* binfile.c (bin_file_new): Store the offset of the text section
	of the actual binary (not the debug one)

	(bin_file_lookup_symbol): Subtract text_offset before passing
	address to elf parser.

	* module/sysprof-module.c: Remove include of linux/config.h
This commit is contained in:
Soren Sandmann
2006-10-08 04:03:02 +00:00
committed by Søren Sandmann Pedersen
parent 6a7178f612
commit 52274fadd6
7 changed files with 162 additions and 11 deletions

View File

@ -46,6 +46,8 @@ struct BinFile
ino_t inode;
char * undefined_name;
gulong text_offset;
};
/* FIXME: error handling */
@ -154,6 +156,13 @@ bin_file_new (const char *filename)
{
bf = g_new0 (BinFile, 1);
bf->elf = elf_parser_new (filename, NULL);
/* We need the text offset of the actual binary, not the
* (potential) debug binary
*/
if (bf->elf)
bf->text_offset = elf_parser_get_text_offset (bf->elf);
bf->elf = find_separate_debug_file (bf->elf, filename);
bf->inode = read_inode (filename);
bf->filename = g_strdup (filename);
@ -188,10 +197,16 @@ bin_file_lookup_symbol (BinFile *bin_file,
{
if (bin_file->elf)
{
address -= bin_file->text_offset;
const ElfSym *sym = elf_parser_lookup_symbol (bin_file->elf, address);
if (sym)
{
g_print ("found %lx => %s\n", address, bin_symbol_get_name (bin_file, sym));
return (const BinSymbol *)sym;
}
}
return (const BinSymbol *)bin_file->undefined_name;