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