Add c-format tags to translatable strings with more than one argument-using formattin...
[external/binutils.git] / bfd / coffcode.h
1 /* Support for the generic parts of most COFF variants, for BFD.
2    Copyright (C) 1990-2016 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       (_("%s: warning: claims to have 0xffff relocs, without overflow"),
1946        bfd_get_filename (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               char s_name_buf[SCNNMLEN + 1];
3759
3760               /* An inherent limitation of the /nnnnnnn notation used to indicate
3761                  the offset of the long name in the string table is that we
3762                  cannot address entries beyone the ten million byte boundary.  */
3763               if (string_size >= 10000000)
3764                 {
3765                   bfd_set_error (bfd_error_file_too_big);
3766                   _bfd_error_handler
3767                     /* xgettext:c-format */
3768                     (_("%B: section %s: string table overflow at offset %ld"),
3769                     abfd, current->name, string_size);
3770                   return FALSE;
3771                 }
3772
3773               /* snprintf not strictly necessary now we've verified the value
3774                  has less than eight ASCII digits, but never mind.  */
3775               snprintf (s_name_buf, SCNNMLEN + 1, "/%lu", (unsigned long) string_size);
3776               /* Then strncpy takes care of any padding for us.  */
3777               strncpy (section.s_name, s_name_buf, SCNNMLEN);
3778               string_size += len + 1;
3779               long_section_names = TRUE;
3780             }
3781         }
3782 #endif
3783
3784 #ifdef _LIB
3785       /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
3786          Ian Taylor <ian@cygnus.com>.  */
3787       if (strcmp (current->name, _LIB) == 0)
3788         section.s_vaddr = 0;
3789       else
3790 #endif
3791       section.s_vaddr = current->vma;
3792       section.s_paddr = current->lma;
3793       section.s_size =  current->size;
3794 #ifdef coff_get_section_load_page
3795       section.s_page = coff_get_section_load_page (current);
3796 #else
3797       section.s_page = 0;
3798 #endif
3799
3800 #ifdef COFF_WITH_PE
3801       section.s_paddr = 0;
3802 #endif
3803 #ifdef COFF_IMAGE_WITH_PE
3804       /* Reminder: s_paddr holds the virtual size of the section.  */
3805       if (coff_section_data (abfd, current) != NULL
3806           && pei_section_data (abfd, current) != NULL)
3807         section.s_paddr = pei_section_data (abfd, current)->virt_size;
3808       else
3809         section.s_paddr = 0;
3810 #endif
3811
3812       /* If this section has no size or is unloadable then the scnptr
3813          will be 0 too.  */
3814       if (current->size == 0
3815           || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3816         section.s_scnptr = 0;
3817       else
3818         section.s_scnptr = current->filepos;
3819
3820       section.s_relptr = current->rel_filepos;
3821       section.s_lnnoptr = current->line_filepos;
3822       section.s_nreloc = current->reloc_count;
3823       section.s_nlnno = current->lineno_count;
3824 #ifndef COFF_IMAGE_WITH_PE
3825       /* In PEI, relocs come in the .reloc section.  */
3826       if (current->reloc_count != 0)
3827         hasrelocs = TRUE;
3828 #endif
3829       if (current->lineno_count != 0)
3830         haslinno = TRUE;
3831 #ifdef COFF_IMAGE_WITH_PE
3832       if ((current->flags & SEC_DEBUGGING) != 0
3833           && ! is_reloc_section)
3834         hasdebug = TRUE;
3835 #endif
3836
3837 #ifdef RS6000COFF_C
3838 #ifndef XCOFF64
3839       /* Indicate the use of an XCOFF overflow section header.  */
3840       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3841         {
3842           section.s_nreloc = 0xffff;
3843           section.s_nlnno = 0xffff;
3844         }
3845 #endif
3846 #endif
3847
3848       section.s_flags = sec_to_styp_flags (current->name, current->flags);
3849
3850       if (!strcmp (current->name, _TEXT))
3851         text_sec = current;
3852       else if (!strcmp (current->name, _DATA))
3853         data_sec = current;
3854       else if (!strcmp (current->name, _BSS))
3855         bss_sec = current;
3856
3857 #ifdef I960
3858       section.s_align = (current->alignment_power
3859                          ? 1 << current->alignment_power
3860                          : 0);
3861 #endif
3862 #ifdef TIC80COFF
3863       /* TI COFF puts the alignment power in bits 8-11 of the flags.  */
3864       section.s_flags |= (current->alignment_power & 0xF) << 8;
3865 #endif
3866 #ifdef COFF_ENCODE_ALIGNMENT
3867       COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
3868 #endif
3869
3870 #ifdef COFF_IMAGE_WITH_PE
3871       /* Suppress output of the sections if they are null.  ld
3872          includes the bss and data sections even if there is no size
3873          assigned to them.  NT loader doesn't like it if these section
3874          headers are included if the sections themselves are not
3875          needed.  See also coff_compute_section_file_positions.  */
3876       if (section.s_size == 0)
3877         internal_f.f_nscns--;
3878       else
3879 #endif
3880         {
3881           SCNHDR buff;
3882           bfd_size_type amt = bfd_coff_scnhsz (abfd);
3883
3884           if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3885               || bfd_bwrite (& buff, amt, abfd) != amt)
3886             return FALSE;
3887         }
3888
3889 #ifdef COFF_WITH_PE
3890       /* PE stores COMDAT section information in the symbol table.  If
3891          this section is supposed to have some COMDAT info, track down
3892          the symbol in the symbol table and modify it.  */
3893       if ((current->flags & SEC_LINK_ONCE) != 0)
3894         {
3895           unsigned int i, count;
3896           asymbol **psym;
3897           coff_symbol_type *csym = NULL;
3898           asymbol **psymsec;
3899
3900           psymsec = NULL;
3901           count = bfd_get_symcount (abfd);
3902           for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3903             {
3904               if ((*psym)->section != current)
3905                 continue;
3906
3907               /* Remember the location of the first symbol in this
3908                  section.  */
3909               if (psymsec == NULL)
3910                 psymsec = psym;
3911
3912               /* See if this is the section symbol.  */
3913               if (strcmp ((*psym)->name, current->name) == 0)
3914                 {
3915                   csym = coff_symbol_from (*psym);
3916                   if (csym == NULL
3917                       || csym->native == NULL
3918                       || ! csym->native->is_sym
3919                       || csym->native->u.syment.n_numaux < 1
3920                       || csym->native->u.syment.n_sclass != C_STAT
3921                       || csym->native->u.syment.n_type != T_NULL)
3922                     continue;
3923
3924                   /* Here *PSYM is the section symbol for CURRENT.  */
3925
3926                   break;
3927                 }
3928             }
3929
3930           /* Did we find it?
3931              Note that we might not if we're converting the file from
3932              some other object file format.  */
3933           if (i < count)
3934             {
3935               combined_entry_type *aux;
3936
3937               /* We don't touch the x_checksum field.  The
3938                  x_associated field is not currently supported.  */
3939
3940               aux = csym->native + 1;
3941               BFD_ASSERT (! aux->is_sym);
3942               switch (current->flags & SEC_LINK_DUPLICATES)
3943                 {
3944                 case SEC_LINK_DUPLICATES_DISCARD:
3945                   aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3946                   break;
3947
3948                 case SEC_LINK_DUPLICATES_ONE_ONLY:
3949                   aux->u.auxent.x_scn.x_comdat =
3950                     IMAGE_COMDAT_SELECT_NODUPLICATES;
3951                   break;
3952
3953                 case SEC_LINK_DUPLICATES_SAME_SIZE:
3954                   aux->u.auxent.x_scn.x_comdat =
3955                     IMAGE_COMDAT_SELECT_SAME_SIZE;
3956                   break;
3957
3958                 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3959                   aux->u.auxent.x_scn.x_comdat =
3960                     IMAGE_COMDAT_SELECT_EXACT_MATCH;
3961                   break;
3962                 }
3963
3964               /* The COMDAT symbol must be the first symbol from this
3965                  section in the symbol table.  In order to make this
3966                  work, we move the COMDAT symbol before the first
3967                  symbol we found in the search above.  It's OK to
3968                  rearrange the symbol table at this point, because
3969                  coff_renumber_symbols is going to rearrange it
3970                  further and fix up all the aux entries.  */
3971               if (psym != psymsec)
3972                 {
3973                   asymbol *hold;
3974                   asymbol **pcopy;
3975
3976                   hold = *psym;
3977                   for (pcopy = psym; pcopy > psymsec; pcopy--)
3978                     pcopy[0] = pcopy[-1];
3979                   *psymsec = hold;
3980                 }
3981             }
3982         }
3983 #endif /* COFF_WITH_PE */
3984     }
3985
3986 #ifdef RS6000COFF_C
3987 #ifndef XCOFF64
3988   /* XCOFF handles overflows in the reloc and line number count fields
3989      by creating a new section header to hold the correct values.  */
3990   for (current = abfd->sections; current != NULL; current = current->next)
3991     {
3992       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3993         {
3994           struct internal_scnhdr scnhdr;
3995           SCNHDR buff;
3996           bfd_size_type amt;
3997
3998           internal_f.f_nscns++;
3999           memcpy (scnhdr.s_name, ".ovrflo", 8);
4000           scnhdr.s_paddr = current->reloc_count;
4001           scnhdr.s_vaddr = current->lineno_count;
4002           scnhdr.s_size = 0;
4003           scnhdr.s_scnptr = 0;
4004           scnhdr.s_relptr = current->rel_filepos;
4005           scnhdr.s_lnnoptr = current->line_filepos;
4006           scnhdr.s_nreloc = current->target_index;
4007           scnhdr.s_nlnno = current->target_index;
4008           scnhdr.s_flags = STYP_OVRFLO;
4009           amt = bfd_coff_scnhsz (abfd);
4010           if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
4011               || bfd_bwrite (& buff, amt, abfd) != amt)
4012             return FALSE;
4013         }
4014     }
4015 #endif
4016 #endif
4017
4018   /* OK, now set up the filehdr...  */
4019
4020   /* Don't include the internal abs section in the section count */
4021
4022   /* We will NOT put a fucking timestamp in the header here. Every time you
4023      put it back, I will come in and take it out again.  I'm sorry.  This
4024      field does not belong here.  We fill it with a 0 so it compares the
4025      same but is not a reasonable time. -- gnu@cygnus.com  */
4026   internal_f.f_timdat = 0;
4027   internal_f.f_flags = 0;
4028
4029   if (abfd->flags & EXEC_P)
4030     internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
4031   else
4032     {
4033       internal_f.f_opthdr = 0;
4034 #ifdef RS6000COFF_C
4035 #ifndef XCOFF64
4036       if (xcoff_data (abfd)->full_aouthdr)
4037         internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
4038       else
4039         internal_f.f_opthdr = SMALL_AOUTSZ;
4040 #endif
4041 #endif
4042     }
4043
4044   if (!hasrelocs)
4045     internal_f.f_flags |= F_RELFLG;
4046   if (!haslinno)
4047     internal_f.f_flags |= F_LNNO;
4048   if (abfd->flags & EXEC_P)
4049     internal_f.f_flags |= F_EXEC;
4050 #ifdef COFF_IMAGE_WITH_PE
4051   if (! hasdebug)
4052     internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
4053   if (pe_data (abfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
4054     internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
4055 #endif
4056
4057 #ifndef COFF_WITH_pex64
4058 #ifdef COFF_WITH_PE
4059   internal_f.f_flags |= IMAGE_FILE_32BIT_MACHINE;
4060 #else
4061   if (bfd_little_endian (abfd))
4062     internal_f.f_flags |= F_AR32WR;
4063   else
4064     internal_f.f_flags |= F_AR32W;
4065 #endif
4066 #endif
4067
4068 #ifdef TI_TARGET_ID
4069   /* Target id is used in TI COFF v1 and later; COFF0 won't use this field,
4070      but it doesn't hurt to set it internally.  */
4071   internal_f.f_target_id = TI_TARGET_ID;
4072 #endif
4073 #ifdef TIC80_TARGET_ID
4074   internal_f.f_target_id = TIC80_TARGET_ID;
4075 #endif
4076
4077   /* FIXME, should do something about the other byte orders and
4078      architectures.  */
4079
4080 #ifdef RS6000COFF_C
4081   if ((abfd->flags & DYNAMIC) != 0)
4082     internal_f.f_flags |= F_SHROBJ;
4083   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
4084     internal_f.f_flags |= F_DYNLOAD;
4085 #endif
4086
4087   memset (&internal_a, 0, sizeof internal_a);
4088
4089   /* Set up architecture-dependent stuff.  */
4090   {
4091     unsigned int magic = 0;
4092     unsigned short flags = 0;
4093
4094     coff_set_flags (abfd, &magic, &flags);
4095     internal_f.f_magic = magic;
4096     internal_f.f_flags |= flags;
4097     /* ...and the "opt"hdr...  */
4098
4099 #ifdef TICOFF_AOUT_MAGIC
4100     internal_a.magic = TICOFF_AOUT_MAGIC;
4101 #define __A_MAGIC_SET__
4102 #endif
4103 #ifdef TIC80COFF
4104     internal_a.magic = TIC80_ARCH_MAGIC;
4105 #define __A_MAGIC_SET__
4106 #endif /* TIC80 */
4107 #ifdef I860
4108     /* FIXME: What are the a.out magic numbers for the i860?  */
4109     internal_a.magic = 0;
4110 #define __A_MAGIC_SET__
4111 #endif /* I860 */
4112 #ifdef I960
4113     internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
4114 #define __A_MAGIC_SET__
4115 #endif /* I960 */
4116 #if M88
4117 #define __A_MAGIC_SET__
4118     internal_a.magic = PAGEMAGICBCS;
4119 #endif /* M88 */
4120
4121 #if APOLLO_M68
4122 #define __A_MAGIC_SET__
4123     internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
4124 #endif
4125
4126 #if defined(M68) || defined(WE32K) || defined(M68K)
4127 #define __A_MAGIC_SET__
4128 #if defined(LYNXOS)
4129     internal_a.magic = LYNXCOFFMAGIC;
4130 #else
4131 #if defined(TARG_AUX)
4132     internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
4133                         abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
4134                         PAGEMAGICEXECSWAPPED);
4135 #else
4136 #if defined (PAGEMAGICPEXECPAGED)
4137     internal_a.magic = PAGEMAGICPEXECPAGED;
4138 #endif
4139 #endif /* TARG_AUX */
4140 #endif /* LYNXOS */
4141 #endif /* M68 || WE32K || M68K */
4142
4143 #if defined(ARM)
4144 #define __A_MAGIC_SET__
4145     internal_a.magic = ZMAGIC;
4146 #endif
4147
4148 #if defined(PPC_PE)
4149 #define __A_MAGIC_SET__
4150     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
4151 #endif
4152
4153 #if defined MCORE_PE
4154 #define __A_MAGIC_SET__
4155     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
4156 #endif
4157
4158 #if defined(I386)
4159 #define __A_MAGIC_SET__
4160 #if defined LYNXOS
4161     internal_a.magic = LYNXCOFFMAGIC;
4162 #elif defined AMD64
4163     internal_a.magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
4164 #else
4165     internal_a.magic = ZMAGIC;
4166 #endif
4167 #endif /* I386 */
4168
4169 #if defined(IA64)
4170 #define __A_MAGIC_SET__
4171     internal_a.magic = PE32PMAGIC;
4172 #endif /* IA64 */
4173
4174 #if defined(SPARC)
4175 #define __A_MAGIC_SET__
4176 #if defined(LYNXOS)
4177     internal_a.magic = LYNXCOFFMAGIC;
4178 #endif /* LYNXOS */
4179 #endif /* SPARC */
4180
4181 #ifdef RS6000COFF_C
4182 #define __A_MAGIC_SET__
4183     internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
4184     (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
4185     RS6K_AOUTHDR_OMAGIC;
4186 #endif
4187
4188 #if defined(SH) && defined(COFF_WITH_PE)
4189 #define __A_MAGIC_SET__
4190     internal_a.magic = SH_PE_MAGIC;
4191 #endif
4192
4193 #if defined(MIPS) && defined(COFF_WITH_PE)
4194 #define __A_MAGIC_SET__
4195     internal_a.magic = MIPS_PE_MAGIC;
4196 #endif
4197
4198 #ifndef __A_MAGIC_SET__
4199 #include "Your aouthdr magic number is not being set!"
4200 #else
4201 #undef __A_MAGIC_SET__
4202 #endif
4203   }
4204
4205   /* FIXME: Does anybody ever set this to another value?  */
4206   internal_a.vstamp = 0;
4207
4208   /* Now should write relocs, strings, syms.  */
4209   obj_sym_filepos (abfd) = sym_base;
4210
4211   if (bfd_get_symcount (abfd) != 0)
4212     {
4213       int firstundef;
4214
4215       if (!coff_renumber_symbols (abfd, &firstundef))
4216         return FALSE;
4217       coff_mangle_symbols (abfd);
4218       if (! coff_write_symbols (abfd))
4219         return FALSE;
4220       if (! coff_write_linenumbers (abfd))
4221         return FALSE;
4222       if (! coff_write_relocs (abfd, firstundef))
4223         return FALSE;
4224     }
4225 #ifdef COFF_LONG_SECTION_NAMES
4226   else if (long_section_names && ! obj_coff_strings_written (abfd))
4227     {
4228       /* If we have long section names we have to write out the string
4229          table even if there are no symbols.  */
4230       if (! coff_write_symbols (abfd))
4231         return FALSE;
4232     }
4233 #endif
4234 #ifdef COFF_IMAGE_WITH_PE
4235 #ifdef PPC_PE
4236   else if ((abfd->flags & EXEC_P) != 0)
4237     {
4238       bfd_byte b;
4239
4240       /* PowerPC PE appears to require that all executable files be
4241          rounded up to the page size.  */
4242       b = 0;
4243       if (bfd_seek (abfd,
4244                     (file_ptr) BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
4245                     SEEK_SET) != 0
4246           || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
4247         return FALSE;
4248     }
4249 #endif
4250 #endif
4251
4252   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
4253      backend linker, and obj_raw_syment_count is not valid until after
4254      coff_write_symbols is called.  */
4255   if (obj_raw_syment_count (abfd) != 0)
4256     {
4257       internal_f.f_symptr = sym_base;
4258 #ifdef RS6000COFF_C
4259       /* AIX appears to require that F_RELFLG not be set if there are
4260          local symbols but no relocations.  */
4261       internal_f.f_flags &=~ F_RELFLG;
4262 #endif
4263     }
4264   else
4265     {
4266       if (long_section_names)
4267         internal_f.f_symptr = sym_base;
4268       else
4269         internal_f.f_symptr = 0;
4270       internal_f.f_flags |= F_LSYMS;
4271     }
4272
4273   if (text_sec)
4274     {
4275       internal_a.tsize = text_sec->size;
4276       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
4277     }
4278   if (data_sec)
4279     {
4280       internal_a.dsize = data_sec->size;
4281       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
4282     }
4283   if (bss_sec)
4284     {
4285       internal_a.bsize = bss_sec->size;
4286       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
4287         internal_a.data_start = bss_sec->vma;
4288     }
4289
4290   internal_a.entry = bfd_get_start_address (abfd);
4291   internal_f.f_nsyms = obj_raw_syment_count (abfd);
4292
4293 #ifdef RS6000COFF_C
4294   if (xcoff_data (abfd)->full_aouthdr)
4295     {
4296       bfd_vma toc;
4297       asection *loader_sec;
4298
4299       internal_a.vstamp = 1;
4300
4301       internal_a.o_snentry = xcoff_data (abfd)->snentry;
4302       if (internal_a.o_snentry == 0)
4303         internal_a.entry = (bfd_vma) -1;
4304
4305       if (text_sec != NULL)
4306         {
4307           internal_a.o_sntext = text_sec->target_index;
4308           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
4309         }
4310       else
4311         {
4312           internal_a.o_sntext = 0;
4313           internal_a.o_algntext = 0;
4314         }
4315       if (data_sec != NULL)
4316         {
4317           internal_a.o_sndata = data_sec->target_index;
4318           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
4319         }
4320       else
4321         {
4322           internal_a.o_sndata = 0;
4323           internal_a.o_algndata = 0;
4324         }
4325       loader_sec = bfd_get_section_by_name (abfd, ".loader");
4326       if (loader_sec != NULL)
4327         internal_a.o_snloader = loader_sec->target_index;
4328       else
4329         internal_a.o_snloader = 0;
4330       if (bss_sec != NULL)
4331         internal_a.o_snbss = bss_sec->target_index;
4332       else
4333         internal_a.o_snbss = 0;
4334
4335       toc = xcoff_data (abfd)->toc;
4336       internal_a.o_toc = toc;
4337       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
4338
4339       internal_a.o_modtype = xcoff_data (abfd)->modtype;
4340       if (xcoff_data (abfd)->cputype != -1)
4341         internal_a.o_cputype = xcoff_data (abfd)->cputype;
4342       else
4343         {
4344           switch (bfd_get_arch (abfd))
4345             {
4346             case bfd_arch_rs6000:
4347               internal_a.o_cputype = 4;
4348               break;
4349             case bfd_arch_powerpc:
4350               if (bfd_get_mach (abfd) == bfd_mach_ppc)
4351                 internal_a.o_cputype = 3;
4352               else
4353                 internal_a.o_cputype = 1;
4354               break;
4355             default:
4356               abort ();
4357             }
4358         }
4359       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
4360       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
4361     }
4362 #endif
4363
4364 #ifdef COFF_WITH_PE
4365   {
4366     /* After object contents are finalized so we can compute a reasonable hash,
4367        but before header is written so we can update it to point to debug directory.  */
4368     struct pe_tdata *pe = pe_data (abfd);
4369
4370     if (pe->build_id.after_write_object_contents != NULL)
4371       (*pe->build_id.after_write_object_contents) (abfd);
4372   }
4373 #endif
4374
4375   /* Now write header.  */
4376   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
4377     return FALSE;
4378
4379   {
4380     char * buff;
4381     bfd_size_type amount = bfd_coff_filhsz (abfd);
4382
4383     buff = (char *) bfd_malloc (amount);
4384     if (buff == NULL)
4385       return FALSE;
4386
4387     bfd_coff_swap_filehdr_out (abfd, & internal_f, buff);
4388     amount = bfd_bwrite (buff, amount, abfd);
4389
4390     free (buff);
4391
4392     if (amount != bfd_coff_filhsz (abfd))
4393       return FALSE;
4394   }
4395
4396   if (abfd->flags & EXEC_P)
4397     {
4398       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
4399          include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)).  */
4400       char * buff;
4401       bfd_size_type amount = bfd_coff_aoutsz (abfd);
4402
4403       buff = (char *) bfd_malloc (amount);
4404       if (buff == NULL)
4405         return FALSE;
4406
4407       coff_swap_aouthdr_out (abfd, & internal_a, buff);
4408       amount = bfd_bwrite (buff, amount, abfd);
4409
4410       free (buff);
4411
4412       if (amount != bfd_coff_aoutsz (abfd))
4413         return FALSE;
4414
4415 #ifdef COFF_IMAGE_WITH_PE
4416       if (! coff_apply_checksum (abfd))
4417         return FALSE;
4418 #endif
4419     }
4420 #ifdef RS6000COFF_C
4421   else
4422     {
4423       AOUTHDR buff;
4424       size_t size;
4425
4426       /* XCOFF seems to always write at least a small a.out header.  */
4427       coff_swap_aouthdr_out (abfd, & internal_a, & buff);
4428       if (xcoff_data (abfd)->full_aouthdr)
4429         size = bfd_coff_aoutsz (abfd);
4430       else
4431         size = SMALL_AOUTSZ;
4432       if (bfd_bwrite (& buff, (bfd_size_type) size, abfd) != size)
4433         return FALSE;
4434     }
4435 #endif
4436
4437   return TRUE;
4438 }
4439
4440 static bfd_boolean
4441 coff_set_section_contents (bfd * abfd,
4442                            sec_ptr section,
4443                            const void * location,
4444                            file_ptr offset,
4445                            bfd_size_type count)
4446 {
4447   if (! abfd->output_has_begun) /* Set by bfd.c handler.  */
4448     {
4449       if (! coff_compute_section_file_positions (abfd))
4450         return FALSE;
4451     }
4452
4453 #if defined(_LIB) && !defined(TARG_AUX)
4454    /* The physical address field of a .lib section is used to hold the
4455       number of shared libraries in the section.  This code counts the
4456       number of sections being written, and increments the lma field
4457       with the number.
4458
4459       I have found no documentation on the contents of this section.
4460       Experimentation indicates that the section contains zero or more
4461       records, each of which has the following structure:
4462
4463       - a (four byte) word holding the length of this record, in words,
4464       - a word that always seems to be set to "2",
4465       - the path to a shared library, null-terminated and then padded
4466         to a whole word boundary.
4467
4468       bfd_assert calls have been added to alert if an attempt is made
4469       to write a section which doesn't follow these assumptions.  The
4470       code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
4471       <robertl@arnet.com> (Thanks!).
4472
4473       Gvran Uddeborg <gvran@uddeborg.pp.se>.  */
4474     if (strcmp (section->name, _LIB) == 0)
4475       {
4476         bfd_byte *rec, *recend;
4477
4478         rec = (bfd_byte *) location;
4479         recend = rec + count;
4480         while (rec < recend)
4481           {
4482             ++section->lma;
4483             rec += bfd_get_32 (abfd, rec) * 4;
4484           }
4485
4486         BFD_ASSERT (rec == recend);
4487       }
4488 #endif
4489
4490   /* Don't write out bss sections - one way to do this is to
4491        see if the filepos has not been set.  */
4492   if (section->filepos == 0)
4493     return TRUE;
4494
4495   if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
4496     return FALSE;
4497
4498   if (count == 0)
4499     return TRUE;
4500
4501   return bfd_bwrite (location, count, abfd) == count;
4502 }
4503
4504 static void *
4505 buy_and_read (bfd *abfd, file_ptr where, bfd_size_type size)
4506 {
4507   void * area = bfd_alloc (abfd, size);
4508
4509   if (!area)
4510     return NULL;
4511   if (bfd_seek (abfd, where, SEEK_SET) != 0
4512       || bfd_bread (area, size, abfd) != size)
4513     return NULL;
4514   return area;
4515 }
4516
4517 /*
4518 SUBSUBSECTION
4519         Reading linenumbers
4520
4521         Creating the linenumber table is done by reading in the entire
4522         coff linenumber table, and creating another table for internal use.
4523
4524         A coff linenumber table is structured so that each function
4525         is marked as having a line number of 0. Each line within the
4526         function is an offset from the first line in the function. The
4527         base of the line number information for the table is stored in
4528         the symbol associated with the function.
4529
4530         Note: The PE format uses line number 0 for a flag indicating a
4531         new source file.
4532
4533         The information is copied from the external to the internal
4534         table, and each symbol which marks a function is marked by
4535         pointing its...
4536
4537         How does this work ?
4538 */
4539
4540 static int
4541 coff_sort_func_alent (const void * arg1, const void * arg2)
4542 {
4543   const alent *al1 = *(const alent **) arg1;
4544   const alent *al2 = *(const alent **) arg2;
4545   const coff_symbol_type *s1 = (const coff_symbol_type *) (al1->u.sym);
4546   const coff_symbol_type *s2 = (const coff_symbol_type *) (al2->u.sym);
4547
4548   if (s1 == NULL || s2 == NULL)
4549     return 0;
4550   if (s1->symbol.value < s2->symbol.value)
4551     return -1;
4552   else if (s1->symbol.value > s2->symbol.value)
4553     return 1;
4554
4555   return 0;
4556 }
4557
4558 static bfd_boolean
4559 coff_slurp_line_table (bfd *abfd, asection *asect)
4560 {
4561   LINENO *native_lineno;
4562   alent *lineno_cache;
4563   bfd_size_type amt;
4564   unsigned int counter;
4565   alent *cache_ptr;
4566   bfd_vma prev_offset = 0;
4567   bfd_boolean ordered = TRUE;
4568   unsigned int nbr_func;
4569   LINENO *src;
4570   bfd_boolean have_func;
4571   bfd_boolean ret = TRUE;
4572
4573   BFD_ASSERT (asect->lineno == NULL);
4574
4575   amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
4576   lineno_cache = (alent *) bfd_alloc (abfd, amt);
4577   if (lineno_cache == NULL)
4578     return FALSE;
4579
4580   amt = (bfd_size_type) bfd_coff_linesz (abfd) * asect->lineno_count;
4581   native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, amt);
4582   if (native_lineno == NULL)
4583     {
4584       _bfd_error_handler
4585         (_("%B: warning: line number table read failed"), abfd);
4586       bfd_release (abfd, lineno_cache);
4587       return FALSE;
4588     }
4589
4590   cache_ptr = lineno_cache;
4591   asect->lineno = lineno_cache;
4592   src = native_lineno;
4593   nbr_func = 0;
4594   have_func = FALSE;
4595
4596   for (counter = 0; counter < asect->lineno_count; counter++, src++)
4597     {
4598       struct internal_lineno dst;
4599
4600       bfd_coff_swap_lineno_in (abfd, src, &dst);
4601       cache_ptr->line_number = dst.l_lnno;
4602       /* Appease memory checkers that get all excited about
4603          uninitialised memory when copying alents if u.offset is
4604          larger than u.sym.  (64-bit BFD on 32-bit host.)  */
4605       memset (&cache_ptr->u, 0, sizeof (cache_ptr->u));
4606
4607       if (cache_ptr->line_number == 0)
4608         {
4609           combined_entry_type * ent;
4610           bfd_vma symndx;
4611           coff_symbol_type *sym;
4612
4613           have_func = FALSE;
4614           symndx = dst.l_addr.l_symndx;
4615           if (symndx >= obj_raw_syment_count (abfd))
4616             {
4617               _bfd_error_handler
4618                 /* xgettext:c-format */
4619                 (_("%B: warning: illegal symbol index 0x%lx in line number entry %d"),
4620                  abfd, (long) symndx, counter);
4621               cache_ptr->line_number = -1;
4622               ret = FALSE;
4623               continue;
4624             }
4625
4626           ent = obj_raw_syments (abfd) + symndx;
4627           /* FIXME: We should not be casting between ints and
4628              pointers like this.  */
4629           if (! ent->is_sym)
4630             {
4631               _bfd_error_handler
4632                 /* xgettext:c-format */
4633                 (_("%B: warning: illegal symbol index 0x%lx in line number entry %d"),
4634                  abfd, (long) symndx, counter);
4635               cache_ptr->line_number = -1;
4636               ret = FALSE;
4637               continue;
4638             }
4639           sym = (coff_symbol_type *) (ent->u.syment._n._n_n._n_zeroes);
4640
4641           /* PR 17512 file: 078-10659-0.004  */
4642           if (sym < obj_symbols (abfd)
4643               || sym >= obj_symbols (abfd) + bfd_get_symcount (abfd))
4644             {
4645               _bfd_error_handler
4646                 /* xgettext:c-format */
4647                 (_("%B: warning: illegal symbol in line number entry %d"),
4648                  abfd, counter);
4649               cache_ptr->line_number = -1;
4650               ret = FALSE;
4651               continue;
4652             }
4653
4654           have_func = TRUE;
4655           nbr_func++;
4656           cache_ptr->u.sym = (asymbol *) sym;
4657           if (sym->lineno != NULL)
4658             _bfd_error_handler
4659               /* xgettext:c-format */
4660               (_("%B: warning: duplicate line number information for `%s'"),
4661                abfd, bfd_asymbol_name (&sym->symbol));
4662
4663           sym->lineno = cache_ptr;
4664           if (sym->symbol.value < prev_offset)
4665             ordered = FALSE;
4666           prev_offset = sym->symbol.value;
4667         }
4668       else if (!have_func)
4669         /* Drop line information that has no associated function.
4670            PR 17521: file: 078-10659-0.004.  */
4671         continue;
4672       else
4673         cache_ptr->u.offset = (dst.l_addr.l_paddr
4674                                - bfd_section_vma (abfd, asect));
4675       cache_ptr++;
4676     }
4677
4678   asect->lineno_count = cache_ptr - lineno_cache;
4679   memset (cache_ptr, 0, sizeof (*cache_ptr));
4680   bfd_release (abfd, native_lineno);
4681
4682   /* On some systems (eg AIX5.3) the lineno table may not be sorted.  */
4683   if (!ordered)
4684     {
4685       /* Sort the table.  */
4686       alent **func_table;
4687       alent *n_lineno_cache;
4688
4689       /* Create a table of functions.  */
4690       func_table = (alent **) bfd_alloc (abfd, nbr_func * sizeof (alent *));
4691       if (func_table != NULL)
4692         {
4693           alent **p = func_table;
4694           unsigned int i;
4695
4696           for (i = 0; i < asect->lineno_count; i++)
4697             if (lineno_cache[i].line_number == 0)
4698               *p++ = &lineno_cache[i];
4699
4700           BFD_ASSERT ((unsigned int) (p - func_table) == nbr_func);
4701
4702           /* Sort by functions.  */
4703           qsort (func_table, nbr_func, sizeof (alent *), coff_sort_func_alent);
4704
4705           /* Create the new sorted table.  */
4706           amt = (bfd_size_type) asect->lineno_count * sizeof (alent);
4707           n_lineno_cache = (alent *) bfd_alloc (abfd, amt);
4708           if (n_lineno_cache != NULL)
4709             {
4710               alent *n_cache_ptr = n_lineno_cache;
4711
4712               for (i = 0; i < nbr_func; i++)
4713                 {
4714                   coff_symbol_type *sym;
4715                   alent *old_ptr = func_table[i];
4716
4717                   /* Update the function entry.  */
4718                   sym = (coff_symbol_type *) old_ptr->u.sym;
4719                   /* PR binutils/17512: Point the lineno to where
4720                      this entry will be after the memcpy below.  */
4721                   sym->lineno = lineno_cache + (n_cache_ptr - n_lineno_cache);
4722                   /* Copy the function and line number entries.  */
4723                   do
4724                     *n_cache_ptr++ = *old_ptr++;
4725                   while (old_ptr->line_number != 0);
4726                 }
4727               BFD_ASSERT ((bfd_size_type) (n_cache_ptr - n_lineno_cache) == (amt / sizeof (alent)));
4728
4729               memcpy (lineno_cache, n_lineno_cache, amt);
4730             }
4731           else
4732             ret = FALSE;
4733           bfd_release (abfd, func_table);
4734         }
4735       else
4736         ret = FALSE;
4737     }
4738
4739   return ret;
4740 }
4741
4742 /* Slurp in the symbol table, converting it to generic form.  Note
4743    that if coff_relocate_section is defined, the linker will read
4744    symbols via coff_link_add_symbols, rather than via this routine.  */
4745
4746 static bfd_boolean
4747 coff_slurp_symbol_table (bfd * abfd)
4748 {
4749   combined_entry_type *native_symbols;
4750   coff_symbol_type *cached_area;
4751   unsigned int *table_ptr;
4752   bfd_size_type amt;
4753   unsigned int number_of_symbols = 0;
4754   bfd_boolean ret = TRUE;
4755
4756   if (obj_symbols (abfd))
4757     return TRUE;
4758
4759   /* Read in the symbol table.  */
4760   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
4761     return FALSE;
4762
4763   /* Allocate enough room for all the symbols in cached form.  */
4764   amt = obj_raw_syment_count (abfd);
4765   amt *= sizeof (coff_symbol_type);
4766   cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt);
4767   if (cached_area == NULL)
4768     return FALSE;
4769
4770   amt = obj_raw_syment_count (abfd);
4771   amt *= sizeof (unsigned int);
4772   table_ptr = (unsigned int *) bfd_zalloc (abfd, amt);
4773
4774   if (table_ptr == NULL)
4775     return FALSE;
4776   else
4777     {
4778       coff_symbol_type *dst = cached_area;
4779       unsigned int last_native_index = obj_raw_syment_count (abfd);
4780       unsigned int this_index = 0;
4781
4782       while (this_index < last_native_index)
4783         {
4784           combined_entry_type *src = native_symbols + this_index;
4785           table_ptr[this_index] = number_of_symbols;
4786
4787           dst->symbol.the_bfd = abfd;
4788           BFD_ASSERT (src->is_sym);
4789           dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
4790           /* We use the native name field to point to the cached field.  */
4791           src->u.syment._n._n_n._n_zeroes = (bfd_hostptr_t) dst;
4792           dst->symbol.section = coff_section_from_bfd_index (abfd,
4793                                                      src->u.syment.n_scnum);
4794           dst->symbol.flags = 0;
4795           /* PR 17512: file: 079-7098-0.001:0.1.  */
4796           dst->symbol.value = 0;
4797           dst->done_lineno = FALSE;
4798
4799           switch (src->u.syment.n_sclass)
4800             {
4801 #ifdef I960
4802             case C_LEAFEXT:
4803               /* Fall through to next case.  */
4804 #endif
4805
4806             case C_EXT:
4807             case C_WEAKEXT:
4808 #if defined ARM
4809             case C_THUMBEXT:
4810             case C_THUMBEXTFUNC:
4811 #endif
4812 #ifdef RS6000COFF_C
4813             case C_HIDEXT:
4814 #endif
4815 #ifdef C_SYSTEM
4816             case C_SYSTEM:      /* System Wide variable.  */
4817 #endif
4818 #ifdef COFF_WITH_PE
4819             /* In PE, 0x68 (104) denotes a section symbol.  */
4820             case C_SECTION:
4821             /* In PE, 0x69 (105) denotes a weak external symbol.  */
4822             case C_NT_WEAK:
4823 #endif
4824               switch (coff_classify_symbol (abfd, &src->u.syment))
4825                 {
4826                 case COFF_SYMBOL_GLOBAL:
4827                   dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4828 #if defined COFF_WITH_PE
4829                   /* PE sets the symbol to a value relative to the
4830                      start of the section.  */
4831                   dst->symbol.value = src->u.syment.n_value;
4832 #else
4833                   dst->symbol.value = (src->u.syment.n_value
4834                                        - dst->symbol.section->vma);
4835 #endif
4836                   if (ISFCN ((src->u.syment.n_type)))
4837                     /* A function ext does not go at the end of a
4838                        file.  */
4839                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4840                   break;
4841
4842                 case COFF_SYMBOL_COMMON:
4843                   dst->symbol.section = bfd_com_section_ptr;
4844                   dst->symbol.value = src->u.syment.n_value;
4845                   break;
4846
4847                 case COFF_SYMBOL_UNDEFINED:
4848                   dst->symbol.section = bfd_und_section_ptr;
4849                   dst->symbol.value = 0;
4850                   break;
4851
4852                 case COFF_SYMBOL_PE_SECTION:
4853                   dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
4854                   dst->symbol.value = 0;
4855                   break;
4856
4857                 case COFF_SYMBOL_LOCAL:
4858                   dst->symbol.flags = BSF_LOCAL;
4859 #if defined COFF_WITH_PE
4860                   /* PE sets the symbol to a value relative to the
4861                      start of the section.  */
4862                   dst->symbol.value = src->u.syment.n_value;
4863 #else
4864                   dst->symbol.value = (src->u.syment.n_value
4865                                        - dst->symbol.section->vma);
4866 #endif
4867                   if (ISFCN ((src->u.syment.n_type)))
4868                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4869                   break;
4870                 }
4871
4872 #ifdef RS6000COFF_C
4873               /* A symbol with a csect entry should not go at the end.  */
4874               if (src->u.syment.n_numaux > 0)
4875                 dst->symbol.flags |= BSF_NOT_AT_END;
4876 #endif
4877
4878 #ifdef COFF_WITH_PE
4879               if (src->u.syment.n_sclass == C_NT_WEAK)
4880                 dst->symbol.flags |= BSF_WEAK;
4881
4882               if (src->u.syment.n_sclass == C_SECTION
4883                   && src->u.syment.n_scnum > 0)
4884                 dst->symbol.flags = BSF_LOCAL;
4885 #endif
4886               if (src->u.syment.n_sclass == C_WEAKEXT)
4887                 dst->symbol.flags |= BSF_WEAK;
4888
4889               break;
4890
4891             case C_STAT:         /* Static.  */
4892 #ifdef I960
4893             case C_LEAFSTAT:     /* Static leaf procedure.  */
4894 #endif
4895 #if defined ARM
4896             case C_THUMBSTAT:    /* Thumb static.  */
4897             case C_THUMBLABEL:   /* Thumb label.  */
4898             case C_THUMBSTATFUNC:/* Thumb static function.  */
4899 #endif
4900 #ifdef RS6000COFF_C
4901             case C_DWARF:        /* A label in a dwarf section.  */
4902             case C_INFO:         /* A label in a comment section.  */
4903 #endif
4904             case C_LABEL:        /* Label.  */
4905               if (src->u.syment.n_scnum == N_DEBUG)
4906                 dst->symbol.flags = BSF_DEBUGGING;
4907               else
4908                 dst->symbol.flags = BSF_LOCAL;
4909
4910               /* Base the value as an index from the base of the
4911                  section, if there is one.  */
4912               if (dst->symbol.section)
4913                 {
4914 #if defined COFF_WITH_PE
4915                   /* PE sets the symbol to a value relative to the
4916                      start of the section.  */
4917                   dst->symbol.value = src->u.syment.n_value;
4918 #else
4919                   dst->symbol.value = (src->u.syment.n_value
4920                                        - dst->symbol.section->vma);
4921 #endif
4922                 }
4923               else
4924                 dst->symbol.value = src->u.syment.n_value;
4925               break;
4926
4927             case C_MOS:         /* Member of structure.  */
4928             case C_EOS:         /* End of structure.  */
4929             case C_REGPARM:     /* Register parameter.  */
4930             case C_REG:         /* register variable.  */
4931               /* C_AUTOARG conflicts with TI COFF C_UEXT.  */
4932 #if !defined (TIC80COFF) && !defined (TICOFF)
4933 #ifdef C_AUTOARG
4934             case C_AUTOARG:     /* 960-specific storage class.  */
4935 #endif
4936 #endif
4937             case C_TPDEF:       /* Type definition.  */
4938             case C_ARG:
4939             case C_AUTO:        /* Automatic variable.  */
4940             case C_FIELD:       /* Bit field.  */
4941             case C_ENTAG:       /* Enumeration tag.  */
4942             case C_MOE:         /* Member of enumeration.  */
4943             case C_MOU:         /* Member of union.  */
4944             case C_UNTAG:       /* Union tag.  */
4945               dst->symbol.flags = BSF_DEBUGGING;
4946               dst->symbol.value = (src->u.syment.n_value);
4947               break;
4948
4949             case C_FILE:        /* File name.  */
4950             case C_STRTAG:      /* Structure tag.  */
4951 #ifdef RS6000COFF_C
4952             case C_GSYM:
4953             case C_LSYM:
4954             case C_PSYM:
4955             case C_RSYM:
4956             case C_RPSYM:
4957             case C_STSYM:
4958             case C_TCSYM:
4959             case C_BCOMM:
4960             case C_ECOML:
4961             case C_ECOMM:
4962             case C_DECL:
4963             case C_ENTRY:
4964             case C_FUN:
4965             case C_ESTAT:
4966 #endif
4967               dst->symbol.flags = BSF_DEBUGGING;
4968               dst->symbol.value = (src->u.syment.n_value);
4969               break;
4970
4971 #ifdef RS6000COFF_C
4972             case C_BINCL:       /* Beginning of include file.  */
4973             case C_EINCL:       /* Ending of include file.  */
4974               /* The value is actually a pointer into the line numbers
4975                  of the file.  We locate the line number entry, and
4976                  set the section to the section which contains it, and
4977                  the value to the index in that section.  */
4978               {
4979                 asection *sec;
4980
4981                 dst->symbol.flags = BSF_DEBUGGING;
4982                 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4983                   if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4984                       && ((file_ptr) (sec->line_filepos
4985                                       + sec->lineno_count * bfd_coff_linesz (abfd))
4986                           > (file_ptr) src->u.syment.n_value))
4987                     break;
4988                 if (sec == NULL)
4989                   dst->symbol.value = 0;
4990                 else
4991                   {
4992                     dst->symbol.section = sec;
4993                     dst->symbol.value = ((src->u.syment.n_value
4994                                           - sec->line_filepos)
4995                                          / bfd_coff_linesz (abfd));
4996                     src->fix_line = 1;
4997                   }
4998               }
4999               break;
5000
5001             case C_BSTAT:
5002               dst->symbol.flags = BSF_DEBUGGING;
5003
5004               /* The value is actually a symbol index.  Save a pointer
5005                  to the symbol instead of the index.  FIXME: This
5006                  should use a union.  */
5007               src->u.syment.n_value =
5008                 (long) (intptr_t) (native_symbols + src->u.syment.n_value);
5009               dst->symbol.value = src->u.syment.n_value;
5010               src->fix_value = 1;
5011               break;
5012 #endif
5013
5014             case C_BLOCK:       /* ".bb" or ".eb".  */
5015             case C_FCN:         /* ".bf" or ".ef" (or PE ".lf").  */
5016             case C_EFCN:        /* Physical end of function.  */
5017 #if defined COFF_WITH_PE
5018               /* PE sets the symbol to a value relative to the start
5019                  of the section.  */
5020               dst->symbol.value = src->u.syment.n_value;
5021               if (strcmp (dst->symbol.name, ".bf") != 0)
5022                 {
5023                   /* PE uses funny values for .ef and .lf; don't
5024                      relocate them.  */
5025                   dst->symbol.flags = BSF_DEBUGGING;
5026                 }
5027               else
5028                 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
5029 #else
5030               /* Base the value as an index from the base of the
5031                  section.  */
5032               dst->symbol.flags = BSF_LOCAL;
5033               dst->symbol.value = (src->u.syment.n_value
5034                                    - dst->symbol.section->vma);
5035 #endif
5036               break;
5037
5038             case C_STATLAB:     /* Static load time label.  */
5039               dst->symbol.value = src->u.syment.n_value;
5040               dst->symbol.flags = BSF_GLOBAL;
5041               break;
5042
5043             case C_NULL:
5044               /* PE DLLs sometimes have zeroed out symbols for some
5045                  reason.  Just ignore them without a warning.  */
5046               if (src->u.syment.n_type == 0
5047                   && src->u.syment.n_value == 0
5048                   && src->u.syment.n_scnum == 0)
5049                 break;
5050 #ifdef RS6000COFF_C
5051               /* XCOFF specific: deleted entry.  */
5052               if (src->u.syment.n_value == C_NULL_VALUE)
5053                 break;
5054 #endif
5055               /* Fall through.  */
5056             case C_EXTDEF:      /* External definition.  */
5057             case C_ULABEL:      /* Undefined label.  */
5058             case C_USTATIC:     /* Undefined static.  */
5059 #ifndef COFF_WITH_PE
5060             /* C_LINE in regular coff is 0x68.  NT has taken over this storage
5061                class to represent a section symbol.  */
5062             case C_LINE:        /* line # reformatted as symbol table entry.  */
5063               /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
5064             case C_ALIAS:       /* Duplicate tag.  */
5065 #endif
5066               /* New storage classes for TI COFF.  */
5067 #if defined(TIC80COFF) || defined(TICOFF)
5068             case C_UEXT:        /* Tentative external definition.  */
5069 #endif
5070             case C_EXTLAB:      /* External load time label.  */
5071             case C_HIDDEN:      /* Ext symbol in dmert public lib.  */
5072             default:
5073               _bfd_error_handler
5074                 /* xgettext:c-format */
5075                 (_("%B: Unrecognized storage class %d for %s symbol `%s'"),
5076                  abfd, src->u.syment.n_sclass,
5077                  dst->symbol.section->name, dst->symbol.name);
5078               ret = FALSE;
5079               dst->symbol.flags = BSF_DEBUGGING;
5080               dst->symbol.value = (src->u.syment.n_value);
5081               break;
5082             }
5083
5084           dst->native = src;
5085           dst->symbol.udata.i = 0;
5086           dst->lineno = NULL;
5087
5088           this_index += (src->u.syment.n_numaux) + 1;
5089           dst++;
5090           number_of_symbols++;
5091         }
5092     }
5093
5094   obj_symbols (abfd) = cached_area;
5095   obj_raw_syments (abfd) = native_symbols;
5096
5097   bfd_get_symcount (abfd) = number_of_symbols;
5098   obj_convert (abfd) = table_ptr;
5099   /* Slurp the line tables for each section too.  */
5100   {
5101     asection *p;
5102
5103     p = abfd->sections;
5104     while (p)
5105       {
5106         if (! coff_slurp_line_table (abfd, p))
5107           return FALSE;
5108         p = p->next;
5109       }
5110   }
5111
5112   return ret;
5113 }
5114
5115 /* Classify a COFF symbol.  A couple of targets have globally visible
5116    symbols which are not class C_EXT, and this handles those.  It also
5117    recognizes some special PE cases.  */
5118
5119 static enum coff_symbol_classification
5120 coff_classify_symbol (bfd *abfd,
5121                       struct internal_syment *syment)
5122 {
5123   /* FIXME: This partially duplicates the switch in
5124      coff_slurp_symbol_table.  */
5125   switch (syment->n_sclass)
5126     {
5127     case C_EXT:
5128     case C_WEAKEXT:
5129 #ifdef I960
5130     case C_LEAFEXT:
5131 #endif
5132 #ifdef ARM
5133     case C_THUMBEXT:
5134     case C_THUMBEXTFUNC:
5135 #endif
5136 #ifdef C_SYSTEM
5137     case C_SYSTEM:
5138 #endif
5139 #ifdef COFF_WITH_PE
5140     case C_NT_WEAK:
5141 #endif
5142       if (syment->n_scnum == 0)
5143         {
5144           if (syment->n_value == 0)
5145             return COFF_SYMBOL_UNDEFINED;
5146           else
5147             return COFF_SYMBOL_COMMON;
5148         }
5149       return COFF_SYMBOL_GLOBAL;
5150
5151     default:
5152       break;
5153     }
5154
5155 #ifdef COFF_WITH_PE
5156   if (syment->n_sclass == C_STAT)
5157     {
5158       if (syment->n_scnum == 0)
5159         /* The Microsoft compiler sometimes generates these if a
5160            small static function is inlined every time it is used.
5161            The function is discarded, but the symbol table entry
5162            remains.  */
5163         return COFF_SYMBOL_LOCAL;
5164
5165 #ifdef STRICT_PE_FORMAT
5166       /* This is correct for Microsoft generated objects, but it
5167          breaks gas generated objects.  */
5168       if (syment->n_value == 0)
5169         {
5170           asection *sec;
5171           char * name;
5172           char buf[SYMNMLEN + 1];
5173
5174           name = _bfd_coff_internal_syment_name (abfd, syment, buf)
5175           sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
5176           if (sec != NULL && name != NULL
5177               && (strcmp (bfd_get_section_name (abfd, sec), name) == 0))
5178             return COFF_SYMBOL_PE_SECTION;
5179         }
5180 #endif
5181
5182       return COFF_SYMBOL_LOCAL;
5183     }
5184
5185   if (syment->n_sclass == C_SECTION)
5186     {
5187       /* In some cases in a DLL generated by the Microsoft linker, the
5188          n_value field will contain garbage.  FIXME: This should
5189          probably be handled by the swapping function instead.  */
5190       syment->n_value = 0;
5191       if (syment->n_scnum == 0)
5192         return COFF_SYMBOL_UNDEFINED;
5193       return COFF_SYMBOL_PE_SECTION;
5194     }
5195 #endif /* COFF_WITH_PE */
5196
5197   /* If it is not a global symbol, we presume it is a local symbol.  */
5198   if (syment->n_scnum == 0)
5199     {
5200       char buf[SYMNMLEN + 1];
5201
5202       _bfd_error_handler
5203         /* xgettext:c-format */
5204         (_("warning: %B: local symbol `%s' has no section"),
5205          abfd, _bfd_coff_internal_syment_name (abfd, syment, buf));
5206     }
5207
5208   return COFF_SYMBOL_LOCAL;
5209 }
5210
5211 /*
5212 SUBSUBSECTION
5213         Reading relocations
5214
5215         Coff relocations are easily transformed into the internal BFD form
5216         (@code{arelent}).
5217
5218         Reading a coff relocation table is done in the following stages:
5219
5220         o Read the entire coff relocation table into memory.
5221
5222         o Process each relocation in turn; first swap it from the
5223         external to the internal form.
5224
5225         o Turn the symbol referenced in the relocation's symbol index
5226         into a pointer into the canonical symbol table.
5227         This table is the same as the one returned by a call to
5228         @code{bfd_canonicalize_symtab}. The back end will call that
5229         routine and save the result if a canonicalization hasn't been done.
5230
5231         o The reloc index is turned into a pointer to a howto
5232         structure, in a back end specific way. For instance, the 386
5233         and 960 use the @code{r_type} to directly produce an index
5234         into a howto table vector; the 88k subtracts a number from the
5235         @code{r_type} field and creates an addend field.
5236 */
5237
5238 #ifndef CALC_ADDEND
5239 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
5240   {                                                             \
5241     coff_symbol_type *coffsym = NULL;                           \
5242                                                                 \
5243     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
5244       coffsym = (obj_symbols (abfd)                             \
5245                  + (cache_ptr->sym_ptr_ptr - symbols));         \
5246     else if (ptr)                                               \
5247       coffsym = coff_symbol_from (ptr);                         \
5248     if (coffsym != NULL                                         \
5249         && coffsym->native->is_sym                              \
5250         && coffsym->native->u.syment.n_scnum == 0)              \
5251       cache_ptr->addend = 0;                                    \
5252     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
5253              && ptr->section != NULL)                           \
5254       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
5255     else                                                        \
5256       cache_ptr->addend = 0;                                    \
5257   }
5258 #endif
5259
5260 static bfd_boolean
5261 coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
5262 {
5263   RELOC *native_relocs;
5264   arelent *reloc_cache;
5265   arelent *cache_ptr;
5266   unsigned int idx;
5267   bfd_size_type amt;
5268
5269   if (asect->relocation)
5270     return TRUE;
5271   if (asect->reloc_count == 0)
5272     return TRUE;
5273   if (asect->flags & SEC_CONSTRUCTOR)
5274     return TRUE;
5275   if (!coff_slurp_symbol_table (abfd))
5276     return FALSE;
5277
5278   amt = (bfd_size_type) bfd_coff_relsz (abfd) * asect->reloc_count;
5279   native_relocs = (RELOC *) buy_and_read (abfd, asect->rel_filepos, amt);
5280   amt = (bfd_size_type) asect->reloc_count * sizeof (arelent);
5281   reloc_cache = (arelent *) bfd_alloc (abfd, amt);
5282
5283   if (reloc_cache == NULL || native_relocs == NULL)
5284     return FALSE;
5285
5286   for (idx = 0; idx < asect->reloc_count; idx++)
5287     {
5288       struct internal_reloc dst;
5289       struct external_reloc *src;
5290 #ifndef RELOC_PROCESSING
5291       asymbol *ptr;
5292 #endif
5293
5294       cache_ptr = reloc_cache + idx;
5295       src = native_relocs + idx;
5296
5297       dst.r_offset = 0;
5298       coff_swap_reloc_in (abfd, src, &dst);
5299
5300 #ifdef RELOC_PROCESSING
5301       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
5302 #else
5303       cache_ptr->address = dst.r_vaddr;
5304
5305       if (dst.r_symndx != -1)
5306         {
5307           if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
5308             {
5309               _bfd_error_handler
5310                 /* xgettext:c-format */
5311                 (_("%B: warning: illegal symbol index %ld in relocs"),
5312                  abfd, (long) dst.r_symndx);
5313               cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
5314               ptr = NULL;
5315             }
5316           else
5317             {
5318               cache_ptr->sym_ptr_ptr = (symbols
5319                                         + obj_convert (abfd)[dst.r_symndx]);
5320               ptr = *(cache_ptr->sym_ptr_ptr);
5321             }
5322         }
5323       else
5324         {
5325           cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
5326           ptr = NULL;
5327         }
5328
5329       /* The symbols definitions that we have read in have been
5330          relocated as if their sections started at 0. But the offsets
5331          refering to the symbols in the raw data have not been
5332          modified, so we have to have a negative addend to compensate.
5333
5334          Note that symbols which used to be common must be left alone.  */
5335
5336       /* Calculate any reloc addend by looking at the symbol.  */
5337       CALC_ADDEND (abfd, ptr, dst, cache_ptr);
5338       (void) ptr;
5339
5340       cache_ptr->address -= asect->vma;
5341       /* !! cache_ptr->section = NULL;*/
5342
5343       /* Fill in the cache_ptr->howto field from dst.r_type.  */
5344       RTYPE2HOWTO (cache_ptr, &dst);
5345 #endif  /* RELOC_PROCESSING */
5346
5347       if (cache_ptr->howto == NULL)
5348         {
5349           _bfd_error_handler
5350             /* xgettext:c-format */
5351             (_("%B: illegal relocation type %d at address 0x%lx"),
5352              abfd, dst.r_type, (long) dst.r_vaddr);
5353           bfd_set_error (bfd_error_bad_value);
5354           return FALSE;
5355         }
5356     }
5357
5358   asect->relocation = reloc_cache;
5359   return TRUE;
5360 }
5361
5362 #ifndef coff_rtype_to_howto
5363 #ifdef RTYPE2HOWTO
5364
5365 /* Get the howto structure for a reloc.  This is only used if the file
5366    including this one defines coff_relocate_section to be
5367    _bfd_coff_generic_relocate_section, so it is OK if it does not
5368    always work.  It is the responsibility of the including file to
5369    make sure it is reasonable if it is needed.  */
5370
5371 static reloc_howto_type *
5372 coff_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
5373                      asection *sec ATTRIBUTE_UNUSED,
5374                      struct internal_reloc *rel ATTRIBUTE_UNUSED,
5375                      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
5376                      struct internal_syment *sym ATTRIBUTE_UNUSED,
5377                      bfd_vma *addendp ATTRIBUTE_UNUSED)
5378 {
5379   arelent genrel;
5380
5381   genrel.howto = NULL;
5382   RTYPE2HOWTO (&genrel, rel);
5383   return genrel.howto;
5384 }
5385
5386 #else /* ! defined (RTYPE2HOWTO) */
5387
5388 #define coff_rtype_to_howto NULL
5389
5390 #endif /* ! defined (RTYPE2HOWTO) */
5391 #endif /* ! defined (coff_rtype_to_howto) */
5392
5393 /* This is stupid.  This function should be a boolean predicate.  */
5394
5395 static long
5396 coff_canonicalize_reloc (bfd * abfd,
5397                          sec_ptr section,
5398                          arelent ** relptr,
5399                          asymbol ** symbols)
5400 {
5401   arelent *tblptr = section->relocation;
5402   unsigned int count = 0;
5403
5404   if (section->flags & SEC_CONSTRUCTOR)
5405     {
5406       /* This section has relocs made up by us, they are not in the
5407          file, so take them out of their chain and place them into
5408          the data area provided.  */
5409       arelent_chain *chain = section->constructor_chain;
5410
5411       for (count = 0; count < section->reloc_count; count++)
5412         {
5413           *relptr++ = &chain->relent;
5414           chain = chain->next;
5415         }
5416     }
5417   else
5418     {
5419       if (! coff_slurp_reloc_table (abfd, section, symbols))
5420         return -1;
5421
5422       tblptr = section->relocation;
5423
5424       for (; count++ < section->reloc_count;)
5425         *relptr++ = tblptr++;
5426     }
5427   *relptr = 0;
5428   return section->reloc_count;
5429 }
5430
5431 #ifndef coff_reloc16_estimate
5432 #define coff_reloc16_estimate dummy_reloc16_estimate
5433
5434 static int
5435 dummy_reloc16_estimate (bfd *abfd ATTRIBUTE_UNUSED,
5436                         asection *input_section ATTRIBUTE_UNUSED,
5437                         arelent *reloc ATTRIBUTE_UNUSED,
5438                         unsigned int shrink ATTRIBUTE_UNUSED,
5439                         struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
5440 {
5441   abort ();
5442   return 0;
5443 }
5444
5445 #endif
5446
5447 #ifndef coff_reloc16_extra_cases
5448
5449 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
5450
5451 /* This works even if abort is not declared in any header file.  */
5452
5453 static void
5454 dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED,
5455                            struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
5456                            struct bfd_link_order *link_order ATTRIBUTE_UNUSED,
5457                            arelent *reloc ATTRIBUTE_UNUSED,
5458                            bfd_byte *data ATTRIBUTE_UNUSED,
5459                            unsigned int *src_ptr ATTRIBUTE_UNUSED,
5460                            unsigned int *dst_ptr ATTRIBUTE_UNUSED)
5461 {
5462   abort ();
5463 }
5464 #endif
5465
5466 /* If coff_relocate_section is defined, we can use the optimized COFF
5467    backend linker.  Otherwise we must continue to use the old linker.  */
5468
5469 #ifdef coff_relocate_section
5470
5471 #ifndef coff_bfd_link_hash_table_create
5472 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
5473 #endif
5474 #ifndef coff_bfd_link_add_symbols
5475 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
5476 #endif
5477 #ifndef coff_bfd_final_link
5478 #define coff_bfd_final_link _bfd_coff_final_link
5479 #endif
5480
5481 #else /* ! defined (coff_relocate_section) */
5482
5483 #define coff_relocate_section NULL
5484 #ifndef coff_bfd_link_hash_table_create
5485 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
5486 #endif
5487 #ifndef coff_bfd_link_add_symbols
5488 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
5489 #endif
5490 #define coff_bfd_final_link _bfd_generic_final_link
5491
5492 #endif /* ! defined (coff_relocate_section) */
5493
5494 #define coff_bfd_link_just_syms      _bfd_generic_link_just_syms
5495 #define coff_bfd_copy_link_hash_symbol_type \
5496   _bfd_generic_copy_link_hash_symbol_type
5497 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
5498
5499 #define coff_bfd_link_check_relocs   _bfd_generic_link_check_relocs
5500
5501 #ifndef coff_start_final_link
5502 #define coff_start_final_link NULL
5503 #endif
5504
5505 #ifndef coff_adjust_symndx
5506 #define coff_adjust_symndx NULL
5507 #endif
5508
5509 #ifndef coff_link_add_one_symbol
5510 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
5511 #endif
5512
5513 #ifndef coff_link_output_has_begun
5514
5515 static bfd_boolean
5516 coff_link_output_has_begun (bfd * abfd,
5517                             struct coff_final_link_info * info ATTRIBUTE_UNUSED)
5518 {
5519   return abfd->output_has_begun;
5520 }
5521 #endif
5522
5523 #ifndef coff_final_link_postscript
5524
5525 static bfd_boolean
5526 coff_final_link_postscript (bfd * abfd ATTRIBUTE_UNUSED,
5527                             struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED)
5528 {
5529   return TRUE;
5530 }
5531 #endif
5532
5533 #ifndef coff_SWAP_aux_in
5534 #define coff_SWAP_aux_in coff_swap_aux_in
5535 #endif
5536 #ifndef coff_SWAP_sym_in
5537 #define coff_SWAP_sym_in coff_swap_sym_in
5538 #endif
5539 #ifndef coff_SWAP_lineno_in
5540 #define coff_SWAP_lineno_in coff_swap_lineno_in
5541 #endif
5542 #ifndef coff_SWAP_aux_out
5543 #define coff_SWAP_aux_out coff_swap_aux_out
5544 #endif
5545 #ifndef coff_SWAP_sym_out
5546 #define coff_SWAP_sym_out coff_swap_sym_out
5547 #endif
5548 #ifndef coff_SWAP_lineno_out
5549 #define coff_SWAP_lineno_out coff_swap_lineno_out
5550 #endif
5551 #ifndef coff_SWAP_reloc_out
5552 #define coff_SWAP_reloc_out coff_swap_reloc_out
5553 #endif
5554 #ifndef coff_SWAP_filehdr_out
5555 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
5556 #endif
5557 #ifndef coff_SWAP_aouthdr_out
5558 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
5559 #endif
5560 #ifndef coff_SWAP_scnhdr_out
5561 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
5562 #endif
5563 #ifndef coff_SWAP_reloc_in
5564 #define coff_SWAP_reloc_in coff_swap_reloc_in
5565 #endif
5566 #ifndef coff_SWAP_filehdr_in
5567 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
5568 #endif
5569 #ifndef coff_SWAP_aouthdr_in
5570 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
5571 #endif
5572 #ifndef coff_SWAP_scnhdr_in
5573 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
5574 #endif
5575
5576 static bfd_coff_backend_data bfd_coff_std_swap_table ATTRIBUTE_UNUSED =
5577 {
5578   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5579   coff_SWAP_aux_out, coff_SWAP_sym_out,
5580   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5581   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5582   coff_SWAP_scnhdr_out,
5583   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5584 #ifdef COFF_LONG_FILENAMES
5585   TRUE,
5586 #else
5587   FALSE,
5588 #endif
5589   COFF_DEFAULT_LONG_SECTION_NAMES,
5590   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5591 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5592   TRUE,
5593 #else
5594   FALSE,
5595 #endif
5596 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5597   4,
5598 #else
5599   2,
5600 #endif
5601   32768,
5602   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5603   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
5604   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5605   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5606   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5607   coff_classify_symbol, coff_compute_section_file_positions,
5608   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5609   coff_adjust_symndx, coff_link_add_one_symbol,
5610   coff_link_output_has_begun, coff_final_link_postscript,
5611   bfd_pe_print_pdata
5612 };
5613
5614 #ifdef TICOFF
5615 /* COFF0 differs in file/section header size and relocation entry size.  */
5616
5617 static bfd_coff_backend_data ticoff0_swap_table =
5618 {
5619   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5620   coff_SWAP_aux_out, coff_SWAP_sym_out,
5621   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5622   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5623   coff_SWAP_scnhdr_out,
5624   FILHSZ_V0, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ_V0, LINESZ, FILNMLEN,
5625 #ifdef COFF_LONG_FILENAMES
5626   TRUE,
5627 #else
5628   FALSE,
5629 #endif
5630   COFF_DEFAULT_LONG_SECTION_NAMES,
5631   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5632 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5633   TRUE,
5634 #else
5635   FALSE,
5636 #endif
5637 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5638   4,
5639 #else
5640   2,
5641 #endif
5642   32768,
5643   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5644   coff_SWAP_reloc_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook,
5645   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5646   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5647   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5648   coff_classify_symbol, coff_compute_section_file_positions,
5649   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5650   coff_adjust_symndx, coff_link_add_one_symbol,
5651   coff_link_output_has_begun, coff_final_link_postscript,
5652   bfd_pe_print_pdata
5653 };
5654 #endif
5655
5656 #ifdef TICOFF
5657 /* COFF1 differs in section header size.  */
5658
5659 static bfd_coff_backend_data ticoff1_swap_table =
5660 {
5661   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5662   coff_SWAP_aux_out, coff_SWAP_sym_out,
5663   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5664   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5665   coff_SWAP_scnhdr_out,
5666   FILHSZ, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5667 #ifdef COFF_LONG_FILENAMES
5668   TRUE,
5669 #else
5670   FALSE,
5671 #endif
5672   COFF_DEFAULT_LONG_SECTION_NAMES,
5673   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5674 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5675   TRUE,
5676 #else
5677   FALSE,
5678 #endif
5679 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5680   4,
5681 #else
5682   2,
5683 #endif
5684   32768,
5685   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5686   coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook,
5687   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5688   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5689   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5690   coff_classify_symbol, coff_compute_section_file_positions,
5691   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5692   coff_adjust_symndx, coff_link_add_one_symbol,
5693   coff_link_output_has_begun, coff_final_link_postscript,
5694   bfd_pe_print_pdata    /* huh */
5695 };
5696 #endif
5697
5698 #ifdef COFF_WITH_PE_BIGOBJ
5699 /* The UID for bigobj files.  */
5700
5701 static const char header_bigobj_classid[16] =
5702 {
5703   0xC7, 0xA1, 0xBA, 0xD1,
5704   0xEE, 0xBA,
5705   0xa9, 0x4b,
5706   0xAF, 0x20,
5707   0xFA, 0xF6, 0x6A, 0xA4, 0xDC, 0xB8
5708 };
5709
5710 /* Swap routines.  */
5711
5712 static void
5713 coff_bigobj_swap_filehdr_in (bfd * abfd, void * src, void * dst)
5714 {
5715   struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_src =
5716     (struct external_ANON_OBJECT_HEADER_BIGOBJ *) src;
5717   struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
5718
5719   filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->Machine);
5720   filehdr_dst->f_nscns  = H_GET_32 (abfd, filehdr_src->NumberOfSections);
5721   filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->TimeDateStamp);
5722   filehdr_dst->f_symptr =
5723     GET_FILEHDR_SYMPTR (abfd, filehdr_src->PointerToSymbolTable);
5724   filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->NumberOfSymbols);
5725   filehdr_dst->f_opthdr = 0;
5726   filehdr_dst->f_flags  = 0;
5727
5728   /* Check other magic numbers.  */
5729   if (H_GET_16 (abfd, filehdr_src->Sig1) != IMAGE_FILE_MACHINE_UNKNOWN
5730       || H_GET_16 (abfd, filehdr_src->Sig2) != 0xffff
5731       || H_GET_16 (abfd, filehdr_src->Version) != 2
5732       || memcmp (filehdr_src->ClassID, header_bigobj_classid, 16) != 0)
5733     filehdr_dst->f_opthdr = 0xffff;
5734
5735   /* Note that CLR metadata are ignored.  */
5736 }
5737
5738 static unsigned int
5739 coff_bigobj_swap_filehdr_out (bfd *abfd, void * in, void * out)
5740 {
5741   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
5742   struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_out =
5743     (struct external_ANON_OBJECT_HEADER_BIGOBJ *) out;
5744
5745   memset (filehdr_out, 0, sizeof (*filehdr_out));
5746
5747   H_PUT_16 (abfd, IMAGE_FILE_MACHINE_UNKNOWN, filehdr_out->Sig1);
5748   H_PUT_16 (abfd, 0xffff, filehdr_out->Sig2);
5749   H_PUT_16 (abfd, 2, filehdr_out->Version);
5750   memcpy (filehdr_out->ClassID, header_bigobj_classid, 16);
5751   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->Machine);
5752   H_PUT_32 (abfd, filehdr_in->f_nscns, filehdr_out->NumberOfSections);
5753   H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->TimeDateStamp);
5754   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
5755                       filehdr_out->PointerToSymbolTable);
5756   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->NumberOfSymbols);
5757
5758   return bfd_coff_filhsz (abfd);
5759 }
5760
5761 static void
5762 coff_bigobj_swap_sym_in (bfd * abfd, void * ext1, void * in1)
5763 {
5764   SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) ext1;
5765   struct internal_syment *in = (struct internal_syment *) in1;
5766
5767   if (ext->e.e_name[0] == 0)
5768     {
5769       in->_n._n_n._n_zeroes = 0;
5770       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
5771     }
5772   else
5773     {
5774 #if SYMNMLEN != E_SYMNMLEN
5775 #error we need to cope with truncating or extending SYMNMLEN
5776 #else
5777       memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
5778 #endif
5779     }
5780
5781   in->n_value = H_GET_32 (abfd, ext->e_value);
5782   BFD_ASSERT (sizeof (in->n_scnum) >= 4);
5783   in->n_scnum = H_GET_32 (abfd, ext->e_scnum);
5784   in->n_type = H_GET_16 (abfd, ext->e_type);
5785   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
5786   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
5787 }
5788
5789 static unsigned int
5790 coff_bigobj_swap_sym_out (bfd * abfd, void * inp, void * extp)
5791 {
5792   struct internal_syment *in = (struct internal_syment *) inp;
5793   SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) extp;
5794
5795   if (in->_n._n_name[0] == 0)
5796     {
5797       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
5798       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
5799     }
5800   else
5801     {
5802 #if SYMNMLEN != E_SYMNMLEN
5803 #error we need to cope with truncating or extending SYMNMLEN
5804 #else
5805       memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
5806 #endif
5807     }
5808
5809   H_PUT_32 (abfd, in->n_value, ext->e_value);
5810   H_PUT_32 (abfd, in->n_scnum, ext->e_scnum);
5811
5812   H_PUT_16 (abfd, in->n_type, ext->e_type);
5813   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
5814   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
5815
5816   return SYMESZ_BIGOBJ;
5817 }
5818
5819 static void
5820 coff_bigobj_swap_aux_in (bfd *abfd,
5821                          void * ext1,
5822                          int type,
5823                          int in_class,
5824                          int indx,
5825                          int numaux,
5826                          void * in1)
5827 {
5828   AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) ext1;
5829   union internal_auxent *in = (union internal_auxent *) in1;
5830
5831   switch (in_class)
5832     {
5833     case C_FILE:
5834       if (numaux > 1)
5835         {
5836           if (indx == 0)
5837             memcpy (in->x_file.x_fname, ext->File.Name,
5838                     numaux * sizeof (AUXENT_BIGOBJ));
5839         }
5840       else
5841         memcpy (in->x_file.x_fname, ext->File.Name, sizeof (ext->File.Name));
5842       break;
5843
5844     case C_STAT:
5845     case C_LEAFSTAT:
5846     case C_HIDDEN:
5847       if (type == T_NULL)
5848         {
5849           in->x_scn.x_scnlen = H_GET_32 (abfd, ext->Section.Length);
5850           in->x_scn.x_nreloc =
5851             H_GET_16 (abfd, ext->Section.NumberOfRelocations);
5852           in->x_scn.x_nlinno =
5853             H_GET_16 (abfd, ext->Section.NumberOfLinenumbers);
5854           in->x_scn.x_checksum = H_GET_32 (abfd, ext->Section.Checksum);
5855           in->x_scn.x_associated = H_GET_16 (abfd, ext->Section.Number)
5856             | (H_GET_16 (abfd, ext->Section.HighNumber) << 16);
5857           in->x_scn.x_comdat = H_GET_8 (abfd, ext->Section.Selection);
5858           return;
5859         }
5860       break;
5861
5862     default:
5863       in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->Sym.WeakDefaultSymIndex);
5864       /* Characteristics is ignored.  */
5865       break;
5866     }
5867 }
5868
5869 static unsigned int
5870 coff_bigobj_swap_aux_out (bfd * abfd,
5871                           void * inp,
5872                           int type,
5873                           int in_class,
5874                           int indx ATTRIBUTE_UNUSED,
5875                           int numaux ATTRIBUTE_UNUSED,
5876                           void * extp)
5877 {
5878   union internal_auxent * in = (union internal_auxent *) inp;
5879   AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) extp;
5880
5881   memset (ext, 0, AUXESZ);
5882
5883   switch (in_class)
5884     {
5885     case C_FILE:
5886       memcpy (ext->File.Name, in->x_file.x_fname, sizeof (ext->File.Name));
5887
5888       return AUXESZ;
5889
5890     case C_STAT:
5891     case C_LEAFSTAT:
5892     case C_HIDDEN:
5893       if (type == T_NULL)
5894         {
5895           H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->Section.Length);
5896           H_PUT_16 (abfd, in->x_scn.x_nreloc,
5897                     ext->Section.NumberOfRelocations);
5898           H_PUT_16 (abfd, in->x_scn.x_nlinno,
5899                     ext->Section.NumberOfLinenumbers);
5900           H_PUT_32 (abfd, in->x_scn.x_checksum, ext->Section.Checksum);
5901           H_PUT_16 (abfd, in->x_scn.x_associated & 0xffff,
5902                     ext->Section.Number);
5903           H_PUT_16 (abfd, (in->x_scn.x_associated >> 16),
5904                     ext->Section.HighNumber);
5905           H_PUT_8 (abfd, in->x_scn.x_comdat, ext->Section.Selection);
5906           return AUXESZ;
5907         }
5908       break;
5909     }
5910
5911   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->Sym.WeakDefaultSymIndex);
5912   H_PUT_32 (abfd, 1, ext->Sym.WeakSearchType);
5913
5914   return AUXESZ;
5915 }
5916
5917 static bfd_coff_backend_data bigobj_swap_table =
5918 {
5919   coff_bigobj_swap_aux_in, coff_bigobj_swap_sym_in, coff_SWAP_lineno_in,
5920   coff_bigobj_swap_aux_out, coff_bigobj_swap_sym_out,
5921   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5922   coff_bigobj_swap_filehdr_out, coff_SWAP_aouthdr_out,
5923   coff_SWAP_scnhdr_out,
5924   FILHSZ_BIGOBJ, AOUTSZ, SCNHSZ, SYMESZ_BIGOBJ, AUXESZ_BIGOBJ,
5925    RELSZ, LINESZ, FILNMLEN_BIGOBJ,
5926   TRUE,
5927   COFF_DEFAULT_LONG_SECTION_NAMES,
5928   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5929   FALSE,
5930   2,
5931   1U << 31,
5932   coff_bigobj_swap_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5933   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
5934   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5935   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5936   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5937   coff_classify_symbol, coff_compute_section_file_positions,
5938   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5939   coff_adjust_symndx, coff_link_add_one_symbol,
5940   coff_link_output_has_begun, coff_final_link_postscript,
5941   bfd_pe_print_pdata    /* huh */
5942 };
5943
5944 #endif /* COFF_WITH_PE_BIGOBJ */
5945
5946 #ifndef coff_close_and_cleanup
5947 #define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
5948 #endif
5949
5950 #ifndef coff_bfd_free_cached_info
5951 #define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
5952 #endif
5953
5954 #ifndef coff_get_section_contents
5955 #define coff_get_section_contents           _bfd_generic_get_section_contents
5956 #endif
5957
5958 #ifndef coff_bfd_copy_private_symbol_data
5959 #define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
5960 #endif
5961
5962 #ifndef coff_bfd_copy_private_header_data
5963 #define coff_bfd_copy_private_header_data   _bfd_generic_bfd_copy_private_header_data
5964 #endif
5965
5966 #ifndef coff_bfd_copy_private_section_data
5967 #define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
5968 #endif
5969
5970 #ifndef coff_bfd_copy_private_bfd_data
5971 #define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
5972 #endif
5973
5974 #ifndef coff_bfd_merge_private_bfd_data
5975 #define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
5976 #endif
5977
5978 #ifndef coff_bfd_set_private_flags
5979 #define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
5980 #endif
5981
5982 #ifndef coff_bfd_print_private_bfd_data
5983 #define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
5984 #endif
5985
5986 #ifndef coff_bfd_is_local_label_name
5987 #define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
5988 #endif
5989
5990 #ifndef coff_bfd_is_target_special_symbol
5991 #define coff_bfd_is_target_special_symbol   ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
5992 #endif
5993
5994 #ifndef coff_read_minisymbols
5995 #define coff_read_minisymbols               _bfd_generic_read_minisymbols
5996 #endif
5997
5998 #ifndef coff_minisymbol_to_symbol
5999 #define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
6000 #endif
6001
6002 /* The reloc lookup routine must be supplied by each individual COFF
6003    backend.  */
6004 #ifndef coff_bfd_reloc_type_lookup
6005 #define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
6006 #endif
6007 #ifndef coff_bfd_reloc_name_lookup
6008 #define coff_bfd_reloc_name_lookup    _bfd_norelocs_bfd_reloc_name_lookup
6009 #endif
6010
6011 #ifndef coff_bfd_get_relocated_section_contents
6012 #define coff_bfd_get_relocated_section_contents \
6013   bfd_generic_get_relocated_section_contents
6014 #endif
6015
6016 #ifndef coff_bfd_relax_section
6017 #define coff_bfd_relax_section              bfd_generic_relax_section
6018 #endif
6019
6020 #ifndef coff_bfd_gc_sections
6021 #define coff_bfd_gc_sections                bfd_coff_gc_sections
6022 #endif
6023
6024 #ifndef coff_bfd_lookup_section_flags
6025 #define coff_bfd_lookup_section_flags       bfd_generic_lookup_section_flags
6026 #endif
6027
6028 #ifndef coff_bfd_merge_sections
6029 #define coff_bfd_merge_sections             bfd_generic_merge_sections
6030 #endif
6031
6032 #ifndef coff_bfd_is_group_section
6033 #define coff_bfd_is_group_section           bfd_generic_is_group_section
6034 #endif
6035
6036 #ifndef coff_bfd_discard_group
6037 #define coff_bfd_discard_group              bfd_generic_discard_group
6038 #endif
6039
6040 #ifndef coff_section_already_linked
6041 #define coff_section_already_linked \
6042   _bfd_coff_section_already_linked
6043 #endif
6044
6045 #ifndef coff_bfd_define_common_symbol
6046 #define coff_bfd_define_common_symbol       bfd_generic_define_common_symbol
6047 #endif
6048
6049 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)     \
6050 const bfd_target VAR =                                                  \
6051 {                                                                       \
6052   NAME ,                                                                \
6053   bfd_target_coff_flavour,                                              \
6054   BFD_ENDIAN_BIG,               /* Data byte order is big.  */          \
6055   BFD_ENDIAN_BIG,               /* Header byte order is big.  */        \
6056   /* object flags */                                                    \
6057   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
6058    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
6059   /* section flags */                                                   \
6060   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
6061   UNDER,                        /* Leading symbol underscore.  */       \
6062   '/',                          /* AR_pad_char.  */                     \
6063   15,                           /* AR_max_namelen.  */                  \
6064   0,                            /* match priority.  */                  \
6065                                                                         \
6066   /* Data conversion functions.  */                                     \
6067   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
6068   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
6069   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
6070                                                                         \
6071   /* Header conversion functions.  */                                   \
6072   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
6073   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
6074   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
6075                                                                         \
6076         /* bfd_check_format.  */                                        \
6077   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
6078     _bfd_dummy_target },                                                \
6079         /* bfd_set_format.  */                                          \
6080   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
6081         /* bfd_write_contents.  */                                      \
6082   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
6083     bfd_false },                                                        \
6084                                                                         \
6085   BFD_JUMP_TABLE_GENERIC (coff),                                        \
6086   BFD_JUMP_TABLE_COPY (coff),                                           \
6087   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
6088   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
6089   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
6090   BFD_JUMP_TABLE_RELOCS (coff),                                         \
6091   BFD_JUMP_TABLE_WRITE (coff),                                          \
6092   BFD_JUMP_TABLE_LINK (coff),                                           \
6093   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
6094                                                                         \
6095   ALTERNATIVE,                                                          \
6096                                                                         \
6097   SWAP_TABLE                                                            \
6098 };
6099
6100 #define CREATE_BIGHDR_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)  \
6101 const bfd_target VAR =                                                  \
6102 {                                                                       \
6103   NAME ,                                                                \
6104   bfd_target_coff_flavour,                                              \
6105   BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */       \
6106   BFD_ENDIAN_BIG,               /* Header byte order is big.  */        \
6107   /* object flags */                                                    \
6108   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
6109    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
6110   /* section flags */                                                   \
6111   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
6112   UNDER,                        /* Leading symbol underscore.  */       \
6113   '/',                          /* AR_pad_char.  */                     \
6114   15,                           /* AR_max_namelen.  */                  \
6115   0,                            /* match priority.  */                  \
6116                                                                         \
6117   /* Data conversion functions.  */                                     \
6118   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
6119   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
6120   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
6121                                                                         \
6122   /* Header conversion functions.  */                                   \
6123   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
6124   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
6125   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
6126                                                                         \
6127         /* bfd_check_format.  */                                        \
6128   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
6129     _bfd_dummy_target },                                                \
6130         /* bfd_set_format.  */                                          \
6131   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
6132         /* bfd_write_contents.  */                                      \
6133   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
6134     bfd_false },                                                        \
6135                                                                         \
6136   BFD_JUMP_TABLE_GENERIC (coff),                                        \
6137   BFD_JUMP_TABLE_COPY (coff),                                           \
6138   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
6139   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
6140   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
6141   BFD_JUMP_TABLE_RELOCS (coff),                                         \
6142   BFD_JUMP_TABLE_WRITE (coff),                                          \
6143   BFD_JUMP_TABLE_LINK (coff),                                           \
6144   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
6145                                                                         \
6146   ALTERNATIVE,                                                          \
6147                                                                         \
6148   SWAP_TABLE                                                            \
6149 };
6150
6151 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)  \
6152 const bfd_target VAR =                                                  \
6153 {                                                                       \
6154   NAME ,                                                                \
6155   bfd_target_coff_flavour,                                              \
6156   BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */       \
6157   BFD_ENDIAN_LITTLE,            /* Header byte order is little.  */     \
6158         /* object flags */                                              \
6159   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
6160    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
6161         /* section flags */                                             \
6162   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
6163   UNDER,                        /* Leading symbol underscore.  */       \
6164   '/',                          /* AR_pad_char.  */                     \
6165   15,                           /* AR_max_namelen.  */                  \
6166   0,                            /* match priority.  */                  \
6167                                                                         \
6168   /* Data conversion functions.  */                                     \
6169   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
6170   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
6171   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
6172   /* Header conversion functions.  */                                   \
6173   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
6174   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
6175   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
6176         /* bfd_check_format.  */                                        \
6177   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
6178     _bfd_dummy_target },                                                \
6179        /* bfd_set_format.  */                                           \
6180   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
6181         /* bfd_write_contents.  */                                      \
6182   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
6183     bfd_false },                                                        \
6184                                                                         \
6185   BFD_JUMP_TABLE_GENERIC (coff),                                        \
6186   BFD_JUMP_TABLE_COPY (coff),                                           \
6187   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
6188   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
6189   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
6190   BFD_JUMP_TABLE_RELOCS (coff),                                         \
6191   BFD_JUMP_TABLE_WRITE (coff),                                          \
6192   BFD_JUMP_TABLE_LINK (coff),                                           \
6193   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
6194                                                                         \
6195   ALTERNATIVE,                                                          \
6196                                                                         \
6197   SWAP_TABLE                                                            \
6198 };