aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/bfd-in2.h5
-rw-r--r--bfd/elf32-spu.c1
-rw-r--r--bfd/opncls.c25
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/spu-linux-nat.c15
6 files changed, 53 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 58a7552..312fef6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2006-12-15 Alan Modra <amodra@bigpond.net.au>
+
+ * opncls.c (bfd_openr_iovec): Add "stat" parameter.
+ (struct opncls): Add "stat" field.
+ (opncls_bstat): Call vec->stat.
+ * bfd-in2.h: Regenerate.
+ * elf32-spu.c (spu_elf_open_builtin_lib): Adjust.
+
2006-12-14 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (struct bfd_elf_section_data): Clarify sec_group
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 480b2d7..32eb6c9 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -970,7 +970,10 @@ bfd *bfd_openr_iovec (const char *filename, const char *target,
file_ptr nbytes,
file_ptr offset),
int (*close) (struct bfd *nbfd,
- void *stream));
+ void *stream),
+ int (*stat) (struct bfd *abfd,
+ void *stream,
+ struct stat *sb));
bfd *bfd_openw (const char *filename, const char *target);
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index 5eb0f05..5d0c0f7 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -1090,6 +1090,7 @@ spu_elf_open_builtin_lib (bfd **ovl_bfd, const struct _ovl_stream *stream)
ovl_mgr_open,
(void *) stream,
ovl_mgr_pread,
+ NULL,
NULL);
return *ovl_bfd != NULL;
}
diff --git a/bfd/opncls.c b/bfd/opncls.c
index 4131f9d..4002f5f 100644
--- a/bfd/opncls.c
+++ b/bfd/opncls.c
@@ -384,7 +384,10 @@ SYNOPSIS
file_ptr nbytes,
file_ptr offset),
int (*close) (struct bfd *nbfd,
- void *stream));
+ void *stream),
+ int (*stat) (struct bfd *abfd,
+ void *stream,
+ struct stat *sb));
DESCRIPTION
@@ -411,6 +414,10 @@ DESCRIPTION
<<bfd_close>>. @var{close} either succeeds returning 0, or
fails returning -1 (setting <<bfd_error>>).
+ Calls @var{stat} to fill in a stat structure for bfd_stat,
+ bfd_get_size, and bfd_get_mtime calls. @var{stat} returns 0
+ on success, or returns -1 on failure (setting <<bfd_error>>).
+
If <<bfd_openr_iovec>> returns <<NULL>> then an error has
occurred. Possible errors are <<bfd_error_no_memory>>,
<<bfd_error_invalid_target>> and <<bfd_error_system_call>>.
@@ -423,6 +430,7 @@ struct opncls
file_ptr (*pread) (struct bfd *abfd, void *stream, void *buf,
file_ptr nbytes, file_ptr offset);
int (*close) (struct bfd *abfd, void *stream);
+ int (*stat) (struct bfd *abfd, void *stream, struct stat *sb);
file_ptr where;
};
@@ -485,10 +493,15 @@ opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED)
}
static int
-opncls_bstat (struct bfd *abfd ATTRIBUTE_UNUSED, struct stat *sb)
+opncls_bstat (struct bfd *abfd, struct stat *sb)
{
+ struct opncls *vec = abfd->iostream;
+
memset (sb, 0, sizeof (*sb));
- return 0;
+ if (vec->stat == NULL)
+ return 0;
+
+ return (vec->stat) (abfd, vec->stream, sb);
}
static const struct bfd_iovec opncls_iovec = {
@@ -507,7 +520,10 @@ bfd_openr_iovec (const char *filename, const char *target,
file_ptr nbytes,
file_ptr offset),
int (*close) (struct bfd *nbfd,
- void *stream))
+ void *stream),
+ int (*stat) (struct bfd *abfd,
+ void *stream,
+ struct stat *sb))
{
bfd *nbfd;
const bfd_target *target_vec;
@@ -539,6 +555,7 @@ bfd_openr_iovec (const char *filename, const char *target,
vec->stream = stream;
vec->pread = pread;
vec->close = close;
+ vec->stat = stat;
nbfd->iovec = &opncls_iovec;
nbfd->iostream = vec;
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 049a484..134112a 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2006-12-15 Alan Modra <amodra@bigpond.net.au>
+
+ * spu-linux-nat.c (spu_bfd_iovec_stat): New function.
+ (spu_bfd_open): Adjust bfd_openr_iovec call.
+
2006-12-13 Jim Blandy <jimb@codesourcery.com>
* value.c (value_copy): Copy the full 'location' contents, instead
diff --git a/gdb/spu-linux-nat.c b/gdb/spu-linux-nat.c
index fd3673c..99144b7 100644
--- a/gdb/spu-linux-nat.c
+++ b/gdb/spu-linux-nat.c
@@ -281,6 +281,18 @@ spu_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
return nbytes;
}
+static int
+spu_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
+{
+ /* We don't have an easy way of finding the size of embedded spu
+ images. We could parse the in-memory ELF header and section
+ table to find the extent of the last section but that seems
+ pointless when the size is needed only for checks of other
+ parsed values in dbxread.c. */
+ sb->st_size = INT_MAX;
+ return 0;
+}
+
static bfd *
spu_bfd_open (CORE_ADDR addr)
{
@@ -291,7 +303,8 @@ spu_bfd_open (CORE_ADDR addr)
nbfd = bfd_openr_iovec (xstrdup ("<in-memory>"), "elf32-spu",
spu_bfd_iovec_open, open_closure,
- spu_bfd_iovec_pread, spu_bfd_iovec_close);
+ spu_bfd_iovec_pread, spu_bfd_iovec_close,
+ spu_bfd_iovec_stat);
if (!nbfd)
return NULL;