OSDN Git Service

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