support prelinked binaries

This commit is contained in:
Søren Sandmann Pedersen
2004-04-28 15:08:22 +00:00
parent a0b578bba5
commit 7e5c6cbca4
4 changed files with 32 additions and 3 deletions

View File

@ -24,6 +24,7 @@ struct BinFile
int n_symbols; int n_symbols;
Symbol *symbols; Symbol *symbols;
Symbol undefined; Symbol undefined;
gulong address;
}; };
static bfd * static bfd *
@ -277,6 +278,7 @@ read_symbols (BinFile *bf)
int i; int i;
bfd *bfd; bfd *bfd;
GArray *symbols; GArray *symbols;
asection *sec;
bf->symbols = NULL; bf->symbols = NULL;
bf->n_symbols = 0; bf->n_symbols = 0;
@ -299,6 +301,16 @@ read_symbols (BinFile *bf)
if (!bfd_symbols) if (!bfd_symbols)
return; 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"); text_section = bfd_get_section_by_name (bfd, ".text");
if (!text_section) if (!text_section)
return; return;
@ -362,6 +374,12 @@ bin_file_free (BinFile *bf)
g_free (bf); g_free (bf);
} }
gulong
bin_file_get_load_address (BinFile *bf)
{
return bf->address;
}
const Symbol * const Symbol *
bin_file_lookup_symbol (BinFile *bf, bin_file_lookup_symbol (BinFile *bf,
gulong address) gulong address)

View File

@ -12,6 +12,7 @@ BinFile * bin_file_new (const char *filename);
void bin_file_free (BinFile *bin_file); void bin_file_free (BinFile *bin_file);
const Symbol *bin_file_lookup_symbol (BinFile *bin_file, const Symbol *bin_file_lookup_symbol (BinFile *bin_file,
gulong address); gulong address);
gulong bin_file_get_load_address (BinFile *bf);
/* Symbol */ /* Symbol */
struct Symbol struct Symbol

View File

@ -48,6 +48,8 @@ initialize (void)
static gboolean static gboolean
should_offset (const char *filename, int pid) should_offset (const char *filename, int pid)
{ {
return FALSE;
gboolean result = TRUE; gboolean result = TRUE;
struct stat stat1, stat2; struct stat stat1, stat2;
@ -266,11 +268,18 @@ process_lookup_symbol (Process *process, gulong address)
return &undefined; return &undefined;
} }
/* if (map->do_offset)
address -= map->start;
*/
if (!map->bin_file) if (!map->bin_file)
map->bin_file = bin_file_new (map->filename); map->bin_file = bin_file_new (map->filename);
if (map->do_offset) /* FIXME - this seems to work with prelinked binaries, but is
address -= map->start; * 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); result = bin_file_lookup_symbol (map->bin_file, address);
return result; return result;

View File

@ -119,7 +119,8 @@ on_read (gpointer data)
filename = trace.filename; filename = trace.filename;
for (i = 0; i < trace.n_addresses; ++i) 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); g_assert (!app->generating_profile);
stack_stash_add_trace ( stack_stash_add_trace (