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