1999-09-06 Donn Terry <donn@interix.com>
[external/binutils.git] / bfd / coffcode.h
1 /* Support for the generic parts of most COFF variants, for BFD.
2    Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3    Free Software Foundation, Inc.
4    Written by Cygnus Support.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 /*
23 Most of this hacked by  Steve Chamberlain,
24                         sac@cygnus.com
25 */
26 /*
27
28 SECTION
29         coff backends
30
31         BFD supports a number of different flavours of coff format.
32         The major differences between formats are the sizes and
33         alignments of fields in structures on disk, and the occasional
34         extra field.
35
36         Coff in all its varieties is implemented with a few common
37         files and a number of implementation specific files. For
38         example, The 88k bcs coff format is implemented in the file
39         @file{coff-m88k.c}. This file @code{#include}s
40         @file{coff/m88k.h} which defines the external structure of the
41         coff format for the 88k, and @file{coff/internal.h} which
42         defines the internal structure. @file{coff-m88k.c} also
43         defines the relocations used by the 88k format
44         @xref{Relocations}.
45
46         The Intel i960 processor version of coff is implemented in
47         @file{coff-i960.c}. This file has the same structure as
48         @file{coff-m88k.c}, except that it includes @file{coff/i960.h}
49         rather than @file{coff-m88k.h}.
50
51 SUBSECTION
52         Porting to a new version of coff
53
54         The recommended method is to select from the existing
55         implementations the version of coff which is most like the one
56         you want to use.  For example, we'll say that i386 coff is
57         the one you select, and that your coff flavour is called foo.
58         Copy @file{i386coff.c} to @file{foocoff.c}, copy
59         @file{../include/coff/i386.h} to @file{../include/coff/foo.h},
60         and add the lines to @file{targets.c} and @file{Makefile.in}
61         so that your new back end is used. Alter the shapes of the
62         structures in @file{../include/coff/foo.h} so that they match
63         what you need. You will probably also have to add
64         @code{#ifdef}s to the code in @file{coff/internal.h} and
65         @file{coffcode.h} if your version of coff is too wild.
66
67         You can verify that your new BFD backend works quite simply by
68         building @file{objdump} from the @file{binutils} directory,
69         and making sure that its version of what's going on and your
70         host system's idea (assuming it has the pretty standard coff
71         dump utility, usually called @code{att-dump} or just
72         @code{dump}) are the same.  Then clean up your code, and send
73         what you've done to Cygnus. Then your stuff will be in the
74         next release, and you won't have to keep integrating it.
75
76 SUBSECTION
77         How the coff backend works
78
79 SUBSUBSECTION
80         File layout
81
82         The Coff backend is split into generic routines that are
83         applicable to any Coff target and routines that are specific
84         to a particular target.  The target-specific routines are
85         further split into ones which are basically the same for all
86         Coff targets except that they use the external symbol format
87         or use different values for certain constants.
88
89         The generic routines are in @file{coffgen.c}.  These routines
90         work for any Coff target.  They use some hooks into the target
91         specific code; the hooks are in a @code{bfd_coff_backend_data}
92         structure, one of which exists for each target.
93
94         The essentially similar target-specific routines are in
95         @file{coffcode.h}.  This header file includes executable C code.
96         The various Coff targets first include the appropriate Coff
97         header file, make any special defines that are needed, and
98         then include @file{coffcode.h}.
99
100         Some of the Coff targets then also have additional routines in
101         the target source file itself.
102
103         For example, @file{coff-i960.c} includes
104         @file{coff/internal.h} and @file{coff/i960.h}.  It then
105         defines a few constants, such as @code{I960}, and includes
106         @file{coffcode.h}.  Since the i960 has complex relocation
107         types, @file{coff-i960.c} also includes some code to
108         manipulate the i960 relocs.  This code is not in
109         @file{coffcode.h} because it would not be used by any other
110         target.
111
112 SUBSUBSECTION
113         Bit twiddling
114
115         Each flavour of coff supported in BFD has its own header file
116         describing the external layout of the structures. There is also
117         an internal description of the coff layout, in
118         @file{coff/internal.h}. A major function of the
119         coff backend is swapping the bytes and twiddling the bits to
120         translate the external form of the structures into the normal
121         internal form. This is all performed in the
122         @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
123         elements are different sizes between different versions of
124         coff; it is the duty of the coff version specific include file
125         to override the definitions of various packing routines in
126         @file{coffcode.h}. E.g., the size of line number entry in coff is
127         sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
128         @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
129         correct one. No doubt, some day someone will find a version of
130         coff which has a varying field size not catered to at the
131         moment. To port BFD, that person will have to add more @code{#defines}.
132         Three of the bit twiddling routines are exported to
133         @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
134         and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
135         table on its own, but uses BFD to fix things up.  More of the
136         bit twiddlers are exported for @code{gas};
137         @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
138         @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
139         @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
140         @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
141         of all the symbol table and reloc drudgery itself, thereby
142         saving the internal BFD overhead, but uses BFD to swap things
143         on the way out, making cross ports much safer.  Doing so also
144         allows BFD (and thus the linker) to use the same header files
145         as @code{gas}, which makes one avenue to disaster disappear.
146
147 SUBSUBSECTION
148         Symbol reading
149
150         The simple canonical form for symbols used by BFD is not rich
151         enough to keep all the information available in a coff symbol
152         table. The back end gets around this problem by keeping the original
153         symbol table around, "behind the scenes".
154
155         When a symbol table is requested (through a call to
156         @code{bfd_canonicalize_symtab}), a request gets through to
157         @code{coff_get_normalized_symtab}. This reads the symbol table from
158         the coff file and swaps all the structures inside into the
159         internal form. It also fixes up all the pointers in the table
160         (represented in the file by offsets from the first symbol in
161         the table) into physical pointers to elements in the new
162         internal table. This involves some work since the meanings of
163         fields change depending upon context: a field that is a
164         pointer to another structure in the symbol table at one moment
165         may be the size in bytes of a structure at the next.  Another
166         pass is made over the table. All symbols which mark file names
167         (<<C_FILE>> symbols) are modified so that the internal
168         string points to the value in the auxent (the real filename)
169         rather than the normal text associated with the symbol
170         (@code{".file"}).
171
172         At this time the symbol names are moved around. Coff stores
173         all symbols less than nine characters long physically
174         within the symbol table; longer strings are kept at the end of
175         the file in the string  table. This pass moves all strings
176         into memory and replaces them with pointers to the strings.
177
178
179         The symbol table is massaged once again, this time to create
180         the canonical table used by the BFD application. Each symbol
181         is inspected in turn, and a decision made (using the
182         @code{sclass} field) about the various flags to set in the
183         @code{asymbol}.  @xref{Symbols}. The generated canonical table
184         shares strings with the hidden internal symbol table.
185
186         Any linenumbers are read from the coff file too, and attached
187         to the symbols which own the functions the linenumbers belong to.
188
189 SUBSUBSECTION
190         Symbol writing
191
192         Writing a symbol to a coff file which didn't come from a coff
193         file will lose any debugging information. The @code{asymbol}
194         structure remembers the BFD from which the symbol was taken, and on
195         output the back end makes sure that the same destination target as
196         source target is present.
197
198         When the symbols have come from a coff file then all the
199         debugging information is preserved.
200
201         Symbol tables are provided for writing to the back end in a
202         vector of pointers to pointers. This allows applications like
203         the linker to accumulate and output large symbol tables
204         without having to do too much byte copying.
205
206         This function runs through the provided symbol table and
207         patches each symbol marked as a file place holder
208         (@code{C_FILE}) to point to the next file place holder in the
209         list. It also marks each @code{offset} field in the list with
210         the offset from the first symbol of the current symbol.
211
212         Another function of this procedure is to turn the canonical
213         value form of BFD into the form used by coff. Internally, BFD
214         expects symbol values to be offsets from a section base; so a
215         symbol physically at 0x120, but in a section starting at
216         0x100, would have the value 0x20. Coff expects symbols to
217         contain their final value, so symbols have their values
218         changed at this point to reflect their sum with their owning
219         section.  This transformation uses the
220         <<output_section>> field of the @code{asymbol}'s
221         @code{asection} @xref{Sections}.
222
223         o <<coff_mangle_symbols>>
224
225         This routine runs though the provided symbol table and uses
226         the offsets generated by the previous pass and the pointers
227         generated when the symbol table was read in to create the
228         structured hierachy required by coff. It changes each pointer
229         to a symbol into the index into the symbol table of the asymbol.
230
231         o <<coff_write_symbols>>
232
233         This routine runs through the symbol table and patches up the
234         symbols from their internal form into the coff way, calls the
235         bit twiddlers, and writes out the table to the file.
236
237 */
238
239 /*
240 INTERNAL_DEFINITION
241         coff_symbol_type
242
243 DESCRIPTION
244         The hidden information for an <<asymbol>> is described in a
245         <<combined_entry_type>>:
246
247 CODE_FRAGMENT
248 .
249 .typedef struct coff_ptr_struct
250 .{
251 .
252 .       {* Remembers the offset from the first symbol in the file for
253 .          this symbol. Generated by coff_renumber_symbols. *}
254 .unsigned int offset;
255 .
256 .       {* Should the value of this symbol be renumbered.  Used for
257 .          XCOFF C_BSTAT symbols.  Set by coff_slurp_symbol_table.  *}
258 .unsigned int fix_value : 1;
259 .
260 .       {* Should the tag field of this symbol be renumbered.
261 .          Created by coff_pointerize_aux. *}
262 .unsigned int fix_tag : 1;
263 .
264 .       {* Should the endidx field of this symbol be renumbered.
265 .          Created by coff_pointerize_aux. *}
266 .unsigned int fix_end : 1;
267 .
268 .       {* Should the x_csect.x_scnlen field be renumbered.
269 .          Created by coff_pointerize_aux. *}
270 .unsigned int fix_scnlen : 1;
271 .
272 .       {* Fix up an XCOFF C_BINCL/C_EINCL symbol.  The value is the
273 .          index into the line number entries.  Set by
274 .          coff_slurp_symbol_table.  *}
275 .unsigned int fix_line : 1;
276 .
277 .       {* The container for the symbol structure as read and translated
278 .           from the file. *}
279 .
280 .union {
281 .   union internal_auxent auxent;
282 .   struct internal_syment syment;
283 . } u;
284 .} combined_entry_type;
285 .
286 .
287 .{* Each canonical asymbol really looks like this: *}
288 .
289 .typedef struct coff_symbol_struct
290 .{
291 .   {* The actual symbol which the rest of BFD works with *}
292 .asymbol symbol;
293 .
294 .   {* A pointer to the hidden information for this symbol *}
295 .combined_entry_type *native;
296 .
297 .   {* A pointer to the linenumber information for this symbol *}
298 .struct lineno_cache_entry *lineno;
299 .
300 .   {* Have the line numbers been relocated yet ? *}
301 .boolean done_lineno;
302 .} coff_symbol_type;
303
304
305 */
306
307 #ifdef COFF_WITH_PE
308 #include "peicode.h"
309 #else
310 #include "coffswap.h"
311 #endif
312
313 #define STRING_SIZE_SIZE (4)
314
315 static long sec_to_styp_flags PARAMS ((const char *, flagword));
316 static flagword styp_to_sec_flags
317   PARAMS ((bfd *, PTR, const char *, asection *));
318 static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
319 static void coff_set_custom_section_alignment
320   PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *,
321            const unsigned int));
322 static boolean coff_new_section_hook PARAMS ((bfd *, asection *));
323 static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR));
324 static boolean coff_write_relocs PARAMS ((bfd *, int));
325 static boolean coff_set_flags
326   PARAMS ((bfd *, unsigned int *, unsigned short *));
327 static boolean coff_set_arch_mach
328   PARAMS ((bfd *, enum bfd_architecture, unsigned long));
329 static boolean coff_compute_section_file_positions PARAMS ((bfd *));
330 static boolean coff_write_object_contents PARAMS ((bfd *));
331 static boolean coff_set_section_contents
332   PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
333 static PTR buy_and_read PARAMS ((bfd *, file_ptr, int, size_t));
334 static boolean coff_slurp_line_table PARAMS ((bfd *, asection *));
335 static boolean coff_slurp_symbol_table PARAMS ((bfd *));
336 static enum coff_symbol_classification coff_classify_symbol
337   PARAMS ((bfd *, struct internal_syment *));
338 static boolean coff_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
339 static long coff_canonicalize_reloc
340   PARAMS ((bfd *, asection *, arelent **, asymbol **));
341 #ifndef coff_mkobject_hook
342 static PTR coff_mkobject_hook PARAMS ((bfd *, PTR,  PTR));
343 #endif
344 \f
345 /* void warning(); */
346
347 /* Return a word with STYP_* (scnhdr.s_flags) flags set to represent
348    the incoming SEC_* flags.  The inverse of this function is
349    styp_to_sec_flags().  NOTE: If you add to/change this routine, you
350    should probably mirror the changes in styp_to_sec_flags().  */
351
352 #ifndef COFF_WITH_PE
353
354 static long
355 sec_to_styp_flags (sec_name, sec_flags)
356      CONST char *sec_name;
357      flagword sec_flags;
358 {
359   long styp_flags = 0;
360
361   if (!strcmp (sec_name, _TEXT))
362     {
363       styp_flags = STYP_TEXT;
364     }
365   else if (!strcmp (sec_name, _DATA))
366     {
367       styp_flags = STYP_DATA;
368     }
369   else if (!strcmp (sec_name, _BSS))
370     {
371       styp_flags = STYP_BSS;
372 #ifdef _COMMENT
373     }
374   else if (!strcmp (sec_name, _COMMENT))
375     {
376       styp_flags = STYP_INFO;
377 #endif /* _COMMENT */
378 #ifdef _LIB
379     }
380   else if (!strcmp (sec_name, _LIB))
381     {
382       styp_flags = STYP_LIB;
383 #endif /* _LIB */
384 #ifdef _LIT
385     }
386   else if (!strcmp (sec_name, _LIT))
387     {
388       styp_flags = STYP_LIT;
389 #endif /* _LIT */
390     }
391   else if (!strcmp (sec_name, ".debug"))
392     {
393 #ifdef STYP_DEBUG
394       styp_flags = STYP_DEBUG;
395 #else
396       styp_flags = STYP_INFO;
397 #endif
398     }
399   else if (!strncmp (sec_name, ".stab", 5))
400     {
401       styp_flags = STYP_INFO;
402     }
403 #ifdef RS6000COFF_C
404   else if (!strcmp (sec_name, _PAD))
405     {
406       styp_flags = STYP_PAD;
407     }
408   else if (!strcmp (sec_name, _LOADER))
409     {
410       styp_flags = STYP_LOADER;
411     }
412 #endif
413   /* Try and figure out what it should be */
414   else if (sec_flags & SEC_CODE)
415     {
416       styp_flags = STYP_TEXT;
417     }
418   else if (sec_flags & SEC_DATA)
419     {
420       styp_flags = STYP_DATA;
421     }
422   else if (sec_flags & SEC_READONLY)
423     {
424 #ifdef STYP_LIT                 /* 29k readonly text/data section */
425       styp_flags = STYP_LIT;
426 #else
427       styp_flags = STYP_TEXT;
428 #endif /* STYP_LIT */
429     }
430   else if (sec_flags & SEC_LOAD)
431     {
432       styp_flags = STYP_TEXT;
433     }
434   else if (sec_flags & SEC_ALLOC)
435     {
436       styp_flags = STYP_BSS;
437     }
438
439 #ifdef STYP_NOLOAD
440   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
441     styp_flags |= STYP_NOLOAD;
442 #endif
443
444   return styp_flags;
445 }
446
447 #else /* COFF_WITH_PE */
448
449 /* The PE version; see above for the general comments.  The non-PE
450    case seems to be more guessing, and breaks PE format; specifically,
451    .rdata is readonly, but it sure ain't text.  Really, all this
452    should be set up properly in gas (or whatever assembler is in use),
453    and honor whatever objcopy/strip, etc. sent us as input.  */
454
455 static long
456 sec_to_styp_flags (sec_name, sec_flags)
457      const char *sec_name ATTRIBUTE_UNUSED;
458      flagword sec_flags;
459 {
460   long styp_flags = 0;
461
462   /* caution: there are at least three groups of symbols that have
463      very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
464      SEC_* are the BFD internal flags, used for generic BFD
465      information.  STYP_* are the COFF section flags which appear in
466      COFF files.  IMAGE_SCN_* are the PE section flags which appear in
467      PE files.  The STYP_* flags and the IMAGE_SCN_* flags overlap,
468      but there are more IMAGE_SCN_* flags.  */
469
470   /* skip LOAD */
471   /* READONLY later */
472   /* skip RELOC */
473   if ((sec_flags & SEC_CODE) != 0)
474     styp_flags |= IMAGE_SCN_CNT_CODE;
475   if ((sec_flags & SEC_DATA) != 0)
476     styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
477   if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
478     styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;  /* ==STYP_BSS */
479   /* skip ROM */
480   /* skip CONSTRUCTOR */
481   /* skip CONTENTS */
482 #ifdef STYP_NOLOAD
483   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
484     styp_flags |= STYP_NOLOAD;
485 #endif
486   if ((sec_flags & SEC_IS_COMMON) != 0)
487     styp_flags |= IMAGE_SCN_LNK_COMDAT;
488   if ((sec_flags & SEC_DEBUGGING) != 0)
489     styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
490   if ((sec_flags & SEC_EXCLUDE) != 0)
491     styp_flags |= IMAGE_SCN_LNK_REMOVE;
492   if ((sec_flags & SEC_NEVER_LOAD) != 0)
493     styp_flags |= IMAGE_SCN_LNK_REMOVE;
494   /* skip IN_MEMORY */
495   /* skip SORT */
496   if (sec_flags & SEC_LINK_ONCE) 
497     styp_flags |= IMAGE_SCN_LNK_COMDAT; 
498   /* skip LINK_DUPLICATES */
499   /* skip LINKER_CREATED */
500
501   /* For now, the read/write bits are mapped onto SEC_READONLY, even
502      though the semantics don't quite match.  The bits from the input
503      are retained in pei_section_data(abfd, section)->pe_flags */
504
505   styp_flags |= IMAGE_SCN_MEM_READ;       /* always readable. */
506   if ((sec_flags & SEC_READONLY) == 0)
507     styp_flags |= IMAGE_SCN_MEM_WRITE;    /* Invert READONLY for write */
508   if (sec_flags & SEC_CODE)
509     styp_flags |= IMAGE_SCN_MEM_EXECUTE;  /* CODE->EXECUTE */
510   if (sec_flags & SEC_SHARED)
511     styp_flags |= IMAGE_SCN_MEM_SHARED;   /* Shared remains meaningful */
512
513   return styp_flags; 
514 }
515
516 #endif /* COFF_WITH_PE */
517
518 /* Return a word with SEC_* flags set to represent the incoming STYP_*
519    flags (from scnhdr.s_flags).  The inverse of this function is
520    sec_to_styp_flags().  NOTE: If you add to/change this routine, you
521    should probably mirror the changes in sec_to_styp_flags().  */
522
523 #ifndef COFF_WITH_PE
524
525 static flagword
526 styp_to_sec_flags (abfd, hdr, name, section)
527      bfd *abfd ATTRIBUTE_UNUSED;
528      PTR hdr;
529      const char *name;
530      asection *section ATTRIBUTE_UNUSED;
531 {
532   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
533   long styp_flags = internal_s->s_flags;
534   flagword sec_flags = 0;
535
536 #ifdef STYP_NOLOAD
537   if (styp_flags & STYP_NOLOAD)
538     {
539       sec_flags |= SEC_NEVER_LOAD;
540     }
541 #endif /* STYP_NOLOAD */
542
543   /* For 386 COFF, at least, an unloadable text or data section is
544      actually a shared library section.  */
545   if (styp_flags & STYP_TEXT)
546     {
547       if (sec_flags & SEC_NEVER_LOAD)
548         sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
549       else
550         sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
551     }
552   else if (styp_flags & STYP_DATA)
553     {
554       if (sec_flags & SEC_NEVER_LOAD)
555         sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
556       else
557         sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
558     }
559   else if (styp_flags & STYP_BSS)
560     {
561 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
562       if (sec_flags & SEC_NEVER_LOAD)
563         sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
564       else
565 #endif
566         sec_flags |= SEC_ALLOC;
567     }
568   else if (styp_flags & STYP_INFO)
569     {
570       /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
571          defined.  coff_compute_section_file_positions uses
572          COFF_PAGE_SIZE to ensure that the low order bits of the
573          section VMA and the file offset match.  If we don't know
574          COFF_PAGE_SIZE, we can't ensure the correct correspondence,
575          and demand page loading of the file will fail.  */
576 #if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS)
577       sec_flags |= SEC_DEBUGGING;
578 #endif
579     }
580   else if (styp_flags & STYP_PAD)
581     {
582       sec_flags = 0;
583     }
584   else if (strcmp (name, _TEXT) == 0)
585     {
586       if (sec_flags & SEC_NEVER_LOAD)
587         sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
588       else
589         sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
590     }
591   else if (strcmp (name, _DATA) == 0)
592     {
593       if (sec_flags & SEC_NEVER_LOAD)
594         sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
595       else
596         sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
597     }
598   else if (strcmp (name, _BSS) == 0)
599     {
600 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
601       if (sec_flags & SEC_NEVER_LOAD)
602         sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
603       else
604 #endif
605         sec_flags |= SEC_ALLOC;
606     }
607   else if (strcmp (name, ".debug") == 0
608 #ifdef _COMMENT
609            || strcmp (name, _COMMENT) == 0
610 #endif
611            || strncmp (name, ".stab", 5) == 0)
612     {
613 #ifdef COFF_PAGE_SIZE
614       sec_flags |= SEC_DEBUGGING;
615 #endif
616     }
617 #ifdef _LIB
618   else if (strcmp (name, _LIB) == 0)
619     ;
620 #endif
621 #ifdef _LIT
622   else if (strcmp (name, _LIT) == 0)
623     {
624       sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
625     }
626 #endif
627   else
628     {
629       sec_flags |= SEC_ALLOC | SEC_LOAD;
630     }
631
632 #ifdef STYP_LIT                 /* A29k readonly text/data section type */
633   if ((styp_flags & STYP_LIT) == STYP_LIT)
634     {
635       sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
636     }
637 #endif /* STYP_LIT */
638 #ifdef STYP_OTHER_LOAD          /* Other loaded sections */
639   if (styp_flags & STYP_OTHER_LOAD)
640     {
641       sec_flags = (SEC_LOAD | SEC_ALLOC);
642     }
643 #endif /* STYP_SDATA */
644
645 #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
646   /* As a GNU extension, if the name begins with .gnu.linkonce, we
647      only link a single copy of the section.  This is used to support
648      g++.  g++ will emit each template expansion in its own section.
649      The symbols will be defined as weak, so that multiple definitions
650      are permitted.  The GNU linker extension is to actually discard
651      all but one of the sections.  */
652   if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
653     sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
654 #endif
655
656   return sec_flags;
657 }
658
659 #else /* COFF_WITH_PE */
660
661 /* The PE version; see above for the general comments.
662
663    Since to set the SEC_LINK_ONCE and associated flags, we have to
664    look at the symbol table anyway, we return the symbol table index
665    of the symbol being used as the COMDAT symbol.  This is admittedly
666    ugly, but there's really nowhere else that we have access to the
667    required information.  FIXME: Is the COMDAT symbol index used for
668    any purpose other than objdump?  */
669
670 static flagword
671 styp_to_sec_flags (abfd, hdr, name, section)
672      bfd *abfd ATTRIBUTE_UNUSED;
673      PTR hdr;
674      const char *name;
675      asection *section;
676 {
677   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
678   long styp_flags = internal_s->s_flags;
679   flagword sec_flags = 0;
680
681   if (styp_flags & STYP_DSECT)
682     abort ();  /* Don't know what to do */
683 #ifdef SEC_NEVER_LOAD
684   if (styp_flags & STYP_NOLOAD)
685     sec_flags |= SEC_NEVER_LOAD;
686 #endif
687   if (styp_flags & STYP_GROUP)
688     abort ();  /* Don't know what to do */
689   /* skip IMAGE_SCN_TYPE_NO_PAD */
690   if (styp_flags & STYP_COPY)
691     abort ();  /* Don't know what to do */
692   if (styp_flags & IMAGE_SCN_CNT_CODE)
693     sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
694   if (styp_flags & IMAGE_SCN_CNT_INITIALIZED_DATA)
695     sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
696   if (styp_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
697     sec_flags |= SEC_ALLOC;
698   if (styp_flags & IMAGE_SCN_LNK_OTHER)
699     abort ();  /* Don't know what to do */
700   if (styp_flags & IMAGE_SCN_LNK_INFO)
701     {
702       /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
703          defined.  coff_compute_section_file_positions uses
704          COFF_PAGE_SIZE to ensure that the low order bits of the
705          section VMA and the file offset match.  If we don't know
706          COFF_PAGE_SIZE, we can't ensure the correct correspondence,
707          and demand page loading of the file will fail.  */
708 #ifdef COFF_PAGE_SIZE
709       sec_flags |= SEC_DEBUGGING;
710 #endif
711     }
712   if (styp_flags & STYP_OVER)
713     abort ();  /* Don't know what to do */
714   if (styp_flags & IMAGE_SCN_LNK_REMOVE)
715     sec_flags |= SEC_EXCLUDE;
716
717   if (styp_flags & IMAGE_SCN_MEM_SHARED)
718     sec_flags |= SEC_SHARED;
719   /* COMDAT: see below */
720   if (styp_flags & IMAGE_SCN_MEM_DISCARDABLE)
721     sec_flags |= SEC_DEBUGGING;
722   if (styp_flags & IMAGE_SCN_MEM_NOT_CACHED)
723     abort ();/* Don't know what to do */
724   if (styp_flags & IMAGE_SCN_MEM_NOT_PAGED)
725     abort (); /* Don't know what to do */
726
727   /* We infer from the distinct read/write/execute bits the settings
728      of some of the bfd flags; the actual values, should we need them,
729      are also in pei_section_data (abfd, section)->pe_flags.  */
730
731   if (styp_flags & IMAGE_SCN_MEM_EXECUTE)
732     sec_flags |= SEC_CODE;   /* Probably redundant */
733   /* IMAGE_SCN_MEM_READ is simply ignored, assuming it always to be true. */
734   if ((styp_flags & IMAGE_SCN_MEM_WRITE) == 0)
735     sec_flags |= SEC_READONLY;
736
737   /* COMDAT gets very special treatment.  */
738   if (styp_flags & IMAGE_SCN_LNK_COMDAT)
739     {
740       sec_flags |= SEC_LINK_ONCE;
741
742       /* Unfortunately, the PE format stores essential information in
743          the symbol table, of all places.  We need to extract that
744          information now, so that objdump and the linker will know how
745          to handle the section without worrying about the symbols.  We
746          can't call slurp_symtab, because the linker doesn't want the
747          swapped symbols.  */
748
749       /* COMDAT sections are special.  The first symbol is the section
750          symbol, which tells what kind of COMDAT section it is.  The
751          second symbol is the "comdat symbol" - the one with the
752          unique name.  GNU uses the section symbol for the unique
753          name; MS uses ".text" for every comdat section.  Sigh.  - DJ */
754
755       /* This is not mirrored in sec_to_styp_flags(), but there
756          doesn't seem to be a need to, either, and it would at best be
757          rather messy.  */
758
759       if (_bfd_coff_get_external_symbols (abfd))
760         {
761           bfd_byte *esymstart, *esym, *esymend;
762
763           esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
764           esymend = esym + obj_raw_syment_count (abfd) * SYMESZ;
765
766           while (esym < esymend)
767             {
768               struct internal_syment isym;
769               char buf[SYMNMLEN + 1];
770               const char *symname;
771
772               bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
773
774               if (sizeof (internal_s->s_name) > SYMNMLEN)
775                 {
776                   /* This case implies that the matching symbol name
777                      will be in the string table.  */
778                   abort ();
779                 }
780
781               /* The MS documentation is vague, but it appears to
782                  require that n_sclass be C_STAT for both entries;
783                  However, the Alpha compiler uses C_EXT for the one
784                  with the "real" name, at least for string-pooled
785                  constants.  */
786               if (isym.n_scnum == section->target_index
787                   && (isym.n_sclass == C_STAT || isym.n_sclass == C_EXT)
788                   && isym.n_type == T_NULL
789                   && isym.n_value == 0)
790                 {
791                   /* The first TWO entries with the section # are both
792                      of interest to us.  The first one is the "section
793                      symbol" (section name).  The second is the comdat
794                      symbol name.  'value' must be zero for it to
795                      apply.  Here, we've found a qualifying entry; we
796                      distinguish the first from the second by numaux
797                      (which should be 0 for the second).  FIXME: We
798                      should use the first one first rather than
799                      counting on numaux.  */
800                   if (isym.n_numaux == 1)
801                     {
802                       union internal_auxent aux;
803
804                       symname = _bfd_coff_internal_syment_name (abfd, &isym,
805                                                                 buf);
806                       if (symname == NULL)
807                         abort ();
808
809                       if (strcmp (name, symname) != 0)
810                         abort ();
811
812                       /* This is the section symbol.  */
813
814                       bfd_coff_swap_aux_in (abfd, (PTR) (esym + SYMESZ),
815                                             isym.n_type, isym.n_sclass,
816                                             0, isym.n_numaux, (PTR) &aux);
817
818                       /* FIXME: Microsoft uses NODUPLICATES and
819                          ASSOCIATIVE, but gnu uses ANY and SAME_SIZE.
820                          Unfortunately, gnu doesn't do the comdat
821                          symbols right.  So, until we can fix it to do
822                          the right thing, we are temporarily disabling
823                          comdats for the MS types (they're used in
824                          DLLs and C++, but we don't support *their*
825                          C++ libraries anyway - DJ.  */
826
827                       switch (aux.x_scn.x_comdat)
828                         {
829                         case IMAGE_COMDAT_SELECT_NODUPLICATES:
830 /* FIXME: This is bogus.  It breaks cross-compilers.  */
831 #ifdef __INTERIX
832                           sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
833 #else
834                           sec_flags &= ~SEC_LINK_ONCE;
835 #endif
836                           break;
837
838                         case IMAGE_COMDAT_SELECT_ANY:
839                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
840                           break;
841
842                         case IMAGE_COMDAT_SELECT_SAME_SIZE:
843                           sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
844                           break;
845
846                         case IMAGE_COMDAT_SELECT_EXACT_MATCH:
847                           /* Not yet fully implemented in the linker.  */
848                           sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
849                           break;
850
851                         case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
852 /* FIXME: This is bogus.  It breaks cross-compilers.  */
853 #ifdef __INTERIX
854                           /* FIXME: This is not currently implemented.  */
855                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
856 #else
857                           sec_flags &= ~SEC_LINK_ONCE;
858 #endif
859                           break;
860
861                         default:
862                           /* FIXME: Shouldn't this be at least a
863                              warning?  */
864                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
865                           break;
866                         }
867                     }
868                   else 
869                     {
870                       char *newname;
871
872                       /* This should be the the second symbol with the
873                          section #.  It is the actual symbol name.
874                          Intel puts the two adjacent, but Alpha (at
875                          least) spreads them out.  */
876
877                       section->comdat =
878                         bfd_alloc (abfd, sizeof (struct bfd_comdat_info));
879                       if (section->comdat == NULL)
880                         abort ();
881                       section->comdat->symbol = (esym - esymstart) / SYMESZ;
882                       symname = _bfd_coff_internal_syment_name (abfd, &isym,
883                                                                 buf);
884                       if (symname == NULL)
885                         abort ();
886
887                       newname = bfd_alloc (abfd, strlen (symname) + 1);
888                       if (newname == NULL)
889                         abort ();
890                       strcpy (newname, symname);
891                       section->comdat->name = newname;
892
893                       break;
894                     }
895                 }
896
897               esym += (isym.n_numaux + 1) * SYMESZ;
898             }
899         }
900     }
901
902 #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
903   /* As a GNU extension, if the name begins with .gnu.linkonce, we
904      only link a single copy of the section.  This is used to support
905      g++.  g++ will emit each template expansion in its own section.
906      The symbols will be defined as weak, so that multiple definitions
907      are permitted.  The GNU linker extension is to actually discard
908      all but one of the sections.  */
909   if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
910     sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
911 #endif
912
913   return sec_flags;
914 }
915
916 #endif /* COFF_WITH_PE */
917
918 #define get_index(symbol)       ((symbol)->udata.i)
919
920 /*
921 INTERNAL_DEFINITION
922         bfd_coff_backend_data
923
924 CODE_FRAGMENT
925
926 .{* COFF symbol classifications.  *}
927 .
928 .enum coff_symbol_classification
929 .{
930 .  {* Global symbol.  *}
931 .  COFF_SYMBOL_GLOBAL,
932 .  {* Common symbol.  *}
933 .  COFF_SYMBOL_COMMON,
934 .  {* Undefined symbol.  *}
935 .  COFF_SYMBOL_UNDEFINED,
936 .  {* Local symbol.  *}
937 .  COFF_SYMBOL_LOCAL,
938 .  {* PE section symbol.  *}
939 .  COFF_SYMBOL_PE_SECTION
940 .};
941 .
942 Special entry points for gdb to swap in coff symbol table parts:
943 .typedef struct
944 .{
945 .  void (*_bfd_coff_swap_aux_in) PARAMS ((
946 .       bfd            *abfd,
947 .       PTR             ext,
948 .       int             type,
949 .       int             class,
950 .       int             indaux,
951 .       int             numaux,
952 .       PTR             in));
953 .
954 .  void (*_bfd_coff_swap_sym_in) PARAMS ((
955 .       bfd            *abfd ,
956 .       PTR             ext,
957 .       PTR             in));
958 .
959 .  void (*_bfd_coff_swap_lineno_in) PARAMS ((
960 .       bfd            *abfd,
961 .       PTR            ext,
962 .       PTR             in));
963 .
964
965 Special entry points for gas to swap out coff parts:
966
967 . unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
968 .       bfd     *abfd,
969 .       PTR     in,
970 .       int     type,
971 .       int     class,
972 .       int     indaux,
973 .       int     numaux,
974 .       PTR     ext));
975 .
976 . unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
977 .      bfd      *abfd,
978 .      PTR      in,
979 .      PTR      ext));
980 .
981 . unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
982 .       bfd     *abfd,
983 .       PTR     in,
984 .       PTR     ext));
985 .
986 . unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
987 .       bfd     *abfd,
988 .       PTR     src,
989 .       PTR     dst));
990 .
991 . unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
992 .       bfd     *abfd,
993 .       PTR     in,
994 .       PTR     out));
995 .
996 . unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
997 .       bfd     *abfd,
998 .       PTR     in,
999 .       PTR     out));
1000 .
1001 . unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
1002 .       bfd     *abfd,
1003 .       PTR     in,
1004 .       PTR     out));
1005 .
1006
1007 Special entry points for generic COFF routines to call target
1008 dependent COFF routines:
1009
1010 . unsigned int _bfd_filhsz;
1011 . unsigned int _bfd_aoutsz;
1012 . unsigned int _bfd_scnhsz;
1013 . unsigned int _bfd_symesz;
1014 . unsigned int _bfd_auxesz;
1015 . unsigned int _bfd_relsz;
1016 . unsigned int _bfd_linesz;
1017 . boolean _bfd_coff_long_filenames;
1018 . boolean _bfd_coff_long_section_names;
1019 . unsigned int _bfd_coff_default_section_alignment_power;
1020 . void (*_bfd_coff_swap_filehdr_in) PARAMS ((
1021 .       bfd     *abfd,
1022 .       PTR     ext,
1023 .       PTR     in));
1024 . void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
1025 .       bfd     *abfd,
1026 .       PTR     ext,
1027 .       PTR     in));
1028 . void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
1029 .       bfd     *abfd,
1030 .       PTR     ext,
1031 .       PTR     in));
1032 . void (*_bfd_coff_swap_reloc_in) PARAMS ((
1033 .       bfd     *abfd,
1034 .       PTR     ext,
1035 .       PTR     in));
1036 . boolean (*_bfd_coff_bad_format_hook) PARAMS ((
1037 .       bfd     *abfd,
1038 .       PTR     internal_filehdr));
1039 . boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
1040 .       bfd     *abfd,
1041 .       PTR     internal_filehdr));
1042 . PTR (*_bfd_coff_mkobject_hook) PARAMS ((
1043 .       bfd     *abfd,
1044 .       PTR     internal_filehdr,
1045 .       PTR     internal_aouthdr));
1046 . flagword (*_bfd_styp_to_sec_flags_hook) PARAMS ((
1047 .       bfd     *abfd,
1048 .       PTR     internal_scnhdr,
1049 .       const char *name,
1050 .       asection *section));
1051 . void (*_bfd_set_alignment_hook) PARAMS ((
1052 .       bfd     *abfd,
1053 .       asection *sec,
1054 .       PTR     internal_scnhdr));
1055 . boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
1056 .       bfd     *abfd));
1057 . boolean (*_bfd_coff_symname_in_debug) PARAMS ((
1058 .       bfd     *abfd,
1059 .       struct internal_syment *sym));
1060 . boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
1061 .       bfd *abfd,
1062 .       combined_entry_type *table_base,
1063 .       combined_entry_type *symbol,
1064 .       unsigned int indaux,
1065 .       combined_entry_type *aux));
1066 . boolean (*_bfd_coff_print_aux) PARAMS ((
1067 .       bfd *abfd,
1068 .       FILE *file,
1069 .       combined_entry_type *table_base,
1070 .       combined_entry_type *symbol,
1071 .       combined_entry_type *aux,
1072 .       unsigned int indaux));
1073 . void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
1074 .       bfd     *abfd,
1075 .       struct bfd_link_info *link_info,
1076 .       struct bfd_link_order *link_order,
1077 .       arelent *reloc,
1078 .       bfd_byte *data,
1079 .       unsigned int *src_ptr,
1080 .       unsigned int *dst_ptr));
1081 . int (*_bfd_coff_reloc16_estimate) PARAMS ((
1082 .       bfd *abfd,
1083 .       asection *input_section,
1084 .       arelent *r,
1085 .       unsigned int shrink,
1086 .       struct bfd_link_info *link_info));
1087 . enum coff_symbol_classification (*_bfd_coff_classify_symbol) PARAMS ((
1088 .       bfd *abfd,
1089 .       struct internal_syment *));
1090 . boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
1091 .       bfd *abfd));
1092 . boolean (*_bfd_coff_start_final_link) PARAMS ((
1093 .       bfd *output_bfd,
1094 .       struct bfd_link_info *info));
1095 . boolean (*_bfd_coff_relocate_section) PARAMS ((
1096 .       bfd *output_bfd,
1097 .       struct bfd_link_info *info,
1098 .       bfd *input_bfd,
1099 .       asection *input_section,
1100 .       bfd_byte *contents,
1101 .       struct internal_reloc *relocs,
1102 .       struct internal_syment *syms,
1103 .       asection **sections));
1104 . reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
1105 .       bfd *abfd,
1106 .       asection *sec,
1107 .       struct internal_reloc *rel,
1108 .       struct coff_link_hash_entry *h,
1109 .       struct internal_syment *sym,
1110 .       bfd_vma *addendp));
1111 . boolean (*_bfd_coff_adjust_symndx) PARAMS ((
1112 .       bfd *obfd,
1113 .       struct bfd_link_info *info,
1114 .       bfd *ibfd,
1115 .       asection *sec,
1116 .       struct internal_reloc *reloc,
1117 .       boolean *adjustedp));
1118 . boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
1119 .       struct bfd_link_info *info,
1120 .       bfd *abfd,
1121 .       const char *name,
1122 .       flagword flags, 
1123 .       asection *section,
1124 .       bfd_vma value,
1125 .       const char *string,
1126 .       boolean copy,
1127 .       boolean collect, 
1128 .       struct bfd_link_hash_entry **hashp));
1129 .
1130 . boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
1131 .       bfd * abfd,
1132 .       struct coff_final_link_info * pfinfo));
1133 . boolean (*_bfd_coff_final_link_postscript) PARAMS ((
1134 .       bfd * abfd,
1135 .       struct coff_final_link_info * pfinfo));
1136 .
1137 .} bfd_coff_backend_data;
1138 .
1139 .#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
1140 .
1141 .#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
1142 .        ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
1143 .
1144 .#define bfd_coff_swap_sym_in(a,e,i) \
1145 .        ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
1146 .
1147 .#define bfd_coff_swap_lineno_in(a,e,i) \
1148 .        ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
1149 .
1150 .#define bfd_coff_swap_reloc_out(abfd, i, o) \
1151 .        ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
1152 .
1153 .#define bfd_coff_swap_lineno_out(abfd, i, o) \
1154 .        ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
1155 .
1156 .#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
1157 .        ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
1158 .
1159 .#define bfd_coff_swap_sym_out(abfd, i,o) \
1160 .        ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
1161 .
1162 .#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
1163 .        ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
1164 .
1165 .#define bfd_coff_swap_filehdr_out(abfd, i,o) \
1166 .        ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
1167 .
1168 .#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
1169 .        ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
1170 .
1171 .#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
1172 .#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
1173 .#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
1174 .#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
1175 .#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
1176 .#define bfd_coff_relsz(abfd)  (coff_backend_info (abfd)->_bfd_relsz)
1177 .#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
1178 .#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
1179 .#define bfd_coff_long_section_names(abfd) \
1180 .        (coff_backend_info (abfd)->_bfd_coff_long_section_names)
1181 .#define bfd_coff_default_section_alignment_power(abfd) \
1182 .        (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
1183 .#define bfd_coff_swap_filehdr_in(abfd, i,o) \
1184 .        ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
1185 .
1186 .#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
1187 .        ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
1188 .
1189 .#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
1190 .        ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
1191 .
1192 .#define bfd_coff_swap_reloc_in(abfd, i, o) \
1193 .        ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
1194 .
1195 .#define bfd_coff_bad_format_hook(abfd, filehdr) \
1196 .        ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
1197 .
1198 .#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
1199 .        ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
1200 .#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
1201 .        ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
1202 .
1203 .#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section)\
1204 .        ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
1205 .         (abfd, scnhdr, name, section))
1206 .
1207 .#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
1208 .        ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
1209 .
1210 .#define bfd_coff_slurp_symbol_table(abfd)\
1211 .        ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
1212 .
1213 .#define bfd_coff_symname_in_debug(abfd, sym)\
1214 .        ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
1215 .
1216 .#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
1217 .        ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
1218 .         (abfd, file, base, symbol, aux, indaux))
1219 .
1220 .#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
1221 .        ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
1222 .         (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
1223 .
1224 .#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
1225 .        ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
1226 .         (abfd, section, reloc, shrink, link_info))
1227 .
1228 .#define bfd_coff_classify_symbol(abfd, sym)\
1229 .        ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
1230 .         (abfd, sym))
1231 .
1232 .#define bfd_coff_compute_section_file_positions(abfd)\
1233 .        ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
1234 .         (abfd))
1235 .
1236 .#define bfd_coff_start_final_link(obfd, info)\
1237 .        ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
1238 .         (obfd, info))
1239 .#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
1240 .        ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
1241 .         (obfd, info, ibfd, o, con, rel, isyms, secs))
1242 .#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
1243 .        ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
1244 .         (abfd, sec, rel, h, sym, addendp))
1245 .#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
1246 .        ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
1247 .         (obfd, info, ibfd, sec, rel, adjustedp))
1248 .#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\
1249 .        ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
1250 .         (info, abfd, name, flags, section, value, string, cp, coll, hashp))
1251 .
1252 .#define bfd_coff_link_output_has_begun(a,p) \
1253 .        ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
1254 .#define bfd_coff_final_link_postscript(a,p) \
1255 .        ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
1256 .
1257 */
1258
1259 /* See whether the magic number matches.  */
1260
1261 static boolean
1262 coff_bad_format_hook (abfd, filehdr)
1263      bfd * abfd ATTRIBUTE_UNUSED;
1264      PTR filehdr;
1265 {
1266   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1267
1268   if (BADMAG (*internal_f))
1269     return false;
1270
1271   /* if the optional header is NULL or not the correct size then
1272      quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
1273      and Intel 960 readwrite headers (I960WRMAGIC) is that the
1274      optional header is of a different size.
1275
1276      But the mips keeps extra stuff in it's opthdr, so dont check
1277      when doing that
1278      */
1279
1280 #if defined(M88) || defined(I960)
1281   if (internal_f->f_opthdr != 0 && AOUTSZ != internal_f->f_opthdr)
1282     return false;
1283 #endif
1284
1285   return true;
1286 }
1287
1288 /* Check whether this section uses an alignment other than the
1289    default.  */
1290
1291 static void
1292 coff_set_custom_section_alignment (abfd, section, alignment_table, table_size)
1293      bfd *abfd ATTRIBUTE_UNUSED;
1294      asection *section;
1295      const struct coff_section_alignment_entry *alignment_table;
1296      const unsigned int table_size;
1297 {
1298   const unsigned int default_alignment = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1299   unsigned int i;
1300
1301   for (i = 0; i < table_size; ++i)
1302     {
1303       const char *secname = bfd_get_section_name (abfd, section);
1304       if (alignment_table[i].comparison_length == (unsigned int) -1
1305           ? strcmp (alignment_table[i].name, secname) == 0
1306           : strncmp (alignment_table[i].name, secname,
1307                      alignment_table[i].comparison_length) == 0)
1308         break;
1309     }
1310   if (i >= table_size)
1311     return;
1312
1313   if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY
1314       && default_alignment < alignment_table[i].default_alignment_min)
1315     return;
1316
1317   if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
1318       && default_alignment > alignment_table[i].default_alignment_max)
1319     return;
1320
1321   section->alignment_power = alignment_table[i].alignment_power;
1322 }
1323
1324 /* Custom section alignment records.  */
1325
1326 static const struct coff_section_alignment_entry
1327 coff_section_alignment_table[] =
1328 {
1329 #ifdef COFF_SECTION_ALIGNMENT_ENTRIES
1330   COFF_SECTION_ALIGNMENT_ENTRIES,
1331 #endif
1332   /* There must not be any gaps between .stabstr sections.  */
1333   { COFF_SECTION_NAME_PARTIAL_MATCH (".stabstr"),
1334     1, COFF_ALIGNMENT_FIELD_EMPTY, 0 },
1335   /* The .stab section must be aligned to 2**2 at most, to avoid gaps.  */
1336   { COFF_SECTION_NAME_PARTIAL_MATCH (".stab"),
1337     3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1338   /* Similarly for the .ctors and .dtors sections.  */
1339   { COFF_SECTION_NAME_EXACT_MATCH (".ctors"),
1340     3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1341   { COFF_SECTION_NAME_EXACT_MATCH (".dtors"),
1342     3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }
1343 };
1344
1345 static const unsigned int coff_section_alignment_table_size =
1346   sizeof coff_section_alignment_table / sizeof coff_section_alignment_table[0];
1347
1348 /* Initialize a section structure with information peculiar to this
1349    particular implementation of COFF.  */
1350
1351 static boolean
1352 coff_new_section_hook (abfd, section)
1353      bfd *abfd;
1354      asection *section;
1355 {
1356   combined_entry_type *native;
1357
1358   section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1359
1360 #ifdef RS6000COFF_C
1361   if (xcoff_data (abfd)->text_align_power != 0
1362       && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
1363     section->alignment_power = xcoff_data (abfd)->text_align_power;
1364   if (xcoff_data (abfd)->data_align_power != 0
1365       && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
1366     section->alignment_power = xcoff_data (abfd)->data_align_power;
1367 #endif
1368
1369   /* Allocate aux records for section symbols, to store size and
1370      related info.
1371
1372      @@ The 10 is a guess at a plausible maximum number of aux entries
1373      (but shouldn't be a constant).  */
1374   native = ((combined_entry_type *)
1375             bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
1376   if (native == NULL)
1377     return false;
1378
1379   /* We don't need to set up n_name, n_value, or n_scnum in the native
1380      symbol information, since they'll be overriden by the BFD symbol
1381      anyhow.  However, we do need to set the type and storage class,
1382      in case this symbol winds up getting written out.  The value 0
1383      for n_numaux is already correct.  */
1384
1385   native->u.syment.n_type = T_NULL;
1386   native->u.syment.n_sclass = C_STAT;
1387
1388   coffsymbol (section->symbol)->native = native;
1389
1390   coff_set_custom_section_alignment (abfd, section,
1391                                      coff_section_alignment_table,
1392                                      coff_section_alignment_table_size);
1393
1394   return true;
1395 }
1396
1397 #ifdef COFF_ALIGN_IN_SECTION_HEADER
1398
1399 /* Set the alignment of a BFD section.  */
1400
1401 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1402
1403 static void
1404 coff_set_alignment_hook (abfd, section, scnhdr)
1405      bfd * abfd ATTRIBUTE_UNUSED;
1406      asection * section;
1407      PTR scnhdr;
1408 {
1409   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1410   unsigned int i;
1411
1412 #ifdef I960
1413   /* Extract ALIGN from 2**ALIGN stored in section header */
1414   for (i = 0; i < 32; i++)
1415     if ((1 << i) >= hdr->s_align)
1416       break;
1417 #endif
1418 #ifdef TIC80COFF
1419   /* TI tools hijack bits 8-11 for the alignment */
1420   i = (hdr->s_flags >> 8) & 0xF ;
1421 #endif
1422   section->alignment_power = i;
1423 }
1424
1425 #else /* ! COFF_ALIGN_IN_SECTION_HEADER */
1426 #ifdef COFF_WITH_PE
1427
1428 /* a couple of macros to help setting the alignment power field */
1429 #define ALIGN_SET(field,x,y) \
1430   if (((field) & IMAGE_SCN_ALIGN_64BYTES) == x )\
1431   {\
1432      section->alignment_power = y;\
1433   }
1434
1435 #define ELIFALIGN_SET(field,x,y) \
1436   else if (( (field) & IMAGE_SCN_ALIGN_64BYTES) == x ) \
1437   {\
1438      section->alignment_power = y;\
1439   }
1440
1441 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1442
1443 static void
1444 coff_set_alignment_hook (abfd, section, scnhdr)
1445      bfd * abfd ATTRIBUTE_UNUSED;
1446      asection * section;
1447      PTR scnhdr;
1448 {
1449   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1450
1451   ALIGN_SET     (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6)
1452   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5)
1453   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_16BYTES, 4)
1454   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_8BYTES,  3)
1455   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_4BYTES,  2)
1456   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_2BYTES,  1)
1457   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_1BYTES,  0)
1458
1459 #ifdef POWERPC_LE_PE
1460   if (strcmp (section->name, ".idata$2") == 0)
1461     {
1462       section->alignment_power = 0;
1463     }
1464   else if (strcmp (section->name, ".idata$3") == 0)
1465     {
1466       section->alignment_power = 0;
1467     }
1468   else if (strcmp (section->name, ".idata$4") == 0)
1469     {
1470       section->alignment_power = 2;
1471     }
1472   else if (strcmp (section->name, ".idata$5") == 0)
1473     {
1474       section->alignment_power = 2;
1475     }
1476   else if (strcmp (section->name, ".idata$6") == 0)
1477     {
1478       section->alignment_power = 1;
1479     }
1480   else if (strcmp (section->name, ".reloc") == 0)
1481     {
1482       section->alignment_power = 1;
1483     }
1484   else if (strncmp (section->name, ".stab", 5) == 0)
1485     {
1486       section->alignment_power = 2;
1487     }
1488 #endif
1489
1490 #ifdef COFF_IMAGE_WITH_PE
1491   /* In a PE image file, the s_paddr field holds the virtual size of a
1492      section, while the s_size field holds the raw size.  */
1493   if (hdr->s_paddr != 0)
1494     {
1495       if (coff_section_data (abfd, section) == NULL)
1496         {
1497           section->used_by_bfd =
1498             (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
1499           if (section->used_by_bfd == NULL)
1500             {
1501               /* FIXME: Return error.  */
1502               abort ();
1503             }
1504         }
1505       if (pei_section_data (abfd, section) == NULL)
1506         {
1507           coff_section_data (abfd, section)->tdata =
1508             (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
1509           if (coff_section_data (abfd, section)->tdata == NULL)
1510             {
1511               /* FIXME: Return error.  */
1512               abort ();
1513             }
1514         }
1515       pei_section_data (abfd, section)->virt_size = hdr->s_paddr;
1516     }
1517 #endif
1518
1519 #ifdef COFF_WITH_PE
1520   section->lma = hdr->s_vaddr;
1521 #endif
1522 }
1523 #undef ALIGN_SET
1524 #undef ELIFALIGN_SET
1525
1526 #else /* ! COFF_WITH_PE */
1527 #ifdef RS6000COFF_C
1528
1529 /* We grossly abuse this function to handle XCOFF overflow headers.
1530    When we see one, we correct the reloc and line number counts in the
1531    real header, and remove the section we just created.  */
1532
1533 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1534
1535 static void
1536 coff_set_alignment_hook (abfd, section, scnhdr)
1537      bfd *abfd;
1538      asection *section;
1539      PTR scnhdr;
1540 {
1541   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1542   asection *real_sec;
1543   asection **ps;
1544
1545   if ((hdr->s_flags & STYP_OVRFLO) == 0)
1546     return;
1547
1548   real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
1549   if (real_sec == NULL)
1550     return;
1551
1552   real_sec->reloc_count = hdr->s_paddr;
1553   real_sec->lineno_count = hdr->s_vaddr;
1554
1555   for (ps = &abfd->sections; *ps != NULL; ps = &(*ps)->next)
1556     {
1557       if (*ps == section)
1558         {
1559           *ps = (*ps)->next;
1560           --abfd->section_count;
1561           break;
1562         }
1563     }
1564 }
1565
1566 #else /* ! RS6000COFF_C */
1567
1568 #define coff_set_alignment_hook \
1569   ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
1570
1571 #endif /* ! RS6000COFF_C */
1572 #endif /* ! COFF_WITH_PE */
1573 #endif /* ! COFF_ALIGN_IN_SECTION_HEADER */
1574
1575 #ifndef coff_mkobject
1576
1577 static boolean coff_mkobject PARAMS ((bfd *));
1578
1579 static boolean
1580 coff_mkobject (abfd)
1581      bfd * abfd;
1582 {
1583   coff_data_type *coff;
1584
1585   abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
1586   if (abfd->tdata.coff_obj_data == 0)
1587     return false;
1588   coff = coff_data (abfd);
1589   coff->symbols = (coff_symbol_type *) NULL;
1590   coff->conversion_table = (unsigned int *) NULL;
1591   coff->raw_syments = (struct coff_ptr_struct *) NULL;
1592   coff->relocbase = 0;
1593   coff->local_toc_sym_map = 0;
1594
1595 /*  make_abs_section(abfd);*/
1596
1597   return true;
1598 }
1599 #endif
1600
1601 /* Create the COFF backend specific information.  */
1602 #ifndef coff_mkobject_hook
1603 static PTR
1604 coff_mkobject_hook (abfd, filehdr, aouthdr)
1605      bfd * abfd;
1606      PTR filehdr;
1607      PTR aouthdr ATTRIBUTE_UNUSED;
1608 {
1609   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1610   coff_data_type *coff;
1611
1612   if (coff_mkobject (abfd) == false)
1613     return NULL;
1614
1615   coff = coff_data (abfd);
1616
1617   coff->sym_filepos = internal_f->f_symptr;
1618
1619   /* These members communicate important constants about the symbol
1620      table to GDB's symbol-reading code.  These `constants'
1621      unfortunately vary among coff implementations...  */
1622   coff->local_n_btmask = N_BTMASK;
1623   coff->local_n_btshft = N_BTSHFT;
1624   coff->local_n_tmask = N_TMASK;
1625   coff->local_n_tshift = N_TSHIFT;
1626   coff->local_symesz = SYMESZ;
1627   coff->local_auxesz = AUXESZ;
1628   coff->local_linesz = LINESZ;
1629
1630   obj_raw_syment_count (abfd) =
1631     obj_conv_table_size (abfd) =
1632       internal_f->f_nsyms;
1633
1634 #ifdef RS6000COFF_C
1635   if ((internal_f->f_flags & F_SHROBJ) != 0)
1636     abfd->flags |= DYNAMIC;
1637   if (aouthdr != NULL && internal_f->f_opthdr >= AOUTSZ)
1638     {
1639       struct internal_aouthdr *internal_a =
1640         (struct internal_aouthdr *) aouthdr;
1641       struct xcoff_tdata *xcoff;
1642
1643       xcoff = xcoff_data (abfd);
1644       xcoff->full_aouthdr = true;
1645       xcoff->toc = internal_a->o_toc;
1646       xcoff->sntoc = internal_a->o_sntoc;
1647       xcoff->snentry = internal_a->o_snentry;
1648       xcoff->text_align_power = internal_a->o_algntext;
1649       xcoff->data_align_power = internal_a->o_algndata;
1650       xcoff->modtype = internal_a->o_modtype;
1651       xcoff->cputype = internal_a->o_cputype;
1652       xcoff->maxdata = internal_a->o_maxdata;
1653       xcoff->maxstack = internal_a->o_maxstack;
1654     }
1655 #endif
1656
1657 #ifdef ARM 
1658   /* Set the flags field from the COFF header read in */
1659   if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
1660     coff->flags = 0;
1661 #endif
1662   
1663   return (PTR) coff;
1664 }
1665 #endif
1666
1667 /* Determine the machine architecture and type.  FIXME: This is target
1668    dependent because the magic numbers are defined in the target
1669    dependent header files.  But there is no particular need for this.
1670    If the magic numbers were moved to a separate file, this function
1671    would be target independent and would also be much more successful
1672    at linking together COFF files for different architectures.  */
1673
1674 static boolean
1675 coff_set_arch_mach_hook (abfd, filehdr)
1676      bfd *abfd;
1677      PTR filehdr;
1678 {
1679   long machine;
1680   enum bfd_architecture arch;
1681   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1682
1683   machine = 0;
1684   switch (internal_f->f_magic)
1685     {
1686 #ifdef PPCMAGIC
1687     case PPCMAGIC:
1688       arch = bfd_arch_powerpc;
1689       machine = 0; /* what does this mean? (krk) */
1690       break; 
1691 #endif
1692 #ifdef I386MAGIC
1693     case I386MAGIC:
1694     case I386PTXMAGIC:
1695     case I386AIXMAGIC:          /* Danbury PS/2 AIX C Compiler */
1696     case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1697       arch = bfd_arch_i386;
1698       machine = 0;
1699       break;
1700 #endif
1701 #ifdef A29K_MAGIC_BIG
1702     case A29K_MAGIC_BIG:
1703     case A29K_MAGIC_LITTLE:
1704       arch = bfd_arch_a29k;
1705       machine = 0;
1706       break;
1707 #endif
1708 #ifdef ARMMAGIC
1709     case ARMMAGIC:
1710       arch = bfd_arch_arm;
1711       switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1712         {
1713         case F_ARM_2:  machine = bfd_mach_arm_2;  break;
1714         case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1715         case F_ARM_3:  machine = bfd_mach_arm_3;  break;
1716         default:
1717         case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1718         case F_ARM_4:  machine = bfd_mach_arm_4;  break;
1719         case F_ARM_4T: machine = bfd_mach_arm_4T; break;
1720         case F_ARM_5:  machine = bfd_mach_arm_5;  break;
1721         }
1722       break;
1723 #endif
1724 #ifdef MC68MAGIC
1725     case MC68MAGIC:
1726     case M68MAGIC:
1727 #ifdef MC68KBCSMAGIC
1728     case MC68KBCSMAGIC:
1729 #endif
1730 #ifdef APOLLOM68KMAGIC
1731     case APOLLOM68KMAGIC:
1732 #endif
1733 #ifdef LYNXCOFFMAGIC
1734     case LYNXCOFFMAGIC:
1735 #endif
1736       arch = bfd_arch_m68k;
1737       machine = bfd_mach_m68020;
1738       break;
1739 #endif
1740 #ifdef MC88MAGIC
1741     case MC88MAGIC:
1742     case MC88DMAGIC:
1743     case MC88OMAGIC:
1744       arch = bfd_arch_m88k;
1745       machine = 88100;
1746       break;
1747 #endif
1748 #ifdef Z8KMAGIC
1749     case Z8KMAGIC:
1750       arch = bfd_arch_z8k;
1751       switch (internal_f->f_flags & F_MACHMASK)
1752         {
1753         case F_Z8001:
1754           machine = bfd_mach_z8001;
1755           break;
1756         case F_Z8002:
1757           machine = bfd_mach_z8002;
1758           break;
1759         default:
1760           return false;
1761         }
1762       break;
1763 #endif
1764 #ifdef I860
1765     case I860MAGIC:
1766       arch = bfd_arch_i860;
1767       break;
1768 #endif
1769 #ifdef I960
1770 #ifdef I960ROMAGIC
1771     case I960ROMAGIC:
1772     case I960RWMAGIC:
1773       arch = bfd_arch_i960;
1774       switch (F_I960TYPE & internal_f->f_flags)
1775         {
1776         default:
1777         case F_I960CORE:
1778           machine = bfd_mach_i960_core;
1779           break;
1780         case F_I960KB:
1781           machine = bfd_mach_i960_kb_sb;
1782           break;
1783         case F_I960MC:
1784           machine = bfd_mach_i960_mc;
1785           break;
1786         case F_I960XA:
1787           machine = bfd_mach_i960_xa;
1788           break;
1789         case F_I960CA:
1790           machine = bfd_mach_i960_ca;
1791           break;
1792         case F_I960KA:
1793           machine = bfd_mach_i960_ka_sa;
1794           break;
1795         case F_I960JX:
1796           machine = bfd_mach_i960_jx;
1797           break;
1798         case F_I960HX:
1799           machine = bfd_mach_i960_hx;
1800           break;
1801         }
1802       break;
1803 #endif
1804 #endif
1805
1806 #ifdef RS6000COFF_C
1807     case U802ROMAGIC:
1808     case U802WRMAGIC:
1809     case U802TOCMAGIC:
1810       {
1811         int cputype;
1812
1813         if (xcoff_data (abfd)->cputype != -1)
1814           cputype = xcoff_data (abfd)->cputype & 0xff;
1815         else
1816           {
1817             /* We did not get a value from the a.out header.  If the
1818                file has not been stripped, we may be able to get the
1819                architecture information from the first symbol, if it
1820                is a .file symbol.  */
1821             if (obj_raw_syment_count (abfd) == 0)
1822               cputype = 0;
1823             else
1824               {
1825                 bfd_byte buf[SYMESZ];
1826                 struct internal_syment sym;
1827
1828                 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1829                     || bfd_read (buf, 1, SYMESZ, abfd) != SYMESZ)
1830                   return false;
1831                 coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
1832                 if (sym.n_sclass == C_FILE)
1833                   cputype = sym.n_type & 0xff;
1834                 else
1835                   cputype = 0;
1836               }
1837           }
1838
1839         /* FIXME: We don't handle all cases here.  */
1840         switch (cputype)
1841           {
1842           default:
1843           case 0:
1844 #ifdef POWERMAC
1845             /* PowerPC Macs use the same magic numbers as RS/6000
1846                (because that's how they were bootstrapped originally),
1847                but they are always PowerPC architecture.  */
1848             arch = bfd_arch_powerpc;
1849             machine = 0;
1850 #else
1851             arch = bfd_arch_rs6000;
1852             machine = 6000;
1853 #endif /* POWERMAC */
1854             break;
1855
1856           case 1:
1857             arch = bfd_arch_powerpc;
1858             machine = 601;
1859             break;
1860           case 2: /* 64 bit PowerPC */
1861             arch = bfd_arch_powerpc;
1862             machine = 620;
1863             break;
1864           case 3:
1865             arch = bfd_arch_powerpc;
1866             machine = 0;
1867             break;
1868           case 4:
1869             arch = bfd_arch_rs6000;
1870             machine = 6000;
1871             break;
1872           }
1873       }
1874       break;
1875 #endif
1876
1877 #ifdef WE32KMAGIC
1878     case WE32KMAGIC:
1879       arch = bfd_arch_we32k;
1880       machine = 0;
1881       break;
1882 #endif
1883
1884 #ifdef H8300MAGIC
1885     case H8300MAGIC:
1886       arch = bfd_arch_h8300;
1887       machine = bfd_mach_h8300;
1888       /* !! FIXME this probably isn't the right place for this */
1889       abfd->flags |= BFD_IS_RELAXABLE;
1890       break;
1891 #endif
1892
1893 #ifdef H8300HMAGIC
1894     case H8300HMAGIC:
1895       arch = bfd_arch_h8300;
1896       machine = bfd_mach_h8300h;
1897       /* !! FIXME this probably isn't the right place for this */
1898       abfd->flags |= BFD_IS_RELAXABLE;
1899       break;
1900 #endif
1901
1902 #ifdef H8300SMAGIC
1903     case H8300SMAGIC:
1904       arch = bfd_arch_h8300;
1905       machine = bfd_mach_h8300s;
1906       /* !! FIXME this probably isn't the right place for this */
1907       abfd->flags |= BFD_IS_RELAXABLE;
1908       break;
1909 #endif
1910
1911 #ifdef SH_ARCH_MAGIC_BIG
1912     case SH_ARCH_MAGIC_BIG:
1913     case SH_ARCH_MAGIC_LITTLE:
1914       arch = bfd_arch_sh;
1915       machine = 0;
1916       break;
1917 #endif
1918
1919 #ifdef H8500MAGIC
1920     case H8500MAGIC:
1921       arch = bfd_arch_h8500;
1922       machine = 0;
1923       break;
1924 #endif
1925
1926 #ifdef SPARCMAGIC
1927     case SPARCMAGIC:
1928 #ifdef LYNXCOFFMAGIC
1929     case LYNXCOFFMAGIC:
1930 #endif
1931       arch = bfd_arch_sparc;
1932       machine = 0;
1933       break;
1934 #endif
1935
1936 #ifdef TIC30MAGIC
1937     case TIC30MAGIC:
1938       arch = bfd_arch_tic30;
1939       break;
1940 #endif
1941
1942 #ifdef TIC80_ARCH_MAGIC
1943     case TIC80_ARCH_MAGIC:
1944       arch = bfd_arch_tic80;
1945       break;
1946 #endif
1947
1948 #ifdef MCOREMAGIC
1949     case MCOREMAGIC:
1950       arch = bfd_arch_mcore;
1951       break;
1952 #endif
1953     default:                    /* Unreadable input file type */
1954       arch = bfd_arch_obscure;
1955       break;
1956     }
1957
1958   bfd_default_set_arch_mach (abfd, arch, machine);
1959   return true;
1960 }
1961
1962 #ifdef SYMNAME_IN_DEBUG
1963
1964 static boolean symname_in_debug_hook
1965   PARAMS ((bfd *, struct internal_syment *));
1966
1967 static boolean
1968 symname_in_debug_hook (abfd, sym)
1969      bfd * abfd ATTRIBUTE_UNUSED;
1970      struct internal_syment *sym;
1971 {
1972   return SYMNAME_IN_DEBUG (sym) ? true : false;
1973 }
1974
1975 #else
1976
1977 #define symname_in_debug_hook \
1978   (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
1979
1980 #endif
1981
1982 #ifdef RS6000COFF_C
1983
1984 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
1985
1986 static boolean coff_pointerize_aux_hook
1987   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1988            unsigned int, combined_entry_type *));
1989
1990 /*ARGSUSED*/
1991 static boolean
1992 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
1993      bfd *abfd ATTRIBUTE_UNUSED;
1994      combined_entry_type *table_base;
1995      combined_entry_type *symbol;
1996      unsigned int indaux;
1997      combined_entry_type *aux;
1998 {
1999   int class = symbol->u.syment.n_sclass;
2000
2001   if ((class == C_EXT || class == C_HIDEXT)
2002       && indaux + 1 == symbol->u.syment.n_numaux)
2003     {
2004       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2005         {
2006           aux->u.auxent.x_csect.x_scnlen.p =
2007             table_base + aux->u.auxent.x_csect.x_scnlen.l;
2008           aux->fix_scnlen = 1;
2009         }
2010
2011       /* Return true to indicate that the caller should not do any
2012          further work on this auxent.  */
2013       return true;
2014     }
2015
2016   /* Return false to indicate that this auxent should be handled by
2017      the caller.  */
2018   return false;
2019 }
2020
2021 #else
2022 #ifdef I960
2023
2024 /* We don't want to pointerize bal entries.  */
2025
2026 static boolean coff_pointerize_aux_hook
2027   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2028            unsigned int, combined_entry_type *));
2029
2030 /*ARGSUSED*/
2031 static boolean
2032 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
2033      bfd *abfd ATTRIBUTE_UNUSED;
2034      combined_entry_type *table_base ATTRIBUTE_UNUSED;
2035      combined_entry_type *symbol;
2036      unsigned int indaux;
2037      combined_entry_type *aux ATTRIBUTE_UNUSED;
2038 {
2039   /* Return true if we don't want to pointerize this aux entry, which
2040      is the case for the lastfirst aux entry for a C_LEAFPROC symbol.  */
2041   return (indaux == 1
2042           && (symbol->u.syment.n_sclass == C_LEAFPROC
2043               || symbol->u.syment.n_sclass == C_LEAFSTAT
2044               || symbol->u.syment.n_sclass == C_LEAFEXT));
2045 }
2046
2047 #else /* ! I960 */
2048
2049 #define coff_pointerize_aux_hook 0
2050
2051 #endif /* ! I960 */
2052 #endif /* ! RS6000COFF_C */
2053
2054 /* Print an aux entry.  This returns true if it has printed it.  */
2055
2056 static boolean coff_print_aux
2057   PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
2058            combined_entry_type *, unsigned int));
2059
2060 static boolean
2061 coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
2062      bfd *abfd ATTRIBUTE_UNUSED;
2063      FILE *file ATTRIBUTE_UNUSED;
2064      combined_entry_type *table_base ATTRIBUTE_UNUSED;
2065      combined_entry_type *symbol ATTRIBUTE_UNUSED;
2066      combined_entry_type *aux ATTRIBUTE_UNUSED;
2067      unsigned int indaux ATTRIBUTE_UNUSED;
2068 {
2069 #ifdef RS6000COFF_C
2070   if ((symbol->u.syment.n_sclass == C_EXT
2071        || symbol->u.syment.n_sclass == C_HIDEXT)
2072       && indaux + 1 == symbol->u.syment.n_numaux)
2073     {
2074       /* This is a csect entry.  */
2075       fprintf (file, "AUX ");
2076       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2077         {
2078           BFD_ASSERT (! aux->fix_scnlen);
2079           fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
2080         }
2081       else
2082         {
2083           fprintf (file, "indx ");
2084           if (! aux->fix_scnlen)
2085             fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
2086           else
2087             fprintf (file, "%4ld",
2088                      (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2089         }
2090       fprintf (file,
2091                " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2092                aux->u.auxent.x_csect.x_parmhash,
2093                (unsigned int) aux->u.auxent.x_csect.x_snhash,
2094                SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2095                SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2096                (unsigned int) aux->u.auxent.x_csect.x_smclas,
2097                aux->u.auxent.x_csect.x_stab,
2098                (unsigned int) aux->u.auxent.x_csect.x_snstab);
2099       return true;
2100     }
2101 #endif
2102
2103   /* Return false to indicate that no special action was taken.  */
2104   return false;
2105 }
2106
2107 /*
2108 SUBSUBSECTION
2109         Writing relocations
2110
2111         To write relocations, the back end steps though the
2112         canonical relocation table and create an
2113         @code{internal_reloc}. The symbol index to use is removed from
2114         the @code{offset} field in the symbol table supplied.  The
2115         address comes directly from the sum of the section base
2116         address and the relocation offset; the type is dug directly
2117         from the howto field.  Then the @code{internal_reloc} is
2118         swapped into the shape of an @code{external_reloc} and written
2119         out to disk.
2120
2121 */
2122
2123 #ifdef TARG_AUX
2124
2125 static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2126
2127 /* AUX's ld wants relocations to be sorted */
2128 static int
2129 compare_arelent_ptr (x, y)
2130      const PTR x;
2131      const PTR y;
2132 {
2133   const arelent **a = (const arelent **) x;
2134   const arelent **b = (const arelent **) y;
2135   bfd_size_type aadr = (*a)->address;
2136   bfd_size_type badr = (*b)->address;
2137
2138   return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2139 }
2140
2141 #endif /* TARG_AUX */
2142
2143 static boolean
2144 coff_write_relocs (abfd, first_undef)
2145      bfd * abfd;
2146      int first_undef;
2147 {
2148   asection *s;
2149
2150   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2151     {
2152       unsigned int i;
2153       struct external_reloc dst;
2154       arelent **p;
2155
2156 #ifndef TARG_AUX
2157       p = s->orelocation;
2158 #else
2159       /* sort relocations before we write them out */
2160       p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
2161       if (p == NULL && s->reloc_count > 0)
2162         return false;
2163       memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2164       qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2165 #endif
2166
2167       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2168         return false;
2169       for (i = 0; i < s->reloc_count; i++)
2170         {
2171           struct internal_reloc n;
2172           arelent *q = p[i];
2173           memset ((PTR) & n, 0, sizeof (n));
2174
2175           /* Now we've renumbered the symbols we know where the
2176              undefined symbols live in the table.  Check the reloc
2177              entries for symbols who's output bfd isn't the right one.
2178              This is because the symbol was undefined (which means
2179              that all the pointers are never made to point to the same
2180              place). This is a bad thing,'cause the symbols attached
2181              to the output bfd are indexed, so that the relocation
2182              entries know which symbol index they point to.  So we
2183              have to look up the output symbol here. */
2184
2185           if (q->sym_ptr_ptr[0]->the_bfd != abfd)
2186             {
2187               int i;
2188               const char *sname = q->sym_ptr_ptr[0]->name;
2189               asymbol **outsyms = abfd->outsymbols;
2190               for (i = first_undef; outsyms[i]; i++)
2191                 {
2192                   const char *intable = outsyms[i]->name;
2193                   if (strcmp (intable, sname) == 0) {
2194                     /* got a hit, so repoint the reloc */
2195                     q->sym_ptr_ptr = outsyms + i;
2196                     break;
2197                   }
2198                 }
2199             }
2200
2201           n.r_vaddr = q->address + s->vma;
2202
2203 #ifdef R_IHCONST
2204           /* The 29k const/consth reloc pair is a real kludge.  The consth
2205              part doesn't have a symbol; it has an offset.  So rebuilt
2206              that here.  */
2207           if (q->howto->type == R_IHCONST)
2208             n.r_symndx = q->addend;
2209           else
2210 #endif
2211             if (q->sym_ptr_ptr)
2212               {
2213                 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
2214                   /* This is a relocation relative to the absolute symbol.  */
2215                   n.r_symndx = -1;
2216                 else
2217                   {
2218                     n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2219                     /* Take notice if the symbol reloc points to a symbol
2220                        we don't have in our symbol table.  What should we
2221                        do for this??  */
2222                     if (n.r_symndx > obj_conv_table_size (abfd))
2223                       abort ();
2224                   }
2225               }
2226
2227 #ifdef SWAP_OUT_RELOC_OFFSET
2228           n.r_offset = q->addend;
2229 #endif
2230
2231 #ifdef SELECT_RELOC
2232           /* Work out reloc type from what is required */
2233           SELECT_RELOC (n, q->howto);
2234 #else
2235           n.r_type = q->howto->type;
2236 #endif
2237           coff_swap_reloc_out (abfd, &n, &dst);
2238           if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
2239             return false;
2240         }
2241
2242 #ifdef TARG_AUX
2243       if (p != NULL)
2244         free (p);
2245 #endif
2246     }
2247
2248   return true;
2249 }
2250
2251 /* Set flags and magic number of a coff file from architecture and machine
2252    type.  Result is true if we can represent the arch&type, false if not.  */
2253
2254 static boolean
2255 coff_set_flags (abfd, magicp, flagsp)
2256      bfd * abfd;
2257      unsigned int *magicp ATTRIBUTE_UNUSED;
2258      unsigned short *flagsp ATTRIBUTE_UNUSED;
2259 {
2260   switch (bfd_get_arch (abfd))
2261     {
2262 #ifdef Z8KMAGIC
2263     case bfd_arch_z8k:
2264       *magicp = Z8KMAGIC;
2265       switch (bfd_get_mach (abfd))
2266         {
2267         case bfd_mach_z8001:
2268           *flagsp = F_Z8001;
2269           break;
2270         case bfd_mach_z8002:
2271           *flagsp = F_Z8002;
2272           break;
2273         default:
2274           return false;
2275         }
2276       return true;
2277 #endif
2278 #ifdef I960ROMAGIC
2279
2280     case bfd_arch_i960:
2281
2282       {
2283         unsigned flags;
2284         *magicp = I960ROMAGIC;
2285         /*
2286           ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
2287           I960RWMAGIC);   FIXME???
2288           */
2289         switch (bfd_get_mach (abfd))
2290           {
2291           case bfd_mach_i960_core:
2292             flags = F_I960CORE;
2293             break;
2294           case bfd_mach_i960_kb_sb:
2295             flags = F_I960KB;
2296             break;
2297           case bfd_mach_i960_mc:
2298             flags = F_I960MC;
2299             break;
2300           case bfd_mach_i960_xa:
2301             flags = F_I960XA;
2302             break;
2303           case bfd_mach_i960_ca:
2304             flags = F_I960CA;
2305             break;
2306           case bfd_mach_i960_ka_sa:
2307             flags = F_I960KA;
2308             break;
2309           case bfd_mach_i960_jx:
2310             flags = F_I960JX;
2311             break;
2312           case bfd_mach_i960_hx:
2313             flags = F_I960HX;
2314             break;
2315           default:
2316             return false;
2317           }
2318         *flagsp = flags;
2319         return true;
2320       }
2321       break;
2322 #endif
2323
2324 #ifdef TIC30MAGIC
2325     case bfd_arch_tic30:
2326       *magicp = TIC30MAGIC;
2327       return true;
2328 #endif
2329 #ifdef TIC80_ARCH_MAGIC
2330     case bfd_arch_tic80:
2331       *magicp = TIC80_ARCH_MAGIC;
2332       return true;
2333 #endif
2334 #ifdef ARMMAGIC
2335     case bfd_arch_arm:
2336       * magicp = ARMMAGIC;
2337       * flagsp = 0;
2338       if (APCS_SET (abfd))
2339         {
2340           if (APCS_26_FLAG (abfd))
2341             * flagsp |= F_APCS26;
2342           
2343           if (APCS_FLOAT_FLAG (abfd))
2344             * flagsp |= F_APCS_FLOAT;
2345           
2346           if (PIC_FLAG (abfd))
2347             * flagsp |= F_PIC;
2348         }
2349       if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2350         * flagsp |= F_INTERWORK;
2351       switch (bfd_get_mach (abfd))
2352         {
2353         case bfd_mach_arm_2:  * flagsp |= F_ARM_2;  break;
2354         case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2355         case bfd_mach_arm_3:  * flagsp |= F_ARM_3;  break;
2356         case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2357         case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
2358         case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2359         case bfd_mach_arm_5:  * flagsp |= F_ARM_5;  break;
2360         case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break; /* XXX - we do not have an F_ARM_5T */
2361         }
2362       return true;
2363 #endif
2364 #ifdef PPCMAGIC
2365     case bfd_arch_powerpc:
2366       *magicp = PPCMAGIC;
2367       return true;
2368       break;
2369 #endif
2370 #ifdef I386MAGIC
2371     case bfd_arch_i386:
2372       *magicp = I386MAGIC;
2373 #ifdef LYNXOS
2374       /* Just overwrite the usual value if we're doing Lynx. */
2375       *magicp = LYNXCOFFMAGIC;
2376 #endif
2377       return true;
2378       break;
2379 #endif
2380 #ifdef I860MAGIC
2381     case bfd_arch_i860:
2382       *magicp = I860MAGIC;
2383       return true;
2384       break;
2385 #endif
2386 #ifdef MC68MAGIC
2387     case bfd_arch_m68k:
2388 #ifdef APOLLOM68KMAGIC
2389       *magicp = APOLLO_COFF_VERSION_NUMBER;
2390 #else
2391       /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c.  */
2392 #ifdef NAMES_HAVE_UNDERSCORE
2393       *magicp = MC68KBCSMAGIC;
2394 #else
2395       *magicp = MC68MAGIC;
2396 #endif
2397 #endif
2398 #ifdef LYNXOS
2399       /* Just overwrite the usual value if we're doing Lynx. */
2400       *magicp = LYNXCOFFMAGIC;
2401 #endif
2402       return true;
2403       break;
2404 #endif
2405
2406 #ifdef MC88MAGIC
2407     case bfd_arch_m88k:
2408       *magicp = MC88OMAGIC;
2409       return true;
2410       break;
2411 #endif
2412 #ifdef H8300MAGIC
2413     case bfd_arch_h8300:
2414       switch (bfd_get_mach (abfd))
2415         {
2416         case bfd_mach_h8300:
2417           *magicp = H8300MAGIC;
2418           return true;
2419         case bfd_mach_h8300h:
2420           *magicp = H8300HMAGIC;
2421           return true;
2422         case bfd_mach_h8300s:
2423           *magicp = H8300SMAGIC;
2424           return true;
2425         }
2426       break;
2427 #endif
2428
2429 #ifdef SH_ARCH_MAGIC_BIG
2430     case bfd_arch_sh:
2431       if (bfd_big_endian (abfd))
2432         *magicp = SH_ARCH_MAGIC_BIG;
2433       else
2434         *magicp = SH_ARCH_MAGIC_LITTLE;
2435       return true;
2436       break;
2437 #endif
2438
2439 #ifdef SPARCMAGIC
2440     case bfd_arch_sparc:
2441       *magicp = SPARCMAGIC;
2442 #ifdef LYNXOS
2443       /* Just overwrite the usual value if we're doing Lynx. */
2444       *magicp = LYNXCOFFMAGIC;
2445 #endif
2446       return true;
2447       break;
2448 #endif
2449
2450 #ifdef H8500MAGIC
2451     case bfd_arch_h8500:
2452       *magicp = H8500MAGIC;
2453       return true;
2454       break;
2455 #endif
2456 #ifdef A29K_MAGIC_BIG
2457     case bfd_arch_a29k:
2458       if (bfd_big_endian (abfd))
2459         *magicp = A29K_MAGIC_BIG;
2460       else
2461         *magicp = A29K_MAGIC_LITTLE;
2462       return true;
2463       break;
2464 #endif
2465
2466 #ifdef WE32KMAGIC
2467     case bfd_arch_we32k:
2468       *magicp = WE32KMAGIC;
2469       return true;
2470       break;
2471 #endif
2472
2473 #ifdef U802TOCMAGIC
2474     case bfd_arch_rs6000:
2475 #ifndef PPCMAGIC
2476     case bfd_arch_powerpc:
2477 #endif
2478       *magicp = U802TOCMAGIC;
2479       return true;
2480       break;
2481 #endif
2482
2483 #ifdef MCOREMAGIC
2484     case bfd_arch_mcore:
2485       * magicp = MCOREMAGIC;
2486       return true;
2487 #endif
2488       
2489     default:                    /* Unknown architecture */
2490       /* return false;  -- fall through to "return false" below, to avoid
2491        "statement never reached" errors on the one below. */
2492       break;
2493     }
2494
2495   return false;
2496 }
2497
2498
2499 static boolean
2500 coff_set_arch_mach (abfd, arch, machine)
2501      bfd * abfd;
2502      enum bfd_architecture arch;
2503      unsigned long machine;
2504 {
2505   unsigned dummy1;
2506   unsigned short dummy2;
2507
2508   if (! bfd_default_set_arch_mach (abfd, arch, machine))
2509     return false;
2510
2511   if (arch != bfd_arch_unknown &&
2512       coff_set_flags (abfd, &dummy1, &dummy2) != true)
2513     return false;               /* We can't represent this type */
2514
2515   return true;                  /* We're easy ... */
2516 }
2517
2518
2519 /* Calculate the file position for each section. */
2520
2521 #ifndef I960
2522 #define ALIGN_SECTIONS_IN_FILE
2523 #endif
2524 #ifdef TIC80COFF
2525 #undef ALIGN_SECTIONS_IN_FILE
2526 #endif
2527
2528 static boolean
2529 coff_compute_section_file_positions (abfd)
2530      bfd * abfd;
2531 {
2532   asection *current;
2533   asection *previous = (asection *) NULL;
2534   file_ptr sofar = FILHSZ;
2535   boolean align_adjust;
2536   unsigned int count;
2537 #ifdef ALIGN_SECTIONS_IN_FILE
2538   file_ptr old_sofar;
2539 #endif
2540
2541 #ifdef RS6000COFF_C
2542   /* On XCOFF, if we have symbols, set up the .debug section.  */
2543   if (bfd_get_symcount (abfd) > 0)
2544     {
2545       bfd_size_type sz;
2546       bfd_size_type i, symcount;
2547       asymbol **symp;
2548
2549       sz = 0;
2550       symcount = bfd_get_symcount (abfd);
2551       for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2552         {
2553           coff_symbol_type *cf;
2554
2555           cf = coff_symbol_from (abfd, *symp);
2556           if (cf != NULL
2557               && cf->native != NULL
2558               && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2559             {
2560               size_t len;
2561
2562               len = strlen (bfd_asymbol_name (*symp));
2563               if (len > SYMNMLEN)
2564                 sz += len + 3;
2565             }
2566         }
2567       if (sz > 0)
2568         {
2569           asection *dsec;
2570
2571           dsec = bfd_make_section_old_way (abfd, ".debug");
2572           if (dsec == NULL)
2573             abort ();
2574           dsec->_raw_size = sz;
2575           dsec->flags |= SEC_HAS_CONTENTS;
2576         }
2577     }
2578 #endif
2579
2580 #ifdef COFF_IMAGE_WITH_PE
2581   int page_size;
2582   if (coff_data (abfd)->link_info) 
2583     {
2584       page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2585     }
2586   else
2587     page_size = PE_DEF_FILE_ALIGNMENT;
2588 #else
2589 #ifdef COFF_PAGE_SIZE
2590   int page_size = COFF_PAGE_SIZE;
2591 #endif
2592 #endif
2593
2594   if (bfd_get_start_address (abfd))
2595     {
2596       /*  A start address may have been added to the original file. In this
2597           case it will need an optional header to record it.  */
2598       abfd->flags |= EXEC_P;
2599     }
2600
2601   if (abfd->flags & EXEC_P)
2602     sofar += AOUTSZ;
2603 #ifdef RS6000COFF_C
2604   else if (xcoff_data (abfd)->full_aouthdr)
2605     sofar += AOUTSZ;
2606   else
2607     sofar += SMALL_AOUTSZ;
2608 #endif
2609
2610   sofar += abfd->section_count * SCNHSZ;
2611
2612 #ifdef RS6000COFF_C
2613   /* XCOFF handles overflows in the reloc and line number count fields
2614      by allocating a new section header to hold the correct counts.  */
2615   for (current = abfd->sections; current != NULL; current = current->next)
2616     if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2617       sofar += SCNHSZ;
2618 #endif
2619
2620   align_adjust = false;
2621   for (current = abfd->sections, count = 1;
2622        current != (asection *) NULL;
2623        current = current->next, ++count)
2624     {
2625 #ifdef COFF_IMAGE_WITH_PE
2626       /* The NT loader does not want empty section headers, so we omit
2627          them.  We don't actually remove the section from the BFD,
2628          although we probably should.  This matches code in
2629          coff_write_object_contents.  */
2630       if (current->_raw_size == 0)
2631         {
2632           current->target_index = -1;
2633           --count;
2634           continue;
2635         }
2636 #endif
2637
2638       current->target_index = count;
2639
2640       /* Only deal with sections which have contents */
2641       if (!(current->flags & SEC_HAS_CONTENTS))
2642         continue;
2643
2644       /* Align the sections in the file to the same boundary on
2645          which they are aligned in virtual memory.  I960 doesn't
2646          do this (FIXME) so we can stay in sync with Intel.  960
2647          doesn't yet page from files... */
2648 #ifdef ALIGN_SECTIONS_IN_FILE
2649       if ((abfd->flags & EXEC_P) != 0)
2650         {
2651           /* make sure this section is aligned on the right boundary - by
2652              padding the previous section up if necessary */
2653
2654           old_sofar = sofar;
2655           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2656           if (previous != (asection *) NULL)
2657             {
2658               previous->_raw_size += sofar - old_sofar;
2659             }
2660         }
2661
2662 #endif
2663
2664       /* In demand paged files the low order bits of the file offset
2665          must match the low order bits of the virtual address.  */
2666 #ifdef COFF_PAGE_SIZE
2667       if ((abfd->flags & D_PAGED) != 0
2668           && (current->flags & SEC_ALLOC) != 0)
2669         sofar += (current->vma - sofar) % page_size;
2670 #endif
2671       current->filepos = sofar;
2672
2673 #ifdef COFF_IMAGE_WITH_PE
2674       /* With PE we have to pad each section to be a multiple of its
2675          page size too, and remember both sizes.  */
2676
2677       if (coff_section_data (abfd, current) == NULL)
2678         {
2679           current->used_by_bfd =
2680             (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
2681           if (current->used_by_bfd == NULL)
2682             return false;
2683         }
2684       if (pei_section_data (abfd, current) == NULL)
2685         {
2686           coff_section_data (abfd, current)->tdata =
2687             (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
2688           if (coff_section_data (abfd, current)->tdata == NULL)
2689             return false;
2690         }
2691       if (pei_section_data (abfd, current)->virt_size == 0)
2692         pei_section_data (abfd, current)->virt_size = current->_raw_size;
2693
2694       current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
2695 #endif
2696
2697       sofar += current->_raw_size;
2698
2699 #ifdef ALIGN_SECTIONS_IN_FILE
2700       /* make sure that this section is of the right size too */
2701       if ((abfd->flags & EXEC_P) == 0)
2702         {
2703           bfd_size_type old_size;
2704
2705           old_size = current->_raw_size;
2706           current->_raw_size = BFD_ALIGN (current->_raw_size,
2707                                           1 << current->alignment_power);
2708           align_adjust = current->_raw_size != old_size;
2709           sofar += current->_raw_size - old_size;
2710         }
2711       else
2712         {
2713           old_sofar = sofar;
2714           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2715           align_adjust = sofar != old_sofar;
2716           current->_raw_size += sofar - old_sofar;
2717         }
2718 #endif
2719
2720 #ifdef COFF_IMAGE_WITH_PE
2721       /* For PE we need to make sure we pad out to the aligned
2722          _raw_size, in case the caller only writes out data to the
2723          unaligned _raw_size.  */
2724       if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
2725         align_adjust = true;
2726 #endif
2727
2728 #ifdef _LIB
2729       /* Force .lib sections to start at zero.  The vma is then
2730          incremented in coff_set_section_contents.  This is right for
2731          SVR3.2.  */
2732       if (strcmp (current->name, _LIB) == 0)
2733         bfd_set_section_vma (abfd, current, 0);
2734 #endif
2735
2736       previous = current;
2737     }
2738
2739   /* It is now safe to write to the output file.  If we needed an
2740      alignment adjustment for the last section, then make sure that
2741      there is a byte at offset sofar.  If there are no symbols and no
2742      relocs, then nothing follows the last section.  If we don't force
2743      the last byte out, then the file may appear to be truncated.  */
2744   if (align_adjust)
2745     {
2746       bfd_byte b;
2747
2748       b = 0;
2749       if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
2750           || bfd_write (&b, 1, 1, abfd) != 1)
2751         return false;
2752     }
2753
2754   /* Make sure the relocations are aligned.  We don't need to make
2755      sure that this byte exists, because it will only matter if there
2756      really are relocs.  */
2757   sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
2758
2759   obj_relocbase (abfd) = sofar;
2760   abfd->output_has_begun = true;
2761
2762   return true;
2763 }
2764
2765 #if 0
2766
2767 /* This can never work, because it is called too late--after the
2768    section positions have been set.  I can't figure out what it is
2769    for, so I am going to disable it--Ian Taylor 20 March 1996.  */
2770
2771 /* If .file, .text, .data, .bss symbols are missing, add them.  */
2772 /* @@ Should we only be adding missing symbols, or overriding the aux
2773    values for existing section symbols?  */
2774 static boolean
2775 coff_add_missing_symbols (abfd)
2776      bfd *abfd;
2777 {
2778   unsigned int nsyms = bfd_get_symcount (abfd);
2779   asymbol **sympp = abfd->outsymbols;
2780   asymbol **sympp2;
2781   unsigned int i;
2782   int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
2783
2784   for (i = 0; i < nsyms; i++)
2785     {
2786       coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
2787       CONST char *name;
2788       if (csym)
2789         {
2790           /* only do this if there is a coff representation of the input
2791            symbol */
2792           if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
2793             {
2794               need_file = 0;
2795               continue;
2796             }
2797           name = csym->symbol.name;
2798           if (!name)
2799             continue;
2800           if (!strcmp (name, _TEXT))
2801             need_text = 0;
2802 #ifdef APOLLO_M68
2803           else if (!strcmp (name, ".wtext"))
2804             need_text = 0;
2805 #endif
2806           else if (!strcmp (name, _DATA))
2807             need_data = 0;
2808           else if (!strcmp (name, _BSS))
2809             need_bss = 0;
2810         }
2811     }
2812   /* Now i == bfd_get_symcount (abfd).  */
2813   /* @@ For now, don't deal with .file symbol.  */
2814   need_file = 0;
2815
2816   if (!need_text && !need_data && !need_bss && !need_file)
2817     return true;
2818   nsyms += need_text + need_data + need_bss + need_file;
2819   sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
2820   if (!sympp2)
2821     return false;
2822   memcpy (sympp2, sympp, i * sizeof (asymbol *));
2823   if (need_file)
2824     {
2825       /* @@ Generate fake .file symbol, in sympp2[i], and increment i.  */
2826       abort ();
2827     }
2828   if (need_text)
2829     sympp2[i++] = coff_section_symbol (abfd, _TEXT);
2830   if (need_data)
2831     sympp2[i++] = coff_section_symbol (abfd, _DATA);
2832   if (need_bss)
2833     sympp2[i++] = coff_section_symbol (abfd, _BSS);
2834   BFD_ASSERT (i == nsyms);
2835   bfd_set_symtab (abfd, sympp2, nsyms);
2836   return true;
2837 }
2838
2839 #endif /* 0 */
2840
2841 /* SUPPRESS 558 */
2842 /* SUPPRESS 529 */
2843 static boolean
2844 coff_write_object_contents (abfd)
2845      bfd * abfd;
2846 {
2847   asection *current;
2848   boolean hasrelocs = false;
2849   boolean haslinno = false;
2850   file_ptr scn_base;
2851   file_ptr reloc_base;
2852   file_ptr lineno_base;
2853   file_ptr sym_base;
2854   unsigned long reloc_size = 0;
2855   unsigned long lnno_size = 0;
2856   boolean long_section_names;
2857   asection *text_sec = NULL;
2858   asection *data_sec = NULL;
2859   asection *bss_sec = NULL;
2860   struct internal_filehdr internal_f;
2861   struct internal_aouthdr internal_a;
2862 #ifdef COFF_LONG_SECTION_NAMES
2863   size_t string_size = STRING_SIZE_SIZE;
2864 #endif
2865
2866   bfd_set_error (bfd_error_system_call);
2867
2868   /* Make a pass through the symbol table to count line number entries and
2869      put them into the correct asections */
2870
2871   lnno_size = coff_count_linenumbers (abfd) * LINESZ;
2872
2873   if (abfd->output_has_begun == false)
2874     {
2875       if (! coff_compute_section_file_positions (abfd))
2876         return false;
2877     }
2878
2879   reloc_base = obj_relocbase (abfd);
2880
2881   /* Work out the size of the reloc and linno areas */
2882
2883   for (current = abfd->sections; current != NULL; current =
2884        current->next)
2885     reloc_size += current->reloc_count * RELSZ;
2886
2887   lineno_base = reloc_base + reloc_size;
2888   sym_base = lineno_base + lnno_size;
2889
2890   /* Indicate in each section->line_filepos its actual file address */
2891   for (current = abfd->sections; current != NULL; current =
2892        current->next)
2893     {
2894       if (current->lineno_count)
2895         {
2896           current->line_filepos = lineno_base;
2897           current->moving_line_filepos = lineno_base;
2898           lineno_base += current->lineno_count * LINESZ;
2899         }
2900       else
2901         {
2902           current->line_filepos = 0;
2903         }
2904       if (current->reloc_count)
2905         {
2906           current->rel_filepos = reloc_base;
2907           reloc_base += current->reloc_count * RELSZ;
2908         }
2909       else
2910         {
2911           current->rel_filepos = 0;
2912         }
2913     }
2914
2915   /* Write section headers to the file.  */
2916   internal_f.f_nscns = 0;
2917
2918   if ((abfd->flags & EXEC_P) != 0)
2919     scn_base = FILHSZ + AOUTSZ;
2920   else
2921     {
2922       scn_base = FILHSZ;
2923 #ifdef RS6000COFF_C
2924       if (xcoff_data (abfd)->full_aouthdr)
2925         scn_base += AOUTSZ;
2926       else
2927         scn_base += SMALL_AOUTSZ;
2928 #endif
2929     }
2930
2931   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
2932     return false;
2933
2934   long_section_names = false;
2935   for (current = abfd->sections;
2936        current != NULL;
2937        current = current->next)
2938     {
2939       struct internal_scnhdr section;
2940
2941 #ifdef COFF_WITH_PE
2942       /* If we've got a .reloc section, remember. */
2943
2944 #ifdef COFF_IMAGE_WITH_PE
2945       if (strcmp (current->name, ".reloc") == 0)
2946         {
2947           pe_data (abfd)->has_reloc_section = 1;
2948         }
2949 #endif
2950
2951 #endif
2952       internal_f.f_nscns++;
2953
2954       strncpy (section.s_name, current->name, SCNNMLEN);
2955
2956 #ifdef COFF_LONG_SECTION_NAMES
2957       /* Handle long section names as in PE.  This must be compatible
2958          with the code in coff_write_symbols and _bfd_coff_final_link.  */
2959       {
2960         size_t len;
2961
2962         len = strlen (current->name);
2963         if (len > SCNNMLEN)
2964           {
2965             memset (section.s_name, 0, SCNNMLEN);
2966             sprintf (section.s_name, "/%lu", (unsigned long) string_size);
2967             string_size += len + 1;
2968             long_section_names = true;
2969           }
2970       }
2971 #endif
2972
2973 #ifdef _LIB
2974       /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
2975          Ian Taylor <ian@cygnus.com>.  */
2976       if (strcmp (current->name, _LIB) == 0)
2977         section.s_vaddr = 0;
2978       else
2979 #endif
2980       section.s_vaddr = current->vma;
2981       section.s_paddr = current->lma;
2982       section.s_size =  current->_raw_size;
2983
2984 #ifdef COFF_WITH_PE
2985       section.s_paddr = 0;
2986 #endif
2987 #ifdef COFF_IMAGE_WITH_PE
2988       /* Reminder: s_paddr holds the virtual size of the section.  */
2989       if (coff_section_data (abfd, current) != NULL
2990           && pei_section_data (abfd, current) != NULL)
2991         section.s_paddr = pei_section_data (abfd, current)->virt_size;
2992       else
2993         section.s_paddr = 0;
2994 #endif
2995
2996       /*
2997          If this section has no size or is unloadable then the scnptr
2998          will be 0 too
2999          */
3000       if (current->_raw_size == 0 ||
3001           (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3002         {
3003           section.s_scnptr = 0;
3004         }
3005       else
3006         {
3007           section.s_scnptr = current->filepos;
3008         }
3009       section.s_relptr = current->rel_filepos;
3010       section.s_lnnoptr = current->line_filepos;
3011       section.s_nreloc = current->reloc_count;
3012       section.s_nlnno = current->lineno_count;
3013       if (current->reloc_count != 0)
3014         hasrelocs = true;
3015       if (current->lineno_count != 0)
3016         haslinno = true;
3017
3018 #ifdef RS6000COFF_C
3019       /* Indicate the use of an XCOFF overflow section header.  */
3020       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3021         {
3022           section.s_nreloc = 0xffff;
3023           section.s_nlnno = 0xffff;
3024         }
3025 #endif
3026
3027       section.s_flags = sec_to_styp_flags (current->name, current->flags);
3028
3029       if (!strcmp (current->name, _TEXT))
3030         {
3031           text_sec = current;
3032         }
3033       else if (!strcmp (current->name, _DATA))
3034         {
3035           data_sec = current;
3036         }
3037       else if (!strcmp (current->name, _BSS))
3038         {
3039           bss_sec = current;
3040         }
3041
3042 #ifdef I960
3043       section.s_align = (current->alignment_power
3044                          ? 1 << current->alignment_power
3045                          : 0);
3046 #else
3047 #ifdef TIC80COFF
3048       section.s_flags |= (current->alignment_power & 0xF) << 8;
3049 #endif
3050 #endif
3051
3052 #ifdef COFF_IMAGE_WITH_PE
3053       /* Suppress output of the sections if they are null.  ld
3054          includes the bss and data sections even if there is no size
3055          assigned to them.  NT loader doesn't like it if these section
3056          headers are included if the sections themselves are not
3057          needed.  See also coff_compute_section_file_positions.  */
3058       if (section.s_size == 0)
3059         internal_f.f_nscns--;
3060       else
3061 #endif
3062         {
3063           SCNHDR buff;
3064           if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3065               || bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
3066             return false;
3067         }
3068
3069 #ifdef COFF_WITH_PE
3070       /* PE stores COMDAT section information in the symbol table.  If
3071          this section is supposed to have some COMDAT info, track down
3072          the symbol in the symbol table and modify it.  */
3073       if ((current->flags & SEC_LINK_ONCE) != 0)
3074         {
3075           unsigned int i, count;
3076           asymbol **psym;
3077           coff_symbol_type *csym = NULL;
3078           asymbol **psymsec;
3079
3080           psymsec = NULL;
3081           count = bfd_get_symcount (abfd);
3082           for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3083             {
3084               if ((*psym)->section != current)
3085                 continue;
3086
3087               /* Remember the location of the first symbol in this
3088                  section.  */
3089               if (psymsec == NULL)
3090                 psymsec = psym;
3091
3092               /* See if this is the section symbol.  */
3093               if (strcmp ((*psym)->name, current->name) == 0)
3094                 {
3095                   csym = coff_symbol_from (abfd, *psym);
3096                   if (csym == NULL
3097                       || csym->native == NULL
3098                       || csym->native->u.syment.n_numaux < 1
3099                       || csym->native->u.syment.n_sclass != C_STAT
3100                       || csym->native->u.syment.n_type != T_NULL)
3101                     continue;
3102
3103                   /* Here *PSYM is the section symbol for CURRENT.  */
3104
3105                   break;
3106                 }
3107             }
3108
3109           /* Did we find it?
3110              Note that we might not if we're converting the file from
3111              some other object file format.  */
3112           if (i < count)
3113             {
3114               combined_entry_type *aux;
3115
3116               /* We don't touch the x_checksum field.  The
3117                  x_associated field is not currently supported.  */
3118
3119               aux = csym->native + 1;
3120               switch (current->flags & SEC_LINK_DUPLICATES)
3121                 {
3122                 case SEC_LINK_DUPLICATES_DISCARD:
3123                   aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3124                   break;
3125
3126                 case SEC_LINK_DUPLICATES_ONE_ONLY:
3127                   aux->u.auxent.x_scn.x_comdat =
3128                     IMAGE_COMDAT_SELECT_NODUPLICATES;
3129                   break;
3130
3131                 case SEC_LINK_DUPLICATES_SAME_SIZE:
3132                   aux->u.auxent.x_scn.x_comdat =
3133                     IMAGE_COMDAT_SELECT_SAME_SIZE;
3134                   break;
3135
3136                 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3137                   aux->u.auxent.x_scn.x_comdat =
3138                     IMAGE_COMDAT_SELECT_EXACT_MATCH;
3139                   break;
3140                 }
3141
3142               /* The COMDAT symbol must be the first symbol from this
3143                  section in the symbol table.  In order to make this
3144                  work, we move the COMDAT symbol before the first
3145                  symbol we found in the search above.  It's OK to
3146                  rearrange the symbol table at this point, because
3147                  coff_renumber_symbols is going to rearrange it
3148                  further and fix up all the aux entries.  */
3149               if (psym != psymsec)
3150                 {
3151                   asymbol *hold;
3152                   asymbol **pcopy;
3153
3154                   hold = *psym;
3155                   for (pcopy = psym; pcopy > psymsec; pcopy--)
3156                     pcopy[0] = pcopy[-1];
3157                   *psymsec = hold;
3158                 }
3159             }
3160         }
3161 #endif /* COFF_WITH_PE */
3162     }
3163
3164 #ifdef RS6000COFF_C
3165   /* XCOFF handles overflows in the reloc and line number count fields
3166      by creating a new section header to hold the correct values.  */
3167   for (current = abfd->sections; current != NULL; current = current->next)
3168     {
3169       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3170         {
3171           struct internal_scnhdr scnhdr;
3172           SCNHDR buff;
3173
3174           internal_f.f_nscns++;
3175           strncpy (&(scnhdr.s_name[0]), current->name, 8);
3176           scnhdr.s_paddr = current->reloc_count;
3177           scnhdr.s_vaddr = current->lineno_count;
3178           scnhdr.s_size = 0;
3179           scnhdr.s_scnptr = 0;
3180           scnhdr.s_relptr = current->rel_filepos;
3181           scnhdr.s_lnnoptr = current->line_filepos;
3182           scnhdr.s_nreloc = current->target_index;
3183           scnhdr.s_nlnno = current->target_index;
3184           scnhdr.s_flags = STYP_OVRFLO;
3185           if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3186               || bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ)
3187             return false;
3188         }
3189     }
3190 #endif
3191
3192   /* OK, now set up the filehdr... */
3193
3194   /* Don't include the internal abs section in the section count */
3195
3196   /*
3197      We will NOT put a fucking timestamp in the header here. Every time you
3198      put it back, I will come in and take it out again.  I'm sorry.  This
3199      field does not belong here.  We fill it with a 0 so it compares the
3200      same but is not a reasonable time. -- gnu@cygnus.com
3201      */
3202   internal_f.f_timdat = 0;
3203
3204   internal_f.f_flags = 0;
3205
3206   if (abfd->flags & EXEC_P)
3207     internal_f.f_opthdr = AOUTSZ;
3208   else
3209     {
3210       internal_f.f_opthdr = 0;
3211 #ifdef RS6000COFF_C
3212       if (xcoff_data (abfd)->full_aouthdr)
3213         internal_f.f_opthdr = AOUTSZ;
3214       else
3215         internal_f.f_opthdr = SMALL_AOUTSZ;
3216 #endif
3217     }
3218
3219   if (!hasrelocs)
3220     internal_f.f_flags |= F_RELFLG;
3221   if (!haslinno)
3222     internal_f.f_flags |= F_LNNO;
3223   if (abfd->flags & EXEC_P)
3224     internal_f.f_flags |= F_EXEC;
3225
3226 #ifndef COFF_WITH_PE
3227   if (bfd_little_endian (abfd))
3228     internal_f.f_flags |= F_AR32WR;
3229   else
3230     internal_f.f_flags |= F_AR32W;
3231 #endif
3232
3233 #ifdef TIC80_TARGET_ID
3234   internal_f.f_target_id = TIC80_TARGET_ID;
3235 #endif
3236
3237   /*
3238      FIXME, should do something about the other byte orders and
3239      architectures.
3240      */
3241
3242 #ifdef RS6000COFF_C
3243   if ((abfd->flags & DYNAMIC) != 0)
3244     internal_f.f_flags |= F_SHROBJ;
3245   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3246     internal_f.f_flags |= F_DYNLOAD;
3247 #endif
3248
3249   memset (&internal_a, 0, sizeof internal_a);
3250
3251   /* Set up architecture-dependent stuff */
3252
3253   {
3254     unsigned int magic = 0;
3255     unsigned short flags = 0;
3256     coff_set_flags (abfd, &magic, &flags);
3257     internal_f.f_magic = magic;
3258     internal_f.f_flags |= flags;
3259     /* ...and the "opt"hdr... */
3260
3261 #ifdef A29K
3262 #ifdef ULTRA3                   /* NYU's machine */
3263     /* FIXME: This is a bogus check.  I really want to see if there
3264      * is a .shbss or a .shdata section, if so then set the magic
3265      * number to indicate a shared data executable.
3266      */
3267     if (internal_f.f_nscns >= 7)
3268       internal_a.magic = SHMAGIC; /* Shared magic */
3269     else
3270 #endif /* ULTRA3 */
3271       internal_a.magic = NMAGIC; /* Assume separate i/d */
3272 #define __A_MAGIC_SET__
3273 #endif /* A29K */
3274 #ifdef TIC80COFF
3275     internal_a.magic = TIC80_ARCH_MAGIC;
3276 #define __A_MAGIC_SET__
3277 #endif /* TIC80 */
3278 #ifdef I860
3279     /* FIXME: What are the a.out magic numbers for the i860?  */
3280     internal_a.magic = 0;
3281 #define __A_MAGIC_SET__
3282 #endif /* I860 */
3283 #ifdef I960
3284     internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3285 #define __A_MAGIC_SET__
3286 #endif /* I960 */
3287 #if M88
3288 #define __A_MAGIC_SET__
3289     internal_a.magic = PAGEMAGICBCS;
3290 #endif /* M88 */
3291
3292 #if APOLLO_M68
3293 #define __A_MAGIC_SET__
3294     internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3295 #endif
3296
3297 #if defined(M68) || defined(WE32K) || defined(M68K)
3298 #define __A_MAGIC_SET__
3299 #if defined(LYNXOS)
3300     internal_a.magic = LYNXCOFFMAGIC;
3301 #else
3302 #if defined(TARG_AUX)
3303     internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3304                         abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3305                         PAGEMAGICEXECSWAPPED);
3306 #else
3307 #if defined (PAGEMAGICPEXECPAGED)
3308     internal_a.magic = PAGEMAGICPEXECPAGED;
3309 #endif
3310 #endif /* TARG_AUX */
3311 #endif /* LYNXOS */
3312 #endif /* M68 || WE32K || M68K */
3313
3314 #if defined(ARM)
3315 #define __A_MAGIC_SET__
3316     internal_a.magic = ZMAGIC;
3317 #endif 
3318
3319 #if defined(PPC_PE)
3320 #define __A_MAGIC_SET__
3321     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3322 #endif
3323
3324 #if defined MCORE_PE
3325 #define __A_MAGIC_SET__
3326     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3327 #endif 
3328
3329 #if defined(I386)
3330 #define __A_MAGIC_SET__
3331 #if defined(LYNXOS)
3332     internal_a.magic = LYNXCOFFMAGIC;
3333 #else  /* LYNXOS */
3334     internal_a.magic = ZMAGIC;
3335 #endif /* LYNXOS */
3336 #endif /* I386 */
3337
3338 #if defined(SPARC)
3339 #define __A_MAGIC_SET__
3340 #if defined(LYNXOS)
3341     internal_a.magic = LYNXCOFFMAGIC;
3342 #endif /* LYNXOS */
3343 #endif /* SPARC */
3344
3345 #ifdef RS6000COFF_C
3346 #define __A_MAGIC_SET__
3347     internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
3348     (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
3349     RS6K_AOUTHDR_OMAGIC;
3350 #endif
3351
3352 #ifndef __A_MAGIC_SET__
3353 #include "Your aouthdr magic number is not being set!"
3354 #else
3355 #undef __A_MAGIC_SET__
3356 #endif
3357   }
3358
3359   /* FIXME: Does anybody ever set this to another value?  */
3360   internal_a.vstamp = 0;
3361
3362   /* Now should write relocs, strings, syms */
3363   obj_sym_filepos (abfd) = sym_base;
3364
3365   if (bfd_get_symcount (abfd) != 0)
3366     {
3367       int firstundef;
3368 #if 0
3369       if (!coff_add_missing_symbols (abfd))
3370         return false;
3371 #endif
3372       if (!coff_renumber_symbols (abfd, &firstundef))
3373         return false;
3374       coff_mangle_symbols (abfd);
3375       if (! coff_write_symbols (abfd))
3376         return false;
3377       if (! coff_write_linenumbers (abfd))
3378         return false;
3379       if (! coff_write_relocs (abfd, firstundef))
3380         return false;
3381     }
3382 #ifdef COFF_LONG_SECTION_NAMES
3383   else if (long_section_names)
3384     {
3385       /* If we have long section names we have to write out the string
3386          table even if there are no symbols.  */
3387       if (! coff_write_symbols (abfd))
3388         return false;
3389     }
3390 #endif
3391 #ifdef COFF_IMAGE_WITH_PE
3392 #ifdef PPC_PE
3393   else if ((abfd->flags & EXEC_P) != 0)
3394     {
3395       bfd_byte b;
3396
3397       /* PowerPC PE appears to require that all executable files be
3398          rounded up to the page size.  */
3399       b = 0;
3400       if (bfd_seek (abfd,
3401                     BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3402                     SEEK_SET) != 0
3403           || bfd_write (&b, 1, 1, abfd) != 1)
3404         return false;
3405     }
3406 #endif
3407 #endif
3408
3409   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
3410      backend linker, and obj_raw_syment_count is not valid until after
3411      coff_write_symbols is called.  */
3412   if (obj_raw_syment_count (abfd) != 0)
3413     {
3414       internal_f.f_symptr = sym_base;
3415 #ifdef RS6000COFF_C
3416       /* AIX appears to require that F_RELFLG not be set if there are
3417          local symbols but no relocations.  */
3418       internal_f.f_flags &=~ F_RELFLG;
3419 #endif
3420     }
3421   else
3422     {
3423       if (long_section_names)
3424         internal_f.f_symptr = sym_base;
3425       else
3426         internal_f.f_symptr = 0;
3427       internal_f.f_flags |= F_LSYMS;
3428     }
3429
3430   if (text_sec)
3431     {
3432       internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3433       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3434     }
3435   if (data_sec)
3436     {
3437       internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3438       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
3439     }
3440   if (bss_sec)
3441     {
3442       internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
3443       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
3444         internal_a.data_start = bss_sec->vma;
3445     }
3446
3447   internal_a.entry = bfd_get_start_address (abfd);
3448   internal_f.f_nsyms = obj_raw_syment_count (abfd);
3449
3450 #ifdef RS6000COFF_C
3451   if (xcoff_data (abfd)->full_aouthdr)
3452     {
3453       bfd_vma toc;
3454       asection *loader_sec;
3455
3456       internal_a.vstamp = 1;
3457
3458       internal_a.o_snentry = xcoff_data (abfd)->snentry;
3459       if (internal_a.o_snentry == 0)
3460         internal_a.entry = (bfd_vma) -1;
3461
3462       if (text_sec != NULL)
3463         {
3464           internal_a.o_sntext = text_sec->target_index;
3465           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
3466         }
3467       else
3468         {
3469           internal_a.o_sntext = 0;
3470           internal_a.o_algntext = 0;
3471         }
3472       if (data_sec != NULL)
3473         {
3474           internal_a.o_sndata = data_sec->target_index;
3475           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
3476         }
3477       else
3478         {
3479           internal_a.o_sndata = 0;
3480           internal_a.o_algndata = 0;
3481         }
3482       loader_sec = bfd_get_section_by_name (abfd, ".loader");
3483       if (loader_sec != NULL)
3484         internal_a.o_snloader = loader_sec->target_index;
3485       else
3486         internal_a.o_snloader = 0;
3487       if (bss_sec != NULL)
3488         internal_a.o_snbss = bss_sec->target_index;
3489       else
3490         internal_a.o_snbss = 0;
3491
3492       toc = xcoff_data (abfd)->toc;
3493       internal_a.o_toc = toc;
3494       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
3495
3496       internal_a.o_modtype = xcoff_data (abfd)->modtype;
3497       if (xcoff_data (abfd)->cputype != -1)
3498         internal_a.o_cputype = xcoff_data (abfd)->cputype;
3499       else
3500         {
3501           switch (bfd_get_arch (abfd))
3502             {
3503             case bfd_arch_rs6000:
3504               internal_a.o_cputype = 4;
3505               break;
3506             case bfd_arch_powerpc:
3507               if (bfd_get_mach (abfd) == 0)
3508                 internal_a.o_cputype = 3;
3509               else
3510                 internal_a.o_cputype = 1;
3511               break;
3512             default:
3513               abort ();
3514             }
3515         }
3516       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
3517       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
3518     }
3519 #endif
3520
3521   /* now write them */
3522   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3523     return false;
3524   {
3525     char buff[FILHSZ];
3526     coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
3527     if (bfd_write ((PTR) buff, 1, FILHSZ, abfd) != FILHSZ)
3528       return false;
3529   }
3530   if (abfd->flags & EXEC_P)
3531     {
3532       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR. 
3533          include/coff/pe.h sets AOUTSZ == sizeof(PEAOUTHDR)) */
3534       char buff[AOUTSZ];
3535       coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
3536       if (bfd_write ((PTR) buff, 1, AOUTSZ, abfd) != AOUTSZ)
3537         return false;
3538     }
3539 #ifdef RS6000COFF_C
3540   else
3541     {
3542       AOUTHDR buff;
3543       size_t size;
3544
3545       /* XCOFF seems to always write at least a small a.out header.  */
3546       coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3547       if (xcoff_data (abfd)->full_aouthdr)
3548         size = AOUTSZ;
3549       else
3550         size = SMALL_AOUTSZ;
3551       if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
3552         return false;
3553     }
3554 #endif
3555
3556   return true;
3557 }
3558
3559 static boolean
3560 coff_set_section_contents (abfd, section, location, offset, count)
3561      bfd * abfd;
3562      sec_ptr section;
3563      PTR location;
3564      file_ptr offset;
3565      bfd_size_type count;
3566 {
3567   if (abfd->output_has_begun == false)  /* set by bfd.c handler */
3568     {
3569       if (! coff_compute_section_file_positions (abfd))
3570         return false;
3571     }
3572
3573 #if defined(_LIB) && !defined(TARG_AUX)
3574
3575    /* The physical address field of a .lib section is used to hold the
3576       number of shared libraries in the section.  This code counts the
3577       number of sections being written, and increments the lma field
3578       with the number.
3579
3580       I have found no documentation on the contents of this section.
3581       Experimentation indicates that the section contains zero or more
3582       records, each of which has the following structure:
3583
3584       - a (four byte) word holding the length of this record, in words,
3585       - a word that always seems to be set to "2",
3586       - the path to a shared library, null-terminated and then padded
3587         to a whole word boundary.
3588
3589       bfd_assert calls have been added to alert if an attempt is made
3590       to write a section which doesn't follow these assumptions.  The
3591       code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
3592       <robertl@arnet.com> (Thanks!).
3593   
3594       Gvran Uddeborg <gvran@uddeborg.pp.se> */
3595
3596     if (strcmp (section->name, _LIB) == 0)
3597       {
3598         bfd_byte *rec, *recend;
3599
3600         rec = (bfd_byte *) location;
3601         recend = rec + count;
3602         while (rec < recend)
3603           {
3604             ++section->lma;
3605             rec += bfd_get_32 (abfd, rec) * 4;
3606           }
3607
3608         BFD_ASSERT (rec == recend);
3609       }
3610
3611 #endif
3612
3613   /* Don't write out bss sections - one way to do this is to
3614        see if the filepos has not been set. */
3615   if (section->filepos == 0)
3616     return true;
3617
3618   if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
3619     return false;
3620
3621   if (count != 0)
3622     {
3623       return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3624     }
3625   return true;
3626 }
3627 #if 0
3628 static boolean
3629 coff_close_and_cleanup (abfd)
3630      bfd *abfd;
3631 {
3632   if (!bfd_read_p (abfd))
3633     switch (abfd->format)
3634       {
3635       case bfd_archive:
3636         if (!_bfd_write_archive_contents (abfd))
3637           return false;
3638         break;
3639       case bfd_object:
3640         if (!coff_write_object_contents (abfd))
3641           return false;
3642         break;
3643       default:
3644         bfd_set_error (bfd_error_invalid_operation);
3645         return false;
3646       }
3647
3648   /* We depend on bfd_close to free all the memory on the objalloc.  */
3649   return true;
3650 }
3651
3652 #endif
3653
3654 static PTR
3655 buy_and_read (abfd, where, seek_direction, size)
3656      bfd *abfd;
3657      file_ptr where;
3658      int seek_direction;
3659      size_t size;
3660 {
3661   PTR area = (PTR) bfd_alloc (abfd, size);
3662   if (!area)
3663     return (NULL);
3664   if (bfd_seek (abfd, where, seek_direction) != 0
3665       || bfd_read (area, 1, size, abfd) != size)
3666     return (NULL);
3667   return (area);
3668 }                               /* buy_and_read() */
3669
3670 /*
3671 SUBSUBSECTION
3672         Reading linenumbers
3673
3674         Creating the linenumber table is done by reading in the entire
3675         coff linenumber table, and creating another table for internal use.
3676
3677         A coff linenumber table is structured so that each function
3678         is marked as having a line number of 0. Each line within the
3679         function is an offset from the first line in the function. The
3680         base of the line number information for the table is stored in
3681         the symbol associated with the function.
3682
3683         Note: The PE format uses line number 0 for a flag indicating a
3684         new source file.
3685
3686         The information is copied from the external to the internal
3687         table, and each symbol which marks a function is marked by
3688         pointing its...
3689
3690         How does this work ?
3691
3692 */
3693
3694 static boolean
3695 coff_slurp_line_table (abfd, asect)
3696      bfd *abfd;
3697      asection *asect;
3698 {
3699   LINENO *native_lineno;
3700   alent *lineno_cache;
3701
3702   BFD_ASSERT (asect->lineno == (alent *) NULL);
3703
3704   native_lineno = (LINENO *) buy_and_read (abfd,
3705                                            asect->line_filepos,
3706                                            SEEK_SET,
3707                                            (size_t) (LINESZ *
3708                                                      asect->lineno_count));
3709   lineno_cache =
3710     (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
3711   if (lineno_cache == NULL)
3712     return false;
3713   else
3714     {
3715       unsigned int counter = 0;
3716       alent *cache_ptr = lineno_cache;
3717       LINENO *src = native_lineno;
3718
3719       while (counter < asect->lineno_count)
3720         {
3721           struct internal_lineno dst;
3722           coff_swap_lineno_in (abfd, src, &dst);
3723           cache_ptr->line_number = dst.l_lnno;
3724
3725           if (cache_ptr->line_number == 0)
3726             {
3727               boolean warned;
3728               long symndx;
3729               coff_symbol_type *sym;
3730
3731               warned = false;
3732               symndx = dst.l_addr.l_symndx;
3733               if (symndx < 0
3734                   || (unsigned long) symndx >= obj_raw_syment_count (abfd))
3735                 {
3736                   (*_bfd_error_handler)
3737                     (_("%s: warning: illegal symbol index %ld in line numbers"),
3738                      bfd_get_filename (abfd), dst.l_addr.l_symndx);
3739                   symndx = 0;
3740                   warned = true;
3741                 }
3742               /* FIXME: We should not be casting between ints and
3743                  pointers like this.  */
3744               sym = ((coff_symbol_type *)
3745                      ((symndx + obj_raw_syments (abfd))
3746                       ->u.syment._n._n_n._n_zeroes));
3747               cache_ptr->u.sym = (asymbol *) sym;
3748               if (sym->lineno != NULL && ! warned)
3749                 {
3750                   (*_bfd_error_handler)
3751                     (_("%s: warning: duplicate line number information for `%s'"),
3752                      bfd_get_filename (abfd),
3753                      bfd_asymbol_name (&sym->symbol));
3754                 }
3755               sym->lineno = cache_ptr;
3756             }
3757           else
3758             {
3759               cache_ptr->u.offset = dst.l_addr.l_paddr
3760                 - bfd_section_vma (abfd, asect);
3761             }                   /* If no linenumber expect a symbol index */
3762
3763           cache_ptr++;
3764           src++;
3765           counter++;
3766         }
3767       cache_ptr->line_number = 0;
3768
3769     }
3770   asect->lineno = lineno_cache;
3771   /* FIXME, free native_lineno here, or use alloca or something. */
3772   return true;
3773 }
3774
3775 /* Slurp in the symbol table, converting it to generic form.  Note
3776    that if coff_relocate_section is defined, the linker will read
3777    symbols via coff_link_add_symbols, rather than via this routine.  */
3778
3779 static boolean
3780 coff_slurp_symbol_table (abfd)
3781      bfd * abfd;
3782 {
3783   combined_entry_type *native_symbols;
3784   coff_symbol_type *cached_area;
3785   unsigned int *table_ptr;
3786
3787   unsigned int number_of_symbols = 0;
3788
3789   if (obj_symbols (abfd))
3790     return true;
3791
3792   /* Read in the symbol table */
3793   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
3794     {
3795       return (false);
3796     }                           /* on error */
3797
3798   /* Allocate enough room for all the symbols in cached form */
3799   cached_area = ((coff_symbol_type *)
3800                  bfd_alloc (abfd,
3801                             (obj_raw_syment_count (abfd)
3802                              * sizeof (coff_symbol_type))));
3803
3804   if (cached_area == NULL)
3805     return false;
3806   table_ptr = ((unsigned int *)
3807                bfd_alloc (abfd,
3808                           (obj_raw_syment_count (abfd)
3809                            * sizeof (unsigned int))));
3810
3811   if (table_ptr == NULL)
3812     return false;
3813   else
3814     {
3815       coff_symbol_type *dst = cached_area;
3816       unsigned int last_native_index = obj_raw_syment_count (abfd);
3817       unsigned int this_index = 0;
3818       while (this_index < last_native_index)
3819         {
3820           combined_entry_type *src = native_symbols + this_index;
3821           table_ptr[this_index] = number_of_symbols;
3822           dst->symbol.the_bfd = abfd;
3823
3824           dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
3825           /* We use the native name field to point to the cached field.  */
3826           src->u.syment._n._n_n._n_zeroes = (long) dst;
3827           dst->symbol.section = coff_section_from_bfd_index (abfd,
3828                                                      src->u.syment.n_scnum);
3829           dst->symbol.flags = 0;
3830           dst->done_lineno = false;
3831
3832           switch (src->u.syment.n_sclass)
3833             {
3834 #ifdef I960
3835             case C_LEAFEXT:
3836 #if 0
3837               dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
3838               dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3839               dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3840 #endif
3841               /* Fall through to next case */
3842
3843 #endif
3844
3845             case C_EXT:
3846             case C_WEAKEXT:
3847 #if defined ARM
3848             case C_THUMBEXT:
3849             case C_THUMBEXTFUNC:
3850 #endif
3851 #ifdef RS6000COFF_C
3852             case C_HIDEXT:
3853 #endif
3854 #ifdef C_SYSTEM
3855             case C_SYSTEM:      /* System Wide variable */
3856 #endif
3857 #ifdef COFF_WITH_PE
3858             /* In PE, 0x68 (104) denotes a section symbol */
3859             case C_SECTION:
3860             /* In PE, 0x69 (105) denotes a weak external symbol.  */
3861             case C_NT_WEAK:
3862 #endif
3863               switch (coff_classify_symbol (abfd, &src->u.syment))
3864                 {
3865                 case COFF_SYMBOL_GLOBAL:
3866                   dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3867 #if defined COFF_WITH_PE
3868                   /* PE sets the symbol to a value relative to the
3869                      start of the section.  */
3870                   dst->symbol.value = src->u.syment.n_value;
3871 #else
3872                   dst->symbol.value = (src->u.syment.n_value
3873                                        - dst->symbol.section->vma);
3874 #endif
3875                   if (ISFCN ((src->u.syment.n_type)))
3876                     {
3877                       /* A function ext does not go at the end of a
3878                          file.  */
3879                       dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3880                     }
3881                   break;
3882
3883                 case COFF_SYMBOL_COMMON:
3884                   dst->symbol.section = bfd_com_section_ptr;
3885                   dst->symbol.value = src->u.syment.n_value;
3886                   break;
3887
3888                 case COFF_SYMBOL_UNDEFINED:
3889                   dst->symbol.section = bfd_und_section_ptr;
3890                   dst->symbol.value = 0;
3891                   break; 
3892
3893                 case COFF_SYMBOL_PE_SECTION:
3894                   dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
3895                   dst->symbol.value = 0;
3896                   break;
3897
3898                 case COFF_SYMBOL_LOCAL:
3899                   dst->symbol.flags = BSF_LOCAL;
3900 #if defined COFF_WITH_PE
3901                   /* PE sets the symbol to a value relative to the
3902                      start of the section.  */
3903                   dst->symbol.value = src->u.syment.n_value;
3904 #else
3905                   dst->symbol.value = (src->u.syment.n_value
3906                                        - dst->symbol.section->vma);
3907 #endif
3908                   if (ISFCN ((src->u.syment.n_type)))
3909                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3910                   break;
3911                 }
3912
3913 #ifdef RS6000COFF_C
3914               /* A symbol with a csect entry should not go at the end.  */
3915               if (src->u.syment.n_numaux > 0)
3916                 dst->symbol.flags |= BSF_NOT_AT_END;
3917 #endif
3918
3919 #ifdef COFF_WITH_PE
3920               if (src->u.syment.n_sclass == C_NT_WEAK)
3921                 dst->symbol.flags = BSF_WEAK;
3922               if (src->u.syment.n_sclass == C_SECTION
3923                   && src->u.syment.n_scnum > 0)
3924                 {
3925                   dst->symbol.flags = BSF_LOCAL;
3926                 }
3927 #endif
3928
3929               if (src->u.syment.n_sclass == C_WEAKEXT)
3930                 dst->symbol.flags = BSF_WEAK;
3931
3932               break;
3933
3934             case C_STAT:        /* static                        */
3935 #ifdef I960
3936             case C_LEAFSTAT:    /* static leaf procedure        */
3937 #endif
3938 #if defined ARM 
3939             case C_THUMBSTAT:   /* Thumb static                  */
3940             case C_THUMBLABEL:  /* Thumb label                   */
3941             case C_THUMBSTATFUNC:/* Thumb static function        */
3942 #endif
3943             case C_LABEL:       /* label                         */
3944               if (src->u.syment.n_scnum == N_DEBUG)
3945                 dst->symbol.flags = BSF_DEBUGGING;
3946               else
3947                 dst->symbol.flags = BSF_LOCAL;
3948
3949               /* Base the value as an index from the base of the
3950                  section, if there is one.  */
3951               if (dst->symbol.section)
3952                 {
3953 #if defined COFF_WITH_PE
3954                   /* PE sets the symbol to a value relative to the
3955                      start of the section.  */
3956                   dst->symbol.value = src->u.syment.n_value;
3957 #else
3958                   dst->symbol.value = (src->u.syment.n_value
3959                                        - dst->symbol.section->vma);
3960 #endif
3961                 }
3962               else
3963                 dst->symbol.value = src->u.syment.n_value;
3964               break;
3965
3966             case C_MOS: /* member of structure   */
3967             case C_EOS: /* end of structure              */
3968 #ifdef NOTDEF                   /* C_AUTOARG has the same value */
3969 #ifdef C_GLBLREG
3970             case C_GLBLREG:     /* A29k-specific storage class */
3971 #endif
3972 #endif
3973             case C_REGPARM:     /* register parameter            */
3974             case C_REG: /* register variable             */
3975 #ifndef TIC80COFF
3976 #ifdef C_AUTOARG
3977             case C_AUTOARG:     /* 960-specific storage class */
3978 #endif
3979 #endif
3980             case C_TPDEF:       /* type definition               */
3981             case C_ARG:
3982             case C_AUTO:        /* automatic variable */
3983             case C_FIELD:       /* bit field */
3984             case C_ENTAG:       /* enumeration tag               */
3985             case C_MOE: /* member of enumeration         */
3986             case C_MOU: /* member of union               */
3987             case C_UNTAG:       /* union tag                     */
3988               dst->symbol.flags = BSF_DEBUGGING;
3989               dst->symbol.value = (src->u.syment.n_value);
3990               break;
3991
3992             case C_FILE:        /* file name                     */
3993             case C_STRTAG:      /* structure tag                 */
3994 #ifdef RS6000COFF_C
3995             case C_GSYM:
3996             case C_LSYM:
3997             case C_PSYM:
3998             case C_RSYM:
3999             case C_RPSYM:
4000             case C_STSYM:
4001             case C_BCOMM:
4002             case C_ECOMM:
4003             case C_DECL:
4004             case C_ENTRY:
4005             case C_FUN:
4006             case C_ESTAT:
4007 #endif
4008               dst->symbol.flags = BSF_DEBUGGING;
4009               dst->symbol.value = (src->u.syment.n_value);
4010               break;
4011
4012 #ifdef RS6000COFF_C
4013             case C_BINCL:       /* beginning of include file     */
4014             case C_EINCL:       /* ending of include file        */
4015               /* The value is actually a pointer into the line numbers
4016                  of the file.  We locate the line number entry, and
4017                  set the section to the section which contains it, and
4018                  the value to the index in that section.  */
4019               {
4020                 asection *sec;
4021
4022                 dst->symbol.flags = BSF_DEBUGGING;
4023                 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4024                   if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4025                       && ((file_ptr) (sec->line_filepos
4026                                       + sec->lineno_count * LINESZ)
4027                           > (file_ptr) src->u.syment.n_value))
4028                     break;
4029                 if (sec == NULL)
4030                   dst->symbol.value = 0;
4031                 else
4032                   {
4033                     dst->symbol.section = sec;
4034                     dst->symbol.value = ((src->u.syment.n_value
4035                                           - sec->line_filepos)
4036                                          / LINESZ);
4037                     src->fix_line = 1;
4038                   }
4039               }
4040               break;
4041
4042             case C_BSTAT:
4043               dst->symbol.flags = BSF_DEBUGGING;
4044
4045               /* The value is actually a symbol index.  Save a pointer
4046                  to the symbol instead of the index.  FIXME: This
4047                  should use a union.  */
4048               src->u.syment.n_value =
4049                 (long) (native_symbols + src->u.syment.n_value);
4050               dst->symbol.value = src->u.syment.n_value;
4051               src->fix_value = 1;
4052               break;
4053 #endif
4054
4055             case C_BLOCK:       /* ".bb" or ".eb"                */
4056             case C_FCN:         /* ".bf" or ".ef"                */
4057             case C_EFCN:        /* physical end of function      */
4058               dst->symbol.flags = BSF_LOCAL;
4059 #if defined COFF_WITH_PE
4060               /* PE sets the symbol to a value relative to the start
4061                  of the section.  */
4062               dst->symbol.value = src->u.syment.n_value;
4063 #else
4064               /* Base the value as an index from the base of the
4065                  section.  */
4066               dst->symbol.value = (src->u.syment.n_value
4067                                    - dst->symbol.section->vma);
4068 #endif
4069               break;
4070
4071             case C_NULL:
4072               /* PE DLLs sometimes have zeroed out symbols for some
4073                  reason.  Just ignore them without a warning.  */
4074               if (src->u.syment.n_type == 0
4075                   && src->u.syment.n_value == 0
4076                   && src->u.syment.n_scnum == 0)
4077                 break;
4078               /* Fall through.  */
4079             case C_EXTDEF:      /* external definition           */
4080             case C_ULABEL:      /* undefined label               */
4081             case C_USTATIC:     /* undefined static              */
4082 #ifndef COFF_WITH_PE
4083             /* C_LINE in regular coff is 0x68.  NT has taken over this storage
4084                class to represent a section symbol */
4085             case C_LINE:        /* line # reformatted as symbol table entry */
4086               /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
4087             case C_ALIAS:       /* duplicate tag                 */
4088 #endif
4089               /* New storage classes for TIc80 */
4090 #ifdef TIC80COFF
4091             case C_UEXT:        /* Tentative external definition */
4092 #endif
4093             case C_STATLAB:     /* Static load time label */
4094             case C_EXTLAB:      /* External load time label */
4095             case C_HIDDEN:      /* ext symbol in dmert public lib */
4096             default:
4097               (*_bfd_error_handler)
4098                 (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
4099                  bfd_get_filename (abfd), src->u.syment.n_sclass,
4100                  dst->symbol.section->name, dst->symbol.name);
4101               dst->symbol.flags = BSF_DEBUGGING;
4102               dst->symbol.value = (src->u.syment.n_value);
4103               break;
4104             }
4105
4106 /*      BFD_ASSERT(dst->symbol.flags != 0);*/
4107
4108           dst->native = src;
4109
4110           dst->symbol.udata.i = 0;
4111           dst->lineno = (alent *) NULL;
4112           this_index += (src->u.syment.n_numaux) + 1;
4113           dst++;
4114           number_of_symbols++;
4115         }                       /* walk the native symtab */
4116     }                           /* bfdize the native symtab */
4117
4118   obj_symbols (abfd) = cached_area;
4119   obj_raw_syments (abfd) = native_symbols;
4120
4121   bfd_get_symcount (abfd) = number_of_symbols;
4122   obj_convert (abfd) = table_ptr;
4123   /* Slurp the line tables for each section too */
4124   {
4125     asection *p;
4126     p = abfd->sections;
4127     while (p)
4128       {
4129         coff_slurp_line_table (abfd, p);
4130         p = p->next;
4131       }
4132   }
4133   return true;
4134 }                               /* coff_slurp_symbol_table() */
4135
4136 /* Classify a COFF symbol.  A couple of targets have globally visible
4137    symbols which are not class C_EXT, and this handles those.  It also
4138    recognizes some special PE cases.  */
4139
4140 static enum coff_symbol_classification
4141 coff_classify_symbol (abfd, syment)
4142      bfd *abfd;
4143      struct internal_syment *syment;
4144 {
4145   /* FIXME: This partially duplicates the switch in
4146      coff_slurp_symbol_table.  */
4147   switch (syment->n_sclass)
4148     {
4149     case C_EXT:
4150     case C_WEAKEXT:
4151 #ifdef I960
4152     case C_LEAFEXT:
4153 #endif
4154 #ifdef ARM
4155     case C_THUMBEXT:
4156     case C_THUMBEXTFUNC:
4157 #endif
4158 #ifdef C_SYSTEM
4159     case C_SYSTEM:
4160 #endif
4161 #ifdef COFF_WITH_PE
4162     case C_NT_WEAK:
4163 #endif
4164       if (syment->n_scnum == 0)
4165         {
4166           if (syment->n_value == 0)
4167             return COFF_SYMBOL_UNDEFINED;
4168           else
4169             return COFF_SYMBOL_COMMON;
4170         }
4171       return COFF_SYMBOL_GLOBAL;
4172
4173     default:
4174       break;
4175     }
4176
4177 #ifdef COFF_WITH_PE
4178   if (syment->n_sclass == C_STAT)
4179     {
4180       if (syment->n_scnum == 0)
4181         {
4182           /* The Microsoft compiler sometimes generates these if a
4183              small static function is inlined every time it is used.
4184              The function is discarded, but the symbol table entry
4185              remains.  */
4186           return COFF_SYMBOL_LOCAL;
4187         }
4188
4189 #if 0
4190       /* This is correct for Microsoft generated objects, but it
4191          breaks gas generated objects.  */
4192
4193       if (syment->n_value == 0)
4194         {
4195           asection *sec;
4196           char buf[SYMNMLEN + 1];
4197
4198           sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4199           if (sec != NULL
4200               && (strcmp (bfd_get_section_name (abfd, sec),
4201                           _bfd_coff_internal_syment_name (abfd, syment, buf))
4202                   == 0))
4203             return COFF_SYMBOL_PE_SECTION;
4204         }
4205 #endif
4206
4207       return COFF_SYMBOL_LOCAL;
4208     }
4209
4210   if (syment->n_sclass == C_SECTION)
4211     {
4212       /* In some cases in a DLL generated by the Microsoft linker, the
4213          n_value field will contain garbage.  FIXME: This should
4214          probably be handled by the swapping function instead.  */
4215       syment->n_value = 0;
4216       if (syment->n_scnum == 0)
4217         return COFF_SYMBOL_UNDEFINED;
4218       return COFF_SYMBOL_PE_SECTION;
4219     }
4220 #endif /* COFF_WITH_PE */
4221
4222   /* If it is not a global symbol, we presume it is a local symbol.  */
4223
4224   if (syment->n_scnum == 0)
4225     {
4226       char buf[SYMNMLEN + 1];
4227
4228       (*_bfd_error_handler)
4229         (_("warning: %s: local symbol `%s' has no section"),
4230          bfd_get_filename (abfd),
4231          _bfd_coff_internal_syment_name (abfd, syment, buf));
4232     }
4233
4234   return COFF_SYMBOL_LOCAL;
4235 }
4236
4237 /*
4238 SUBSUBSECTION
4239         Reading relocations
4240
4241         Coff relocations are easily transformed into the internal BFD form
4242         (@code{arelent}).
4243
4244         Reading a coff relocation table is done in the following stages:
4245
4246         o Read the entire coff relocation table into memory.
4247
4248         o Process each relocation in turn; first swap it from the
4249         external to the internal form.
4250
4251         o Turn the symbol referenced in the relocation's symbol index
4252         into a pointer into the canonical symbol table.
4253         This table is the same as the one returned by a call to
4254         @code{bfd_canonicalize_symtab}. The back end will call that
4255         routine and save the result if a canonicalization hasn't been done.
4256
4257         o The reloc index is turned into a pointer to a howto
4258         structure, in a back end specific way. For instance, the 386
4259         and 960 use the @code{r_type} to directly produce an index
4260         into a howto table vector; the 88k subtracts a number from the
4261         @code{r_type} field and creates an addend field.
4262
4263
4264 */
4265
4266 #ifndef CALC_ADDEND
4267 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
4268   {                                                             \
4269     coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
4270     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
4271       coffsym = (obj_symbols (abfd)                             \
4272                  + (cache_ptr->sym_ptr_ptr - symbols));         \
4273     else if (ptr)                                               \
4274       coffsym = coff_symbol_from (abfd, ptr);                   \
4275     if (coffsym != (coff_symbol_type *) NULL                    \
4276         && coffsym->native->u.syment.n_scnum == 0)              \
4277       cache_ptr->addend = 0;                                    \
4278     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
4279              && ptr->section != (asection *) NULL)              \
4280       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
4281     else                                                        \
4282       cache_ptr->addend = 0;                                    \
4283   }
4284 #endif
4285
4286 static boolean
4287 coff_slurp_reloc_table (abfd, asect, symbols)
4288      bfd * abfd;
4289      sec_ptr asect;
4290      asymbol ** symbols;
4291 {
4292   RELOC *native_relocs;
4293   arelent *reloc_cache;
4294   arelent *cache_ptr;
4295
4296   unsigned int idx;
4297
4298   if (asect->relocation)
4299     return true;
4300   if (asect->reloc_count == 0)
4301     return true;
4302   if (asect->flags & SEC_CONSTRUCTOR)
4303     return true;
4304   if (!coff_slurp_symbol_table (abfd))
4305     return false;
4306   native_relocs =
4307     (RELOC *) buy_and_read (abfd,
4308                             asect->rel_filepos,
4309                             SEEK_SET,
4310                             (size_t) (RELSZ *
4311                                       asect->reloc_count));
4312   reloc_cache = (arelent *)
4313     bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
4314
4315   if (reloc_cache == NULL)
4316     return false;
4317
4318
4319   for (idx = 0; idx < asect->reloc_count; idx++)
4320     {
4321       struct internal_reloc dst;
4322       struct external_reloc *src;
4323 #ifndef RELOC_PROCESSING
4324       asymbol *ptr;
4325 #endif
4326
4327       cache_ptr = reloc_cache + idx;
4328       src = native_relocs + idx;
4329
4330       coff_swap_reloc_in (abfd, src, &dst);
4331
4332 #ifdef RELOC_PROCESSING
4333       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
4334 #else
4335       cache_ptr->address = dst.r_vaddr;
4336
4337       if (dst.r_symndx != -1)
4338         {
4339           if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
4340             {
4341               (*_bfd_error_handler)
4342                 (_("%s: warning: illegal symbol index %ld in relocs"),
4343                  bfd_get_filename (abfd), dst.r_symndx);
4344               cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4345               ptr = NULL;
4346             }
4347           else
4348             {
4349               cache_ptr->sym_ptr_ptr = (symbols
4350                                         + obj_convert (abfd)[dst.r_symndx]);
4351               ptr = *(cache_ptr->sym_ptr_ptr);
4352             }
4353         }
4354       else
4355         {
4356           cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4357           ptr = NULL;
4358         }
4359
4360       /* The symbols definitions that we have read in have been
4361          relocated as if their sections started at 0. But the offsets
4362          refering to the symbols in the raw data have not been
4363          modified, so we have to have a negative addend to compensate.
4364
4365          Note that symbols which used to be common must be left alone */
4366
4367       /* Calculate any reloc addend by looking at the symbol */
4368       CALC_ADDEND (abfd, ptr, dst, cache_ptr);
4369
4370       cache_ptr->address -= asect->vma;
4371 /* !!     cache_ptr->section = (asection *) NULL;*/
4372
4373       /* Fill in the cache_ptr->howto field from dst.r_type */
4374       RTYPE2HOWTO (cache_ptr, &dst);
4375 #endif  /* RELOC_PROCESSING */
4376
4377       if (cache_ptr->howto == NULL)
4378         {
4379           (*_bfd_error_handler)
4380             (_("%s: illegal relocation type %d at address 0x%lx"),
4381              bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
4382           bfd_set_error (bfd_error_bad_value);
4383           return false;
4384         }
4385     }
4386
4387   asect->relocation = reloc_cache;
4388   return true;
4389 }
4390
4391 #ifndef coff_rtype_to_howto
4392 #ifdef RTYPE2HOWTO
4393
4394 /* Get the howto structure for a reloc.  This is only used if the file
4395    including this one defines coff_relocate_section to be
4396    _bfd_coff_generic_relocate_section, so it is OK if it does not
4397    always work.  It is the responsibility of the including file to
4398    make sure it is reasonable if it is needed.  */
4399
4400 static reloc_howto_type *coff_rtype_to_howto
4401   PARAMS ((bfd *, asection *, struct internal_reloc *,
4402            struct coff_link_hash_entry *, struct internal_syment *,
4403            bfd_vma *));
4404
4405 /*ARGSUSED*/
4406 static reloc_howto_type *
4407 coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
4408      bfd *abfd ATTRIBUTE_UNUSED;
4409      asection *sec ATTRIBUTE_UNUSED;
4410      struct internal_reloc *rel;
4411      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
4412      struct internal_syment *sym ATTRIBUTE_UNUSED;
4413      bfd_vma *addendp ATTRIBUTE_UNUSED;
4414 {
4415   arelent genrel;
4416
4417   RTYPE2HOWTO (&genrel, rel);
4418   return genrel.howto;
4419 }
4420
4421 #else /* ! defined (RTYPE2HOWTO) */
4422
4423 #define coff_rtype_to_howto NULL
4424
4425 #endif /* ! defined (RTYPE2HOWTO) */
4426 #endif /* ! defined (coff_rtype_to_howto) */
4427
4428 /* This is stupid.  This function should be a boolean predicate.  */
4429 static long
4430 coff_canonicalize_reloc (abfd, section, relptr, symbols)
4431      bfd * abfd;
4432      sec_ptr section;
4433      arelent ** relptr;
4434      asymbol ** symbols;
4435 {
4436   arelent *tblptr = section->relocation;
4437   unsigned int count = 0;
4438
4439
4440   if (section->flags & SEC_CONSTRUCTOR)
4441     {
4442       /* this section has relocs made up by us, they are not in the
4443        file, so take them out of their chain and place them into
4444        the data area provided */
4445       arelent_chain *chain = section->constructor_chain;
4446       for (count = 0; count < section->reloc_count; count++)
4447         {
4448           *relptr++ = &chain->relent;
4449           chain = chain->next;
4450         }
4451
4452     }
4453   else
4454     {
4455       if (! coff_slurp_reloc_table (abfd, section, symbols))
4456         return -1;
4457
4458       tblptr = section->relocation;
4459
4460       for (; count++ < section->reloc_count;)
4461         *relptr++ = tblptr++;
4462
4463
4464     }
4465   *relptr = 0;
4466   return section->reloc_count;
4467 }
4468
4469 #ifdef GNU960
4470 file_ptr
4471 coff_sym_filepos (abfd)
4472      bfd *abfd;
4473 {
4474   return obj_sym_filepos (abfd);
4475 }
4476 #endif
4477
4478 #ifndef coff_reloc16_estimate
4479 #define coff_reloc16_estimate dummy_reloc16_estimate
4480
4481 static int dummy_reloc16_estimate
4482   PARAMS ((bfd *, asection *, arelent *, unsigned int,
4483            struct bfd_link_info *));
4484
4485 static int
4486 dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
4487      bfd *abfd ATTRIBUTE_UNUSED;
4488      asection *input_section ATTRIBUTE_UNUSED;
4489      arelent *reloc ATTRIBUTE_UNUSED;
4490      unsigned int shrink ATTRIBUTE_UNUSED;
4491      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4492 {
4493   abort ();
4494   return 0;
4495 }
4496
4497 #endif
4498
4499 #ifndef coff_reloc16_extra_cases
4500
4501 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
4502
4503 /* This works even if abort is not declared in any header file.  */
4504
4505 static void dummy_reloc16_extra_cases
4506   PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
4507            bfd_byte *, unsigned int *, unsigned int *));
4508
4509 static void
4510 dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
4511                            dst_ptr)
4512      bfd *abfd ATTRIBUTE_UNUSED;
4513      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4514      struct bfd_link_order *link_order ATTRIBUTE_UNUSED;
4515      arelent *reloc ATTRIBUTE_UNUSED;
4516      bfd_byte *data ATTRIBUTE_UNUSED;
4517      unsigned int *src_ptr ATTRIBUTE_UNUSED;
4518      unsigned int *dst_ptr ATTRIBUTE_UNUSED;
4519 {
4520   abort ();
4521 }
4522 #endif
4523
4524 /* If coff_relocate_section is defined, we can use the optimized COFF
4525    backend linker.  Otherwise we must continue to use the old linker.  */
4526 #ifdef coff_relocate_section
4527 #ifndef coff_bfd_link_hash_table_create
4528 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
4529 #endif
4530 #ifndef coff_bfd_link_add_symbols
4531 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
4532 #endif
4533 #ifndef coff_bfd_final_link
4534 #define coff_bfd_final_link _bfd_coff_final_link
4535 #endif
4536 #else /* ! defined (coff_relocate_section) */
4537 #define coff_relocate_section NULL
4538 #ifndef coff_bfd_link_hash_table_create
4539 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
4540 #endif
4541 #ifndef coff_bfd_link_add_symbols
4542 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
4543 #endif
4544 #define coff_bfd_final_link _bfd_generic_final_link
4545 #endif /* ! defined (coff_relocate_section) */
4546
4547 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
4548
4549 #ifndef coff_start_final_link
4550 #define coff_start_final_link NULL
4551 #endif
4552
4553 #ifndef coff_adjust_symndx
4554 #define coff_adjust_symndx NULL
4555 #endif
4556
4557 #ifndef coff_link_add_one_symbol
4558 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
4559 #endif
4560
4561 #ifndef coff_link_output_has_begun
4562
4563 static boolean coff_link_output_has_begun
4564   PARAMS ((bfd *, struct coff_final_link_info *));
4565
4566 static boolean
4567 coff_link_output_has_begun (abfd, info)
4568      bfd * abfd;
4569      struct coff_final_link_info * info ATTRIBUTE_UNUSED;
4570 {
4571   return abfd->output_has_begun;
4572 }
4573 #endif
4574
4575 #ifndef coff_final_link_postscript
4576
4577 static boolean coff_final_link_postscript
4578   PARAMS ((bfd *, struct coff_final_link_info *));
4579
4580 static boolean
4581 coff_final_link_postscript (abfd, pfinfo)
4582      bfd * abfd ATTRIBUTE_UNUSED;
4583      struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
4584 {
4585   return true;
4586 }
4587 #endif
4588
4589 #ifndef coff_SWAP_aux_in
4590 #define coff_SWAP_aux_in coff_swap_aux_in
4591 #endif
4592 #ifndef coff_SWAP_sym_in
4593 #define coff_SWAP_sym_in coff_swap_sym_in
4594 #endif
4595 #ifndef coff_SWAP_lineno_in
4596 #define coff_SWAP_lineno_in coff_swap_lineno_in
4597 #endif
4598 #ifndef coff_SWAP_aux_out
4599 #define coff_SWAP_aux_out coff_swap_aux_out
4600 #endif
4601 #ifndef coff_SWAP_sym_out
4602 #define coff_SWAP_sym_out coff_swap_sym_out
4603 #endif
4604 #ifndef coff_SWAP_lineno_out
4605 #define coff_SWAP_lineno_out coff_swap_lineno_out
4606 #endif
4607 #ifndef coff_SWAP_reloc_out
4608 #define coff_SWAP_reloc_out coff_swap_reloc_out
4609 #endif
4610 #ifndef coff_SWAP_filehdr_out
4611 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
4612 #endif
4613 #ifndef coff_SWAP_aouthdr_out
4614 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
4615 #endif
4616 #ifndef coff_SWAP_scnhdr_out
4617 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
4618 #endif
4619 #ifndef coff_SWAP_reloc_in
4620 #define coff_SWAP_reloc_in coff_swap_reloc_in
4621 #endif
4622 #ifndef coff_SWAP_filehdr_in
4623 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
4624 #endif
4625 #ifndef coff_SWAP_aouthdr_in
4626 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
4627 #endif
4628 #ifndef coff_SWAP_scnhdr_in
4629 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
4630 #endif
4631
4632
4633
4634 static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
4635 {
4636   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
4637   coff_SWAP_aux_out, coff_SWAP_sym_out,
4638   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
4639   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
4640   coff_SWAP_scnhdr_out,
4641   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ,
4642 #ifdef COFF_LONG_FILENAMES
4643   true,
4644 #else
4645   false,
4646 #endif
4647 #ifdef COFF_LONG_SECTION_NAMES
4648   true,
4649 #else
4650   false,
4651 #endif
4652   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
4653   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
4654   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
4655   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
4656   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
4657   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
4658   coff_classify_symbol, coff_compute_section_file_positions,
4659   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
4660   coff_adjust_symndx, coff_link_add_one_symbol,
4661   coff_link_output_has_begun, coff_final_link_postscript
4662 };
4663
4664 #ifndef coff_close_and_cleanup
4665 #define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
4666 #endif
4667
4668 #ifndef coff_bfd_free_cached_info
4669 #define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
4670 #endif
4671
4672 #ifndef coff_get_section_contents
4673 #define coff_get_section_contents           _bfd_generic_get_section_contents
4674 #endif
4675
4676 #ifndef coff_bfd_copy_private_symbol_data
4677 #define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
4678 #endif
4679
4680 #ifndef coff_bfd_copy_private_section_data
4681 #define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
4682 #endif
4683
4684 #ifndef coff_bfd_copy_private_bfd_data 
4685 #define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
4686 #endif
4687
4688 #ifndef coff_bfd_merge_private_bfd_data
4689 #define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
4690 #endif
4691
4692 #ifndef coff_bfd_set_private_flags
4693 #define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
4694 #endif
4695
4696 #ifndef coff_bfd_print_private_bfd_data 
4697 #define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
4698 #endif
4699
4700 #ifndef coff_bfd_is_local_label_name
4701 #define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
4702 #endif
4703
4704 #ifndef coff_read_minisymbols
4705 #define coff_read_minisymbols               _bfd_generic_read_minisymbols
4706 #endif
4707
4708 #ifndef coff_minisymbol_to_symbol
4709 #define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
4710 #endif
4711
4712 /* The reloc lookup routine must be supplied by each individual COFF
4713    backend.  */
4714 #ifndef coff_bfd_reloc_type_lookup
4715 #define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
4716 #endif
4717
4718 #ifndef coff_bfd_get_relocated_section_contents
4719 #define coff_bfd_get_relocated_section_contents \
4720   bfd_generic_get_relocated_section_contents
4721 #endif
4722
4723 #ifndef coff_bfd_relax_section
4724 #define coff_bfd_relax_section              bfd_generic_relax_section
4725 #endif
4726
4727 #ifndef coff_bfd_gc_sections
4728 #define coff_bfd_gc_sections                bfd_generic_gc_sections
4729 #endif
4730
4731 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4732 const bfd_target VAR =                                                                          \
4733 {                                                                                               \
4734   NAME ,                                                                                        \
4735   bfd_target_coff_flavour,                                                                      \
4736   BFD_ENDIAN_BIG,               /* data byte order is big */                                    \
4737   BFD_ENDIAN_BIG,               /* header byte order is big */                                  \
4738   /* object flags */                                                                            \
4739   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                                                \
4740    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                                            \
4741   /* section flags */                                                                           \
4742   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),                        \
4743   UNDER,                        /* leading symbol underscore */                                 \
4744   '/',                          /* ar_pad_char */                                               \
4745   15,                           /* ar_max_namelen */                                            \
4746                                                                                                 \
4747   /* Data conversion functions.  */                                                             \
4748   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                                                   \
4749   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                                                   \
4750   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                                                   \
4751                                                                                                 \
4752   /* Header conversion functions.  */                                                           \
4753   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                                                   \
4754   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                                                   \
4755   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                                                   \
4756                                                                                                 \
4757         /* bfd_check_format */                                                                  \
4758   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, _bfd_dummy_target },               \
4759         /* bfd_set_format */                                                                    \
4760   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },                              \
4761         /* bfd_write_contents */                                                                \
4762   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, bfd_false },            \
4763                                                                                                 \
4764   BFD_JUMP_TABLE_GENERIC (coff),                                                                \
4765   BFD_JUMP_TABLE_COPY (coff),                                                                   \
4766   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                                            \
4767   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                                                   \
4768   BFD_JUMP_TABLE_SYMBOLS (coff),                                                                \
4769   BFD_JUMP_TABLE_RELOCS (coff),                                                                 \
4770   BFD_JUMP_TABLE_WRITE (coff),                                                                  \
4771   BFD_JUMP_TABLE_LINK (coff),                                                                   \
4772   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                                                      \
4773                                                                                                 \
4774   ALTERNATIVE,                                                                                  \
4775                                                                                                 \
4776   COFF_SWAP_TABLE                                                                               \
4777 };
4778
4779 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE)      \
4780 const bfd_target VAR =                                                                          \
4781 {                                                                                               \
4782   NAME ,                                                                                        \
4783   bfd_target_coff_flavour,                                                                      \
4784   BFD_ENDIAN_LITTLE,            /* data byte order is little */                                 \
4785   BFD_ENDIAN_LITTLE,            /* header byte order is little */                               \
4786         /* object flags */                                                                      \
4787   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                                                \
4788    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                                            \
4789         /* section flags */                                                                     \
4790   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),                        \
4791   UNDER,                        /* leading symbol underscore */                                 \
4792   '/',                          /* ar_pad_char */                                               \
4793   15,                           /* ar_max_namelen */                                            \
4794                                                                                                 \
4795   /* Data conversion functions.  */                                                             \
4796   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                                                   \
4797   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                                                   \
4798   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                                                   \
4799   /* Header conversion functions.  */                                                           \
4800   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                                                   \
4801   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                                                   \
4802   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                                                   \
4803         /* bfd_check_format */                                                                  \
4804   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, _bfd_dummy_target },               \
4805        /* bfd_set_format */                                                                     \
4806   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },                              \
4807         /* bfd_write_contents */                                                                \
4808   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, bfd_false },            \
4809                                                                                                 \
4810   BFD_JUMP_TABLE_GENERIC (coff),                                                                \
4811   BFD_JUMP_TABLE_COPY (coff),                                                                   \
4812   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                                            \
4813   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                                                   \
4814   BFD_JUMP_TABLE_SYMBOLS (coff),                                                                \
4815   BFD_JUMP_TABLE_RELOCS (coff),                                                                 \
4816   BFD_JUMP_TABLE_WRITE (coff),                                                                  \
4817   BFD_JUMP_TABLE_LINK (coff),                                                                   \
4818   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                                                      \
4819                                                                                                 \
4820   ALTERNATIVE,                                                                                  \
4821                                                                                                 \
4822   COFF_SWAP_TABLE                                                                               \
4823 };