X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fopncls.c;h=40432000c0abc3cb3984cbc022206efd9f7ab236;hb=9e2278f567e4ddeb7180ef4e0b3b24e4b087d703;hp=799203065ce3a44e98372b139c3458ed6bf300b1;hpb=440ae135a822be30029115ff739e1d0e16a07858;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/opncls.c b/bfd/opncls.c index 799203065c..40432000c0 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -1,6 +1,6 @@ /* opncls.c -- open and close a BFD. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Written by Cygnus Support. @@ -38,9 +38,17 @@ #define S_IXOTH 0001 /* Execute by others. */ #endif -/* Counter used to initialize the bfd identifier. */ +/* Counters used to initialize the bfd identifier. */ -static unsigned int _bfd_id_counter = 0; +static unsigned int bfd_id_counter = 0; +static unsigned int bfd_reserved_id_counter = 0; + +/* +CODE_FRAGMENT +.{* Set to N to open the next N BFDs using an alternate id space. *} +.extern unsigned int bfd_use_reserved_id; +*/ +unsigned int bfd_use_reserved_id = 0; /* fdopen is a loser -- we should use stdio exclusively. Unfortunately if we do that we can't use fcntl. */ @@ -52,11 +60,17 @@ _bfd_new_bfd (void) { bfd *nbfd; - nbfd = bfd_zmalloc (sizeof (bfd)); + nbfd = (bfd *) bfd_zmalloc (sizeof (bfd)); if (nbfd == NULL) return NULL; - nbfd->id = _bfd_id_counter++; + if (bfd_use_reserved_id) + { + nbfd->id = --bfd_reserved_id_counter; + --bfd_use_reserved_id; + } + else + nbfd->id = bfd_id_counter++; nbfd->memory = objalloc_create (); if (nbfd->memory == NULL) @@ -342,7 +356,7 @@ DESCRIPTION bfd * bfd_openstreamr (const char *filename, const char *target, void *streamarg) { - FILE *stream = streamarg; + FILE *stream = (FILE *) streamarg; bfd *nbfd; const bfd_target *target_vec; @@ -376,47 +390,47 @@ FUNCTION SYNOPSIS bfd *bfd_openr_iovec (const char *filename, const char *target, - void *(*open) (struct bfd *nbfd, - void *open_closure), + void *(*open_func) (struct bfd *nbfd, + void *open_closure), void *open_closure, - file_ptr (*pread) (struct bfd *nbfd, - void *stream, - void *buf, - file_ptr nbytes, - file_ptr offset), - int (*close) (struct bfd *nbfd, - void *stream), - int (*stat) (struct bfd *abfd, - void *stream, - struct stat *sb)); + file_ptr (*pread_func) (struct bfd *nbfd, + void *stream, + void *buf, + file_ptr nbytes, + file_ptr offset), + int (*close_func) (struct bfd *nbfd, + void *stream), + int (*stat_func) (struct bfd *abfd, + void *stream, + struct stat *sb)); DESCRIPTION Create and return a BFD backed by a read-only @var{stream}. - The @var{stream} is created using @var{open}, accessed using - @var{pread} and destroyed using @var{close}. + The @var{stream} is created using @var{open_func}, accessed using + @var{pread_func} and destroyed using @var{close_func}. Calls <>, so @var{target} is interpreted as by that function. - Calls @var{open} (which can call <> and + Calls @var{open_func} (which can call <> and <>) to obtain the read-only stream backing - the BFD. @var{open} either succeeds returning the + the BFD. @var{open_func} either succeeds returning the non-<> @var{stream}, or fails returning <> (setting <>). - Calls @var{pread} to request @var{nbytes} of data from + Calls @var{pread_func} to request @var{nbytes} of data from @var{stream} starting at @var{offset} (e.g., via a call to - <>). @var{pread} either succeeds returning the + <>). @var{pread_func} either succeeds returning the number of bytes read (which can be less than @var{nbytes} when end-of-file), or fails returning -1 (setting <>). - Calls @var{close} when the BFD is later closed using - <>. @var{close} either succeeds returning 0, or + Calls @var{close_func} when the BFD is later closed using + <>. @var{close_func} either succeeds returning 0, or fails returning -1 (setting <>). - Calls @var{stat} to fill in a stat structure for bfd_stat, - bfd_get_size, and bfd_get_mtime calls. @var{stat} returns 0 + Calls @var{stat_func} to fill in a stat structure for bfd_stat, + bfd_get_size, and bfd_get_mtime calls. @var{stat_func} returns 0 on success, or returns -1 on failure (setting <>). If <> returns <> then an error has @@ -438,14 +452,14 @@ struct opncls static file_ptr opncls_btell (struct bfd *abfd) { - struct opncls *vec = abfd->iostream; + struct opncls *vec = (struct opncls *) abfd->iostream; return vec->where; } static int opncls_bseek (struct bfd *abfd, file_ptr offset, int whence) { - struct opncls *vec = abfd->iostream; + struct opncls *vec = (struct opncls *) abfd->iostream; switch (whence) { case SEEK_SET: vec->where = offset; break; @@ -458,7 +472,7 @@ opncls_bseek (struct bfd *abfd, file_ptr offset, int whence) static file_ptr opncls_bread (struct bfd *abfd, void *buf, file_ptr nbytes) { - struct opncls *vec = abfd->iostream; + struct opncls *vec = (struct opncls *) abfd->iostream; file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where); if (nread < 0) return nread; @@ -477,7 +491,7 @@ opncls_bwrite (struct bfd *abfd ATTRIBUTE_UNUSED, static int opncls_bclose (struct bfd *abfd) { - struct opncls *vec = abfd->iostream; + struct opncls *vec = (struct opncls *) abfd->iostream; /* Since the VEC's memory is bound to the bfd deleting the bfd will free it. */ int status = 0; @@ -496,7 +510,7 @@ opncls_bflush (struct bfd *abfd ATTRIBUTE_UNUSED) static int opncls_bstat (struct bfd *abfd, struct stat *sb) { - struct opncls *vec = abfd->iostream; + struct opncls *vec = (struct opncls *) abfd->iostream; memset (sb, 0, sizeof (*sb)); if (vec->stat == NULL) @@ -523,19 +537,12 @@ static const struct bfd_iovec opncls_iovec = { bfd * bfd_openr_iovec (const char *filename, const char *target, - void *(*open) (struct bfd *nbfd, - void *open_closure), + void *(*open_p) (struct bfd *, void *), void *open_closure, - file_ptr (*pread) (struct bfd *abfd, - void *stream, - void *buf, - file_ptr nbytes, - file_ptr offset), - int (*close) (struct bfd *nbfd, - void *stream), - int (*stat) (struct bfd *abfd, - void *stream, - struct stat *sb)) + file_ptr (*pread_p) (struct bfd *, void *, void *, + file_ptr, file_ptr), + int (*close_p) (struct bfd *, void *), + int (*stat_p) (struct bfd *, void *, struct stat *)) { bfd *nbfd; const bfd_target *target_vec; @@ -556,19 +563,19 @@ bfd_openr_iovec (const char *filename, const char *target, nbfd->filename = filename; nbfd->direction = read_direction; - /* `open (...)' would get expanded by an the open(2) syscall macro. */ - stream = (*open) (nbfd, open_closure); + /* `open_p (...)' would get expanded by an the open(2) syscall macro. */ + stream = (*open_p) (nbfd, open_closure); if (stream == NULL) { _bfd_delete_bfd (nbfd); return NULL; } - vec = bfd_zalloc (nbfd, sizeof (struct opncls)); + vec = (struct opncls *) bfd_zalloc (nbfd, sizeof (struct opncls)); vec->stream = stream; - vec->pread = pread; - vec->close = close; - vec->stat = stat; + vec->pread = pread_p; + vec->close = close_p; + vec->stat = stat_p; nbfd->iovec = &opncls_iovec; nbfd->iostream = vec; @@ -635,7 +642,7 @@ _maybe_make_executable (bfd * abfd) /* If the file was open for writing and is now executable, make it so. */ if (abfd->direction == write_direction - && abfd->flags & EXEC_P) + && (abfd->flags & (EXEC_P | DYNAMIC)) != 0) { struct stat buf; @@ -703,18 +710,7 @@ bfd_close (bfd *abfd) if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) return FALSE; - if ((abfd->flags & BFD_IN_MEMORY) != 0) - { - /* FIXME: cagney/2004-02-15: Need to implement a BFD_IN_MEMORY io - vector. - Until that's done, at least don't leak memory. */ - struct bfd_in_memory *bim = abfd->iostream; - free (bim->buffer); - free (bim); - ret = TRUE; - } - else - ret = abfd->iovec->bclose (abfd); + ret = abfd->iovec->bclose (abfd); if (ret) _maybe_make_executable (abfd); @@ -771,7 +767,7 @@ SYNOPSIS DESCRIPTION Create a new BFD in the manner of <>, but without opening a file. The new BFD takes the target from the target - used by @var{template}. The format is always set to <>. + used by @var{templ}. The format is always set to <>. */ bfd * @@ -819,7 +815,7 @@ bfd_make_writable (bfd *abfd) return FALSE; } - bim = bfd_malloc (sizeof (struct bfd_in_memory)); + bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory)); if (bim == NULL) return FALSE; /* bfd_error already set. */ abfd->iostream = bim; @@ -828,6 +824,8 @@ bfd_make_writable (bfd *abfd) bim->buffer = 0; abfd->flags |= BFD_IN_MEMORY; + abfd->iovec = &_bfd_memory_iovec; + abfd->origin = 0; abfd->direction = write_direction; abfd->where = 0; @@ -866,7 +864,6 @@ bfd_make_readable (bfd *abfd) if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) return FALSE; - abfd->arch_info = &bfd_default_arch_struct; abfd->where = 0; @@ -878,7 +875,7 @@ bfd_make_readable (bfd *abfd) abfd->section_count = 0; abfd->usrdata = NULL; abfd->cacheable = FALSE; - abfd->flags = BFD_IN_MEMORY; + abfd->flags |= BFD_IN_MEMORY; abfd->mtime_set = FALSE; abfd->target_defaulted = TRUE; @@ -895,7 +892,7 @@ bfd_make_readable (bfd *abfd) } /* -INTERNAL_FUNCTION +FUNCTION bfd_alloc SYNOPSIS @@ -917,7 +914,7 @@ bfd_alloc (bfd *abfd, bfd_size_type size) return NULL; } - ret = objalloc_alloc (abfd->memory, (unsigned long) size); + ret = objalloc_alloc ((struct objalloc *) abfd->memory, (unsigned long) size); if (ret == NULL) bfd_set_error (bfd_error_no_memory); return ret; @@ -956,14 +953,14 @@ bfd_alloc2 (bfd *abfd, bfd_size_type nmemb, bfd_size_type size) return NULL; } - ret = objalloc_alloc (abfd->memory, (unsigned long) size); + ret = objalloc_alloc ((struct objalloc *) abfd->memory, (unsigned long) size); if (ret == NULL) bfd_set_error (bfd_error_no_memory); return ret; } /* -INTERNAL_FUNCTION +FUNCTION bfd_zalloc SYNOPSIS @@ -1232,7 +1229,7 @@ DESCRIPTION static char * find_separate_debug_file (bfd *abfd, const char *debug_file_directory) { - char *basename; + char *base; char *dir; char *debugfile; char *canon_dir; @@ -1251,13 +1248,13 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) return NULL; } - basename = get_debug_link_info (abfd, & crc32); - if (basename == NULL) + base = get_debug_link_info (abfd, & crc32); + if (base == NULL) return NULL; - if (basename[0] == '\0') + if (base[0] == '\0') { - free (basename); + free (base); bfd_set_error (bfd_error_no_debug_section); return NULL; } @@ -1266,10 +1263,10 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) if (IS_DIR_SEPARATOR (abfd->filename[dirlen - 1])) break; - dir = bfd_malloc (dirlen + 1); + dir = (char *) bfd_malloc (dirlen + 1); if (dir == NULL) { - free (basename); + free (base); return NULL; } memcpy (dir, abfd->filename, dirlen); @@ -1283,14 +1280,15 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) break; canon_dir[canon_dirlen] = '\0'; - debugfile = bfd_malloc (strlen (debug_file_directory) + 1 - + (canon_dirlen > dirlen ? canon_dirlen : dirlen) - + strlen (".debug/") - + strlen (basename) - + 1); + debugfile = (char *) + bfd_malloc (strlen (debug_file_directory) + 1 + + (canon_dirlen > dirlen ? canon_dirlen : dirlen) + + strlen (".debug/") + + strlen (base) + + 1); if (debugfile == NULL) { - free (basename); + free (base); free (dir); free (canon_dir); return NULL; @@ -1298,11 +1296,11 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) /* First try in the same directory as the original file: */ strcpy (debugfile, dir); - strcat (debugfile, basename); + strcat (debugfile, base); if (separate_debug_file_exists (debugfile, crc32)) { - free (basename); + free (base); free (dir); free (canon_dir); return debugfile; @@ -1311,11 +1309,11 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) /* Then try in a subdirectory called .debug. */ strcpy (debugfile, dir); strcat (debugfile, ".debug/"); - strcat (debugfile, basename); + strcat (debugfile, base); if (separate_debug_file_exists (debugfile, crc32)) { - free (basename); + free (base); free (dir); free (canon_dir); return debugfile; @@ -1329,18 +1327,18 @@ find_separate_debug_file (bfd *abfd, const char *debug_file_directory) && canon_dir[0] != '/') strcat (debugfile, "/"); strcat (debugfile, canon_dir); - strcat (debugfile, basename); + strcat (debugfile, base); if (separate_debug_file_exists (debugfile, crc32)) { - free (basename); + free (base); free (dir); free (canon_dir); return debugfile; } free (debugfile); - free (basename); + free (base); free (dir); free (canon_dir); return NULL; @@ -1507,7 +1505,7 @@ bfd_fill_in_gnu_debuglink_section (bfd *abfd, debuglink_size &= ~3; debuglink_size += 4; - contents = bfd_malloc (debuglink_size); + contents = (char *) bfd_malloc (debuglink_size); if (contents == NULL) { /* XXX Should we delete the section from the bfd ? */