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