output-file.c revision 130562
1169718Skan/* output-file.c - Deal with the output file 2169718Skan Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1996, 1998, 1999, 2001, 2003 3169718Skan Free Software Foundation, Inc. 4169718Skan 5169718Skan This file is part of GAS, the GNU Assembler. 6169718Skan 7 GAS is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2, or (at your option) 10 any later version. 11 12 GAS is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GAS; see the file COPYING. If not, write to 19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 20 02111-1307, USA. */ 21 22#include <stdio.h> 23 24#include "as.h" 25 26#include "output-file.h" 27 28#ifdef BFD_HEADERS 29#define USE_BFD 30#endif 31 32#ifdef BFD_ASSEMBLER 33#define USE_BFD 34#ifndef TARGET_MACH 35#define TARGET_MACH 0 36#endif 37#endif 38 39#ifdef USE_BFD 40#include "bfd.h" 41bfd *stdoutput; 42 43void 44output_file_create (char *name) 45{ 46 if (name[0] == '-' && name[1] == '\0') 47 as_fatal (_("can't open a bfd on stdout %s"), name); 48 49 else if (!(stdoutput = bfd_openw (name, TARGET_FORMAT))) 50 { 51 as_perror (_("FATAL: can't create %s"), name); 52 exit (EXIT_FAILURE); 53 } 54 55 bfd_set_format (stdoutput, bfd_object); 56#ifdef BFD_ASSEMBLER 57 bfd_set_arch_mach (stdoutput, TARGET_ARCH, TARGET_MACH); 58#endif 59 if (flag_traditional_format) 60 stdoutput->flags |= BFD_TRADITIONAL_FORMAT; 61} 62 63void 64output_file_close (char *filename) 65{ 66#ifdef BFD_ASSEMBLER 67 /* Close the bfd. */ 68 if (bfd_close (stdoutput) == 0) 69 { 70 bfd_perror (filename); 71 as_perror (_("FATAL: can't close %s\n"), filename); 72 exit (EXIT_FAILURE); 73 } 74#else 75 /* Close the bfd without getting bfd to write out anything by itself. */ 76 if (bfd_close_all_done (stdoutput) == 0) 77 { 78 as_perror (_("FATAL: can't close %s\n"), filename); 79 exit (EXIT_FAILURE); 80 } 81#endif 82 stdoutput = NULL; /* Trust nobody! */ 83} 84 85#ifndef BFD_ASSEMBLER 86void 87output_file_append (char *where ATTRIBUTE_UNUSED, 88 long length ATTRIBUTE_UNUSED, 89 char *filename ATTRIBUTE_UNUSED) 90{ 91 abort (); 92} 93#endif 94 95#else 96 97static FILE *stdoutput; 98 99void 100output_file_create (char *name) 101{ 102 if (name[0] == '-' && name[1] == '\0') 103 { 104 stdoutput = stdout; 105 return; 106 } 107 108 stdoutput = fopen (name, FOPEN_WB); 109 if (stdoutput == NULL) 110 { 111#ifdef BFD_ASSEMBLER 112 bfd_set_error (bfd_error_system_call); 113#endif 114 as_perror (_("FATAL: can't create %s"), name); 115 exit (EXIT_FAILURE); 116 } 117} 118 119void 120output_file_close (char *filename) 121{ 122 if (EOF == fclose (stdoutput)) 123 { 124#ifdef BFD_ASSEMBLER 125 bfd_set_error (bfd_error_system_call); 126#endif 127 as_perror (_("FATAL: can't close %s"), filename); 128 exit (EXIT_FAILURE); 129 } 130 131 /* Trust nobody! */ 132 stdoutput = NULL; 133} 134 135void 136output_file_append (char * where, long length, char * filename) 137{ 138 for (; length; length--, where++) 139 { 140 (void) putc (*where, stdoutput); 141 142 if (ferror (stdoutput)) 143 { 144#ifdef BFD_ASSEMBLER 145 bfd_set_error (bfd_error_system_call); 146#endif 147 as_perror (_("Failed to emit an object byte"), filename); 148 as_fatal (_("can't continue")); 149 } 150 } 151} 152 153#endif 154 155