+2006-11-23 Soren Sandmann <sandmann@daimi.au.dk>
+
+ * process.c (read_maps): Set inode for vdso to 0.
+
+ * binfile.c (read_inode): Return -1 on error, 0 on vdso
+ (bin_file_new): Only read the inode if the file actually exists
+ and is an elf file.
+ (bin_file_check_inode): Return FALSE if there is no file.
+
2006-11-22 Soren Sandmann <sandmann@daimi.au.dk>
* sfile.c (sfile_load): Use GMappedFile instead
ino_t inode;
};
-/* FIXME: error handling */
static ino_t
read_inode (const char *filename)
{
struct stat statbuf;
if (strcmp (filename, "[vdso]") == 0)
+ return (ino_t)0;
+
+ if (stat (filename, &statbuf) < 0)
return (ino_t)-1;
-
- stat (filename, &statbuf);
+
return statbuf.st_ino;
}
{
bf = g_new0 (BinFile, 1);
+ bf->inode_check = FALSE;
+ bf->filename = g_strdup (filename);
+ bf->undefined_name = g_strdup_printf ("In file %s", filename);
+ bf->ref_count = 1;
+
+ g_hash_table_insert (bin_files, bf->filename, bf);
+
if (strcmp (filename, "[vdso]") == 0)
{
gsize length;
else
g_print (" opened the original elf file\n");
#endif
+ bf->inode = read_inode (filename);
}
-
- bf->inode_check = FALSE;
- bf->inode = read_inode (filename);
- bf->filename = g_strdup (filename);
- bf->undefined_name = g_strdup_printf ("In file %s", filename);
- bf->ref_count = 1;
-
- g_hash_table_insert (bin_files, bf->filename, bf);
}
return bf;
if (bin_file->inode == inode)
return TRUE;
+ if (!bin_file->elf)
+ return FALSE;
+
if (!bin_file->inode_check)
{
g_print ("warning: %s has inode %lld. It should be %lld\n",
{
/* For the vdso, the kernel reports 'offset' as the
* the same as the mapping addres. This doesn't make
- * any sense to me, so we just zero it here.
+ * any sense to me, so we just zero it here. There
+ * is code in binfile.c (read_inode) that returns 0
+ * for [vdso].
*/
map.offset = 0;
- map.inode = -1;
+ map.inode = 0;
}
else
{