/* opncls.c -- open and close a BFD.
- Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 1997
+ Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
+ 2001
Free Software Foundation, Inc.
Written by Cygnus Support.
{
bfd *nbfd;
- nbfd = (bfd *) bfd_zmalloc (sizeof (bfd));
+ nbfd = (bfd *) bfd_zmalloc ((bfd_size_type) sizeof (bfd));
if (nbfd == NULL)
return NULL;
if (nbfd->memory == NULL)
{
bfd_set_error (bfd_error_no_memory);
+ free (nbfd);
return NULL;
}
nbfd->direction = no_direction;
nbfd->iostream = NULL;
nbfd->where = 0;
+ if (!bfd_hash_table_init (&nbfd->section_htab, bfd_section_hash_newfunc))
+ {
+ free (nbfd);
+ return NULL;
+ }
nbfd->sections = (asection *) NULL;
+ nbfd->section_tail = &nbfd->sections;
nbfd->format = bfd_unknown;
nbfd->my_archive = (bfd *) NULL;
- nbfd->origin = 0;
+ nbfd->origin = 0;
nbfd->opened_once = false;
nbfd->output_has_begun = false;
nbfd->section_count = 0;
return nbfd;
}
+/* Delete a BFD. */
+
+void
+_bfd_delete_bfd (abfd)
+ bfd *abfd;
+{
+ bfd_hash_table_free (&abfd->section_htab);
+ objalloc_free ((struct objalloc *) abfd->memory);
+ free (abfd);
+}
+
/*
SECTION
Opening and closing BFDs
bfd_openr
SYNOPSIS
- bfd *bfd_openr(CONST char *filename, CONST char *target);
+ bfd *bfd_openr(const char *filename, const char *target);
DESCRIPTION
Open the file @var{filename} (using <<fopen>>) with the target
bfd *
bfd_openr (filename, target)
- CONST char *filename;
- CONST char *target;
+ const char *filename;
+ const char *target;
{
bfd *nbfd;
const bfd_target *target_vec;
target_vec = bfd_find_target (target, nbfd);
if (target_vec == NULL)
{
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
bfd_set_error (bfd_error_invalid_target);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
{
/* File didn't exist, or some such */
bfd_set_error (bfd_error_system_call);
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
bfd_fdopenr
SYNOPSIS
- bfd *bfd_fdopenr(CONST char *filename, CONST char *target, int fd);
+ bfd *bfd_fdopenr(const char *filename, const char *target, int fd);
DESCRIPTION
<<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>.
bfd *
bfd_fdopenr (filename, target, fd)
- CONST char *filename;
- CONST char *target;
+ const char *filename;
+ const char *target;
int fd;
{
bfd *nbfd;
if (target_vec == NULL)
{
bfd_set_error (bfd_error_invalid_target);
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
if (nbfd->iostream == NULL)
{
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
be written through, although doing so requires that we end
the previous clause with a preposition. */
/* (O_ACCMODE) parens are to avoid Ultrix header file bug */
- switch (fdflags & O_ACCMODE)
+ switch (fdflags & (O_ACCMODE))
{
case O_RDONLY: nbfd->direction = read_direction; break;
case O_WRONLY: nbfd->direction = write_direction; break;
if (! bfd_cache_init (nbfd))
{
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
nbfd->opened_once = true;
if (target_vec == NULL)
{
bfd_set_error (bfd_error_invalid_target);
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
nbfd->iostream = (PTR) stream;
nbfd->filename = filename;
nbfd->direction = read_direction;
-
+
if (! bfd_cache_init (nbfd))
{
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
bfd_openw
SYNOPSIS
- bfd *bfd_openw(CONST char *filename, CONST char *target);
+ bfd *bfd_openw(const char *filename, const char *target);
DESCRIPTION
Create a BFD, associated with file @var{filename}, using the
bfd *
bfd_openw (filename, target)
- CONST char *filename;
- CONST char *target;
+ const char *filename;
+ const char *target;
{
bfd *nbfd;
const bfd_target *target_vec;
target_vec = bfd_find_target (target, nbfd);
if (target_vec == NULL)
{
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
if (bfd_open_file (nbfd) == NULL)
{
bfd_set_error (bfd_error_system_call); /* File not writeable, etc */
- objalloc_free ((struct objalloc *) nbfd->memory);
- free (nbfd);
+ _bfd_delete_bfd (nbfd);
return NULL;
}
if (stat (abfd->filename, &buf) == 0)
{
- int mask = umask (0);
+ unsigned int mask = umask (0);
umask (mask);
chmod (abfd->filename,
(0777
}
}
- objalloc_free ((struct objalloc *) abfd->memory);
- free (abfd);
+ _bfd_delete_bfd (abfd);
return ret;
}
if (stat (abfd->filename, &buf) == 0)
{
- int mask = umask (0);
+ unsigned int mask = umask (0);
umask (mask);
chmod (abfd->filename,
- (0x777
+ (0777
& (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
}
}
- objalloc_free ((struct objalloc *) abfd->memory);
- free (abfd);
+ _bfd_delete_bfd (abfd);
return ret;
}
bfd_create
SYNOPSIS
- bfd *bfd_create(CONST char *filename, bfd *templ);
+ bfd *bfd_create(const char *filename, bfd *templ);
DESCRIPTION
Create a new BFD in the manner of
bfd *
bfd_create (filename, templ)
- CONST char *filename;
+ const char *filename;
bfd *templ;
{
bfd *nbfd;
return false;
}
- bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
+ bim = ((struct bfd_in_memory *)
+ bfd_malloc ((bfd_size_type) sizeof (struct bfd_in_memory)));
abfd->iostream = (PTR) bim;
- /* bfd_write will grow these as needed */
+ /* bfd_bwrite will grow these as needed */
bim->size = 0;
bim->buffer = 0;
if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
return false;
+ if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
+ return false;
+
+
+ abfd->arch_info = &bfd_default_arch_struct;
+
abfd->where = 0;
+ abfd->sections = (asection *) NULL;
+ abfd->format = bfd_unknown;
+ abfd->my_archive = (bfd *) NULL;
+ abfd->origin = 0;
+ abfd->opened_once = false;
+ abfd->output_has_begun = false;
+ abfd->section_count = 0;
+ abfd->usrdata = (PTR) NULL;
+ abfd->cacheable = false;
+ abfd->flags = BFD_IN_MEMORY;
+ abfd->mtime_set = false;
+
+ abfd->target_defaulted = true;
abfd->direction = read_direction;
+ abfd->sections = 0;
+ abfd->symcount = 0;
+ abfd->outsymbols = 0;
+ abfd->tdata.any = 0;
+
+ bfd_check_format(abfd, bfd_object);
return true;
}
PTR
bfd_alloc (abfd, size)
bfd *abfd;
- size_t size;
+ bfd_size_type size;
{
PTR ret;
+ if (size != (unsigned long) size)
+ {
+ bfd_set_error (bfd_error_no_memory);
+ return NULL;
+ }
+
ret = objalloc_alloc (abfd->memory, (unsigned long) size);
if (ret == NULL)
bfd_set_error (bfd_error_no_memory);
PTR
bfd_zalloc (abfd, size)
bfd *abfd;
- size_t size;
+ bfd_size_type size;
{
PTR res;
res = bfd_alloc (abfd, size);
if (res)
- memset (res, 0, size);
+ memset (res, 0, (size_t) size);
return res;
}
-/* Free a block allocated for a BFD. */
+/* Free a block allocated for a BFD.
+ Note: Also frees all more recently allocated blocks! */
void
bfd_release (abfd, block)