* aoutx.h (NAME(aout,find_nearest_line)): Handle the case
authorPer Bothner <per@bothner.com>
Tue, 12 Nov 1991 02:46:26 +0000 (02:46 +0000)
committerPer Bothner <per@bothner.com>
Tue, 12 Nov 1991 02:46:26 +0000 (02:46 +0000)
of two N_SO stabs, one for directory, and one for filename.

* bfd-in.h (print_vma):  Factor out duplicate definition.

Exit a little more gracefully when malloc returns NULL.
* libbfd.c: New function bfd_xmalloc (malloc wrapper).
* opncls.c, syms.c, bout.c, aoutx.h:  Replace malloc by bfd_xmalloc.
* libbfd.h: Rre-generated due to libbfd.c update.

bfd/ChangeLog
bfd/opncls.c

index 30441baf2784b42b80c7534c15c2da018f971b84..375cb0b8d0d6a9fa5ab2be8ee43011b95b818b20 100644 (file)
@@ -1,3 +1,15 @@
+Mon Nov 11 18:36:47 1991  Per Bothner  (bothner at cygnus.com)
+
+       * aoutx.h (NAME(aout,find_nearest_line)):  Handle the case
+       of two N_SO stabs, one for directory, and one for filename.
+
+       * bfd-in.h (print_vma):  Factor out duplicate definition.
+
+       Exit a little more gracefully when malloc returns NULL.
+       * libbfd.c: New function bfd_xmalloc (malloc wrapper).
+       * opncls.c, syms.c, bout.c, aoutx.h:  Replace malloc by bfd_xmalloc.
+       * libbfd.h: Rre-generated due to libbfd.c update.
+
 Sat Nov  9 13:45:01 1991  Fred Fish  (fnf at cygnus.com)
 
        * config/mt-m68k-elf:  Define DEFAULT_VECTOR as elf_big_vec.
index f4bedfeb619682c816b6cdc6b013ff041570895f..9e096f4d4a86aa9a1de3a3cae831c5e18644310c 100644 (file)
@@ -20,8 +20,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* $Id$ */
 
-#include <sysdep.h>
 #include "bfd.h"
+#include "sysdep.h"
 #include "libbfd.h"
 #include "obstack.h"
 extern void bfd_cache_init();
@@ -31,7 +31,7 @@ FILE *bfd_open_file();
    if we do that we can't use fcntl.  */
 
 
-#define obstack_chunk_alloc malloc
+#define obstack_chunk_alloc bfd_xmalloc
 #define obstack_chunk_free free
 
 /* Return a new BFD.  All BFD's are allocated through this routine.  */
@@ -44,8 +44,11 @@ bfd *new_bfd()
   if (!nbfd)
     return 0;
 
-  obstack_begin(&nbfd->memory, 128);
-  
+  bfd_check_init();
+  obstack_begin((PTR)&nbfd->memory, 128);
+
+  nbfd->arch_info = &bfd_default_arch_struct;
+
   nbfd->direction = no_direction;
   nbfd->iostream = NULL;
   nbfd->where = 0;
@@ -172,8 +175,12 @@ DEFUN(bfd_fdopenr,(filename, target, fd),
     return NULL;
   }
 
+#ifdef FASCIST_FDOPEN
+  nbfd->iostream = (char *) fdopen (fd, "r"); 
+#else
   /* if the fd were open for read only, this still would not hurt: */
   nbfd->iostream = (char *) fdopen (fd, "r+"); 
+#endif
   if (nbfd->iostream == NULL) {
     (void) obstack_free (&nbfd->memory, (PTR)0);
     return NULL;
@@ -186,7 +193,8 @@ DEFUN(bfd_fdopenr,(filename, target, fd),
   /* As a special case we allow a FD open for read/write to
      be written through, although doing so requires that we end
      the previous clause with a preposition.  */
-  switch (fdflags & O_ACCMODE) {
+  /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
+  switch (fdflags & (O_ACCMODE)) {
   case O_RDONLY: nbfd->direction = read_direction; break;
   case O_WRONLY: nbfd->direction = write_direction; break;  
   case O_RDWR: nbfd->direction = both_direction; break;
@@ -287,7 +295,51 @@ DEFUN(bfd_close,(abfd),
     chmod(abfd->filename,buf.st_mode | S_IXUSR | S_IXGRP | S_IXOTH);
   }
   (void) obstack_free (&abfd->memory, (PTR)0);
-  /* FIXME, shouldn't we de-allocate the bfd as well? */
+  (void) free(abfd);
+  return true;
+}
+
+/*proto* bfd_close_all_done
+This function closes a BFD. It differs from @code{bfd_close} since it
+does not complete any pending operations.  This routine would be used
+if the application had just used BFD for swapping and didn't want to
+use any of the writing code.
+
+If the created file is executable, then @code{chmod} is called to mark
+it as such.
+
+All memory attached to the BFD's obstacks is released. 
+
+@code{true} is returned if all is ok, otherwise @code{false}.
+*; PROTO(boolean, bfd_close_all_done,(bfd *));
+*/
+
+boolean
+DEFUN(bfd_close_all_done,(abfd),
+      bfd *abfd)
+{
+  bfd_cache_close(abfd);
+
+  /* If the file was open for writing and is now executable,
+     make it so */
+  if (abfd->direction == write_direction 
+      && abfd->flags & EXEC_P) {
+    struct stat buf;
+    stat(abfd->filename, &buf);
+#ifndef S_IXUSR
+#define S_IXUSR 0100   /* Execute by owner.  */
+#endif
+#ifndef S_IXGRP
+#define S_IXGRP 0010   /* Execute by group.  */
+#endif
+#ifndef S_IXOTH
+#define S_IXOTH 0001   /* Execute by others.  */
+#endif
+
+    chmod(abfd->filename,buf.st_mode | S_IXUSR | S_IXGRP | S_IXOTH);
+  }
+  (void) obstack_free (&abfd->memory, (PTR)0);
+  (void) free(abfd);
   return true;
 }