]> Git Repo - binutils.git/blob - bfd/coffcode.h
A couple of things from the net.
[binutils.git] / bfd / coffcode.h
1 /* Support for the generic parts of most COFF variants, for BFD.
2    Copyright (C) 1990-1991 Free Software Foundation, Inc.
3    Written by Cygnus Support.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program 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 of the License, or
10 (at your option) any later version.
11
12 This program 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 this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 /* 
22 Most of this hacked by  Steve Chamberlain,
23                         [email protected] 
24 */
25 /*
26
27 SECTION
28         coff backends
29
30         BFD supports a number of different flavours of coff format.
31         The major difference between formats are the sizes and
32         alignments of fields in structures on disk, and the occasional
33         extra field.  
34
35         Coff in all its varieties is implimented with a few common
36         files and a number of implementation specific files. For
37         example, The 88k bcs coff format is implemented in the file
38         @code{coff-m88k.c}. This file @code{#include}s
39         @code{coff-m88k.h} which defines the external structure of the
40         coff format for the 88k, and @code{internalcoff.h} which
41         defines the internal structure. @code{coff-m88k.c} also
42         defines pthe relocations used by the 88k format
43         @xref{Relocations}. Then the major portion of coff code is
44         included (@code{coffcode.h}) which defines the methods used to
45         act upon the types defined in @code{coff-m88k.h} and
46         @code{internalcoff.h}.
47
48
49         The Intel i960 processor version of coff is implemented in
50         @code{coff-i960.c}. This file has the same structure as
51         @code{coff-m88k.c}, except that it includes @code{coff-i960.h}
52         rather than @code{coff-m88k.h}. 
53
54 SUBSECTION
55         Porting To A New Version of Coff
56
57         The recommended method is to select from the existing
58         implimentations the version of coff which is most like the one
59         you want to use, for our purposes, we'll say that i386 coff is
60         the one you select, and that your coff flavour is called foo.
61         Copy the @code{i386coff.c} to @code{foocoff.c}, copy
62         @code{../include/i386coff.h} to @code{../include/foocoff.h}
63         and add the lines to @code{targets.c} and @code{Makefile.in}
64         so that your new back end is used. Alter the shapes of the
65         structures in @code{../include/foocoff.h} so that they match
66         what you need. You will probably also have to add
67         @code{#ifdef}s to the code in @code{internalcoff.h} and
68         @code{coffcode.h} if your version of coff is too wild. 
69
70         You can verify that your new BFD backend works quite simply by
71         building @code{objdump} from the @code{binutils} directory,
72         and making sure that its version of what's going on at your
73         host systems idea (assuming it has the pretty standard coff
74         dump utility (usually called @code{att-dump} or just
75         @code{dump})) are the same.  Then clean up your code, and send
76         what you've done to Cygnus. Then your stuff will be in the
77         next release, and you won't have to keep integrating it.
78
79 SUBSECTION
80         How The Coff Backend Works
81
82 SUBSUBSECTION
83         Bit Twiddling
84
85         Each flavour of coff supported in BFD has its own header file
86         descibing the external layout of the structures. There is also
87         an internal description of the coff layout (in
88         @code{internalcoff.h}) file (@code{}). A major function of the
89         coff backend is swapping the bytes and twiddling the bits to
90         translate the external form of the structures into the normal
91         internal form. This is all performed in the
92         @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
93         elements are different sizes between different versions of
94         coff, it is the duty of the coff version specific include file
95         to override the definitions of various packing routines in
96         @code{coffcode.h}. Eg the size of line number entry in coff is
97         sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
98         @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
99         correct one. No doubt, some day someone will find a version of
100         coff which has a varying field size not catered for at the
101         moment. To port BFD, that person will have to add more @code{#defines}.  
102         Three of the bit twiddling routines are exported to
103         @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
104         and @code{coff_swap_linno_in}. @code{GDB} reads the symbol
105         table on its own, but uses BFD to fix things up.  More of the
106         bit twiddlers are exported for @code{gas};
107         @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
108         @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
109         @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
110         @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
111         of all the symbol table and reloc drudgery itself, thereby
112         saving the internal BFD overhead, but uses BFD to swap things
113         on the way out, making cross ports much safer.  This also
114         allows BFD (and thus the linker) to use the same header files
115         as @code{gas}, which makes one avenue to disaster disappear.
116
117 SUBSUBSECTION
118         Symbol Reading
119
120         The simple canonical form for symbols used by BFD is not rich
121         enough to keep all the information available in a coff symbol
122         table. The back end gets around this by keeping the original
123         symbol table around, "behind the scenes". 
124
125         When a symbol table is requested (through a call to
126         @code{bfd_canonicalize_symtab}, a request gets through to
127         @code{get_normalized_symtab}. This reads the symbol table from
128         the coff file and swaps all the structures inside into the
129         internal form. It also fixes up all the pointers in the table
130         (represented in the file by offsets from the first symbol in
131         the table) into physical pointers to elements in the new
132         internal table. This involves some work since the meanings of
133         fields changes depending upon context; a field that is a
134         pointer to another structure in the symbol table at one moment
135         may be the size in bytes of a structure in the next.  Another
136         pass is made over the table. All symbols which mark file names
137         (<<C_FILE>> symbols) are modified so that the internal
138         string points to the value in the auxent (the real filename)
139         rather than the normal text associated with the symbol
140         (@code{".file"}). 
141
142         At this time the symbol names are moved around. Coff stores
143         all symbols less than nine characters long physically
144         within the symbol table, longer strings are kept at the end of
145         the file in the string  table. This pass moves all strings
146         into memory, and replaces them with pointers to the strings.
147
148
149         The symbol table is massaged once again, this time to create
150         the canonical table used by the BFD application. Each symbol
151         is inspected in turn, and a decision made (using the
152         @code{sclass} field) about the various flags to set in the
153         @code{asymbol} @xref{Symbols}. The generated canonical table
154         shares strings with the hidden internal symbol table. 
155
156         Any linenumbers are read from the coff file too, and attached
157         to the symbols which own the functions the linenumbers belong to. 
158
159 SUBSUBSECTION
160         Symbol Writing
161
162         Writing a symbol to a coff file which didn't come from a coff
163         file will lose any debugging information. The @code{asymbol}
164         structure remembers the BFD from which was born, and on output
165         the back end makes sure that the same destination target as
166         source target is present.
167
168         When the symbols have come from a coff file then all the
169         debugging information is preserved.
170
171         Symbol tables are provided for writing to the back end in a
172         vector of pointers to pointers. This allows applications like
173         the linker to accumulate and output large symbol tables
174         without having to do too much byte copying.
175
176         This function runs through the provided symbol table and
177         patches each symbol marked as a file place holder
178         (@code{C_FILE}) to point to the next file place holder in the
179         list. It also marks each @code{offset} field in the list with
180         the offset from the first symbol of the current symbol.
181
182         Another function of this procedure is to turn the canonical
183         value form of BFD into the form used by coff. Internally, BFD
184         expects symbol values to be offsets from a section base; so a
185         symbol physically at 0x120, but in a section starting at
186         0x100, would have the value 0x20. Coff expects symbols to
187         contain their final value, so symbols have their values
188         changed at this point to reflect their sum with their owning
189         section. Note that this transformation uses the
190         <<output_section>> field of the @code{asymbol}'s
191         @code{asection} @xref{Sections}. 
192
193         o coff_mangle_symbols
194
195         This routine runs though the provided symbol table and uses
196         the offsets generated by the previous pass and the pointers
197         generated when the symbol table was read in to create the
198         structured hierachy required by coff. It changes each pointer
199         to a symbol to an index into the symbol table of the symbol
200         being referenced. 
201
202         o coff_write_symbols
203
204         This routine runs through the symbol table and patches up the
205         symbols from their internal form into the coff way, calls the
206         bit twiddlers and writes out the tabel to the file. 
207
208 */
209
210 /*
211 INTERNAL_DEFINITION
212         coff_symbol_type
213
214 DESCRIPTION
215         The hidden information for an asymbol is described in a
216         coff_ptr_struct, which is typedefed to a combined_entry_type
217
218 CODE_FRAGMENT
219 .
220 .typedef struct coff_ptr_struct 
221 .{
222 .
223 .       {* Remembers the offset from the first symbol in the file for
224 .          this symbol. Generated by coff_renumber_symbols. *}
225 .unsigned int offset;
226 .
227 .       {* Should the tag field of this symbol be renumbered.
228 .          Created by coff_pointerize_aux. *}
229 .char fix_tag;
230 .
231 .       {* Should the endidx field of this symbol be renumbered.
232 .          Created by coff_pointerize_aux. *}
233 .char fix_end;
234 .
235 .       {* The container for the symbol structure as read and translated
236 .           from the file. *}
237 .
238 .union {
239 .   union internal_auxent auxent;
240 .   struct internal_syment syment;
241 . } u;
242 .} combined_entry_type;
243 .
244 .
245 .{* Each canonical asymbol really looks like this: *}
246 .
247 .typedef struct coff_symbol_struct
248 .{
249 .   {* The actual symbol which the rest of BFD works with *}
250 .asymbol symbol;
251 .
252 .   {* A pointer to the hidden information for this symbol *}
253 .combined_entry_type *native;
254 .
255 .   {* A pointer to the linenumber information for this symbol *}
256 .struct lineno_cache_entry *lineno;
257 .
258 .   {* Have the line numbers been relocated yet ? *}
259 .boolean done_lineno;
260 .} coff_symbol_type;
261
262
263 */
264
265 #include "seclet.h"
266 extern bfd_error_vector_type bfd_error_vector;
267
268
269
270
271 #define PUTWORD bfd_h_put_32
272 #define PUTHALF bfd_h_put_16
273 #define PUTBYTE bfd_h_put_8
274
275 #ifndef GET_FCN_LNNOPTR
276 #define GET_FCN_LNNOPTR(abfd, ext)  bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
277 #endif
278
279 #ifndef GET_FCN_ENDNDX
280 #define GET_FCN_ENDNDX(abfd, ext)  bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
281 #endif
282
283 #ifndef PUT_FCN_LNNOPTR
284 #define PUT_FCN_LNNOPTR(abfd, in, ext)  PUTWORD(abfd,  in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
285 #endif
286 #ifndef PUT_FCN_ENDNDX
287 #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
288 #endif
289 #ifndef GET_LNSZ_LNNO
290 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
291 #endif
292 #ifndef GET_LNSZ_SIZE
293 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
294 #endif
295 #ifndef PUT_LNSZ_LNNO
296 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
297 #endif
298 #ifndef PUT_LNSZ_SIZE
299 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
300 #endif
301 #ifndef GET_SCN_SCNLEN
302 #define GET_SCN_SCNLEN(abfd,  ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
303 #endif
304 #ifndef GET_SCN_NRELOC
305 #define GET_SCN_NRELOC(abfd,  ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
306 #endif
307 #ifndef GET_SCN_NLINNO
308 #define GET_SCN_NLINNO(abfd, ext)  bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
309 #endif
310 #ifndef PUT_SCN_SCNLEN
311 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
312 #endif
313 #ifndef PUT_SCN_NRELOC
314 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
315 #endif
316 #ifndef PUT_SCN_NLINNO
317 #define PUT_SCN_NLINNO(abfd,in, ext)  bfd_h_put_16(abfd,in, (bfd_byte  *) ext->x_scn.x_nlinno)
318 #endif
319 #ifndef GET_LINENO_LNNO
320 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
321 #endif
322 #ifndef PUT_LINENO_LNNO
323 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val,  (bfd_byte *) (ext->l_lnno));
324 #endif
325
326 \f
327 /* void warning(); */
328
329 /*
330  * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
331  * incoming SEC_* flags.  The inverse of this function is styp_to_sec_flags().
332  * NOTE: If you add to/change this routine, you should mirror the changes
333  *      in styp_to_sec_flags().
334  */
335 static long
336 DEFUN(sec_to_styp_flags, (sec_name, sec_flags),
337         CONST char *            sec_name        AND
338         flagword        sec_flags)
339 {
340     long styp_flags = 0;
341
342     if (!strcmp(sec_name, _TEXT)) {
343         return((long)STYP_TEXT);
344     } else if (!strcmp(sec_name, _DATA)) {
345         return((long)STYP_DATA);
346     } else if (!strcmp(sec_name, _BSS)) {
347         return((long)STYP_BSS);
348 #ifdef _COMMENT
349     } else if (!strcmp(sec_name, _COMMENT)) {
350         return((long)STYP_INFO);
351 #endif /* _COMMENT */
352     }
353
354 /* Try and figure out what it should be */
355    if (sec_flags & SEC_CODE) styp_flags = STYP_TEXT;
356    if (sec_flags & SEC_DATA) styp_flags = STYP_DATA;
357    else if (sec_flags & SEC_READONLY)
358 #ifdef STYP_LIT /* 29k readonly text/data section */
359         styp_flags = STYP_LIT;
360 #else
361         styp_flags = STYP_TEXT;
362 #endif  /* STYP_LIT */
363    else if (sec_flags & SEC_LOAD) styp_flags = STYP_TEXT;
364
365    if (styp_flags == 0) styp_flags = STYP_BSS;
366
367    return(styp_flags);
368 }
369 /*
370  * Return a word with SEC_* flags set to represent the incoming
371  * STYP_* flags (from scnhdr.s_flags).   The inverse of this
372  * function is sec_to_styp_flags().
373  * NOTE: If you add to/change this routine, you should mirror the changes
374  *      in sec_to_styp_flags().
375  */
376 static flagword
377 DEFUN(styp_to_sec_flags, (styp_flags),
378         long    styp_flags)
379 {
380     flagword    sec_flags=0;
381
382     if ((styp_flags & STYP_TEXT) || (styp_flags & STYP_DATA))
383         sec_flags = (SEC_LOAD | SEC_ALLOC);
384     else if (styp_flags & STYP_BSS)
385         sec_flags = SEC_ALLOC;
386
387 #ifdef STYP_LIT         /* A29k readonly text/data section type */
388     if ((styp_flags & STYP_LIT) == STYP_LIT)
389         sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
390 #endif  /* STYP_LIT */
391 #ifdef STYP_OTHER_LOAD  /* Other loaded sections */
392     if (styp_flags & STYP_OTHER_LOAD)
393         sec_flags = (SEC_LOAD | SEC_ALLOC);
394 #endif  /* STYP_SDATA */
395
396     return(sec_flags);
397 }
398
399 #define get_index(symbol)       ((int) (symbol)->udata)
400 #define set_index(symbol, idx)  ((symbol)->udata =(PTR) (idx))
401
402 /*  **********************************************************************
403 Here are all the routines for swapping the structures seen in the
404 outside world into the internal forms.
405 */
406
407
408 static void
409 DEFUN(bfd_swap_reloc_in,(abfd, reloc_src, reloc_dst),
410       bfd            *abfd AND
411       RELOC *reloc_src AND
412       struct internal_reloc *reloc_dst)
413 {
414   reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
415   reloc_dst->r_symndx = bfd_h_get_32(abfd, (bfd_byte *) reloc_src->r_symndx);
416
417 #ifdef RS6000COFF_C
418   reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
419   reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
420 #else
421   reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
422 #endif
423
424 #ifdef SWAP_IN_RELOC_OFFSET
425   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
426                                              (bfd_byte *) reloc_src->r_offset);
427 #endif
428 }
429
430
431 static unsigned int
432 DEFUN(coff_swap_reloc_out,(abfd, src, dst),
433       bfd       *abfd AND
434       PTR       src AND
435       PTR       dst)
436 {
437   struct internal_reloc *reloc_src = (struct internal_reloc *)src;
438   struct external_reloc *reloc_dst = (struct external_reloc *)dst;
439   bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
440   bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
441   bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
442                reloc_dst->r_type);
443
444 #ifdef SWAP_OUT_RELOC_OFFSET
445   SWAP_OUT_RELOC_OFFSET(abfd,
446                         reloc_src->r_offset,
447                         (bfd_byte *) reloc_dst->r_offset);
448 #endif
449 #ifdef SWAP_OUT_RELOC_EXTRA
450   SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
451 #endif
452
453   return sizeof(struct external_reloc);
454 }
455
456 static void
457 DEFUN(bfd_swap_filehdr_in,(abfd, filehdr_src, filehdr_dst),
458       bfd            *abfd AND
459       FILHDR         *filehdr_src AND
460       struct internal_filehdr *filehdr_dst)
461 {
462   filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
463   filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
464   filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
465   filehdr_dst->f_symptr = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_symptr);
466   filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
467   filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
468   filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
469 }
470
471 static  unsigned int
472 DEFUN(coff_swap_filehdr_out,(abfd, in, out),
473       bfd       *abfd AND
474       PTR       in AND
475       PTR       out)
476 {
477   struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
478   FILHDR *filehdr_out = (FILHDR *)out;
479   bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
480   bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
481   bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
482   bfd_h_put_32(abfd, filehdr_in->f_symptr, (bfd_byte *) filehdr_out->f_symptr);
483   bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
484   bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
485   bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
486   return sizeof(FILHDR);
487 }
488
489
490 #ifndef NO_COFF_SYMBOLS
491
492 static void
493 DEFUN(coff_swap_sym_in,(abfd, ext1, in1),
494       bfd            *abfd AND
495       PTR ext1 AND
496       PTR in1)
497 {
498   SYMENT *ext = (SYMENT *)ext1;
499   struct internal_syment      *in = (struct internal_syment *)in1;
500
501   if( ext->e.e_name[0] == 0) {
502     in->_n._n_n._n_zeroes = 0;
503     in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
504   }
505   else {
506 #if SYMNMLEN != E_SYMNMLEN
507    -> Error, we need to cope with truncating or extending SYMNMLEN!;
508 #else
509     memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
510 #endif
511   }
512   in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
513   in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
514   if (sizeof(ext->e_type) == 2){
515     in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
516   }
517   else {
518     in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
519   }
520   in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
521   in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
522 }
523
524 static unsigned int
525 DEFUN(coff_swap_sym_out,(abfd, inp, extp),
526       bfd       *abfd AND
527       PTR       inp AND
528       PTR       extp)
529 {
530   struct internal_syment *in = (struct internal_syment *)inp;
531   SYMENT *ext =(SYMENT *)extp;
532   if(in->_n._n_name[0] == 0) {
533     bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
534     bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *)  ext->e.e.e_offset);
535   }
536   else {
537 #if SYMNMLEN != E_SYMNMLEN
538     -> Error, we need to cope with truncating or extending SYMNMLEN!;
539 #else
540     memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
541 #endif
542   }
543   bfd_h_put_32(abfd,  in->n_value , (bfd_byte *) ext->e_value);
544   bfd_h_put_16(abfd,  in->n_scnum , (bfd_byte *) ext->e_scnum);
545   if (sizeof(ext->e_type) == 2)
546       {
547         bfd_h_put_16(abfd,  in->n_type , (bfd_byte *) ext->e_type);
548       }
549   else
550       {
551         bfd_h_put_32(abfd,  in->n_type , (bfd_byte *) ext->e_type);
552       }
553   bfd_h_put_8(abfd,  in->n_sclass , ext->e_sclass);
554   bfd_h_put_8(abfd,  in->n_numaux , ext->e_numaux);
555   return sizeof(SYMENT);
556 }
557
558 static void
559 DEFUN(coff_swap_aux_in,(abfd, ext1, type, class, in1),
560       bfd            *abfd AND
561       PTR             ext1 AND
562       int             type AND
563       int             class AND
564       PTR             in1)
565 {
566   AUXENT    *ext = (AUXENT *)ext1;
567   union internal_auxent *in = (union internal_auxent *)in1;
568
569   switch (class) {
570     case C_FILE:
571       if (ext->x_file.x_fname[0] == 0) {
572           in->x_file.x_n.x_zeroes = 0;
573           in->x_file.x_n.x_offset = 
574            bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
575         } else {
576 #if FILNMLEN != E_FILNMLEN
577             -> Error, we need to cope with truncating or extending FILNMLEN!;
578 #else
579             memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
580 #endif
581           }
582       break;
583
584       /* RS/6000 "csect" auxents */
585 #ifdef RS6000COFF_C
586     case C_EXT:
587     case C_HIDEXT:
588       in->x_csect.x_scnlen   = bfd_h_get_32 (abfd, (bfd_byte *) ext->x_csect.x_scnlen);
589       in->x_csect.x_parmhash = bfd_h_get_32 (abfd, (bfd_byte *) ext->x_csect.x_parmhash);
590       in->x_csect.x_snhash   = bfd_h_get_16 (abfd, (bfd_byte *) ext->x_csect.x_snhash);
591       /* We don't have to hack bitfields in x_smtyp because it's defined by
592          shifts-and-ands, which are equivalent on all byte orders.  */
593       in->x_csect.x_smtyp    = bfd_h_get_8  (abfd, (bfd_byte *) ext->x_csect.x_smtyp);
594       in->x_csect.x_smclas   = bfd_h_get_8  (abfd, (bfd_byte *) ext->x_csect.x_smclas);
595       in->x_csect.x_stab     = bfd_h_get_32 (abfd, (bfd_byte *) ext->x_csect.x_stab);
596       in->x_csect.x_snstab   = bfd_h_get_16 (abfd, (bfd_byte *) ext->x_csect.x_snstab);
597       break;
598 #endif
599
600     case C_STAT:
601 #ifdef C_LEAFSTAT
602     case C_LEAFSTAT:
603 #endif
604     case C_HIDDEN:
605       if (type == T_NULL) {
606           in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
607           in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
608           in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
609           break;
610         }
611     default:
612       in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
613 #ifndef NO_TVNDX
614       in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
615 #endif
616
617       if (ISARY(type) || class == C_BLOCK) {
618 #if DIMNUM != E_DIMNUM
619           -> Error, we need to cope with truncating or extending DIMNUM!;
620 #else
621           in->x_sym.x_fcnary.x_ary.x_dimen[0] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
622           in->x_sym.x_fcnary.x_ary.x_dimen[1] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
623           in->x_sym.x_fcnary.x_ary.x_dimen[2] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
624           in->x_sym.x_fcnary.x_ary.x_dimen[3] = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
625 #endif
626         }
627       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR(abfd, ext);
628       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX(abfd, ext);
629
630       if (ISFCN(type)) {
631           in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
632         }
633       else {
634           in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
635           in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
636         }
637     }
638 }
639
640 static unsigned int
641 DEFUN(coff_swap_aux_out,(abfd, inp, type, class, extp),
642   bfd   *abfd AND
643   PTR   inp AND
644   int   type AND
645   int   class AND
646   PTR   extp)
647 {
648   union internal_auxent *in = (union internal_auxent *)inp;
649   AUXENT *ext = (AUXENT *)extp;
650   switch (class) {
651   case C_FILE:
652     if (in->x_file.x_fname[0] == 0) {
653       PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
654       PUTWORD(abfd,
655               in->x_file.x_n.x_offset,
656               (bfd_byte *) ext->x_file.x_n.x_offset);
657     }
658     else {
659 #if FILNMLEN != E_FILNMLEN
660       -> Error, we need to cope with truncating or extending FILNMLEN!;
661 #else
662       memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
663 #endif
664     }
665     break;
666
667 #ifdef RS6000COFF_C
668   /* RS/6000 "csect" auxents */
669   case C_EXT:
670   case C_HIDEXT:
671     PUTWORD (abfd, in->x_csect.x_scnlen,        ext->x_csect.x_scnlen);
672     PUTWORD (abfd, in->x_csect.x_parmhash,      ext->x_csect.x_parmhash);
673     PUTHALF (abfd, in->x_csect.x_snhash,        ext->x_csect.x_snhash);
674     /* We don't have to hack bitfields in x_smtyp because it's defined by
675        shifts-and-ands, which are equivalent on all byte orders.  */
676     PUTBYTE (abfd, in->x_csect.x_smtyp,         ext->x_csect.x_smtyp);
677     PUTBYTE (abfd, in->x_csect.x_smclas,        ext->x_csect.x_smclas);
678     PUTWORD (abfd, in->x_csect.x_stab,          ext->x_csect.x_stab);
679     PUTHALF (abfd, in->x_csect.x_snstab,        ext->x_csect.x_snstab);
680     break;
681 #endif
682
683   case C_STAT:
684 #ifdef C_LEAFSTAT
685   case C_LEAFSTAT:
686 #endif
687   case C_HIDDEN:
688     if (type == T_NULL) {
689       PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
690       PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
691       PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
692       break;
693     }
694   default:
695     PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
696 #ifndef NO_TVNDX
697     bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
698 #endif
699
700     if (ISFCN(type)) {
701       PUTWORD(abfd, in->x_sym.x_misc.x_fsize, (bfd_byte *)  ext->x_sym.x_misc.x_fsize);
702       PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
703       PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
704     }
705     else {
706
707       if (ISARY(type) || class == C_BLOCK) {
708 #if DIMNUM != E_DIMNUM
709         -> Error, we need to cope with truncating or extending DIMNUM!;
710 #else
711         bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
712         bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
713         bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
714         bfd_h_put_16(abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], (bfd_byte *)ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
715 #endif
716       }
717       PUT_LNSZ_LNNO(abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
718       PUT_LNSZ_SIZE(abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
719
720       PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
721       PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
722
723
724     }
725   }
726 return sizeof(AUXENT);
727 }
728
729 #endif /* NO_COFF_SYMBOLS */
730
731 #ifndef NO_COFF_LINENOS
732
733 static void
734 DEFUN(coff_swap_lineno_in,(abfd, ext1, in1),
735       bfd            *abfd AND
736       PTR ext1 AND
737       PTR in1)
738 {
739   LINENO *ext = (LINENO *)ext1;
740   struct internal_lineno      *in = (struct internal_lineno *)in1;
741
742   in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
743   in->l_lnno = GET_LINENO_LNNO(abfd, ext);
744 }
745
746 static unsigned int
747 DEFUN(coff_swap_lineno_out,(abfd, inp, outp),
748       bfd       *abfd AND
749       PTR       inp AND
750       PTR       outp)
751 {
752   struct internal_lineno *in = (struct internal_lineno *)inp;
753   struct external_lineno *ext = (struct external_lineno *)outp;
754   PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *)
755           ext->l_addr.l_symndx);
756
757   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
758   return sizeof(struct external_lineno);
759 }
760
761 #endif /* NO_COFF_LINENOS */
762
763
764 static void
765 DEFUN(bfd_swap_aouthdr_in,(abfd, aouthdr_ext1, aouthdr_int1),
766       bfd            *abfd AND
767       PTR aouthdr_ext1 AND
768       PTR aouthdr_int1)
769 {
770   AOUTHDR        *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
771   struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
772
773   aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
774   aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
775   aouthdr_int->tsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tsize);
776   aouthdr_int->dsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->dsize);
777   aouthdr_int->bsize = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->bsize);
778   aouthdr_int->entry = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->entry);
779   aouthdr_int->text_start = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->text_start);
780   aouthdr_int->data_start = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->data_start);
781 #ifdef I960
782   aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
783 #endif
784
785 #ifdef RS6000COFF_C
786   aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
787   aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
788   aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
789   aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
790   aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
791   aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
792   aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
793   aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
794   aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
795   aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
796   aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
797 #endif
798 }
799
800 static unsigned int
801 DEFUN(coff_swap_aouthdr_out,(abfd, in, out),
802       bfd       *abfd AND
803       PTR       in AND
804       PTR       out)
805 {
806   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
807   AOUTHDR *aouthdr_out = (AOUTHDR *)out;
808   bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
809   bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
810   bfd_h_put_32(abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
811   bfd_h_put_32(abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
812   bfd_h_put_32(abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
813   bfd_h_put_32(abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
814   bfd_h_put_32(abfd, aouthdr_in->text_start,
815                (bfd_byte *) aouthdr_out->text_start);
816   bfd_h_put_32(abfd, aouthdr_in->data_start, (bfd_byte *) aouthdr_out->data_start);
817 #ifdef I960
818   bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
819 #endif
820   return sizeof(AOUTHDR);
821 }
822
823 static void
824 DEFUN(coff_swap_scnhdr_in,(abfd, scnhdr_ext, scnhdr_int),
825       bfd            *abfd AND
826       SCNHDR         *scnhdr_ext AND
827       struct internal_scnhdr *scnhdr_int)
828 {
829   memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
830   scnhdr_int->s_vaddr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
831   scnhdr_int->s_paddr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_paddr);
832   scnhdr_int->s_size = bfd_h_get_32(abfd, (bfd_byte *)  scnhdr_ext->s_size);
833
834   scnhdr_int->s_scnptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
835   scnhdr_int->s_relptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_relptr);
836   scnhdr_int->s_lnnoptr = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
837   scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags);
838 #if defined(M88)
839   scnhdr_int->s_nreloc = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
840   scnhdr_int->s_nlnno = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
841 #else
842   scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
843   scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
844 #endif
845 #ifdef I960
846   scnhdr_int->s_align = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_align);
847 #endif
848 }
849
850 static unsigned int
851 DEFUN(coff_swap_scnhdr_out,(abfd, in, out),
852       bfd       *abfd AND
853       PTR       in AND
854       PTR       out)
855 {
856   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
857   SCNHDR *scnhdr_ext = (SCNHDR *)out;
858   memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
859   PUTWORD(abfd, scnhdr_int->s_vaddr, (bfd_byte *) scnhdr_ext->s_vaddr);
860   PUTWORD(abfd, scnhdr_int->s_paddr, (bfd_byte *) scnhdr_ext->s_paddr);
861   PUTWORD(abfd, scnhdr_int->s_size, (bfd_byte *) scnhdr_ext->s_size);
862   PUTWORD(abfd, scnhdr_int->s_scnptr, (bfd_byte *) scnhdr_ext->s_scnptr);
863   PUTWORD(abfd, scnhdr_int->s_relptr, (bfd_byte *) scnhdr_ext->s_relptr);
864   PUTWORD(abfd, scnhdr_int->s_lnnoptr, (bfd_byte *) scnhdr_ext->s_lnnoptr);
865   PUTWORD(abfd, scnhdr_int->s_flags, (bfd_byte *) scnhdr_ext->s_flags);
866 #if defined(M88)
867   PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
868   PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
869 #else
870   PUTHALF(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
871   PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
872 #endif
873
874 #if defined(I960)
875   PUTWORD(abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
876 #endif
877   return sizeof(SCNHDR);
878 }
879
880
881 /*
882    initialize a section structure with information peculiar to this
883    particular implementation of coff
884 */
885
886 static          boolean
887 DEFUN(coff_new_section_hook,(abfd_ignore, section),
888       bfd            *abfd_ignore AND
889       asection       *section)
890 {
891   section->alignment_power = abfd_ignore->xvec->align_power_min;
892   return true;
893 }
894
895 static asection bfd_debug_section = 
896 { "*DEBUG*" };
897
898
899
900 static void
901 DEFUN(make_abs_section,(abfd),
902       bfd *abfd)
903 {
904     
905
906   
907 }
908
909 /* Take a section header read from a coff file (in HOST byte order),
910    and make a BFD "section" out of it.  */
911 static          boolean
912 DEFUN(make_a_section_from_file,(abfd, hdr, target_index),
913       bfd            *abfd AND
914       struct internal_scnhdr  *hdr AND
915       unsigned int target_index)
916 {
917   asection       *return_section;
918   char *name;
919     
920   /* Assorted wastage to null-terminate the name, thanks AT&T! */
921   name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
922   if (name == NULL) {
923       bfd_error = no_memory;
924       return false;
925     }
926   strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
927   name[sizeof (hdr->s_name)] = 0;
928
929   return_section = bfd_make_section(abfd, name);
930   if (return_section == NULL)
931    return false;
932
933   /* s_paddr is presumed to be = to s_vaddr */
934
935   return_section->vma = hdr->s_vaddr;
936   return_section->_raw_size = hdr->s_size;
937   return_section->filepos = hdr->s_scnptr;
938   return_section->rel_filepos =  hdr->s_relptr;
939   return_section->reloc_count = hdr->s_nreloc;
940 #ifdef I960
941
942   /* FIXME, use a temp var rather than alignment_power */
943   return_section->alignment_power = hdr->s_align;
944 {
945   unsigned int    i;
946   for (i = 0; i < 32; i++) {
947       if ((1 << i) >= (int) (return_section->alignment_power)) {
948           return_section->alignment_power = i;
949           break;
950         }
951     }
952 }
953
954 #endif
955 return_section->line_filepos =  hdr->s_lnnoptr;
956   /*
957     return_section->linesize =   hdr->s_nlnno * sizeof (struct lineno);
958     */
959
960   return_section->lineno_count = hdr->s_nlnno;
961   return_section->userdata = NULL;
962   return_section->next = (asection *) NULL;
963   return_section->flags = styp_to_sec_flags(hdr->s_flags);
964
965   return_section->target_index = target_index;
966
967   if (hdr->s_nreloc != 0)
968    return_section->flags |= SEC_RELOC;
969   /* FIXME: should this check 'hdr->s_size > 0' */
970   if (hdr->s_scnptr != 0)
971    return_section->flags |= SEC_HAS_CONTENTS;
972   return true;
973 }
974 static          boolean
975 DEFUN(coff_mkobject,(abfd),
976       bfd            *abfd)
977 {
978  abfd->tdata.coff_obj_data = (struct coff_tdata *)bfd_zalloc (abfd,sizeof(coff_data_type));
979   if (abfd->tdata.coff_obj_data == 0){
980     bfd_error = no_memory;
981     return false;
982   }
983   coff_data(abfd)->relocbase = 0;
984 /*  make_abs_section(abfd);*/
985   return true;
986 }
987
988 static
989 bfd_target     *
990 DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
991     bfd            *abfd AND
992     unsigned        nscns AND
993   struct internal_filehdr *internal_f AND
994   struct internal_aouthdr *internal_a)
995 {
996   coff_data_type *coff;
997   enum bfd_architecture arch;
998   long machine;
999   size_t          readsize;     /* length of file_info */
1000   SCNHDR *external_sections;
1001
1002   /* Build a play area */
1003   if (coff_mkobject(abfd) != true)
1004     return 0;
1005
1006   coff = coff_data(abfd);
1007
1008
1009   external_sections = (SCNHDR *)bfd_alloc(abfd, readsize = (nscns * SCNHSZ));
1010
1011   if (bfd_read((PTR)external_sections, 1, readsize, abfd) != readsize) {
1012     goto fail;
1013   }
1014
1015
1016   /* Now copy data as required; construct all asections etc */
1017   coff->symbol_index_slew = 0;
1018   coff->relocbase =0;
1019   coff->raw_syment_count = 0;
1020   coff->raw_linenos = 0;
1021   coff->raw_syments = 0;
1022   coff->sym_filepos =0;
1023   coff->flags = internal_f->f_flags;
1024   if (nscns != 0) {
1025     unsigned int    i;
1026     for (i = 0; i < nscns; i++) {
1027       struct internal_scnhdr tmp;
1028       coff_swap_scnhdr_in(abfd, external_sections + i, &tmp);
1029       make_a_section_from_file(abfd,&tmp, i+1);
1030     }
1031   }
1032
1033 /*  make_abs_section(abfd);*/
1034   
1035   /* Determine the machine architecture and type.  */
1036 machine = 0;
1037   switch (internal_f->f_magic) {
1038 #ifdef I386MAGIC
1039   case I386MAGIC:
1040     arch = bfd_arch_i386;
1041     machine = 0;
1042     break;
1043 #endif
1044
1045 #ifdef A29K_MAGIC_BIG
1046   case  A29K_MAGIC_BIG:
1047   case  A29K_MAGIC_LITTLE:
1048     arch = bfd_arch_a29k;
1049     machine = 0;
1050     break;
1051 #endif
1052
1053 #ifdef MIPS
1054   case  MIPS_MAGIC_1:
1055   case  MIPS_MAGIC_2:
1056   case  MIPS_MAGIC_3:
1057     arch = bfd_arch_mips;
1058     machine = 0;
1059     break;
1060 #endif
1061
1062 #ifdef MC68MAGIC
1063   case MC68MAGIC:
1064   case M68MAGIC:
1065     arch = bfd_arch_m68k;
1066     machine = 68020;
1067     break;
1068 #endif
1069 #ifdef MC88MAGIC
1070   case MC88MAGIC:
1071   case MC88DMAGIC:
1072   case MC88OMAGIC:
1073     arch = bfd_arch_m88k;
1074     machine = 88100;
1075     break;
1076 #endif
1077 #ifdef I960
1078 #ifdef I960ROMAGIC
1079   case I960ROMAGIC:
1080   case I960RWMAGIC:
1081     arch = bfd_arch_i960;
1082     switch (F_I960TYPE & internal_f->f_flags)
1083         {
1084         default:
1085         case F_I960CORE:
1086           machine = bfd_mach_i960_core;
1087           break;
1088         case F_I960KB:
1089           machine = bfd_mach_i960_kb_sb;
1090           break;
1091         case  F_I960MC:
1092           machine = bfd_mach_i960_mc;
1093           break;
1094         case F_I960XA:
1095           machine = bfd_mach_i960_xa;
1096           break;
1097         case F_I960CA:
1098           machine = bfd_mach_i960_ca;
1099           break;
1100         case F_I960KA:
1101           machine = bfd_mach_i960_ka_sa;
1102           break;
1103         }
1104     break;
1105 #endif
1106 #endif
1107
1108 #ifdef U802ROMAGIC
1109   case U802ROMAGIC:
1110   case U802WRMAGIC:
1111   case U802TOCMAGIC:
1112     arch = bfd_arch_rs6000;
1113     machine = 6000;
1114     break;
1115 #endif
1116
1117 #ifdef H8300MAGIC
1118   case H8300MAGIC:
1119     arch = bfd_arch_h8300;
1120     machine = 0;
1121     break;
1122 #endif
1123
1124   default:                      /* Unreadable input file type */
1125  arch = bfd_arch_obscure;
1126     break;
1127   }
1128
1129   bfd_default_set_arch_mach(abfd, arch, machine);
1130   if (!(internal_f->f_flags & F_RELFLG))
1131     abfd->flags |= HAS_RELOC;
1132   if ((internal_f->f_flags & F_EXEC))
1133     abfd->flags |= EXEC_P;
1134   if (!(internal_f->f_flags & F_LNNO))
1135     abfd->flags |= HAS_LINENO;
1136   if (!(internal_f->f_flags & F_LSYMS))
1137     abfd->flags |= HAS_LOCALS;
1138
1139
1140   bfd_get_symcount(abfd) = internal_f->f_nsyms;
1141   if (internal_f->f_nsyms)
1142     abfd->flags |= HAS_SYMS;
1143
1144   coff->sym_filepos = internal_f->f_symptr;
1145
1146   /* These members communicate important constants about the symbol table
1147     to GDB's symbol-reading code.  These `constants' unfortunately vary
1148       from coff implementation to implementation...  */
1149 #ifndef NO_COFF_SYMBOLS
1150   coff->local_n_btmask = N_BTMASK;
1151   coff->local_n_btshft = N_BTSHFT;
1152   coff->local_n_tmask  = N_TMASK;
1153   coff->local_n_tshift = N_TSHIFT;
1154   coff->local_symesz   = SYMESZ;
1155   coff->local_auxesz   = AUXESZ;
1156   coff->local_linesz   = LINESZ;
1157 #endif
1158
1159   coff->symbols = (coff_symbol_type *) NULL;
1160   bfd_get_start_address(abfd) = internal_f->f_opthdr ? internal_a->entry : 0;
1161
1162   return abfd->xvec;
1163  fail:
1164   bfd_release(abfd, coff);
1165   return (bfd_target *)NULL;
1166 }
1167
1168 static bfd_target *
1169 DEFUN(coff_object_p,(abfd),
1170       bfd            *abfd)
1171 {
1172   int   nscns;
1173   FILHDR filehdr;
1174   AOUTHDR opthdr;
1175   struct internal_filehdr internal_f;
1176   struct internal_aouthdr internal_a;
1177
1178   bfd_error = system_call_error;
1179
1180   /* figure out how much to read */
1181   if (bfd_read((PTR) &filehdr, 1, FILHSZ, abfd) != FILHSZ)
1182     return 0;
1183
1184   bfd_swap_filehdr_in(abfd, &filehdr, &internal_f);
1185
1186   if (BADMAG(internal_f)) {
1187     bfd_error = wrong_format;
1188     return 0;
1189   }
1190   nscns =internal_f.f_nscns;
1191
1192   if (internal_f.f_opthdr) {
1193     if (bfd_read((PTR) &opthdr, 1,AOUTSZ, abfd) != AOUTSZ) {
1194       return 0;
1195     }
1196     bfd_swap_aouthdr_in(abfd, (char *)&opthdr, (char *)&internal_a);
1197   }
1198
1199   /* Seek past the opt hdr stuff */
1200   bfd_seek(abfd, internal_f.f_opthdr + FILHSZ, SEEK_SET);
1201
1202   /* if the optional header is NULL or not the correct size then
1203      quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
1204      and Intel 960 readwrite headers (I960WRMAGIC) is that the
1205      optional header is of a different size.
1206
1207      But the mips keeps extra stuff in it's opthdr, so dont check
1208      when doing that
1209      */
1210
1211 #if defined(M88) || defined(I960)
1212   if (internal_f.f_opthdr != 0 && AOUTSZ != internal_f.f_opthdr)
1213     return (bfd_target *)NULL;
1214 #endif
1215
1216   return coff_real_object_p(abfd, nscns, &internal_f, &internal_a);
1217 }
1218
1219
1220
1221 #ifndef NO_COFF_LINENOS
1222
1223 static void
1224 DEFUN(coff_count_linenumbers,(abfd),
1225       bfd            *abfd)
1226 {
1227   unsigned int    limit = bfd_get_symcount(abfd);
1228   unsigned int    i;
1229   asymbol       **p;
1230     {
1231       asection       *s = abfd->sections->output_section;
1232       while (s) {
1233         BFD_ASSERT(s->lineno_count == 0);
1234         s = s->next;
1235       }
1236     }
1237
1238
1239   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
1240     asymbol        *q_maybe = *p;
1241     if (q_maybe->the_bfd->xvec->flavour == bfd_target_coff_flavour) {
1242       coff_symbol_type *q = coffsymbol(q_maybe);
1243       if (q->lineno) {
1244         /*
1245           This symbol has a linenumber, increment the owning
1246           section's linenumber count
1247           */
1248         alent          *l = q->lineno;
1249         q->symbol.section->output_section->lineno_count++;
1250         l++;
1251         while (l->line_number) {
1252           q->symbol.section->output_section->lineno_count++;
1253           l++;
1254         }
1255       }
1256     }
1257   }
1258 }
1259
1260 #endif /* NO_COFF_LINENOS */
1261
1262 #ifndef NO_COFF_SYMBOLS
1263
1264 /*
1265   Takes a bfd and a symbol, returns a pointer to the coff specific area
1266   of the symbol if there is one.
1267   */
1268 static coff_symbol_type *
1269 DEFUN(coff_symbol_from,(ignore_abfd, symbol),
1270       bfd            *ignore_abfd AND
1271       asymbol        *symbol)
1272 {
1273   if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour)
1274     return (coff_symbol_type *)NULL;
1275
1276   if (symbol->the_bfd->tdata.coff_obj_data == (coff_data_type*)NULL)
1277     return (coff_symbol_type *)NULL;
1278
1279   return  (coff_symbol_type *) symbol;
1280 }
1281
1282
1283
1284 static void
1285 DEFUN(fixup_symbol_value,(coff_symbol_ptr, syment),
1286 coff_symbol_type *coff_symbol_ptr AND
1287 struct internal_syment *syment)
1288 {
1289
1290   /* Normalize the symbol flags */
1291   if (coff_symbol_ptr->symbol.section == &bfd_com_section) {
1292     /* a common symbol is undefined with a value */
1293     syment->n_scnum = N_UNDEF;
1294     syment->n_value = coff_symbol_ptr->symbol.value;
1295   }
1296   else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
1297     syment->n_value = coff_symbol_ptr->symbol.value;
1298   }
1299   else if (coff_symbol_ptr->symbol.section == & bfd_und_section) {
1300     syment->n_scnum = N_UNDEF;
1301     syment->n_value = 0;
1302   }
1303   else {
1304     if (coff_symbol_ptr->symbol.section) {
1305       syment->n_scnum    =
1306        coff_symbol_ptr->symbol.section->output_section->target_index;
1307
1308       syment->n_value =
1309        coff_symbol_ptr->symbol.value +
1310         coff_symbol_ptr->symbol.section->output_offset +
1311          coff_symbol_ptr->symbol.section->output_section->vma;
1312     }
1313     else {
1314         BFD_ASSERT(0);
1315       /* This can happen, but I don't know why yet ([email protected]) */
1316       syment->n_scnum = N_ABS;
1317       syment->n_value = coff_symbol_ptr->symbol.value;
1318     }
1319   }
1320 }
1321
1322 /* run through all the symbols in the symbol table and work out what
1323    their indexes into the symbol table will be when output
1324
1325  Coff requires that each C_FILE symbol points to the next one in the
1326  chain, and that the last one points to the first external symbol. We
1327  do that here too.
1328
1329 */
1330 static void
1331 DEFUN(coff_renumber_symbols,(bfd_ptr),
1332       bfd *bfd_ptr)
1333 {
1334   unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
1335   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
1336   unsigned int native_index = 0;
1337   struct internal_syment *last_file = (struct internal_syment *)NULL;
1338   unsigned int symbol_index;
1339   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
1340       {
1341         coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
1342         if (coff_symbol_ptr && coff_symbol_ptr->native) {
1343           combined_entry_type *s = coff_symbol_ptr->native;
1344           int i;
1345
1346           if (s->u.syment.n_sclass == C_FILE)
1347               {
1348                 if (last_file != (struct internal_syment *)NULL) {
1349                   last_file->n_value = native_index;
1350                 }
1351                 last_file = &(s->u.syment);
1352               }
1353           else {
1354
1355             /* Modify the symbol values according to their section and
1356                type */
1357
1358             fixup_symbol_value(coff_symbol_ptr, &(s->u.syment));
1359           }
1360           for (i = 0; i < s->u.syment.n_numaux + 1; i++) {
1361             s[i].offset = native_index ++;
1362           }
1363         }
1364         else {
1365           native_index++;
1366         }
1367       }
1368 }
1369
1370
1371 /*
1372  Run thorough the symbol table again, and fix it so that all pointers to
1373  entries are changed to the entries' index in the output symbol table.
1374
1375 */
1376 static void
1377 DEFUN(coff_mangle_symbols,(bfd_ptr),
1378       bfd *bfd_ptr)
1379 {
1380   unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
1381   asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
1382   unsigned int symbol_index;
1383
1384   for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
1385       {
1386         coff_symbol_type *coff_symbol_ptr =
1387           coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
1388
1389         if (coff_symbol_ptr && coff_symbol_ptr->native) {
1390           int i;
1391           combined_entry_type *s = coff_symbol_ptr->native;
1392
1393           for (i = 0; i < s->u.syment.n_numaux ; i++) {
1394             combined_entry_type *a = s + i + 1;
1395             if (a->fix_tag) {
1396               a->u.auxent.x_sym.x_tagndx.l =
1397                 a->u.auxent.x_sym.x_tagndx.p->offset;
1398               a->fix_tag = 0;
1399             }
1400             if (a->fix_end) {
1401               a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
1402                 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
1403               a->fix_end = 0;
1404               
1405             }
1406
1407           }
1408         }
1409       }
1410 }
1411
1412 static int string_size;
1413 static void
1414 DEFUN(coff_fix_symbol_name,(ignore_abfd, symbol, native),
1415   bfd *ignore_abfd AND
1416   asymbol *symbol AND
1417   combined_entry_type *native)
1418 {
1419   unsigned int    name_length;
1420   union internal_auxent *auxent;
1421   char *  name = ( char *)(symbol->name);
1422
1423   if (name == (char *) NULL) {
1424     /* coff symbols always have names, so we'll make one up */
1425     symbol->name = "strange";
1426     name = (char *)symbol->name;
1427   }
1428   name_length = strlen(name);
1429
1430   if (native->u.syment.n_sclass == C_FILE) {
1431     strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
1432     auxent = &(native+1)->u.auxent;
1433
1434 #ifdef COFF_LONG_FILENAMES
1435     if (name_length <= FILNMLEN) {
1436       strncpy(auxent->x_file.x_fname, name, FILNMLEN);
1437     }
1438     else {
1439       auxent->x_file.x_n.x_offset = string_size + 4;
1440       auxent->x_file.x_n.x_zeroes = 0;
1441       string_size += name_length + 1;
1442     }
1443 #else
1444     strncpy(auxent->x_file.x_fname, name, FILNMLEN);
1445     if (name_length > FILNMLEN) {
1446       name[FILNMLEN] = '\0';
1447     }
1448 #endif
1449   }
1450   else
1451       {                         /* NOT A C_FILE SYMBOL */
1452         if (name_length <= SYMNMLEN) {
1453           /* This name will fit into the symbol neatly */
1454           strncpy(native->u.syment._n._n_name, symbol->name, SYMNMLEN);
1455         }
1456         else {
1457           native->u.syment._n._n_n._n_offset =  string_size + 4;
1458           native->u.syment._n._n_n._n_zeroes = 0;
1459           string_size += name_length + 1;
1460         }
1461       }
1462 }
1463
1464
1465
1466 static unsigned int
1467 DEFUN(coff_write_symbol,(abfd, symbol, native, written),
1468 bfd *abfd AND
1469 asymbol *symbol AND
1470 combined_entry_type *native AND
1471 unsigned int written)
1472 {
1473   unsigned int    numaux = native->u.syment.n_numaux;
1474   int             type = native->u.syment.n_type;
1475   int             class =  native->u.syment.n_sclass;
1476   SYMENT buf;
1477   unsigned int j;
1478   if (symbol->section == &bfd_abs_section) 
1479   {
1480     native->u.syment.n_scnum = N_ABS;
1481   }
1482   else if (symbol->section == &bfd_debug_section) 
1483   {
1484     native->u.syment.n_scnum = N_DEBUG;
1485   }
1486   else if (symbol->section == &bfd_und_section)   
1487   {
1488     native->u.syment.n_scnum = N_UNDEF;
1489   }
1490   else 
1491   {
1492     native->u.syment.n_scnum =
1493      symbol->section->output_section->target_index;
1494   }
1495   
1496   
1497   coff_fix_symbol_name(abfd, symbol, native);
1498
1499   coff_swap_sym_out(abfd, &native->u.syment, &buf);
1500   bfd_write((PTR)& buf, 1, SYMESZ, abfd);
1501   for (j = 0; j < native->u.syment.n_numaux;  j++)
1502   {
1503     AUXENT buf1;
1504     bzero((PTR)&buf, AUXESZ);
1505     coff_swap_aux_out(abfd,
1506                       &( (native + j + 1)->u.auxent), type, class, &buf1);
1507     bfd_write((PTR) (&buf1), 1, AUXESZ, abfd);
1508   }
1509   /*
1510     Reuse somewhere in the symbol to keep the index
1511     */
1512   set_index(symbol, written);
1513   return   written + 1 + numaux;
1514 }
1515
1516
1517 static unsigned int
1518 DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
1519       bfd *abfd AND
1520       asymbol *symbol AND
1521       unsigned int written)
1522 {
1523   /*
1524     This symbol has been created by the loader, or come from a non
1525     coff format. It  has no native element to inherit, make our
1526     own
1527     */
1528   combined_entry_type *native;
1529   combined_entry_type dummy;
1530   native = &dummy;
1531   native->u.syment.n_type =  T_NULL;
1532 #ifdef I960
1533   native->u.syment.n_flags =  0;
1534 #endif
1535   if (symbol->section == &bfd_und_section) 
1536   {
1537       native->u.syment.n_scnum =  N_UNDEF;
1538       native->u.syment.n_value =  symbol->value;
1539     }
1540   else if (symbol->section == &bfd_com_section) 
1541   {
1542       native->u.syment.n_scnum =  N_UNDEF;
1543       native->u.syment.n_value =  symbol->value;
1544
1545   }
1546   
1547   else if (symbol->flags & BSF_DEBUGGING) {
1548       /*
1549         remove name so it doesn't take up any space
1550         */
1551       symbol->name = "";
1552     }
1553   else {
1554       native->u.syment.n_scnum  =   symbol->section->output_section->target_index;
1555       native->u.syment.n_value =   symbol->value +
1556        symbol->section->output_section->vma +
1557         symbol->section->output_offset;
1558 #ifdef I960
1559       /* Copy the any flags from the the file hdr into the symbol  */
1560     {
1561       coff_symbol_type *c = coff_symbol_from(abfd, symbol);
1562       if (c != (coff_symbol_type *)NULL) {
1563           native->u.syment.n_flags =   c->symbol.the_bfd->flags;
1564         }
1565     }
1566 #endif
1567     }
1568
1569 #ifdef HASPAD1
1570   native->u.syment.pad1[0] = 0;
1571   native->u.syment.pad1[0] = 0;
1572 #endif
1573
1574   native->u.syment.n_type =  0;
1575   if (symbol->flags & BSF_LOCAL)
1576    native->u.syment.n_sclass =  C_STAT;
1577   else
1578    native->u.syment.n_sclass =  C_EXT;
1579   native->u.syment.n_numaux =  0;
1580
1581   return   coff_write_symbol(abfd, symbol, native, written);
1582 }
1583
1584 static unsigned int
1585 DEFUN(coff_write_native_symbol,(abfd, symbol,   written),
1586 bfd *abfd AND
1587 coff_symbol_type *symbol AND
1588 unsigned int written)
1589 {
1590   /*
1591     Does this symbol have an ascociated line number - if so then
1592     make it remember this symbol index. Also tag the auxent of
1593     this symbol to point to the right place in the lineno table
1594     */
1595   combined_entry_type *native = symbol->native;
1596
1597   alent          *lineno = symbol->lineno;
1598
1599   if (lineno && !symbol->done_lineno) {
1600     unsigned int    count = 0;
1601     lineno[count].u.offset = written;
1602     if (native->u.syment.n_numaux) {
1603       union internal_auxent  *a = &((native+1)->u.auxent);
1604
1605       a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
1606         symbol->symbol.section->output_section->moving_line_filepos;
1607     }
1608     /*
1609       And count and relocate all other linenumbers
1610       */
1611
1612     count++;
1613     while (lineno[count].line_number) {
1614 #if 0
1615 /* 13 april 92. sac 
1616 I've been told this, but still need proof:
1617 > The second bug is also in `bfd/coffcode.h'.  This bug causes the linker to screw
1618 > up the pc-relocations for all the line numbers in COFF code.  This bug isn't
1619 > only specific to A29K implementations, but affects all systems using COFF
1620 > format binaries.  Note that in COFF object files, the line number core offsets
1621 > output by the assembler are relative to the start of each procedure, not
1622 > to the start of the .text section.  This patch relocates the line numbers
1623 > relative to the `native->u.syment.n_value' instead of the section virtual
1624 > address.  [email protected] (Jon Olson)
1625 */
1626        lineno[count].u.offset += native->u.syment.n_value;
1627
1628 #else
1629       lineno[count].u.offset +=
1630         symbol->symbol.section->output_section->vma +
1631           symbol->symbol.section->output_offset;
1632 #endif
1633       count++;
1634     }
1635     symbol->done_lineno = true;
1636     
1637     symbol->symbol.section->output_section->moving_line_filepos +=
1638       count * LINESZ;
1639   }
1640   return coff_write_symbol(abfd, &( symbol->symbol), native,written);
1641 }
1642
1643 static void
1644 DEFUN(coff_write_symbols,(abfd),
1645       bfd            *abfd)
1646 {
1647   unsigned int    i;
1648   unsigned int    limit = bfd_get_symcount(abfd);
1649   unsigned int    written = 0;
1650
1651   asymbol       **p;
1652
1653   string_size = 0;
1654
1655
1656   /* Seek to the right place */
1657   bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
1658
1659   /* Output all the symbols we have */
1660
1661   written = 0;
1662   for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
1663       {
1664         asymbol        *symbol = *p;
1665         coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
1666
1667         if (c_symbol == (coff_symbol_type *) NULL ||
1668             c_symbol->native == (combined_entry_type *)NULL)
1669             {
1670               written = coff_write_alien_symbol(abfd, symbol, written);
1671             }
1672         else
1673             {
1674               written = coff_write_native_symbol(abfd, c_symbol, written);
1675             }
1676
1677       }
1678
1679   bfd_get_symcount(abfd) = written;
1680
1681   /* Now write out strings */
1682
1683   if (string_size != 0)
1684    {
1685      unsigned int    size = string_size + 4;
1686      bfd_byte buffer[4];
1687
1688      bfd_h_put_32(abfd, size, buffer);
1689      bfd_write((PTR) buffer, 1, sizeof(buffer), abfd);
1690      for (p = abfd->outsymbols, i = 0;
1691           i < limit;
1692           i++, p++)
1693          {
1694            asymbol        *q = *p;
1695            size_t          name_length = strlen(q->name);
1696            int maxlen;
1697            coff_symbol_type*       c_symbol = coff_symbol_from(abfd, q);
1698            maxlen = ((c_symbol != NULL && c_symbol->native != NULL) &&
1699                      (c_symbol->native->u.syment.n_sclass == C_FILE)) ?
1700              FILNMLEN : SYMNMLEN;
1701
1702            if (name_length > maxlen) {
1703              bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
1704            }
1705          }
1706    }
1707   else {
1708     /* We would normally not write anything here, but we'll write
1709        out 4 so that any stupid coff reader which tries to read
1710        the string table even when there isn't one won't croak.
1711        */
1712
1713     uint32e_type size = 4;
1714     size =  size;
1715     bfd_write((PTR)&size, 1, sizeof(size), abfd);
1716
1717   }
1718 }
1719
1720 /*
1721 SUBSUBSECTION
1722         Writing Relocations
1723
1724         To write relocations, all the back end does is step though the
1725         canonical relocation table, and create an
1726         @code{internal_reloc}. The symbol index to use is removed from
1727         the @code{offset} field in the symbol table supplied, the
1728         address comes directly from the sum of the section base
1729         address and the relocation offset and the type is dug directly
1730         from the howto field.  Then the @code{internal_reloc} is
1731         swapped into the shape of an @code{external_reloc} and written
1732         out to disk. 
1733
1734 */
1735
1736 static void
1737 DEFUN(coff_write_relocs,(abfd),
1738       bfd            *abfd)
1739 {
1740   asection       *s;
1741   for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
1742     unsigned int    i;
1743     struct external_reloc dst;
1744
1745     arelent       **p = s->orelocation;
1746     bfd_seek(abfd, s->rel_filepos, SEEK_SET);
1747     for (i = 0; i < s->reloc_count; i++) {
1748       struct internal_reloc    n;
1749       arelent        *q = p[i];
1750       memset((PTR)&n, 0, sizeof(n));
1751       n.r_vaddr = q->address + s->vma;
1752       if (q->sym_ptr_ptr) {
1753         n.r_symndx = get_index((*(q->sym_ptr_ptr)));
1754       }
1755 #ifdef SELECT_RELOC
1756       /* Work out reloc type from what is required */
1757       SELECT_RELOC(n.r_type, q->howto);
1758 #else
1759       n.r_type = q->howto->type;
1760 #endif
1761       coff_swap_reloc_out(abfd, &n, &dst);
1762       bfd_write((PTR) &n, 1, RELSZ, abfd);
1763     }
1764   }
1765 }
1766 #endif /* NO_COFF_SYMBOLS */
1767
1768 #ifndef NO_COFF_LINENOS
1769
1770 static void
1771 DEFUN(coff_write_linenumbers,(abfd),
1772       bfd            *abfd)
1773 {
1774   asection       *s;
1775   for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
1776     if (s->lineno_count) {
1777       asymbol       **q = abfd->outsymbols;
1778       bfd_seek(abfd, s->line_filepos, SEEK_SET);
1779       /* Find all the linenumbers in this section */
1780       while (*q) {
1781         asymbol        *p = *q;
1782         alent          *l = BFD_SEND(p->the_bfd, _get_lineno, (p->the_bfd, p));
1783         if (l) {
1784           /* Found a linenumber entry, output */
1785           struct internal_lineno  out;
1786           LINENO buff;
1787           memset( (PTR)&out, 0, sizeof(out));
1788           out.l_lnno = 0;
1789           out.l_addr.l_symndx = l->u.offset;
1790           coff_swap_lineno_out(abfd, &out, &buff);
1791           bfd_write((PTR) &buff, 1, LINESZ, abfd);
1792           l++;
1793           while (l->line_number) {
1794             out.l_lnno = l->line_number;
1795             out.l_addr.l_symndx = l->u.offset;
1796             coff_swap_lineno_out(abfd, &out, &buff);
1797             bfd_write((PTR) &buff, 1, LINESZ, abfd);
1798             l++;
1799           }
1800         }
1801         q++;
1802       }
1803     }
1804   }
1805 }
1806
1807 static alent   *
1808 DEFUN(coff_get_lineno,(ignore_abfd, symbol),
1809       bfd            *ignore_abfd AND
1810       asymbol        *symbol)
1811 {
1812   return coffsymbol(symbol)->lineno;
1813 }
1814
1815 #endif /* NO_COFF_LINENOS */
1816
1817 static asymbol *
1818 coff_make_empty_symbol(abfd)
1819 bfd            *abfd;
1820 {
1821   coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1822   if (new == NULL) {
1823     bfd_error = no_memory;
1824     return (NULL);
1825   }                             /* on error */
1826   new->native = 0;
1827   new->lineno = (alent *) NULL;
1828   new->done_lineno = false;
1829   new->symbol.the_bfd = abfd;
1830   return &new->symbol;
1831 }
1832
1833 #ifndef NO_COFF_SYMBOLS
1834
1835 static void
1836 DEFUN(coff_print_symbol,(ignore_abfd, filep, symbol, how),
1837       bfd            *ignore_abfd AND
1838       PTR           filep AND
1839       asymbol        *symbol AND
1840       bfd_print_symbol_type how)
1841 {
1842   FILE *file = (FILE *)filep;
1843   switch (how) {
1844     case bfd_print_symbol_name:
1845       fprintf(file, "%s", symbol->name);
1846       break;
1847     case bfd_print_symbol_more:
1848       fprintf(file, "coff %lx %lx", (unsigned long) coffsymbol(symbol)->native,
1849               (unsigned long) coffsymbol(symbol)->lineno);
1850       break;
1851     case bfd_print_symbol_nm:
1852
1853     {
1854       CONST char *section_name = symbol->section->name;
1855       bfd_print_symbol_vandf((PTR) file, symbol);
1856
1857         
1858       fprintf(file, " %-5s %s %s %s",
1859               section_name,
1860               coffsymbol(symbol)->native ? "n" : "g",
1861               coffsymbol(symbol)->lineno ? "l" : " ",
1862               symbol->name);
1863     }
1864
1865
1866       break;
1867     case bfd_print_symbol_all:
1868       /* Print out the symbols in a reasonable way */
1869     {
1870       CONST char *section_name = symbol->section->name;
1871
1872
1873       if (coffsymbol(symbol)->native) 
1874       {
1875         unsigned int aux;
1876         combined_entry_type *combined = coffsymbol(symbol)->native;
1877         combined_entry_type *root = obj_raw_syments(ignore_abfd);
1878         
1879         fprintf(file,"[%3d]",
1880                 combined - root);
1881         
1882
1883         fprintf(file, "(sc %2d)(fl%4x)(ty%3x)(sc%3d) nx(%d) %08x %s",
1884                 combined->u.syment.n_scnum,
1885                 combined->u.syment.n_flags,
1886                 combined->u.syment.n_type,
1887                 combined->u.syment.n_sclass,
1888                 combined->u.syment.n_numaux,
1889                 combined->u.syment.n_value,
1890                 symbol->name
1891                 );
1892         for (aux = 0; aux < combined->u.syment.n_numaux; aux++) 
1893         {
1894           fprintf(file,"\n");
1895           switch (combined->u.syment.n_sclass) {
1896             case C_FILE:
1897               fprintf(file, "File ");
1898               break;
1899             default:
1900               fprintf(file, "AUX lnno %x size %x tagndx %x",
1901                       combined[aux+1].u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
1902                       combined[aux+1].u.auxent.x_sym.x_misc.x_lnsz.x_size,
1903                       combined[aux+1].u.auxent.x_sym.x_tagndx.l);
1904               break;
1905     
1906             }
1907
1908         }
1909         
1910       {
1911         struct lineno_cache_entry *l = coffsymbol(symbol)->lineno;
1912         if (l) 
1913         {
1914           printf("\n%s :", l->u.sym->name);
1915           l++;
1916           while (l->line_number) 
1917           {
1918             printf("\n%4d : %x", 
1919                    l->line_number,
1920                    l->u.offset);
1921             l++;
1922             
1923           }
1924         }
1925       }
1926
1927     
1928
1929       } 
1930
1931       else {
1932           bfd_print_symbol_vandf((PTR) file, symbol);
1933           fprintf(file, " %-5s %s %s %s",
1934                   section_name,
1935                   coffsymbol(symbol)->native ? "n" : "g",
1936                   coffsymbol(symbol)->lineno ? "l" : " ",
1937                   symbol->name);
1938         }
1939
1940     }
1941         
1942     }
1943 }
1944
1945 #endif /* NO_COFF_SYMBOLS */
1946
1947 /* Set flags and magic number of a coff file from architecture and machine
1948    type.  Result is true if we can represent the arch&type, false if not.  */
1949
1950 static          boolean
1951 DEFUN(coff_set_flags,(abfd, magicp, flagsp),
1952       bfd            *abfd AND
1953       unsigned       *magicp AND
1954       unsigned short *flagsp)
1955 {
1956   switch (bfd_get_arch(abfd)) {
1957
1958 #ifdef I960ROMAGIC
1959
1960     case bfd_arch_i960:
1961
1962       {
1963         unsigned        flags;
1964         *magicp = I960ROMAGIC;
1965         /*
1966           ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
1967           I960RWMAGIC);   FIXME???
1968           */
1969         switch (bfd_get_mach(abfd)) {
1970         case bfd_mach_i960_core:
1971           flags = F_I960CORE;
1972           break;
1973         case bfd_mach_i960_kb_sb:
1974           flags = F_I960KB;
1975           break;
1976         case bfd_mach_i960_mc:
1977           flags = F_I960MC;
1978           break;
1979         case bfd_mach_i960_xa:
1980           flags = F_I960XA;
1981           break;
1982         case bfd_mach_i960_ca:
1983           flags = F_I960CA;
1984           break;
1985         case bfd_mach_i960_ka_sa:
1986           flags = F_I960KA;
1987           break;
1988         default:
1989           return false;
1990         }
1991         *flagsp = flags;
1992         return true;
1993       }
1994     break;
1995 #endif
1996 #ifdef MIPS
1997   case bfd_arch_mips:
1998     *magicp = MIPS_MAGIC_2;
1999     return true;
2000     break;
2001 #endif
2002 #ifdef I386MAGIC
2003   case bfd_arch_i386:
2004     *magicp = I386MAGIC;
2005     return true;
2006 #endif
2007 #ifdef MC68MAGIC
2008   case bfd_arch_m68k:
2009     *magicp = MC68MAGIC;
2010     return true;
2011 #endif
2012
2013 #ifdef MC88MAGIC
2014     case bfd_arch_m88k:
2015       *magicp = MC88OMAGIC;
2016       return true;
2017       break;
2018 #endif
2019 #ifdef H8300MAGIC
2020     case bfd_arch_h8300:
2021       *magicp = H8300MAGIC;
2022       return true;
2023       break;
2024 #endif
2025 #ifdef A29K_MAGIC_BIG
2026     case bfd_arch_a29k:
2027       if (abfd->xvec->byteorder_big_p)
2028        *magicp = A29K_MAGIC_BIG;
2029       else
2030        *magicp = A29K_MAGIC_LITTLE;
2031       return true;
2032       break;
2033 #endif
2034
2035 #ifdef U802TOCMAGIC
2036   case bfd_arch_rs6000:
2037     *magicp = U802TOCMAGIC;
2038     break;
2039 #endif
2040
2041   default:                      /* Unknown architecture */
2042     /* return false;  -- fall through to "return false" below, to avoid
2043        "statement never reached" errors on the one below. */
2044     break;
2045   }
2046
2047   return false;
2048 }
2049
2050
2051 static          boolean
2052 DEFUN(coff_set_arch_mach,(abfd, arch, machine),
2053       bfd            *abfd AND
2054       enum bfd_architecture arch AND
2055       unsigned long   machine)
2056 {
2057   unsigned        dummy1;
2058   unsigned     short dummy2;
2059   bfd_default_set_arch_mach(abfd, arch, machine);
2060
2061   if (arch != bfd_arch_unknown &&
2062       coff_set_flags(abfd, &dummy1, &dummy2) != true)
2063     return false;               /* We can't represent this type */
2064   return true;                  /* We're easy ... */
2065 }
2066
2067
2068 /* Calculate the file position for each section. */
2069
2070 static void
2071 DEFUN(coff_compute_section_file_positions,(abfd),
2072       bfd            *abfd)
2073 {
2074   asection       *current;
2075   asection      *previous = (asection *)NULL;
2076   file_ptr        sofar = FILHSZ;
2077   file_ptr      old_sofar;
2078   if (bfd_get_start_address(abfd)) 
2079   {
2080     /*  A start address may have been added to the original file. In this
2081         case it will need an optional header to record it.  */
2082     abfd->flags |= EXEC_P;
2083   }
2084
2085   if (abfd->flags & EXEC_P)
2086    sofar += AOUTSZ;
2087
2088   sofar += abfd->section_count * SCNHSZ;
2089   for (current = abfd->sections;
2090        current != (asection *)NULL;
2091        current = current->next) {
2092
2093       /* Only deal with sections which have contents */
2094       if (!(current->flags & SEC_HAS_CONTENTS))
2095        continue;
2096
2097       /* Align the sections in the file to the same boundary on
2098          which they are aligned in virtual memory.  I960 doesn't
2099          do this (FIXME) so we can stay in sync with Intel.  960
2100          doesn't yet page from files... */
2101 #ifndef I960
2102     {
2103       /* make sure this section is aligned on the right boundary - by
2104          padding the previous section up if necessary */
2105
2106       old_sofar= sofar;
2107       sofar = BFD_ALIGN(sofar, 1 << current->alignment_power);
2108       if (previous != (asection *)NULL) {
2109           previous->_raw_size += sofar - old_sofar;
2110         }
2111     }
2112
2113 #endif
2114       /* FIXME, in demand paged files, the low order bits of the file
2115          offset must match the low order bits of the virtual address.
2116          "Low order" is apparently implementation defined.  Add code
2117          here to round sofar up to match the virtual address.  */
2118
2119       current->filepos = sofar;
2120
2121       /* make sure that this section is of the right size too */
2122       old_sofar =  sofar += current->_raw_size;
2123       sofar = BFD_ALIGN(sofar, 1 << current->alignment_power);
2124       current->_raw_size += sofar - old_sofar ;
2125
2126       previous = current;
2127     }
2128   obj_relocbase(abfd) = sofar;
2129 }
2130
2131
2132
2133
2134 /* SUPPRESS 558 */
2135 /* SUPPRESS 529 */
2136 static          boolean
2137 DEFUN(coff_write_object_contents,(abfd),
2138       bfd            *abfd)
2139 {
2140   asection       *current;
2141   unsigned int count;
2142   
2143   boolean         hasrelocs = false;
2144   boolean         haslinno = false;
2145   file_ptr        reloc_base;
2146   file_ptr        lineno_base;
2147   file_ptr        sym_base;
2148   file_ptr        scn_base;
2149   file_ptr        data_base;
2150   unsigned long   reloc_size = 0;
2151   unsigned long   lnno_size = 0;
2152   asection       *text_sec = NULL;
2153   asection       *data_sec = NULL;
2154   asection       *bss_sec = NULL;
2155
2156   struct internal_filehdr internal_f;
2157   struct internal_aouthdr internal_a;
2158
2159
2160   bfd_error = system_call_error;
2161   /* Number the output sections, starting from one on the first section
2162      with a name which doesn't start with a * */
2163   count = 1;
2164   for (current = abfd->sections; current != (asection *)NULL; 
2165        current = current->next) 
2166   {
2167       current->target_index = count;
2168   }
2169   
2170     
2171
2172
2173
2174   if(abfd->output_has_begun == false) {
2175       coff_compute_section_file_positions(abfd);
2176     }
2177
2178   if (abfd->sections != (asection *)NULL) {
2179       scn_base = abfd->sections->filepos;
2180     }
2181   else {
2182       scn_base = 0;
2183     }
2184   if (bfd_seek(abfd, scn_base, SEEK_SET) != 0)
2185    return false;
2186   reloc_base = obj_relocbase(abfd);
2187
2188   /* Make a pass through the symbol table to count line number entries and
2189      put them into the correct asections */
2190
2191 #ifndef NO_COFF_LINENOS
2192   coff_count_linenumbers(abfd);
2193 #endif
2194   data_base = scn_base;
2195
2196   /* Work out the size of the reloc and linno areas */
2197
2198   for (current = abfd->sections; current != NULL; current =
2199        current->next) 
2200   {
2201     /* We give section headers to +ve indexes */
2202     if (current->target_index > 0) 
2203     {
2204         
2205       reloc_size += current->reloc_count * RELSZ;
2206 #ifndef NO_COFF_LINENOS
2207       lnno_size += current->lineno_count * LINESZ;
2208 #endif
2209       data_base += SCNHSZ;
2210     }
2211       
2212   }
2213
2214   lineno_base = reloc_base + reloc_size;
2215   sym_base = lineno_base + lnno_size;
2216
2217   /* Indicate in each section->line_filepos its actual file address */
2218   for (current = abfd->sections; current != NULL; current =
2219        current->next) 
2220   {
2221     if (current->target_index > 0) 
2222     {
2223         
2224       if (current->lineno_count) {
2225           current->line_filepos = lineno_base;
2226           current->moving_line_filepos = lineno_base;
2227 #ifndef NO_COFF_LINENOS
2228           lineno_base += current->lineno_count * LINESZ;
2229 #endif
2230         }
2231       else {
2232           current->line_filepos = 0;
2233         }
2234       if (current->reloc_count) {
2235           current->rel_filepos = reloc_base;
2236           reloc_base += current->reloc_count * RELSZ;
2237         }
2238       else {
2239           current->rel_filepos = 0;
2240         }
2241     }
2242   }    
2243       
2244
2245
2246   /* Write section headers to the file.  */
2247   internal_f.f_nscns = 0;
2248   bfd_seek(abfd,
2249            (file_ptr) ((abfd->flags & EXEC_P) ?
2250                        (FILHSZ + AOUTSZ) : FILHSZ),
2251            SEEK_SET);
2252
2253 {
2254 #if 0
2255   unsigned int    pad = abfd->flags & D_PAGED ? data_base : 0;
2256 #endif
2257   unsigned int    pad = 0;
2258
2259   for (current = abfd->sections;
2260        current != NULL;
2261        current = current->next) {
2262       struct internal_scnhdr section;
2263       if (current->target_index > 0) 
2264       {
2265         internal_f.f_nscns ++;
2266         strncpy(&(section.s_name[0]), current->name, 8);
2267         section.s_vaddr = current->vma + pad;
2268         section.s_paddr = current->vma + pad;
2269         section.s_size = current->_raw_size - pad;
2270         /*
2271           If this section has no size or is unloadable then the scnptr
2272           will be 0 too
2273           */
2274         if (current->_raw_size - pad == 0 ||
2275             (current->flags & SEC_LOAD) == 0) {
2276             section.s_scnptr = 0;
2277           }
2278         else {
2279             section.s_scnptr = current->filepos;
2280           }
2281         section.s_relptr = current->rel_filepos;
2282         section.s_lnnoptr = current->line_filepos;
2283         section.s_nreloc = current->reloc_count;
2284         section.s_nlnno = current->lineno_count;
2285         if (current->reloc_count != 0)
2286          hasrelocs = true;
2287         if (current->lineno_count != 0)
2288          haslinno = true;
2289
2290         section.s_flags = sec_to_styp_flags(current->name,current->flags);
2291
2292         if (!strcmp(current->name, _TEXT)) {
2293             text_sec = current;
2294           } else if (!strcmp(current->name, _DATA)) {
2295               data_sec = current;
2296             } else if (!strcmp(current->name, _BSS)) {
2297                 bss_sec = current;
2298               }
2299
2300 #ifdef I960
2301         section.s_align = (current->alignment_power
2302                            ? 1 << current->alignment_power
2303                            : 0);
2304
2305 #endif
2306       {
2307         SCNHDR          buff;
2308
2309         coff_swap_scnhdr_out(abfd, &section, &buff);
2310         bfd_write((PTR) (&buff), 1, SCNHSZ, abfd);
2311
2312       }
2313
2314         pad = 0;
2315       }
2316     }   
2317 }
2318
2319
2320   /* OK, now set up the filehdr... */
2321
2322   /* Don't include the internal abs section in the section count */
2323
2324   /*
2325     We will NOT put a fucking timestamp in the header here. Every time you
2326     put it back, I will come in and take it out again. I'm sorry. This
2327     field does not belong here.  We fill it with a 0 so it compares the
2328     same but is not a reasonable time. -- [email protected]
2329     */
2330   /*
2331     Well, I like it, and now we have *customers* who have requested it,
2332     so I'm conditionally compiling it in.
2333
2334     [email protected]
2335     */
2336 #ifndef NOCOFF_TIMESTAMP
2337   internal_f.f_timdat = time(0);
2338 #else
2339   internal_f.f_timdat = 0;
2340 #endif
2341
2342   if (bfd_get_symcount(abfd) != 0)
2343    internal_f.f_symptr = sym_base;
2344   else
2345    internal_f.f_symptr = 0;
2346
2347   internal_f.f_flags = 0;
2348
2349   if (abfd->flags & EXEC_P)
2350    internal_f.f_opthdr = AOUTSZ;
2351   else
2352    internal_f.f_opthdr = 0;
2353
2354   if (!hasrelocs)
2355    internal_f.f_flags |= F_RELFLG;
2356   if (!haslinno)
2357    internal_f.f_flags |= F_LNNO;
2358   if (0 == bfd_get_symcount(abfd))
2359    internal_f.f_flags |= F_LSYMS;
2360   if (abfd->flags & EXEC_P)
2361    internal_f.f_flags |= F_EXEC;
2362
2363   if (!abfd->xvec->byteorder_big_p)
2364    internal_f.f_flags |= F_AR32WR;
2365   else 
2366   internal_f.f_flags |= F_AR32W;
2367
2368   /*
2369     FIXME, should do something about the other byte orders and
2370     architectures.
2371     */
2372
2373   /* Set up architecture-dependent stuff */
2374
2375 { unsigned int   magic = 0;
2376   unsigned short    flags = 0;
2377   coff_set_flags(abfd, &magic, &flags);
2378   internal_f.f_magic = magic;
2379   internal_f.f_flags |= flags;
2380   /* ...and the "opt"hdr... */
2381
2382 #ifdef A29K
2383 # ifdef ULTRA3                  /* NYU's machine */
2384   /* FIXME: This is a bogus check.  I really want to see if there
2385    * is a .shbss or a .shdata section, if so then set the magic
2386    * number to indicate a shared data executable.
2387    */
2388   if (internal_f.f_nscns >= 7)
2389    internal_a.magic = SHMAGIC;  /* Shared magic */
2390   else
2391 # endif                         /* ULTRA3 */
2392    internal_a.magic = NMAGIC;   /* Assume separate i/d */
2393 #define __A_MAGIC_SET__
2394 #endif                          /* A29K */
2395 #ifdef I960
2396   internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
2397 #define __A_MAGIC_SET__
2398 #endif                          /* I960 */
2399 #if M88
2400 #define __A_MAGIC_SET__
2401   internal_a.magic = PAGEMAGICBCS;
2402 #endif                          /* M88 */
2403
2404 #if M68 || I386 || MIPS
2405 #define __A_MAGIC_SET__
2406   /* Never was anything here for the 68k */
2407 #endif                          /* M88 */
2408
2409 #if RS6000COFF_C
2410 #define __A_MAGIC_SET__
2411   internal_a.magic = (abfd->flags & D_PAGED)? RS6K_AOUTHDR_ZMAGIC:
2412   (abfd->flags & WP_TEXT)? RS6K_AOUTHDR_NMAGIC:
2413   RS6K_AOUTHDR_OMAGIC;
2414 #endif
2415
2416 #ifndef __A_MAGIC_SET__
2417 # include "Your aouthdr magic number is not being set!"
2418 #else
2419 # undef __A_MAGIC_SET__
2420 #endif
2421 }
2422   /* Now should write relocs, strings, syms */
2423   obj_sym_filepos(abfd) = sym_base;
2424
2425 #ifndef NO_COFF_SYMBOLS
2426   if (bfd_get_symcount(abfd) != 0) {
2427       coff_renumber_symbols(abfd);
2428       coff_mangle_symbols(abfd);
2429       coff_write_symbols(abfd);
2430       coff_write_linenumbers(abfd);
2431       coff_write_relocs(abfd);
2432     }
2433 #endif                          /* NO_COFF_SYMBOLS */
2434   if (text_sec) {
2435       internal_a.tsize = bfd_get_section_size_before_reloc(text_sec);
2436       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
2437     }
2438   if (data_sec) {
2439       internal_a.dsize = bfd_get_section_size_before_reloc(data_sec);
2440       internal_a.data_start = internal_a.dsize ? data_sec->vma      : 0;
2441     }
2442   if (bss_sec) {
2443       internal_a.bsize = bfd_get_section_size_before_reloc(bss_sec);
2444     }
2445
2446   internal_a.entry = bfd_get_start_address(abfd);
2447   internal_f.f_nsyms =  bfd_get_symcount(abfd);
2448
2449   /* now write them */
2450   if (bfd_seek(abfd, 0L, SEEK_SET) != 0)
2451    return false;
2452 {
2453   FILHDR buff;
2454   coff_swap_filehdr_out(abfd, (PTR)&internal_f, (PTR)&buff);
2455   bfd_write((PTR) &buff, 1, FILHSZ, abfd);
2456 }
2457   if (abfd->flags & EXEC_P) {
2458       AOUTHDR buff;
2459       coff_swap_aouthdr_out(abfd, (PTR)&internal_a, (PTR)&buff);
2460       bfd_write((PTR) &buff, 1, AOUTSZ, abfd);
2461     }
2462   return true;
2463 }
2464
2465 #ifndef NO_COFF_SYMBOLS
2466
2467 /*
2468 this function transforms the offsets into the symbol table into
2469 pointers to syments.
2470 */
2471
2472
2473 static void
2474 DEFUN(coff_pointerize_aux,(ignore_abfd, table_base, type, class, auxent),
2475 bfd *ignore_abfd AND
2476 combined_entry_type *table_base AND
2477 int type AND
2478 int class AND
2479 combined_entry_type *auxent)
2480 {
2481   /* Don't bother if this is a file or a section */
2482   if (class == C_STAT && type == T_NULL) return;
2483   if (class == C_FILE) return;
2484
2485   /* Otherwise patch up */
2486   if (ISFCN(type) || ISTAG(class) || class == C_BLOCK) {
2487       auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = table_base +
2488        auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
2489       auxent->fix_end = 1;
2490     }
2491   if (auxent->u.auxent.x_sym.x_tagndx.l != 0) {
2492       auxent->u.auxent.x_sym.x_tagndx.p =
2493        table_base +  auxent->u.auxent.x_sym.x_tagndx.l;
2494       auxent->fix_tag = 1;
2495     }
2496 }
2497
2498 #endif /* NO_COFF_SYMBOLS */
2499
2500 static          boolean
2501 DEFUN(coff_set_section_contents,(abfd, section, location, offset, count),
2502       bfd            *abfd AND
2503       sec_ptr         section AND
2504       PTR             location AND
2505       file_ptr        offset AND
2506       bfd_size_type   count)
2507 {
2508     if (abfd->output_has_begun == false)        /* set by bfd.c handler */
2509         coff_compute_section_file_positions(abfd);
2510
2511     bfd_seek(abfd, (file_ptr) (section->filepos + offset), SEEK_SET);
2512
2513     if (count != 0) {
2514         return (bfd_write(location, 1, count, abfd) == count) ? true : false;
2515     }
2516     return true;
2517 }
2518 #if 0
2519 static          boolean
2520 coff_close_and_cleanup(abfd)
2521     bfd            *abfd;
2522 {
2523   if (!bfd_read_p(abfd))
2524     switch (abfd->format) {
2525     case bfd_archive:
2526       if (!_bfd_write_archive_contents(abfd))
2527         return false;
2528       break;
2529     case bfd_object:
2530       if (!coff_write_object_contents(abfd))
2531         return false;
2532       break;
2533     default:
2534       bfd_error = invalid_operation;
2535       return false;
2536     }
2537
2538   /* We depend on bfd_close to free all the memory on the obstack.  */
2539   /* FIXME if bfd_release is not using obstacks! */
2540   return true;
2541 }
2542
2543 #endif
2544 static PTR
2545 buy_and_read(abfd, where, seek_direction, size)
2546     bfd            *abfd;
2547     file_ptr        where;
2548     int             seek_direction;
2549     size_t          size;
2550 {
2551     PTR             area = (PTR) bfd_alloc(abfd, size);
2552     if (!area) {
2553         bfd_error = no_memory;
2554         return (NULL);
2555     }
2556     bfd_seek(abfd, where, seek_direction);
2557     if (bfd_read(area, 1, size, abfd) != size) {
2558         bfd_error = system_call_error;
2559         return (NULL);
2560     }                           /* on error */
2561     return (area);
2562 }                               /* buy_and_read() */
2563
2564
2565 #ifndef NO_COFF_SYMBOLS
2566
2567 static char *
2568 DEFUN(build_string_table,(abfd),
2569 bfd *abfd)
2570 {
2571   char string_table_size_buffer[4];
2572   unsigned int string_table_size;
2573   char *string_table;
2574
2575   /* At this point we should be "seek"'d to the end of the
2576      symbols === the symbol table size.  */
2577   if (bfd_read((char *) string_table_size_buffer,
2578                sizeof(string_table_size_buffer),
2579                1, abfd) != sizeof(string_table_size)) {
2580     bfd_error = system_call_error;
2581     return (NULL);
2582   }                             /* on error */
2583
2584   string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
2585
2586   if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
2587     bfd_error = no_memory;
2588     return (NULL);
2589   }                             /* on mallocation error */
2590   if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size) {
2591     bfd_error = system_call_error;
2592     return (NULL);
2593   }
2594   return string_table;
2595 }
2596
2597 /* Allocate space for the ".debug" section, and read it.
2598    We did not read the debug section until now, because
2599    we didn't want to go to the trouble until someone needed it. */
2600
2601 static char *
2602 DEFUN(build_debug_section,(abfd),
2603         bfd *abfd)
2604 {
2605   char *debug_section;
2606   long position;
2607
2608   asection *sect = bfd_get_section_by_name (abfd, ".debug");
2609
2610   if (!sect) {
2611      bfd_error = no_debug_section;
2612      return NULL;
2613   }
2614
2615   debug_section = (PTR) bfd_alloc (abfd,
2616                                    bfd_get_section_size_before_reloc (sect));
2617   if (debug_section == NULL) {
2618     bfd_error = no_memory;
2619     return NULL;
2620   }
2621
2622   /* Seek to the beginning of the `.debug' section and read it. 
2623      Save the current position first; it is needed by our caller.
2624      Then read debug section and reset the file pointer.  */
2625
2626   position = bfd_tell (abfd);
2627   bfd_seek (abfd, sect->filepos, SEEK_SET);
2628   if (bfd_read (debug_section, 
2629                 bfd_get_section_size_before_reloc (sect), 1, abfd)
2630       != bfd_get_section_size_before_reloc(sect)) {
2631     bfd_error = system_call_error;
2632     return NULL;
2633   }
2634   bfd_seek (abfd, position, SEEK_SET);
2635   return debug_section;
2636 }
2637
2638
2639 /* Return a pointer to a malloc'd copy of 'name'.  'name' may not be
2640  \0-terminated, but will not exceed 'maxlen' characters.  The copy *will*
2641  be \0-terminated.  */
2642 static char *
2643 DEFUN(copy_name,(abfd, name, maxlen),
2644       bfd *abfd AND
2645       char *name AND
2646       int maxlen)
2647 {
2648   int  len;
2649   char *newname;
2650
2651   for (len = 0; len < maxlen; ++len) {
2652     if (name[len] == '\0') {
2653       break;
2654     }
2655   }
2656
2657   if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
2658     bfd_error = no_memory;
2659     return (NULL);
2660   }
2661   strncpy(newname, name, len);
2662   newname[len] = '\0';
2663   return newname;
2664 }
2665
2666
2667 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
2668    knit the symbol names into a normalized form.  By normalized here I
2669    mean that all symbols have an n_offset pointer that points to a null-
2670    terminated string.  */
2671
2672 #ifndef SYMNAME_IN_DEBUG
2673 #define SYMNAME_IN_DEBUG(x)  0
2674 #endif
2675
2676 static combined_entry_type *
2677 DEFUN(get_normalized_symtab,(abfd),
2678 bfd            *abfd)
2679 {
2680   combined_entry_type          *internal;
2681   combined_entry_type          *internal_ptr;
2682   combined_entry_type          *symbol_ptr;
2683   combined_entry_type         *internal_end;
2684   SYMENT *raw;
2685   SYMENT *raw_src;
2686   SYMENT *raw_end;
2687   char           *string_table = NULL;
2688   char           *debug_section = NULL;
2689   unsigned long   size;
2690
2691   unsigned int raw_size;
2692   if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
2693       return obj_raw_syments(abfd);
2694     }
2695   if ((size = bfd_get_symcount(abfd) * sizeof(combined_entry_type)) == 0) {
2696       bfd_error = no_symbols;
2697       return (NULL);
2698     }
2699
2700   internal = (combined_entry_type *)bfd_alloc(abfd, size);
2701   internal_end = internal + bfd_get_symcount(abfd);
2702
2703   raw_size =      bfd_get_symcount(abfd) * SYMESZ;
2704   raw = (SYMENT *)bfd_alloc(abfd,raw_size);
2705
2706   if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
2707       || bfd_read((PTR)raw, raw_size, 1, abfd) != raw_size) {
2708       bfd_error = system_call_error;
2709       return (NULL);
2710     }
2711   /* mark the end of the symbols */
2712   raw_end = raw + bfd_get_symcount(abfd);
2713   /*
2714     FIXME SOMEDAY.  A string table size of zero is very weird, but
2715     probably possible.  If one shows up, it will probably kill us.
2716     */
2717
2718   /* Swap all the raw entries */
2719   for (raw_src = raw, internal_ptr = internal;
2720        raw_src < raw_end;
2721        raw_src++, internal_ptr++) {
2722
2723       unsigned int i;
2724       coff_swap_sym_in(abfd, (PTR)raw_src, (PTR)&internal_ptr->u.syment);
2725       internal_ptr->fix_tag = 0;
2726       internal_ptr->fix_end = 0;
2727       symbol_ptr = internal_ptr;
2728     
2729       for (i = 0;
2730            i < symbol_ptr->u.syment.n_numaux;
2731            i++) 
2732       {
2733         internal_ptr++;
2734         raw_src++;
2735       
2736         internal_ptr->fix_tag = 0;
2737         internal_ptr->fix_end = 0;
2738         coff_swap_aux_in(abfd, (char *)(raw_src),
2739                          symbol_ptr->u.syment.n_type,
2740                          symbol_ptr->u.syment.n_sclass,
2741                          &(internal_ptr->u.auxent));
2742         /* Remember that bal entries arn't pointerized */
2743         if (i != 1 || symbol_ptr->u.syment.n_sclass != C_LEAFPROC)
2744         {
2745           
2746         coff_pointerize_aux(abfd,
2747                             internal,
2748                             symbol_ptr->u.syment.n_type,
2749                             symbol_ptr->u.syment.n_sclass,
2750                             internal_ptr);
2751       }
2752         
2753       }
2754     }
2755
2756   /* Free all the raw stuff */
2757   bfd_release(abfd, raw);
2758
2759   for (internal_ptr = internal; internal_ptr < internal_end;
2760        internal_ptr ++)
2761   {
2762     if (internal_ptr->u.syment.n_sclass == C_FILE) {
2763         /* make a file symbol point to the name in the auxent, since
2764            the text ".file" is redundant */
2765         if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
2766             /* the filename is a long one, point into the string table */
2767             if (string_table == NULL) {
2768                 string_table = build_string_table(abfd);
2769               }
2770
2771             internal_ptr->u.syment._n._n_n._n_offset =
2772              (int) (string_table - 4 +
2773                     (internal_ptr+1)->u.auxent.x_file.x_n.x_offset);
2774           }
2775         else {
2776             /* ordinary short filename, put into memory anyway */
2777             internal_ptr->u.syment._n._n_n._n_offset = (int)
2778              copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
2779                        FILNMLEN);
2780           }
2781       }
2782     else {
2783         if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
2784             /* This is a "short" name.  Make it long.  */
2785             unsigned long   i = 0;
2786             char           *newstring = NULL;
2787
2788             /* find the length of this string without walking into memory
2789                that isn't ours.  */
2790             for (i = 0; i < 8; ++i) {
2791                 if (internal_ptr->u.syment._n._n_name[i] == '\0') {
2792                     break;
2793                   }             /* if end of string */
2794               }                 /* possible lengths of this string. */
2795
2796             if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
2797                 bfd_error = no_memory;
2798                 return (NULL);
2799               }                 /* on error */
2800             bzero(newstring, i);
2801             strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
2802             internal_ptr->u.syment._n._n_n._n_offset =  (int) newstring;
2803             internal_ptr->u.syment._n._n_n._n_zeroes = 0;
2804           }
2805         else if (!SYMNAME_IN_DEBUG(&internal_ptr->u.syment)) {
2806             /* Long name already.  Point symbol at the string in the table.  */
2807             if (string_table == NULL) {
2808                 string_table = build_string_table(abfd);
2809               }
2810             internal_ptr->u.syment._n._n_n._n_offset = (int)
2811              (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
2812           }
2813         else {
2814             /* Long name in debug section.  Very similar.  */
2815             if (debug_section == NULL) {
2816                 debug_section = build_debug_section(abfd);
2817               }
2818             internal_ptr->u.syment._n._n_n._n_offset = (int)
2819              (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
2820           }
2821       }
2822     internal_ptr += internal_ptr->u.syment.n_numaux;
2823   }
2824
2825   obj_raw_syments(abfd) = internal;
2826
2827   return (internal);
2828 }                               /* get_normalized_symtab() */
2829
2830 #endif /* NO_COFF_SYMBOLS */
2831
2832 static
2833 struct sec *
2834 DEFUN(section_from_bfd_index,(abfd, index),
2835       bfd            *abfd AND
2836       int             index)
2837 {
2838   struct sec *answer = abfd->sections;
2839
2840   if (index == N_ABS) 
2841   {
2842     return &bfd_abs_section;
2843   }
2844   if (index == N_UNDEF)
2845   {
2846     return &bfd_und_section;
2847   }
2848   if(index == N_DEBUG)
2849   {
2850     return &bfd_debug_section;
2851     
2852   }
2853   
2854   while (answer) {
2855       if (answer->target_index == index)
2856        return answer;
2857       answer = answer->next;
2858     }
2859   BFD_ASSERT(0);
2860   return &bfd_und_section;      /* For gcc -W and lint.  Never executed. */
2861 }
2862
2863 #ifndef NO_COFF_LINENOS
2864
2865 /*
2866 SUBSUBSECTION 
2867         Reading Linenumbers
2868
2869         Creating the linenumber table is done by reading in the entire
2870         coff linenumber table, and creating another table for internal use.
2871
2872         A coff line number table is structured so that each function
2873         is marked as having a line number of 0. Each line within the
2874         function is an offset from the first line in the function. The
2875         base of the line number information for the table is stored in
2876         the symbol associated with the function. 
2877
2878         The information is copied from the external to the internal
2879         table, and each symbol which marks a function is marked by
2880         pointing its...
2881
2882         How does this work ?
2883
2884 */
2885
2886 static boolean
2887 coff_slurp_line_table(abfd, asect)
2888 bfd            *abfd;
2889 asection       *asect;
2890   {
2891     LINENO  *native_lineno;
2892     alent          *lineno_cache;
2893
2894     BFD_ASSERT(asect->lineno == (alent *) NULL);
2895
2896     native_lineno = (LINENO *) buy_and_read(abfd,
2897                                             asect->line_filepos,
2898                                             SEEK_SET,
2899                                             (size_t) (LINESZ *
2900                                                       asect->lineno_count));
2901     lineno_cache =
2902       (alent *) bfd_alloc(abfd, (size_t) ((asect->lineno_count + 1) * sizeof(alent)));
2903     if (lineno_cache == NULL) {
2904       bfd_error = no_memory;
2905       return false;
2906     } else {
2907       unsigned int    counter = 0;
2908       alent          *cache_ptr = lineno_cache;
2909       LINENO  *src = native_lineno;
2910
2911       while (counter < asect->lineno_count) {
2912         struct internal_lineno dst;
2913         coff_swap_lineno_in(abfd, src, &dst);
2914         cache_ptr->line_number = dst.l_lnno;
2915
2916         if (cache_ptr->line_number == 0) {
2917           coff_symbol_type *sym =
2918             (coff_symbol_type *) (dst.l_addr.l_symndx
2919                                   + obj_raw_syments(abfd))->u.syment._n._n_n._n_zeroes;
2920           cache_ptr->u.sym = (asymbol *) sym;
2921           sym->lineno = cache_ptr;
2922         }
2923         else {
2924           cache_ptr->u.offset = dst.l_addr.l_paddr
2925             - bfd_section_vma(abfd, asect);
2926         }                               /* If no linenumber expect a symbol index */
2927
2928         cache_ptr++;
2929         src++;
2930         counter++;
2931       }
2932       cache_ptr->line_number = 0;
2933
2934     }
2935     asect->lineno = lineno_cache;
2936     /* FIXME, free native_lineno here, or use alloca or something. */
2937     return true;
2938   }                             /* coff_slurp_line_table() */
2939
2940 #endif /* NO_COFF_LINENOS */
2941
2942 #ifndef NO_COFF_LINENOS
2943
2944 static          boolean
2945 DEFUN(coff_slurp_symbol_table,(abfd),
2946       bfd            *abfd)
2947 {
2948   combined_entry_type         *native_symbols;
2949   coff_symbol_type *cached_area;
2950   unsigned int   *table_ptr;
2951
2952   unsigned int    number_of_symbols = 0;
2953   if (obj_symbols(abfd))
2954     return true;
2955   bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
2956
2957   /* Read in the symbol table */
2958   if ((native_symbols = get_normalized_symtab(abfd)) == NULL) {
2959     return (false);
2960   }                             /* on error */
2961
2962   /* Allocate enough room for all the symbols in cached form */
2963   cached_area =
2964     (coff_symbol_type *)
2965       bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(coff_symbol_type)));
2966
2967   if (cached_area == NULL) {
2968     bfd_error = no_memory;
2969     return false;
2970   }                             /* on error */
2971   table_ptr =
2972     (unsigned int *)
2973       bfd_alloc(abfd, (size_t) (bfd_get_symcount(abfd) * sizeof(unsigned int)));
2974
2975   if (table_ptr == NULL) {
2976     bfd_error = no_memory;
2977     return false;
2978   } 
2979   else 
2980   {
2981     coff_symbol_type *dst = cached_area;
2982     unsigned int    last_native_index = bfd_get_symcount(abfd);
2983     unsigned int    this_index = 0;
2984     while (this_index < last_native_index) {
2985       combined_entry_type         *src = native_symbols + this_index;
2986       table_ptr[this_index] = number_of_symbols;
2987       dst->symbol.the_bfd = abfd;
2988
2989       dst->symbol.name = (char *)(src->u.syment._n._n_n._n_offset);
2990       /*
2991         We use the native name field to point to the cached field
2992         */
2993       src->u.syment._n._n_n._n_zeroes = (int) dst;
2994       dst->symbol.section = section_from_bfd_index(abfd,
2995                                                    src->u.syment.n_scnum);
2996       dst->symbol.flags = 0;
2997       dst->done_lineno = false;
2998       
2999       switch (src->u.syment.n_sclass) {
3000 #ifdef I960
3001       case C_LEAFEXT:
3002 #if 0
3003         dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
3004         dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3005         dst->symbol.flags |= BSF_NOT_AT_END;
3006 #endif
3007         /* Fall through to next case */
3008
3009 #endif
3010
3011       case C_EXT:
3012 #ifdef RS6000COFF_C
3013       case C_HIDEXT:
3014 #endif
3015         if ((src->u.syment.n_scnum) == 0) {
3016           if ((src->u.syment.n_value) == 0) {
3017             dst->symbol.section = &bfd_und_section;
3018             dst->symbol.value= 0;
3019           }
3020           else {
3021             dst->symbol.section = &bfd_com_section;
3022             dst->symbol.value = (src->u.syment.n_value);
3023           }
3024         }
3025         else {
3026           /*
3027             Base the value as an index from the base of the
3028             section
3029             */
3030
3031             dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3032             dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
3033
3034           if (ISFCN((src->u.syment.n_type))) {
3035             /*
3036               A function ext does not go at the end of a file
3037               */
3038             dst->symbol.flags |= BSF_NOT_AT_END;
3039           }
3040         }
3041
3042
3043         break;
3044
3045       case C_STAT:              /* static                        */
3046 #ifdef I960
3047       case C_LEAFSTAT:          /* static leaf procedure        */
3048 #endif
3049       case C_LABEL:             /* label                         */
3050         if (src->u.syment.n_scnum == -2)
3051           dst->symbol.flags = BSF_DEBUGGING;
3052         else
3053           dst->symbol.flags = BSF_LOCAL;
3054         /*
3055           Base the value as an index from the base of the section, if
3056           there is one
3057           */
3058         if (dst->symbol.section)
3059           dst->symbol.value = (src->u.syment.n_value) -
3060             dst->symbol.section->vma;
3061         else
3062           dst->symbol.value = (src->u.syment.n_value) ;
3063         break;
3064
3065       case C_MOS:               /* member of structure   */
3066       case C_EOS:               /* end of structure              */
3067 #ifdef NOTDEF   /* C_AUTOARG has the same value */
3068 #ifdef C_GLBLREG
3069       case C_GLBLREG:           /* A29k-specific storage class */
3070 #endif
3071 #endif
3072       case C_REGPARM:           /* register parameter            */
3073       case C_REG:               /* register variable             */
3074 #ifdef C_AUTOARG
3075       case C_AUTOARG:           /* 960-specific storage class */
3076 #endif
3077       case C_TPDEF:             /* type definition               */
3078       case C_ARG:
3079       case C_AUTO:              /* automatic variable */
3080       case C_FIELD:             /* bit field */
3081       case C_ENTAG:             /* enumeration tag               */
3082       case C_MOE:               /* member of enumeration         */
3083       case C_MOU:               /* member of union               */
3084       case C_UNTAG:             /* union tag                     */
3085         dst->symbol.flags = BSF_DEBUGGING;
3086         dst->symbol.value = (src->u.syment.n_value);
3087         break;
3088
3089       case C_FILE:              /* file name                     */
3090       case C_STRTAG:            /* structure tag                 */
3091 #ifdef RS6000COFF_C
3092       case C_BINCL:             /* beginning of include file     */
3093       case C_EINCL:             /* ending of include file        */
3094       case C_GSYM:
3095       case C_LSYM:
3096       case C_PSYM:
3097       case C_RSYM:
3098       case C_RPSYM:
3099       case C_STSYM:
3100       case C_DECL:
3101       case C_ENTRY:
3102       case C_FUN:
3103       case C_BSTAT:
3104       case C_ESTAT:
3105 #endif
3106         dst->symbol.flags = BSF_DEBUGGING;
3107         dst->symbol.value = (src->u.syment.n_value);
3108         break;
3109
3110       case C_BLOCK:             /* ".bb" or ".eb"                */
3111       case C_FCN:               /* ".bf" or ".ef"                */
3112       case C_EFCN:              /* physical end of function      */
3113         dst->symbol.flags = BSF_LOCAL;
3114         /*
3115           Base the value as an index from the base of the section
3116           */
3117         dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma;
3118         break;
3119
3120       case C_NULL:
3121       case C_EXTDEF:            /* external definition           */
3122       case C_ULABEL:            /* undefined label               */
3123       case C_USTATIC:           /* undefined static              */
3124       case C_LINE:              /* line # reformatted as symbol table entry */
3125       case C_ALIAS:             /* duplicate tag                 */
3126       case C_HIDDEN:            /* ext symbol in dmert public lib */
3127       default:
3128
3129         fprintf(stderr,"Unrecognized storage class %d\n",
3130                                 src->u.syment.n_sclass);
3131         abort();
3132         dst->symbol.flags = BSF_DEBUGGING;
3133         dst->symbol.value = (src->u.syment.n_value);
3134         break;
3135       }
3136
3137 /*      BFD_ASSERT(dst->symbol.flags != 0);*/
3138
3139       dst->native = src;
3140
3141       dst->symbol.udata = 0;
3142       dst->lineno = (alent *) NULL;
3143       this_index += (src->u.syment.n_numaux) + 1;
3144       dst++;
3145       number_of_symbols++;
3146     }                           /* walk the native symtab */
3147   }                             /* bfdize the native symtab */
3148
3149   obj_symbols(abfd) = cached_area;
3150   obj_raw_syments(abfd) = native_symbols;
3151
3152   bfd_get_symcount(abfd) = number_of_symbols;
3153   obj_convert(abfd) = table_ptr;
3154   /* Slurp the line tables for each section too */
3155     {
3156       asection       *p;
3157       p = abfd->sections;
3158       while (p) {
3159         coff_slurp_line_table(abfd, p);
3160         p = p->next;
3161       }
3162     }
3163   return true;
3164 }                               /* coff_slurp_symbol_table() */
3165
3166 static unsigned int
3167 coff_get_symtab_upper_bound(abfd)
3168 bfd            *abfd;
3169   {
3170     if (!coff_slurp_symbol_table(abfd))
3171       return 0;
3172
3173     return (bfd_get_symcount(abfd) + 1) * (sizeof(coff_symbol_type *));
3174   }
3175
3176
3177 static unsigned int
3178 DEFUN(coff_get_symtab, (abfd, alocation),
3179       bfd            *abfd AND
3180       asymbol       **alocation)
3181 {
3182     unsigned int    counter = 0;
3183     coff_symbol_type *symbase;
3184     coff_symbol_type **location = (coff_symbol_type **) (alocation);
3185     if (!coff_slurp_symbol_table(abfd))
3186      return 0;
3187
3188     symbase = obj_symbols(abfd);
3189     while (counter <  bfd_get_symcount(abfd))
3190     {
3191         /* This nasty code looks at the symbol to decide whether or
3192            not it is descibes a constructor/destructor entry point. It
3193            is structured this way to (hopefully) speed non matches */
3194 #if 0   
3195         if (0 && symbase->symbol.name[9] == '$') 
3196         {
3197             bfd_constructor_entry(abfd, 
3198                                  (asymbol **)location,
3199                                   symbase->symbol.name[10] == 'I' ?
3200                                   "CTOR" : "DTOR");
3201         }
3202 #endif
3203         *(location++) = symbase++;
3204         counter++;
3205     }
3206     *location++ = 0;
3207     return bfd_get_symcount(abfd);
3208 }
3209
3210 #endif /* NO_COFF_SYMBOLS */
3211
3212 static unsigned int
3213 coff_get_reloc_upper_bound(abfd, asect)
3214 bfd            *abfd;
3215 sec_ptr         asect;
3216   {
3217     if (bfd_get_format(abfd) != bfd_object) {
3218       bfd_error = invalid_operation;
3219       return 0;
3220     }
3221     return (asect->reloc_count + 1) * sizeof(arelent *);
3222   }
3223
3224 /*
3225 SUBSUBSECTION 
3226         Reading Relocations
3227
3228         Coff relocations are easily transformed into the internal BFD form
3229         (@code{arelent}).
3230
3231         Reading a coff relocation table is done in the following stages:
3232
3233         o The entire coff relocation table is read into memory.
3234
3235         o Each relocation is processed in turn, first it is swapped from the
3236         external to the internal form.
3237
3238         o The symbol referenced in the relocation's symbol index is
3239         turned intoa pointer into the canonical symbol table. Note
3240         that this table is the same as the one returned by a call to
3241         @code{bfd_canonicalize_symtab}. The back end will call the
3242         routine and save the result if a canonicalization hasn't been done.
3243
3244         o The reloc index is turned into a pointer to a howto
3245         structure, in a back end specific way. For instance, the 386
3246         and 960 use the @code{r_type} to directly produce an index
3247         into a howto table vector; the 88k subtracts a number from the
3248         @code{r_type} field and creates an addend field.
3249
3250
3251 */
3252
3253 #ifndef CALC_ADDEND
3254 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)        \
3255             if (ptr && ptr->the_bfd == abfd             \
3256                 && ((ptr->flags & BSF_OLD_COMMON)== 0)) \
3257             {                                           \
3258                 cache_ptr->addend = -(ptr->section->vma + ptr->value);  \
3259             }                                           \
3260             else {                                      \
3261                 cache_ptr->addend = 0;                  \
3262             }                   
3263 #endif
3264
3265 static          boolean
3266 DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
3267       bfd            *abfd AND
3268       sec_ptr         asect AND
3269       asymbol       **symbols)
3270 {
3271   RELOC   *native_relocs;
3272   arelent        *reloc_cache;
3273   arelent        *cache_ptr;
3274
3275   unsigned int idx;
3276   
3277   if (asect->relocation)
3278    return true;
3279   if (asect->reloc_count == 0)
3280    return true;
3281   if (asect->flags & SEC_CONSTRUCTOR)
3282    return true;
3283 #ifndef NO_COFF_SYMBOLS
3284   if (!coff_slurp_symbol_table(abfd))
3285    return false;
3286 #endif
3287   native_relocs =
3288    (RELOC *) buy_and_read(abfd,
3289                           asect->rel_filepos,
3290                           SEEK_SET,
3291                           (size_t) (RELSZ *
3292                                     asect->reloc_count));
3293   reloc_cache = (arelent *)
3294    bfd_alloc(abfd, (size_t) (asect->reloc_count * sizeof(arelent)));
3295
3296   if (reloc_cache == NULL) {
3297       bfd_error = no_memory;
3298       return false;
3299     } 
3300
3301   
3302   for (idx = 0; idx < asect->reloc_count; idx ++) 
3303   {
3304 #ifdef RELOC_PROCESSING
3305       struct internal_reloc dst;
3306       struct external_reloc  *src;
3307
3308       cache_ptr = reloc_cache + idx;
3309       src = native_relocs + idx;
3310       bfd_swap_reloc_in(abfd, src, &dst);
3311
3312       RELOC_PROCESSING(cache_ptr, &dst, symbols, abfd, asect);
3313 #else
3314       struct internal_reloc dst;
3315       asymbol        *ptr;
3316       struct external_reloc  *src;
3317
3318       cache_ptr = reloc_cache + idx;
3319       src = native_relocs + idx;
3320
3321       bfd_swap_reloc_in(abfd, src, &dst);
3322
3323
3324       cache_ptr->address = dst.r_vaddr;
3325
3326       if (dst.r_symndx != -1) 
3327       {
3328           cache_ptr->sym_ptr_ptr = symbols + obj_convert(abfd)[dst.r_symndx];
3329           ptr = *(cache_ptr->sym_ptr_ptr);
3330       }
3331       else 
3332       {
3333         cache_ptr->sym_ptr_ptr= bfd_abs_section.symbol_ptr_ptr;
3334         ptr = 0;
3335               
3336       }
3337
3338       /*
3339         The symbols definitions that we have read in have been
3340         relocated as if their sections started at 0. But the offsets
3341         refering to the symbols in the raw data have not been
3342         modified, so we have to have a negative addend to compensate.
3343         
3344         Note that symbols which used to be common must be left alone */
3345
3346       /* Calculate any reloc addend by looking at the symbol */
3347       CALC_ADDEND(abfd, ptr, dst, cache_ptr);
3348
3349       cache_ptr->address -= asect->vma;
3350 /* !!     cache_ptr->section = (asection *) NULL;*/
3351
3352       /* Fill in the cache_ptr->howto field from dst.r_type */
3353       RTYPE2HOWTO(cache_ptr, &dst);
3354 #endif
3355
3356   }
3357
3358   asect->relocation = reloc_cache;
3359   return true;
3360 }
3361
3362
3363 /* This is stupid.  This function should be a boolean predicate */
3364 static unsigned int
3365 DEFUN(coff_canonicalize_reloc, (abfd, section, relptr, symbols),
3366 bfd            *abfd AND
3367 sec_ptr         section AND
3368 arelent       **relptr AND
3369 asymbol       **symbols)
3370 {
3371   arelent        *tblptr = section->relocation;
3372   unsigned int    count = 0;
3373
3374
3375   if (section->flags & SEC_CONSTRUCTOR) 
3376   {
3377     /* this section has relocs made up by us, they are not in the
3378        file, so take them out of their chain and place them into
3379        the data area provided */
3380     arelent_chain *chain = section->constructor_chain;
3381     for (count = 0; count < section->reloc_count; count ++) 
3382     {
3383       *relptr ++ = &chain->relent;
3384       chain = chain->next;
3385     }
3386
3387   }
3388   else 
3389   { 
3390     coff_slurp_reloc_table(abfd, section, symbols);
3391
3392
3393     tblptr = section->relocation;
3394     if (!tblptr)
3395      return 0;
3396
3397     for (; count++ < section->reloc_count;)
3398      *relptr++ = tblptr++;
3399
3400
3401   }
3402   *relptr = 0;
3403   return section->reloc_count;
3404 }
3405
3406 #ifndef NO_COFF_SYMBOLS
3407
3408 /*
3409 provided a BFD, a section and an offset into the section, calculate and
3410 return the name of the source file and the line nearest to the wanted
3411 location.
3412 */
3413
3414 static          boolean
3415 DEFUN(coff_find_nearest_line,(abfd,
3416                               section,
3417                               ignore_symbols,
3418                               offset,
3419                               filename_ptr,
3420                               functionname_ptr,
3421                               line_ptr),
3422       bfd            *abfd AND
3423       asection       *section AND
3424       asymbol       **ignore_symbols AND
3425       bfd_vma         offset AND
3426       CONST char      **filename_ptr AND
3427       CONST char       **functionname_ptr AND
3428       unsigned int   *line_ptr)
3429 {
3430   static bfd     *cache_abfd;
3431   static asection *cache_section;
3432   static bfd_vma  cache_offset;
3433   static unsigned int cache_i;
3434   static alent   *cache_l;
3435
3436   unsigned int    i = 0;
3437   coff_data_type *cof = coff_data(abfd);
3438   /* Run through the raw syments if available */
3439   combined_entry_type *p;
3440   alent          *l;
3441   unsigned int    line_base = 0;
3442
3443
3444   *filename_ptr = 0;
3445   *functionname_ptr = 0;
3446   *line_ptr = 0;
3447
3448   /* Don't try and find line numbers in a non coff file */
3449   if (abfd->xvec->flavour != bfd_target_coff_flavour)
3450     return false;
3451
3452   if (cof == NULL)
3453     return false;
3454
3455   p = cof->raw_syments;
3456
3457   for (i = 0; i < cof->raw_syment_count; i++) {
3458     if (p->u.syment.n_sclass == C_FILE) {
3459       /* File name has been moved into symbol */
3460       *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
3461       break;
3462     }
3463     p += 1 +  p->u.syment.n_numaux;
3464   }
3465   /* Now wander though the raw linenumbers of the section */
3466   /*
3467     If this is the same BFD as we were previously called with and this is
3468     the same section, and the offset we want is further down then we can
3469     prime the lookup loop
3470     */
3471   if (abfd == cache_abfd &&
3472       section == cache_section &&
3473       offset >= cache_offset) {
3474     i = cache_i;
3475     l = cache_l;
3476   }
3477   else {
3478     i = 0;
3479     l = section->lineno;
3480   }
3481
3482   for (; i < section->lineno_count; i++) {
3483     if (l->line_number == 0) {
3484       /* Get the symbol this line number points at */
3485       coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
3486       *functionname_ptr = coff->symbol.name;
3487       if (coff->native) {
3488         combined_entry_type  *s = coff->native;
3489         s = s + 1 + s->u.syment.n_numaux;
3490         /*
3491           S should now point to the .bf of the function
3492           */
3493         if (s->u.syment.n_numaux) {
3494           /*
3495             The linenumber is stored in the auxent
3496             */
3497           union internal_auxent   *a = &((s + 1)->u.auxent);
3498           line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
3499         }
3500       }
3501     }
3502     else {
3503       if (l->u.offset > offset)
3504         break;
3505       *line_ptr = l->line_number + line_base + 1;
3506     }
3507     l++;
3508   }
3509
3510   cache_abfd = abfd;
3511   cache_section = section;
3512   cache_offset = offset;
3513   cache_i = i;
3514   cache_l = l;
3515
3516   return true;
3517 }
3518
3519 #ifdef GNU960
3520 file_ptr
3521 coff_sym_filepos(abfd)
3522 bfd *abfd;
3523   {
3524     return obj_sym_filepos(abfd);
3525   }
3526 #endif
3527
3528 #endif /* NO_COFF_SYMBOLS */
3529
3530
3531 static int
3532 DEFUN(coff_sizeof_headers,(abfd, reloc),
3533       bfd *abfd AND
3534       boolean reloc)
3535 {
3536     size_t size;
3537
3538     if (reloc == false) {
3539         size = FILHSZ + AOUTSZ;
3540     }
3541     else {
3542         size = FILHSZ;
3543     }
3544
3545     size +=  abfd->section_count * SCNHSZ;
3546     return size;
3547 }
3548
3549 static bfd_vma 
3550 DEFUN(get_value,(reloc, seclet),
3551       arelent  *reloc AND
3552       bfd_seclet_type *seclet)
3553 {
3554   bfd_vma value;
3555   asymbol *symbol = *(reloc->sym_ptr_ptr);
3556   /* A symbol holds a pointer to a section, and an offset from the
3557      base of the section.  To relocate, we find where the section will
3558      live in the output and add that in */
3559
3560   if (symbol->section == &bfd_und_section)
3561   {
3562     /* Ouch, this is an undefined symbol.. */
3563     bfd_error_vector.undefined_symbol(reloc, seclet);
3564     value = symbol->value;
3565   }
3566   else 
3567   {
3568     value = symbol->value +
3569      symbol->section->output_offset +
3570       symbol->section->output_section->vma;
3571   }
3572   
3573   
3574   /* Add the value contained in the relocation */
3575   value += (short)((reloc->addend) & 0xffff);
3576   
3577   return value;
3578 }
3579
3580 static void
3581 DEFUN(perform_slip,(s, slip, input_section, value),
3582       asymbol **s AND
3583       unsigned int slip AND
3584       asection *input_section AND
3585       bfd_vma value)
3586 {
3587   
3588   /* Find all symbols past this point, and make them know
3589      what's happened */
3590   while (*s) 
3591   {
3592     asymbol *p = *s;
3593     if (p->section == input_section) 
3594     {
3595       /* This was pointing into this section, so mangle it */
3596       if (p->value > value)
3597       {
3598         p->value -=2;
3599       }
3600     }
3601     s++;
3602         
3603   }    
3604 }
3605 static int 
3606 DEFUN(movb1,(input_section, symbols, r, shrink),
3607       asection *input_section AND
3608       asymbol **symbols AND
3609       arelent *r AND
3610       unsigned int shrink) 
3611 {
3612   bfd_vma value = get_value(r,0);
3613         
3614   if (value >= 0xff00)
3615   { 
3616
3617     /* Change the reloc type from 16bit, possible 8 to 8bit
3618        possible 16 */
3619     r->howto = r->howto + 1;      
3620     /* The place to relc moves back by one */
3621     r->address -=1;
3622           
3623     /* This will be two bytes smaller in the long run */
3624     shrink +=2 ;
3625     perform_slip(symbols, 2, input_section, r->address - shrink +1);
3626
3627           
3628   }      
3629   return shrink;      
3630 }
3631
3632 static int 
3633 DEFUN(jmp1,(input_section, symbols, r, shrink),
3634       asection *input_section AND
3635       asymbol **symbols AND
3636       arelent *r AND
3637       unsigned int shrink) 
3638 {
3639
3640   
3641   bfd_vma value = get_value(r, 0);
3642         
3643   bfd_vma dot = input_section->output_section->vma +
3644    input_section->output_offset + r->address;   
3645   bfd_vma gap;
3646   
3647   /* See if the address we're looking at within 127 bytes of where
3648      we are, if so then we can use a small branch rather than the
3649      jump we were going to */
3650
3651   gap = value - (dot - shrink);
3652   
3653
3654   if (-120 < (long)gap && (long)gap < 120 )
3655   { 
3656
3657     /* Change the reloc type from 16bit, possible 8 to 8bit
3658        possible 16 */
3659     r->howto = r->howto + 1;      
3660     /* The place to relc moves back by one */
3661     r->address -=1;
3662           
3663     /* This will be two bytes smaller in the long run */
3664     shrink +=2 ;
3665     perform_slip(symbols, 2, input_section, r->address-shrink +1);
3666
3667           
3668   }      
3669   return shrink;      
3670 }
3671
3672 static boolean 
3673 DEFUN(bfd_coff_relax_section,(abfd, i, symbols),
3674       bfd *abfd AND
3675       asection *i AND
3676       asymbol **symbols)
3677 {
3678   
3679   /* Get enough memory to hold the stuff */
3680   bfd *input_bfd = i->owner;
3681   asection *input_section = i;
3682   int shrink = 0 ;
3683   boolean new = false;
3684   
3685   bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
3686                                                        input_section);
3687   arelent **reloc_vector = (arelent **)bfd_xmalloc(reloc_size);
3688
3689   /* Get the relocs and think about them */
3690   if (bfd_canonicalize_reloc(input_bfd, 
3691                              input_section,
3692                              reloc_vector,
3693                              symbols))
3694   {
3695     arelent **parent;
3696     for (parent = reloc_vector; *parent; parent++) 
3697     {
3698       arelent *r = *parent;
3699       switch (r->howto->type) {
3700         case R_MOVB2:
3701         case R_JMP2:
3702           
3703           shrink+=2;
3704           break;
3705           
3706         case R_MOVB1:
3707           shrink = movb1(input_section, symbols, r, shrink);
3708           new = true;
3709           
3710           break;
3711         case R_JMP1:
3712           shrink = jmp1(input_section, symbols, r, shrink);
3713           new = true;
3714           
3715           break;
3716         }
3717     }
3718
3719   }
3720   input_section->_cooked_size -= shrink;  
3721   free((char *)reloc_vector);
3722   return new;
3723 }
3724
3725 static bfd_byte *
3726 DEFUN(bfd_coff_get_relocated_section_contents,(in_abfd, seclet),
3727       bfd *in_abfd AND
3728       bfd_seclet_type *seclet)
3729
3730 {
3731   /* Get enough memory to hold the stuff */
3732   bfd *input_bfd = seclet->u.indirect.section->owner;
3733   asection *input_section = seclet->u.indirect.section;
3734   bfd_byte  *data = (bfd_byte *)malloc(input_section->_raw_size);
3735   bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
3736                                                        input_section);
3737   arelent **reloc_vector = (arelent **)bfd_xmalloc(reloc_size);
3738   
3739   /* read in the section */
3740   bfd_get_section_contents(input_bfd,
3741                            input_section,
3742                            data,
3743                            0,
3744                            input_section->_raw_size);
3745   
3746   
3747   if (bfd_canonicalize_reloc(input_bfd, 
3748                              input_section,
3749                              reloc_vector,
3750                              seclet->u.indirect.symbols) )
3751   {
3752     arelent **parent = reloc_vector;
3753     arelent *reloc ;
3754     
3755
3756
3757     unsigned int dst_address = 0;
3758     unsigned int src_address = 0;
3759     unsigned int run;
3760     unsigned int idx;
3761     
3762     /* Find how long a run we can do */
3763     while (dst_address < seclet->size) 
3764     {
3765       
3766       reloc = *parent;
3767       if (reloc) 
3768       {
3769         /* Note that the relaxing didn't tie up the addresses in the
3770            relocation, so we use the original address to work out the
3771            run of non-relocated data */
3772         run = reloc->address - src_address;
3773         parent++;
3774         
3775       }
3776       else 
3777       {
3778         run = seclet->size - dst_address;
3779       }
3780       /* Copy the bytes */
3781       for (idx = 0; idx < run; idx++)
3782       {
3783         data[dst_address++] = data[src_address++];
3784       }
3785     
3786       /* Now do the relocation */
3787     
3788       if (reloc) 
3789       {
3790         switch (reloc->howto->type) 
3791         {
3792         case R_JMP2:
3793           /* Speciial relaxed type */
3794         {
3795           bfd_vma dot = seclet->offset + dst_address + seclet->u.indirect.section->output_section->vma;   
3796           int   gap = get_value(reloc,seclet)-dot-1;
3797           if ((gap & ~0xff  ) != 0 &&((gap & 0xff00)!= 0xff00)) abort();
3798
3799           bfd_put_8(in_abfd,gap,   data+dst_address);
3800
3801           switch (data[dst_address-1]) 
3802           {
3803             
3804           case 0x5e:
3805             /* jsr -> bsr */
3806             bfd_put_8(in_abfd, 0x55, data+dst_address-1);
3807             break;
3808           case 0x5a:     
3809             /* jmp ->bra */
3810             bfd_put_8(in_abfd, 0x40, data+dst_address-1);
3811             break;
3812           
3813           default:
3814             abort();
3815           
3816           }
3817         
3818         
3819
3820              
3821           dst_address++;
3822           src_address+=3;
3823   
3824           break;
3825         }
3826
3827              
3828         case R_MOVB2:
3829           /* Special relaxed type, there will be a gap between where we
3830              get stuff from and where we put stuff to now 
3831              
3832              for a mov.b @aa:16 -> mov.b @aa:8
3833              opcode 0x6a 0x0y offset
3834              ->     0x2y off
3835              */
3836           if (data[dst_address-1] != 0x6a)
3837            abort();
3838           switch (data[dst_address] & 0xf0) 
3839           {
3840           case 0x00:
3841             /* Src is memory */
3842             data[dst_address-1] = (data[src_address] & 0xf) | 0x20;
3843             break;
3844           case 0x80:
3845             /* Src is reg */
3846             data[dst_address-1] = (data[src_address] & 0xf) | 0x30;
3847             break;
3848           default:
3849             abort();
3850           }
3851         
3852           /* the offset must fit ! after all, what was all the relaxing
3853              about ? */
3854
3855           bfd_put_8(in_abfd, get_value(reloc, seclet), data + dst_address);
3856
3857           /* Note the magic - src goes up by two bytes, but dst by only
3858              one */
3859           dst_address+=1;
3860           src_address+=3;
3861         
3862           break;
3863           /* PCrel 8 bits */
3864         case R_PCRBYTE:   
3865         {
3866           bfd_vma dot = seclet->offset + dst_address + seclet->u.indirect.section->output_section->vma;   
3867           int   gap = get_value(reloc,seclet)-dot;
3868           if (gap > 127 || gap < -128) 
3869           {
3870             bfd_error_vector.reloc_value_truncated(reloc, seclet);
3871           }
3872           
3873           bfd_put_8(in_abfd,gap,   data+dst_address);
3874           dst_address++;
3875           src_address++;
3876   
3877           break;
3878         }
3879
3880         case R_RELBYTE:
3881         {
3882           unsigned  int gap =get_value(reloc,seclet);
3883           if (gap > 256)
3884           {
3885             bfd_error_vector.reloc_value_truncated(reloc, seclet);
3886           }
3887           
3888           bfd_put_8(in_abfd, gap, data+dst_address);
3889           dst_address+=1;
3890           src_address+=1;
3891
3892
3893         }
3894           break; 
3895         case R_JMP1:
3896           /* A relword which would have like to have been a pcrel */
3897         case R_MOVB1:   
3898           /* A relword which would like to have been modified but
3899              didn't make it */
3900         case R_RELWORD:
3901           bfd_put_16(in_abfd, get_value(reloc,seclet), data+dst_address);
3902           dst_address+=2;
3903           src_address+=2;
3904           break;
3905         
3906         default:
3907           abort();
3908         }
3909       }    
3910     }
3911   }
3912   free((char *)reloc_vector);
3913   return data;
3914   
3915 }
3916
3917
3918 #define coff_core_file_failing_command  _bfd_dummy_core_file_failing_command
3919 #define coff_core_file_failing_signal   _bfd_dummy_core_file_failing_signal
3920 #define coff_core_file_matches_executable_p     _bfd_dummy_core_file_matches_executable_p
3921 #define coff_slurp_armap                bfd_slurp_coff_armap
3922 #define coff_slurp_extended_name_table  _bfd_slurp_extended_name_table
3923 #define coff_truncate_arname            bfd_dont_truncate_arname
3924 #define coff_openr_next_archived_file   bfd_generic_openr_next_archived_file
3925 #define coff_generic_stat_arch_elt      bfd_generic_stat_arch_elt
3926 #define coff_get_section_contents       bfd_generic_get_section_contents
3927 #define coff_close_and_cleanup          bfd_generic_close_and_cleanup
3928
3929 #define coff_bfd_debug_info_start               bfd_void
3930 #define coff_bfd_debug_info_end         bfd_void
3931 #define coff_bfd_debug_info_accumulate  (PROTO(void,(*),(bfd*, struct sec *))) bfd_void
3932 #define coff_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
3933 #define coff_bfd_relax_section bfd_generic_relax_section
3934
This page took 0.239197 seconds and 4 git commands to generate.