diff --git a/binfile.c b/binfile.c index f898966c..64a5b334 100644 --- a/binfile.c +++ b/binfile.c @@ -24,6 +24,7 @@ struct BinFile int n_symbols; Symbol *symbols; Symbol undefined; + gulong address; }; static bfd * @@ -277,6 +278,7 @@ read_symbols (BinFile *bf) int i; bfd *bfd; GArray *symbols; + asection *sec; bf->symbols = NULL; bf->n_symbols = 0; @@ -299,6 +301,16 @@ read_symbols (BinFile *bf) if (!bfd_symbols) return; + bf->address = 0xffffffff; + for (sec = bfd->sections; sec != NULL; sec = sec->next) + { + if (sec->flags & SEC_LOAD) + { + if ((gulong)sec->vma < bf->address) + bf->address = sec->vma & ~4095; + } + } + text_section = bfd_get_section_by_name (bfd, ".text"); if (!text_section) return; @@ -362,6 +374,12 @@ bin_file_free (BinFile *bf) g_free (bf); } +gulong +bin_file_get_load_address (BinFile *bf) +{ + return bf->address; +} + const Symbol * bin_file_lookup_symbol (BinFile *bf, gulong address) diff --git a/binfile.h b/binfile.h index 782d6397..4d2a2828 100644 --- a/binfile.h +++ b/binfile.h @@ -12,6 +12,7 @@ BinFile * bin_file_new (const char *filename); void bin_file_free (BinFile *bin_file); const Symbol *bin_file_lookup_symbol (BinFile *bin_file, gulong address); +gulong bin_file_get_load_address (BinFile *bf); /* Symbol */ struct Symbol diff --git a/process.c b/process.c index 76e3c5c1..cdd2e1d9 100644 --- a/process.c +++ b/process.c @@ -48,6 +48,8 @@ initialize (void) static gboolean should_offset (const char *filename, int pid) { + return FALSE; + gboolean result = TRUE; struct stat stat1, stat2; @@ -266,11 +268,18 @@ process_lookup_symbol (Process *process, gulong address) return &undefined; } + /* if (map->do_offset) + address -= map->start; + */ + if (!map->bin_file) map->bin_file = bin_file_new (map->filename); - if (map->do_offset) - address -= map->start; + /* FIXME - this seems to work with prelinked binaries, but is + * it correct? IE., will normal binaries always have a preferred_addres of 0? + */ + address -= map->start; + address += bin_file_get_load_address (map->bin_file); result = bin_file_lookup_symbol (map->bin_file, address); return result; diff --git a/sysprof.c b/sysprof.c index 0b365a6e..e2a7ffc2 100644 --- a/sysprof.c +++ b/sysprof.c @@ -119,7 +119,8 @@ on_read (gpointer data) filename = trace.filename; for (i = 0; i < trace.n_addresses; ++i) - process_ensure_map (process, trace.pid, (gulong)trace.addresses[i]); + process_ensure_map (process, trace.pid, + (gulong)trace.addresses[i]); g_assert (!app->generating_profile); stack_stash_add_trace (