projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix build breakage from last commit (window-nat.c:windows_create_inferior)
[deliverable/binutils-gdb.git]
/
bfd
/
bfdio.c
diff --git
a/bfd/bfdio.c
b/bfd/bfdio.c
index dab8e88fb23cf2db09a6c6e9f0438084a9c63e1e..792ccdab923a98328f08e41a588190136213502c 100644
(file)
--- a/
bfd/bfdio.c
+++ b/
bfd/bfdio.c
@@
-1,8
+1,6
@@
/* Low-level I/O routines for BFDs.
/* Low-level I/O routines for BFDs.
- Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 1990-2017 Free Software Foundation, Inc.
Written by Cygnus Support.
Written by Cygnus Support.
@@
-43,7
+41,7
@@
#endif
file_ptr
#endif
file_ptr
-real_ftell (FILE *file)
+
_bfd_
real_ftell (FILE *file)
{
#if defined (HAVE_FTELLO64)
return ftello64 (file);
{
#if defined (HAVE_FTELLO64)
return ftello64 (file);
@@
-55,7
+53,7
@@
real_ftell (FILE *file)
}
int
}
int
-real_fseek (FILE *file, file_ptr offset, int whence)
+
_bfd_
real_fseek (FILE *file, file_ptr offset, int whence)
{
#if defined (HAVE_FSEEKO64)
return fseeko64 (file, offset, whence);
{
#if defined (HAVE_FSEEKO64)
return fseeko64 (file, offset, whence);
@@
-84,13
+82,12
@@
close_on_exec (FILE *file)
}
FILE *
}
FILE *
-real_fopen (const char *filename, const char *modes)
+
_bfd_
real_fopen (const char *filename, const char *modes)
{
#ifdef VMS
{
#ifdef VMS
- char vms_modes[4];
char *vms_attr;
char *vms_attr;
- /* On VMS, fopen allows file attributes as option
n
al arguments.
+ /* On VMS, fopen allows file attributes as optional arguments.
We need to use them but we'd better to use the common prototype.
In fopen-vms.h, they are separated from the mode with a comma.
Split here. */
We need to use them but we'd better to use the common prototype.
In fopen-vms.h, they are separated from the mode with a comma.
Split here. */
@@
-158,9
+155,15
@@
DESCRIPTION
. int (*bclose) (struct bfd *abfd);
. int (*bflush) (struct bfd *abfd);
. int (*bstat) (struct bfd *abfd, struct stat *sb);
. int (*bclose) (struct bfd *abfd);
. int (*bflush) (struct bfd *abfd);
. int (*bstat) (struct bfd *abfd, struct stat *sb);
-. {* Just like mmap: (void*)-1 on failure, mmapped address on success. *}
+. {* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
+. mmap parameter, except that LEN and OFFSET do not need to be page
+. aligned. Returns (void *)-1 on failure, mmapped address on success.
+. Also write in MAP_ADDR the address of the page aligned buffer and in
+. MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
+. MAP_LEN to unmap. *}
. void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
. void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
-. int prot, int flags, file_ptr offset);
+. int prot, int flags, file_ptr offset,
+. void **map_addr, bfd_size_type *map_len);
.};
.extern const struct bfd_iovec _bfd_memory_iovec;
.};
.extern const struct bfd_iovec _bfd_memory_iovec;
@@
-179,7
+182,8
@@
bfd_bread (void *ptr, bfd_size_type size, bfd *abfd)
this element. */
if (abfd->arelt_data != NULL)
{
this element. */
if (abfd->arelt_data != NULL)
{
- size_t maxbytes = ((struct areltdata *) abfd->arelt_data)->parsed_size;
+ bfd_size_type maxbytes = arelt_size (abfd);
+
if (abfd->where + size > maxbytes)
{
if (abfd->where >= maxbytes)
if (abfd->where + size > maxbytes)
{
if (abfd->where >= maxbytes)
@@
-227,10
+231,15
@@
bfd_tell (bfd *abfd)
if (abfd->iovec)
{
if (abfd->iovec)
{
+ bfd *parent_bfd = abfd;
ptr = abfd->iovec->btell (abfd);
ptr = abfd->iovec->btell (abfd);
- if (abfd->my_archive)
- ptr -= abfd->origin;
+ while (parent_bfd->my_archive != NULL
+ && !bfd_is_thin_archive (parent_bfd->my_archive))
+ {
+ ptr -= parent_bfd->origin;
+ parent_bfd = parent_bfd->my_archive;
+ }
}
else
ptr = 0;
}
else
ptr = 0;
@@
-281,7
+290,7
@@
bfd_seek (bfd *abfd, file_ptr position, int direction)
if (direction == SEEK_CUR && position == 0)
return 0;
if (direction == SEEK_CUR && position == 0)
return 0;
- if (abfd->
format != bfd_archive && abfd->my_archive == 0
)
+ if (abfd->
my_archive == NULL || bfd_is_thin_archive (abfd->my_archive)
)
{
if (direction == SEEK_SET && (bfd_vma) position == abfd->where)
return 0;
{
if (direction == SEEK_SET && (bfd_vma) position == abfd->where)
return 0;
@@
-302,8
+311,17
@@
bfd_seek (bfd *abfd, file_ptr position, int direction)
}
file_position = position;
}
file_position = position;
- if (direction == SEEK_SET && abfd->my_archive != NULL)
- file_position += abfd->origin;
+ if (direction == SEEK_SET)
+ {
+ bfd *parent_bfd = abfd;
+
+ while (parent_bfd->my_archive != NULL
+ && !bfd_is_thin_archive (parent_bfd->my_archive))
+ {
+ file_position += parent_bfd->origin;
+ parent_bfd = parent_bfd->my_archive;
+ }
+ }
if (abfd->iovec)
result = abfd->iovec->bseek (abfd, file_position, direction);
if (abfd->iovec)
result = abfd->iovec->bseek (abfd, file_position, direction);
@@
-423,23
+441,28
@@
FUNCTION
SYNOPSIS
void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
SYNOPSIS
void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
- int prot, int flags, file_ptr offset);
+ int prot, int flags, file_ptr offset,
+ void **map_addr, bfd_size_type *map_len);
DESCRIPTION
Return mmap()ed region of the file, if possible and implemented.
DESCRIPTION
Return mmap()ed region of the file, if possible and implemented.
+ LEN and OFFSET do not need to be page aligned. The page aligned
+ address and length are written to MAP_ADDR and MAP_LEN.
*/
void *
bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
*/
void *
bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
- int prot, int flags, file_ptr offset)
+ int prot, int flags, file_ptr offset,
+ void **map_addr, bfd_size_type *map_len)
{
void *ret = (void *)-1;
if (abfd->iovec == NULL)
return ret;
{
void *ret = (void *)-1;
if (abfd->iovec == NULL)
return ret;
- return abfd->iovec->bmmap (abfd, addr, len, prot, flags, offset);
+ return abfd->iovec->bmmap (abfd, addr, len, prot, flags, offset,
+ map_addr, map_len);
}
/* Memory file I/O operations. */
}
/* Memory file I/O operations. */
@@
-563,7
+586,7
@@
memory_bclose (struct bfd *abfd)
free (bim);
abfd->iostream = NULL;
free (bim);
abfd->iostream = NULL;
- return
TRUE
;
+ return
0
;
}
static int
}
static int
@@
-586,7
+609,9
@@
memory_bstat (bfd *abfd, struct stat *statbuf)
static void *
memory_bmmap (bfd *abfd ATTRIBUTE_UNUSED, void *addr ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED, int prot ATTRIBUTE_UNUSED,
static void *
memory_bmmap (bfd *abfd ATTRIBUTE_UNUSED, void *addr ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED, int prot ATTRIBUTE_UNUSED,
- int flags ATTRIBUTE_UNUSED, file_ptr offset ATTRIBUTE_UNUSED)
+ int flags ATTRIBUTE_UNUSED, file_ptr offset ATTRIBUTE_UNUSED,
+ void **map_addr ATTRIBUTE_UNUSED,
+ bfd_size_type *map_len ATTRIBUTE_UNUSED)
{
return (void *)-1;
}
{
return (void *)-1;
}
This page took
0.025629 seconds
and
4
git commands to generate.