Remove sh5 and sh64 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     default:                    /* Unreadable input file type.  */
2351       arch = bfd_arch_obscure;
2352       break;
2353     }
2354
2355   bfd_default_set_arch_mach (abfd, arch, machine);
2356   return TRUE;
2357 }
2358
2359 static bfd_boolean
2360 symname_in_debug_hook (bfd *abfd ATTRIBUTE_UNUSED,
2361                        struct internal_syment *sym ATTRIBUTE_UNUSED)
2362 {
2363 #ifdef SYMNAME_IN_DEBUG
2364   return SYMNAME_IN_DEBUG (sym) != 0;
2365 #else
2366   return FALSE;
2367 #endif
2368 }
2369
2370 #ifdef RS6000COFF_C
2371
2372 #ifdef XCOFF64
2373 #define FORCE_SYMNAMES_IN_STRINGS
2374 #endif
2375
2376 /* Handle the csect auxent of a C_EXT, C_AIX_WEAKEXT or C_HIDEXT symbol.  */
2377
2378 static bfd_boolean
2379 coff_pointerize_aux_hook (bfd *abfd ATTRIBUTE_UNUSED,
2380                           combined_entry_type *table_base,
2381                           combined_entry_type *symbol,
2382                           unsigned int indaux,
2383                           combined_entry_type *aux)
2384 {
2385   BFD_ASSERT (symbol->is_sym);
2386   int n_sclass = symbol->u.syment.n_sclass;
2387
2388   if (CSECT_SYM_P (n_sclass)
2389       && indaux + 1 == symbol->u.syment.n_numaux)
2390     {
2391       BFD_ASSERT (! aux->is_sym);
2392       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2393         {
2394           aux->u.auxent.x_csect.x_scnlen.p =
2395             table_base + aux->u.auxent.x_csect.x_scnlen.l;
2396           aux->fix_scnlen = 1;
2397         }
2398
2399       /* Return TRUE to indicate that the caller should not do any
2400          further work on this auxent.  */
2401       return TRUE;
2402     }
2403
2404   /* Return FALSE to indicate that this auxent should be handled by
2405      the caller.  */
2406   return FALSE;
2407 }
2408
2409 #else
2410 #define coff_pointerize_aux_hook 0
2411 #endif /* ! RS6000COFF_C */
2412
2413 /* Print an aux entry.  This returns TRUE if it has printed it.  */
2414
2415 static bfd_boolean
2416 coff_print_aux (bfd *abfd ATTRIBUTE_UNUSED,
2417                 FILE *file ATTRIBUTE_UNUSED,
2418                 combined_entry_type *table_base ATTRIBUTE_UNUSED,
2419                 combined_entry_type *symbol ATTRIBUTE_UNUSED,
2420                 combined_entry_type *aux ATTRIBUTE_UNUSED,
2421                 unsigned int indaux ATTRIBUTE_UNUSED)
2422 {
2423   BFD_ASSERT (symbol->is_sym);
2424   BFD_ASSERT (! aux->is_sym);
2425 #ifdef RS6000COFF_C
2426   if (CSECT_SYM_P (symbol->u.syment.n_sclass)
2427       && indaux + 1 == symbol->u.syment.n_numaux)
2428     {
2429       /* This is a csect entry.  */
2430       fprintf (file, "AUX ");
2431       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2432         {
2433           BFD_ASSERT (! aux->fix_scnlen);
2434           fprintf (file, "val %5" BFD_VMA_FMT "d",
2435                    aux->u.auxent.x_csect.x_scnlen.l);
2436         }
2437       else
2438         {
2439           fprintf (file, "indx ");
2440           if (! aux->fix_scnlen)
2441             fprintf (file, "%4" BFD_VMA_FMT "d",
2442                      aux->u.auxent.x_csect.x_scnlen.l);
2443           else
2444             fprintf (file, "%4ld",
2445                      (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2446         }
2447       fprintf (file,
2448                " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2449                aux->u.auxent.x_csect.x_parmhash,
2450                (unsigned int) aux->u.auxent.x_csect.x_snhash,
2451                SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2452                SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2453                (unsigned int) aux->u.auxent.x_csect.x_smclas,
2454                aux->u.auxent.x_csect.x_stab,
2455                (unsigned int) aux->u.auxent.x_csect.x_snstab);
2456       return TRUE;
2457     }
2458 #endif
2459
2460   /* Return FALSE to indicate that no special action was taken.  */
2461   return FALSE;
2462 }
2463
2464 /*
2465 SUBSUBSECTION
2466         Writing relocations
2467
2468         To write relocations, the back end steps though the
2469         canonical relocation table and create an
2470         @code{internal_reloc}. The symbol index to use is removed from
2471         the @code{offset} field in the symbol table supplied.  The
2472         address comes directly from the sum of the section base
2473         address and the relocation offset; the type is dug directly
2474         from the howto field.  Then the @code{internal_reloc} is
2475         swapped into the shape of an @code{external_reloc} and written
2476         out to disk.
2477
2478 */
2479
2480 #ifdef TARG_AUX
2481
2482
2483 /* AUX's ld wants relocations to be sorted.  */
2484 static int
2485 compare_arelent_ptr (const void * x, const void * y)
2486 {
2487   const arelent **a = (const arelent **) x;
2488   const arelent **b = (const arelent **) y;
2489   bfd_size_type aadr = (*a)->address;
2490   bfd_size_type badr = (*b)->address;
2491
2492   return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2493 }
2494
2495 #endif /* TARG_AUX */
2496
2497 static bfd_boolean
2498 coff_write_relocs (bfd * abfd, int first_undef)
2499 {
2500   asection *s;
2501
2502   for (s = abfd->sections; s != NULL; s = s->next)
2503     {
2504       unsigned int i;
2505       struct external_reloc dst;
2506       arelent **p;
2507
2508 #ifndef TARG_AUX
2509       p = s->orelocation;
2510 #else
2511       {
2512         /* Sort relocations before we write them out.  */
2513         bfd_size_type amt;
2514
2515         amt = s->reloc_count;
2516         amt *= sizeof (arelent *);
2517         p = bfd_malloc (amt);
2518         if (p == NULL)
2519           {
2520             if (s->reloc_count > 0)
2521               return FALSE;
2522           }
2523         else
2524           {
2525             memcpy (p, s->orelocation, (size_t) amt);
2526             qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2527           }
2528       }
2529 #endif
2530
2531       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2532         return FALSE;
2533
2534 #ifdef COFF_WITH_PE
2535       if (obj_pe (abfd) && s->reloc_count >= 0xffff)
2536         {
2537           /* Encode real count here as first reloc.  */
2538           struct internal_reloc n;
2539
2540           memset (& n, 0, sizeof (n));
2541           /* Add one to count *this* reloc (grr).  */
2542           n.r_vaddr = s->reloc_count + 1;
2543           coff_swap_reloc_out (abfd, &n, &dst);
2544           if (bfd_bwrite (& dst, (bfd_size_type) bfd_coff_relsz (abfd),
2545                           abfd) != bfd_coff_relsz (abfd))
2546             return FALSE;
2547         }
2548 #endif
2549
2550       for (i = 0; i < s->reloc_count; i++)
2551         {
2552           struct internal_reloc n;
2553           arelent *q = p[i];
2554
2555           memset (& n, 0, sizeof (n));
2556
2557           /* Now we've renumbered the symbols we know where the
2558              undefined symbols live in the table.  Check the reloc
2559              entries for symbols who's output bfd isn't the right one.
2560              This is because the symbol was undefined (which means
2561              that all the pointers are never made to point to the same
2562              place). This is a bad thing,'cause the symbols attached
2563              to the output bfd are indexed, so that the relocation
2564              entries know which symbol index they point to.  So we
2565              have to look up the output symbol here.  */
2566
2567           if (q->sym_ptr_ptr[0] != NULL && q->sym_ptr_ptr[0]->the_bfd != abfd)
2568             {
2569               int j;
2570               const char *sname = q->sym_ptr_ptr[0]->name;
2571               asymbol **outsyms = abfd->outsymbols;
2572
2573               for (j = first_undef; outsyms[j]; j++)
2574                 {
2575                   const char *intable = outsyms[j]->name;
2576
2577                   if (strcmp (intable, sname) == 0)
2578                     {
2579                       /* Got a hit, so repoint the reloc.  */
2580                       q->sym_ptr_ptr = outsyms + j;
2581                       break;
2582                     }
2583                 }
2584             }
2585
2586           n.r_vaddr = q->address + s->vma;
2587
2588 #ifdef R_IHCONST
2589           /* The 29k const/consth reloc pair is a real kludge.  The consth
2590              part doesn't have a symbol; it has an offset.  So rebuilt
2591              that here.  */
2592           if (q->howto->type == R_IHCONST)
2593             n.r_symndx = q->addend;
2594           else
2595 #endif
2596             if (q->sym_ptr_ptr && q->sym_ptr_ptr[0] != NULL)
2597               {
2598 #ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
2599                 if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q, s))
2600 #else
2601                 if ((*q->sym_ptr_ptr)->section == bfd_abs_section_ptr
2602                     && ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0)
2603 #endif
2604                   /* This is a relocation relative to the absolute symbol.  */
2605                   n.r_symndx = -1;
2606                 else
2607                   {
2608                     n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2609                     /* Check to see if the symbol reloc points to a symbol
2610                        we don't have in our symbol table.  */
2611                     if (n.r_symndx > obj_conv_table_size (abfd))
2612                       {
2613                         bfd_set_error (bfd_error_bad_value);
2614                         /* xgettext:c-format */
2615                         _bfd_error_handler (_("%pB: reloc against a non-existent"
2616                                               " symbol index: %ld"),
2617                                             abfd, n.r_symndx);
2618                         return FALSE;
2619                       }
2620                   }
2621               }
2622
2623 #ifdef SWAP_OUT_RELOC_OFFSET
2624           n.r_offset = q->addend;
2625 #endif
2626
2627 #ifdef SELECT_RELOC
2628           /* Work out reloc type from what is required.  */
2629           SELECT_RELOC (n, q->howto);
2630 #else
2631           n.r_type = q->howto->type;
2632 #endif
2633           coff_swap_reloc_out (abfd, &n, &dst);
2634
2635           if (bfd_bwrite (& dst, (bfd_size_type) bfd_coff_relsz (abfd),
2636                          abfd) != bfd_coff_relsz (abfd))
2637             return FALSE;
2638         }
2639
2640 #ifdef TARG_AUX
2641       if (p != NULL)
2642         free (p);
2643 #endif
2644     }
2645
2646   return TRUE;
2647 }
2648
2649 /* Set flags and magic number of a coff file from architecture and machine
2650    type.  Result is TRUE if we can represent the arch&type, FALSE if not.  */
2651
2652 static bfd_boolean
2653 coff_set_flags (bfd * abfd,
2654                 unsigned int *magicp ATTRIBUTE_UNUSED,
2655                 unsigned short *flagsp ATTRIBUTE_UNUSED)
2656 {
2657   switch (bfd_get_arch (abfd))
2658     {
2659 #ifdef Z80MAGIC
2660     case bfd_arch_z80:
2661       *magicp = Z80MAGIC;
2662       switch (bfd_get_mach (abfd))
2663         {
2664         case 0:
2665         case bfd_mach_z80strict:
2666         case bfd_mach_z80:
2667         case bfd_mach_z80full:
2668         case bfd_mach_r800:
2669           *flagsp = bfd_get_mach (abfd) << 12;
2670           break;
2671         default:
2672           return FALSE;
2673         }
2674       return TRUE;
2675 #endif
2676
2677 #ifdef Z8KMAGIC
2678     case bfd_arch_z8k:
2679       *magicp = Z8KMAGIC;
2680
2681       switch (bfd_get_mach (abfd))
2682         {
2683         case bfd_mach_z8001: *flagsp = F_Z8001; break;
2684         case bfd_mach_z8002: *flagsp = F_Z8002; break;
2685         default:             return FALSE;
2686         }
2687       return TRUE;
2688 #endif
2689
2690 #ifdef TIC30MAGIC
2691     case bfd_arch_tic30:
2692       *magicp = TIC30MAGIC;
2693       return TRUE;
2694 #endif
2695
2696 #ifdef TICOFF_DEFAULT_MAGIC
2697     case TICOFF_TARGET_ARCH:
2698       /* If there's no indication of which version we want, use the default.  */
2699       if (!abfd->xvec )
2700         *magicp = TICOFF_DEFAULT_MAGIC;
2701       else
2702         {
2703           /* We may want to output in a different COFF version.  */
2704           switch (abfd->xvec->name[4])
2705             {
2706             case '0':
2707               *magicp = TICOFF0MAGIC;
2708               break;
2709             case '1':
2710               *magicp = TICOFF1MAGIC;
2711               break;
2712             case '2':
2713               *magicp = TICOFF2MAGIC;
2714               break;
2715             default:
2716               return FALSE;
2717             }
2718         }
2719       TICOFF_TARGET_MACHINE_SET (flagsp, bfd_get_mach (abfd));
2720       return TRUE;
2721 #endif
2722
2723 #ifdef TIC80_ARCH_MAGIC
2724     case bfd_arch_tic80:
2725       *magicp = TIC80_ARCH_MAGIC;
2726       return TRUE;
2727 #endif
2728
2729 #ifdef ARMMAGIC
2730     case bfd_arch_arm:
2731 #ifdef ARM_WINCE
2732       * magicp = ARMPEMAGIC;
2733 #else
2734       * magicp = ARMMAGIC;
2735 #endif
2736       * flagsp = 0;
2737       if (APCS_SET (abfd))
2738         {
2739           if (APCS_26_FLAG (abfd))
2740             * flagsp |= F_APCS26;
2741
2742           if (APCS_FLOAT_FLAG (abfd))
2743             * flagsp |= F_APCS_FLOAT;
2744
2745           if (PIC_FLAG (abfd))
2746             * flagsp |= F_PIC;
2747         }
2748       if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2749         * flagsp |= F_INTERWORK;
2750       switch (bfd_get_mach (abfd))
2751         {
2752         case bfd_mach_arm_2:  * flagsp |= F_ARM_2;  break;
2753         case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2754         case bfd_mach_arm_3:  * flagsp |= F_ARM_3;  break;
2755         case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2756         case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
2757         case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2758         case bfd_mach_arm_5:  * flagsp |= F_ARM_5;  break;
2759           /* FIXME: we do not have F_ARM vaues greater than F_ARM_5.
2760              See also the comment in coff_set_arch_mach_hook().  */
2761         case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break;
2762         case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
2763         case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
2764         }
2765       return TRUE;
2766 #endif
2767
2768 #ifdef PPCMAGIC
2769     case bfd_arch_powerpc:
2770       *magicp = PPCMAGIC;
2771       return TRUE;
2772 #endif
2773
2774 #if defined(I386MAGIC) || defined(AMD64MAGIC)
2775     case bfd_arch_i386:
2776 #if defined(I386MAGIC)
2777       *magicp = I386MAGIC;
2778 #endif
2779 #if defined LYNXOS
2780       /* Just overwrite the usual value if we're doing Lynx.  */
2781       *magicp = LYNXCOFFMAGIC;
2782 #endif
2783 #if defined AMD64MAGIC
2784       *magicp = AMD64MAGIC;
2785 #endif
2786       return TRUE;
2787 #endif
2788
2789 #ifdef IA64MAGIC
2790     case bfd_arch_ia64:
2791       *magicp = IA64MAGIC;
2792       return TRUE;
2793 #endif
2794
2795 #ifdef MC68MAGIC
2796     case bfd_arch_m68k:
2797 #ifdef APOLLOM68KMAGIC
2798       *magicp = APOLLO_COFF_VERSION_NUMBER;
2799 #else
2800       /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c.  */
2801 #ifdef NAMES_HAVE_UNDERSCORE
2802       *magicp = MC68KBCSMAGIC;
2803 #else
2804       *magicp = MC68MAGIC;
2805 #endif
2806 #endif
2807 #ifdef LYNXOS
2808       /* Just overwrite the usual value if we're doing Lynx.  */
2809       *magicp = LYNXCOFFMAGIC;
2810 #endif
2811       return TRUE;
2812 #endif
2813
2814 #ifdef SH_ARCH_MAGIC_BIG
2815     case bfd_arch_sh:
2816 #ifdef COFF_IMAGE_WITH_PE
2817       *magicp = SH_ARCH_MAGIC_WINCE;
2818 #else
2819       if (bfd_big_endian (abfd))
2820         *magicp = SH_ARCH_MAGIC_BIG;
2821       else
2822         *magicp = SH_ARCH_MAGIC_LITTLE;
2823 #endif
2824       return TRUE;
2825 #endif
2826
2827 #ifdef MIPS_ARCH_MAGIC_WINCE
2828     case bfd_arch_mips:
2829       *magicp = MIPS_ARCH_MAGIC_WINCE;
2830       return TRUE;
2831 #endif
2832
2833 #ifdef SPARCMAGIC
2834     case bfd_arch_sparc:
2835       *magicp = SPARCMAGIC;
2836 #ifdef LYNXOS
2837       /* Just overwrite the usual value if we're doing Lynx.  */
2838       *magicp = LYNXCOFFMAGIC;
2839 #endif
2840       return TRUE;
2841 #endif
2842
2843 #ifdef RS6000COFF_C
2844     case bfd_arch_rs6000:
2845 #ifndef PPCMAGIC
2846     case bfd_arch_powerpc:
2847 #endif
2848       BFD_ASSERT (bfd_get_flavour (abfd) == bfd_target_xcoff_flavour);
2849       *magicp = bfd_xcoff_magic_number (abfd);
2850       return TRUE;
2851 #endif
2852
2853 #ifdef MCOREMAGIC
2854     case bfd_arch_mcore:
2855       * magicp = MCOREMAGIC;
2856       return TRUE;
2857 #endif
2858
2859     default:                    /* Unknown architecture.  */
2860       /* Fall through to "return FALSE" below, to avoid
2861          "statement never reached" errors on the one below.  */
2862       break;
2863     }
2864
2865   return FALSE;
2866 }
2867
2868 static bfd_boolean
2869 coff_set_arch_mach (bfd * abfd,
2870                     enum bfd_architecture arch,
2871                     unsigned long machine)
2872 {
2873   unsigned dummy1;
2874   unsigned short dummy2;
2875
2876   if (! bfd_default_set_arch_mach (abfd, arch, machine))
2877     return FALSE;
2878
2879   if (arch != bfd_arch_unknown
2880       && ! coff_set_flags (abfd, &dummy1, &dummy2))
2881     return FALSE;               /* We can't represent this type.  */
2882
2883   return TRUE;                  /* We're easy...  */
2884 }
2885
2886 #ifdef COFF_IMAGE_WITH_PE
2887
2888 /* This is used to sort sections by VMA, as required by PE image
2889    files.  */
2890
2891 static int
2892 sort_by_secaddr (const void * arg1, const void * arg2)
2893 {
2894   const asection *a = *(const asection **) arg1;
2895   const asection *b = *(const asection **) arg2;
2896
2897   if (a->vma < b->vma)
2898     return -1;
2899   else if (a->vma > b->vma)
2900     return 1;
2901
2902   return 0;
2903 }
2904
2905 #endif /* COFF_IMAGE_WITH_PE */
2906
2907 /* Calculate the file position for each section.  */
2908
2909 #define ALIGN_SECTIONS_IN_FILE
2910 #if defined(TIC80COFF) || defined(TICOFF)
2911 #undef ALIGN_SECTIONS_IN_FILE
2912 #endif
2913
2914 static bfd_boolean
2915 coff_compute_section_file_positions (bfd * abfd)
2916 {
2917   asection *current;
2918   file_ptr sofar = bfd_coff_filhsz (abfd);
2919   bfd_boolean align_adjust;
2920   unsigned int target_index;
2921 #ifdef ALIGN_SECTIONS_IN_FILE
2922   asection *previous = NULL;
2923   file_ptr old_sofar;
2924 #endif
2925
2926 #ifdef COFF_IMAGE_WITH_PE
2927   int page_size;
2928
2929   if (coff_data (abfd)->link_info
2930       || (pe_data (abfd) && pe_data (abfd)->pe_opthdr.FileAlignment))
2931     {
2932       page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2933
2934       /* If no file alignment has been set, default to one.
2935          This repairs 'ld -r' for arm-wince-pe target.  */
2936       if (page_size == 0)
2937         page_size = 1;
2938
2939       /* PR 17512: file: 0ac816d3.  */
2940       if (page_size < 0)
2941         {
2942           bfd_set_error (bfd_error_file_too_big);
2943           _bfd_error_handler
2944             /* xgettext:c-format */
2945             (_("%pB: page size is too large (0x%x)"), abfd, page_size);
2946           return FALSE;
2947         }
2948     }
2949   else
2950     page_size = PE_DEF_FILE_ALIGNMENT;
2951 #else
2952 #ifdef COFF_PAGE_SIZE
2953   int page_size = COFF_PAGE_SIZE;
2954 #endif
2955 #endif
2956
2957 #ifdef RS6000COFF_C
2958   /* On XCOFF, if we have symbols, set up the .debug section.  */
2959   if (bfd_get_symcount (abfd) > 0)
2960     {
2961       bfd_size_type sz;
2962       bfd_size_type i, symcount;
2963       asymbol **symp;
2964
2965       sz = 0;
2966       symcount = bfd_get_symcount (abfd);
2967       for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2968         {
2969           coff_symbol_type *cf;
2970
2971           cf = coff_symbol_from (*symp);
2972           if (cf != NULL
2973               && cf->native != NULL
2974               && cf->native->is_sym
2975               && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2976             {
2977               size_t len;
2978
2979               len = strlen (bfd_asymbol_name (*symp));
2980               if (len > SYMNMLEN || bfd_coff_force_symnames_in_strings (abfd))
2981                 sz += len + 1 + bfd_coff_debug_string_prefix_length (abfd);
2982             }
2983         }
2984       if (sz > 0)
2985         {
2986           asection *dsec;
2987
2988           dsec = bfd_make_section_old_way (abfd, DOT_DEBUG);
2989           if (dsec == NULL)
2990             abort ();
2991           dsec->size = sz;
2992           dsec->flags |= SEC_HAS_CONTENTS;
2993         }
2994     }
2995 #endif
2996
2997   if (bfd_get_start_address (abfd))
2998     /*  A start address may have been added to the original file. In this
2999         case it will need an optional header to record it.  */
3000     abfd->flags |= EXEC_P;
3001
3002   if (abfd->flags & EXEC_P)
3003     sofar += bfd_coff_aoutsz (abfd);
3004 #ifdef RS6000COFF_C
3005   else if (xcoff_data (abfd)->full_aouthdr)
3006     sofar += bfd_coff_aoutsz (abfd);
3007   else
3008     sofar += SMALL_AOUTSZ;
3009 #endif
3010
3011   sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
3012
3013 #ifdef RS6000COFF_C
3014   /* XCOFF handles overflows in the reloc and line number count fields
3015      by allocating a new section header to hold the correct counts.  */
3016   for (current = abfd->sections; current != NULL; current = current->next)
3017     if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3018       sofar += bfd_coff_scnhsz (abfd);
3019 #endif
3020
3021 #ifdef COFF_IMAGE_WITH_PE
3022   {
3023     /* PE requires the sections to be in memory order when listed in
3024        the section headers.  It also does not like empty loadable
3025        sections.  The sections apparently do not have to be in the
3026        right order in the image file itself, but we do need to get the
3027        target_index values right.  */
3028
3029     unsigned int count;
3030     asection **section_list;
3031     unsigned int i;
3032     bfd_size_type amt;
3033
3034 #ifdef COFF_PAGE_SIZE
3035     /* Clear D_PAGED if section alignment is smaller than
3036        COFF_PAGE_SIZE.  */
3037    if (pe_data (abfd)->pe_opthdr.SectionAlignment < COFF_PAGE_SIZE)
3038      abfd->flags &= ~D_PAGED;
3039 #endif
3040
3041     count = 0;
3042     for (current = abfd->sections; current != NULL; current = current->next)
3043       ++count;
3044
3045     /* We allocate an extra cell to simplify the final loop.  */
3046     amt = sizeof (struct asection *) * (count + 1);
3047     section_list = (asection **) bfd_malloc (amt);
3048     if (section_list == NULL)
3049       return FALSE;
3050
3051     i = 0;
3052     for (current = abfd->sections; current != NULL; current = current->next)
3053       {
3054         section_list[i] = current;
3055         ++i;
3056       }
3057     section_list[i] = NULL;
3058
3059     qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
3060
3061     /* Rethread the linked list into sorted order; at the same time,
3062        assign target_index values.  */
3063     target_index = 1;
3064     abfd->sections = NULL;
3065     abfd->section_last = NULL;
3066     for (i = 0; i < count; i++)
3067       {
3068         current = section_list[i];
3069         bfd_section_list_append (abfd, current);
3070
3071         /* Later, if the section has zero size, we'll be throwing it
3072            away, so we don't want to number it now.  Note that having
3073            a zero size and having real contents are different
3074            concepts: .bss has no contents, but (usually) non-zero
3075            size.  */
3076         if (current->size == 0)
3077           {
3078             /* Discard.  However, it still might have (valid) symbols
3079                in it, so arbitrarily set it to section 1 (indexing is
3080                1-based here; usually .text).  __end__ and other
3081                contents of .endsection really have this happen.
3082                FIXME: This seems somewhat dubious.  */
3083             current->target_index = 1;
3084           }
3085         else
3086           current->target_index = target_index++;
3087       }
3088
3089     free (section_list);
3090   }
3091 #else /* ! COFF_IMAGE_WITH_PE */
3092   {
3093     /* Set the target_index field.  */
3094     target_index = 1;
3095     for (current = abfd->sections; current != NULL; current = current->next)
3096       current->target_index = target_index++;
3097   }
3098 #endif /* ! COFF_IMAGE_WITH_PE */
3099
3100   if (target_index >= bfd_coff_max_nscns (abfd))
3101     {
3102       bfd_set_error (bfd_error_file_too_big);
3103       _bfd_error_handler
3104         /* xgettext:c-format */
3105         (_("%pB: too many sections (%d)"), abfd, target_index);
3106       return FALSE;
3107     }
3108
3109   align_adjust = FALSE;
3110   for (current = abfd->sections;
3111        current != NULL;
3112        current = current->next)
3113     {
3114 #ifdef COFF_IMAGE_WITH_PE
3115       /* With PE we have to pad each section to be a multiple of its
3116          page size too, and remember both sizes.  */
3117       if (coff_section_data (abfd, current) == NULL)
3118         {
3119           bfd_size_type amt = sizeof (struct coff_section_tdata);
3120
3121           current->used_by_bfd = bfd_zalloc (abfd, amt);
3122           if (current->used_by_bfd == NULL)
3123             return FALSE;
3124         }
3125       if (pei_section_data (abfd, current) == NULL)
3126         {
3127           bfd_size_type amt = sizeof (struct pei_section_tdata);
3128
3129           coff_section_data (abfd, current)->tdata = bfd_zalloc (abfd, amt);
3130           if (coff_section_data (abfd, current)->tdata == NULL)
3131             return FALSE;
3132         }
3133       if (pei_section_data (abfd, current)->virt_size == 0)
3134         pei_section_data (abfd, current)->virt_size = current->size;
3135 #endif
3136
3137       /* Only deal with sections which have contents.  */
3138       if (!(current->flags & SEC_HAS_CONTENTS))
3139         continue;
3140
3141       current->rawsize = current->size;
3142
3143 #ifdef COFF_IMAGE_WITH_PE
3144       /* Make sure we skip empty sections in a PE image.  */
3145       if (current->size == 0)
3146         continue;
3147 #endif
3148
3149       /* Align the sections in the file to the same boundary on
3150          which they are aligned in virtual memory.  */
3151 #ifdef ALIGN_SECTIONS_IN_FILE
3152       if ((abfd->flags & EXEC_P) != 0)
3153         {
3154           /* Make sure this section is aligned on the right boundary - by
3155              padding the previous section up if necessary.  */
3156           old_sofar = sofar;
3157
3158           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3159
3160 #ifdef RS6000COFF_C
3161           /* Make sure the file offset and the vma of .text/.data are at the
3162              same page offset, so that the file can be mmap'ed without being
3163              relocated.  Failing that, AIX is able to load and execute the
3164              program, but it will be silently relocated (possible as
3165              executables are PIE).  But the relocation is slightly costly and
3166              complexify the use of addr2line or gdb.  So better to avoid it,
3167              like does the native linker.  Usually gnu ld makes sure that
3168              the vma of .text is the file offset so this issue shouldn't
3169              appear unless you are stripping such an executable.
3170
3171              AIX loader checks the text section alignment of (vma - filepos),
3172              and the native linker doesn't try to align the text sections.
3173              For example:
3174
3175              0 .text         000054cc  10000128  10000128  00000128  2**5
3176                              CONTENTS, ALLOC, LOAD, CODE
3177           */
3178
3179           if (!strcmp (current->name, _TEXT)
3180               || !strcmp (current->name, _DATA))
3181             {
3182               bfd_vma align = 4096;
3183               bfd_vma sofar_off = sofar % align;
3184               bfd_vma vma_off = current->vma % align;
3185
3186               if (vma_off > sofar_off)
3187                 sofar += vma_off - sofar_off;
3188               else if (vma_off < sofar_off)
3189                 sofar += align + vma_off - sofar_off;
3190             }
3191 #endif
3192           if (previous != NULL)
3193             previous->size += sofar - old_sofar;
3194         }
3195
3196 #endif
3197
3198       /* In demand paged files the low order bits of the file offset
3199          must match the low order bits of the virtual address.  */
3200 #ifdef COFF_PAGE_SIZE
3201       if ((abfd->flags & D_PAGED) != 0
3202           && (current->flags & SEC_ALLOC) != 0)
3203         sofar += (current->vma - (bfd_vma) sofar) % page_size;
3204 #endif
3205       current->filepos = sofar;
3206
3207 #ifdef COFF_IMAGE_WITH_PE
3208       /* Set the padded size.  */
3209       current->size = (current->size + page_size - 1) & -page_size;
3210 #endif
3211
3212       sofar += current->size;
3213
3214 #ifdef ALIGN_SECTIONS_IN_FILE
3215       /* Make sure that this section is of the right size too.  */
3216       if ((abfd->flags & EXEC_P) == 0)
3217         {
3218           bfd_size_type old_size;
3219
3220           old_size = current->size;
3221           current->size = BFD_ALIGN (current->size,
3222                                      1 << current->alignment_power);
3223           align_adjust = current->size != old_size;
3224           sofar += current->size - old_size;
3225         }
3226       else
3227         {
3228           old_sofar = sofar;
3229           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3230           align_adjust = sofar != old_sofar;
3231           current->size += sofar - old_sofar;
3232         }
3233 #endif
3234
3235 #ifdef COFF_IMAGE_WITH_PE
3236       /* For PE we need to make sure we pad out to the aligned
3237          size, in case the caller only writes out data to the
3238          unaligned size.  */
3239       if (pei_section_data (abfd, current)->virt_size < current->size)
3240         align_adjust = TRUE;
3241 #endif
3242
3243 #ifdef _LIB
3244       /* Force .lib sections to start at zero.  The vma is then
3245          incremented in coff_set_section_contents.  This is right for
3246          SVR3.2.  */
3247       if (strcmp (current->name, _LIB) == 0)
3248         (void) bfd_set_section_vma (abfd, current, 0);
3249 #endif
3250
3251 #ifdef ALIGN_SECTIONS_IN_FILE
3252       previous = current;
3253 #endif
3254     }
3255
3256   /* It is now safe to write to the output file.  If we needed an
3257      alignment adjustment for the last section, then make sure that
3258      there is a byte at offset sofar.  If there are no symbols and no
3259      relocs, then nothing follows the last section.  If we don't force
3260      the last byte out, then the file may appear to be truncated.  */
3261   if (align_adjust)
3262     {
3263       bfd_byte b;
3264
3265       b = 0;
3266       if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
3267           || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
3268         return FALSE;
3269     }
3270
3271   /* Make sure the relocations are aligned.  We don't need to make
3272      sure that this byte exists, because it will only matter if there
3273      really are relocs.  */
3274   sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
3275
3276   obj_relocbase (abfd) = sofar;
3277   abfd->output_has_begun = TRUE;
3278
3279   return TRUE;
3280 }
3281
3282 #ifdef COFF_IMAGE_WITH_PE
3283
3284 static unsigned int pelength;
3285 static unsigned int peheader;
3286
3287 static bfd_boolean
3288 coff_read_word (bfd *abfd, unsigned int *value)
3289 {
3290   unsigned char b[2];
3291   int status;
3292
3293   status = bfd_bread (b, (bfd_size_type) 2, abfd);
3294   if (status < 1)
3295     {
3296       *value = 0;
3297       return FALSE;
3298     }
3299
3300   if (status == 1)
3301     *value = (unsigned int) b[0];
3302   else
3303     *value = (unsigned int) (b[0] + (b[1] << 8));
3304
3305   pelength += (unsigned int) status;
3306
3307   return TRUE;
3308 }
3309
3310 static unsigned int
3311 coff_compute_checksum (bfd *abfd)
3312 {
3313   bfd_boolean more_data;
3314   file_ptr filepos;
3315   unsigned int value;
3316   unsigned int total;
3317
3318   total = 0;
3319   pelength = 0;
3320   filepos = (file_ptr) 0;
3321
3322   do
3323     {
3324       if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
3325         return 0;
3326
3327       more_data = coff_read_word (abfd, &value);
3328       total += value;
3329       total = 0xffff & (total + (total >> 0x10));
3330       filepos += 2;
3331     }
3332   while (more_data);
3333
3334   return (0xffff & (total + (total >> 0x10)));
3335 }
3336
3337 static bfd_boolean
3338 coff_apply_checksum (bfd *abfd)
3339 {
3340   unsigned int computed;
3341   unsigned int checksum = 0;
3342
3343   if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0)
3344     return FALSE;
3345
3346   if (!coff_read_word (abfd, &peheader))
3347     return FALSE;
3348
3349   if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
3350     return FALSE;
3351
3352   checksum = 0;
3353   bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
3354
3355   if (bfd_seek (abfd, peheader, SEEK_SET) != 0)
3356     return FALSE;
3357
3358   computed = coff_compute_checksum (abfd);
3359
3360   checksum = computed + pelength;
3361
3362   if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
3363     return FALSE;
3364
3365   bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);
3366
3367   return TRUE;
3368 }
3369
3370 #endif /* COFF_IMAGE_WITH_PE */
3371
3372 static bfd_boolean
3373 coff_write_object_contents (bfd * abfd)
3374 {
3375   asection *current;
3376   bfd_boolean hasrelocs = FALSE;
3377   bfd_boolean haslinno = FALSE;
3378 #ifdef COFF_IMAGE_WITH_PE
3379   bfd_boolean hasdebug = FALSE;
3380 #endif
3381   file_ptr scn_base;
3382   file_ptr reloc_base;
3383   file_ptr lineno_base;
3384   file_ptr sym_base;
3385   unsigned long reloc_size = 0, reloc_count = 0;
3386   unsigned long lnno_size = 0;
3387   bfd_boolean long_section_names;
3388   asection *text_sec = NULL;
3389   asection *data_sec = NULL;
3390   asection *bss_sec = NULL;
3391   struct internal_filehdr internal_f;
3392   struct internal_aouthdr internal_a;
3393 #ifdef COFF_LONG_SECTION_NAMES
3394   size_t string_size = STRING_SIZE_SIZE;
3395 #endif
3396
3397   bfd_set_error (bfd_error_system_call);
3398
3399   /* Make a pass through the symbol table to count line number entries and
3400      put them into the correct asections.  */
3401   lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
3402
3403   if (! abfd->output_has_begun)
3404     {
3405       if (! coff_compute_section_file_positions (abfd))
3406         return FALSE;
3407     }
3408
3409   reloc_base = obj_relocbase (abfd);
3410
3411   /* Work out the size of the reloc and linno areas.  */
3412
3413   for (current = abfd->sections; current != NULL; current =
3414        current->next)
3415     {
3416 #ifdef COFF_WITH_PE
3417       /* We store the actual reloc count in the first reloc's addr.  */
3418       if (obj_pe (abfd) && current->reloc_count >= 0xffff)
3419         reloc_count ++;
3420 #endif
3421       reloc_count += current->reloc_count;
3422     }
3423
3424   reloc_size = reloc_count * bfd_coff_relsz (abfd);
3425
3426   lineno_base = reloc_base + reloc_size;
3427   sym_base = lineno_base + lnno_size;
3428
3429   /* Indicate in each section->line_filepos its actual file address.  */
3430   for (current = abfd->sections; current != NULL; current =
3431        current->next)
3432     {
3433       if (current->lineno_count)
3434         {
3435           current->line_filepos = lineno_base;
3436           current->moving_line_filepos = lineno_base;
3437           lineno_base += current->lineno_count * bfd_coff_linesz (abfd);
3438         }
3439       else
3440         current->line_filepos = 0;
3441
3442       if (current->reloc_count)
3443         {
3444           current->rel_filepos = reloc_base;
3445           reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
3446 #ifdef COFF_WITH_PE
3447           /* Extra reloc to hold real count.  */
3448           if (obj_pe (abfd) && current->reloc_count >= 0xffff)
3449             reloc_base += bfd_coff_relsz (abfd);
3450 #endif
3451         }
3452       else
3453         current->rel_filepos = 0;
3454     }
3455
3456   /* Write section headers to the file.  */
3457   internal_f.f_nscns = 0;
3458
3459   if ((abfd->flags & EXEC_P) != 0)
3460     scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
3461   else
3462     {
3463       scn_base = bfd_coff_filhsz (abfd);
3464 #ifdef RS6000COFF_C
3465 #ifndef XCOFF64
3466       if (xcoff_data (abfd)->full_aouthdr)
3467         scn_base += bfd_coff_aoutsz (abfd);
3468       else
3469         scn_base += SMALL_AOUTSZ;
3470 #endif
3471 #endif
3472     }
3473
3474   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
3475     return FALSE;
3476
3477   long_section_names = FALSE;
3478   for (current = abfd->sections;
3479        current != NULL;
3480        current = current->next)
3481     {
3482       struct internal_scnhdr section;
3483 #ifdef COFF_IMAGE_WITH_PE
3484       bfd_boolean is_reloc_section = FALSE;
3485
3486       if (strcmp (current->name, DOT_RELOC) == 0)
3487         {
3488           is_reloc_section = TRUE;
3489           hasrelocs = TRUE;
3490           pe_data (abfd)->has_reloc_section = 1;
3491         }
3492 #endif
3493
3494       internal_f.f_nscns++;
3495
3496       strncpy (section.s_name, current->name, SCNNMLEN);
3497
3498 #ifdef COFF_LONG_SECTION_NAMES
3499       /* Handle long section names as in PE.  This must be compatible
3500          with the code in coff_write_symbols and _bfd_coff_final_link.  */
3501       if (bfd_coff_long_section_names (abfd))
3502         {
3503           size_t len;
3504
3505           len = strlen (current->name);
3506           if (len > SCNNMLEN)
3507             {
3508               /* The s_name field is defined to be NUL-padded but need not be
3509                  NUL-terminated.  We use a temporary buffer so that we can still
3510                  sprintf all eight chars without splatting a terminating NUL
3511                  over the first byte of the following member (s_paddr).  */
3512               /* PR 21096: The +20 is to stop a bogus warning from gcc7 about
3513                  a possible buffer overflow.  */
3514               char s_name_buf[SCNNMLEN + 1 + 20];
3515
3516               /* An inherent limitation of the /nnnnnnn notation used to indicate
3517                  the offset of the long name in the string table is that we
3518                  cannot address entries beyone the ten million byte boundary.  */
3519               if (string_size >= 10000000)
3520                 {
3521                   bfd_set_error (bfd_error_file_too_big);
3522                   _bfd_error_handler
3523                     /* xgettext:c-format */
3524                     (_("%pB: section %pA: string table overflow at offset %ld"),
3525                     abfd, current, (unsigned long) string_size);
3526                   return FALSE;
3527                 }
3528
3529               /* We do not need to use snprintf here as we have already verfied
3530                  that string_size is not too big, plus we have an overlarge
3531                  buffer, just in case.  */
3532               sprintf (s_name_buf, "/%lu", (unsigned long) string_size);
3533               /* Then strncpy takes care of any padding for us.  */
3534               strncpy (section.s_name, s_name_buf, SCNNMLEN);
3535               string_size += len + 1;
3536               long_section_names = TRUE;
3537             }
3538         }
3539 #endif
3540
3541 #ifdef _LIB
3542       /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
3543          Ian Taylor <ian@cygnus.com>.  */
3544       if (strcmp (current->name, _LIB) == 0)
3545         section.s_vaddr = 0;
3546       else
3547 #endif
3548       section.s_vaddr = current->vma;
3549       section.s_paddr = current->lma;
3550       section.s_size =  current->size;
3551 #ifdef coff_get_section_load_page
3552       section.s_page = coff_get_section_load_page (current);
3553 #else
3554       section.s_page = 0;
3555 #endif
3556
3557 #ifdef COFF_WITH_PE
3558       section.s_paddr = 0;
3559 #endif
3560 #ifdef COFF_IMAGE_WITH_PE
3561       /* Reminder: s_paddr holds the virtual size of the section.  */
3562       if (coff_section_data (abfd, current) != NULL
3563           && pei_section_data (abfd, current) != NULL)
3564         section.s_paddr = pei_section_data (abfd, current)->virt_size;
3565       else
3566         section.s_paddr = 0;
3567 #endif
3568
3569       /* If this section has no size or is unloadable then the scnptr
3570          will be 0 too.  */
3571       if (current->size == 0
3572           || (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3573         section.s_scnptr = 0;
3574       else
3575         section.s_scnptr = current->filepos;
3576
3577       section.s_relptr = current->rel_filepos;
3578       section.s_lnnoptr = current->line_filepos;
3579       section.s_nreloc = current->reloc_count;
3580       section.s_nlnno = current->lineno_count;
3581 #ifndef COFF_IMAGE_WITH_PE
3582       /* In PEI, relocs come in the .reloc section.  */
3583       if (current->reloc_count != 0)
3584         hasrelocs = TRUE;
3585 #endif
3586       if (current->lineno_count != 0)
3587         haslinno = TRUE;
3588 #ifdef COFF_IMAGE_WITH_PE
3589       if ((current->flags & SEC_DEBUGGING) != 0
3590           && ! is_reloc_section)
3591         hasdebug = TRUE;
3592 #endif
3593
3594 #ifdef RS6000COFF_C
3595 #ifndef XCOFF64
3596       /* Indicate the use of an XCOFF overflow section header.  */
3597       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3598         {
3599           section.s_nreloc = 0xffff;
3600           section.s_nlnno = 0xffff;
3601         }
3602 #endif
3603 #endif
3604
3605       section.s_flags = sec_to_styp_flags (current->name, current->flags);
3606
3607       if (!strcmp (current->name, _TEXT))
3608         text_sec = current;
3609       else if (!strcmp (current->name, _DATA))
3610         data_sec = current;
3611       else if (!strcmp (current->name, _BSS))
3612         bss_sec = current;
3613
3614 #ifdef COFF_ENCODE_ALIGNMENT
3615       COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
3616       if ((unsigned int)COFF_DECODE_ALIGNMENT(section.s_flags)
3617           != current->alignment_power)
3618         {
3619           bfd_boolean warn = coff_data (abfd)->link_info
3620             && !bfd_link_relocatable (coff_data (abfd)->link_info);
3621
3622           _bfd_error_handler
3623             /* xgettext:c-format */
3624             (_("%pB:%s section %s: alignment 2**%u not representable"),
3625             abfd, warn ? " warning:" : "", current->name,
3626             current->alignment_power);
3627           if (!warn)
3628             {
3629               bfd_set_error (bfd_error_nonrepresentable_section);
3630               return FALSE;
3631             }
3632         }
3633 #endif
3634
3635 #ifdef COFF_IMAGE_WITH_PE
3636       /* Suppress output of the sections if they are null.  ld
3637          includes the bss and data sections even if there is no size
3638          assigned to them.  NT loader doesn't like it if these section
3639          headers are included if the sections themselves are not
3640          needed.  See also coff_compute_section_file_positions.  */
3641       if (section.s_size == 0)
3642         internal_f.f_nscns--;
3643       else
3644 #endif
3645         {
3646           SCNHDR buff;
3647           bfd_size_type amt = bfd_coff_scnhsz (abfd);
3648
3649           if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3650               || bfd_bwrite (& buff, amt, abfd) != amt)
3651             return FALSE;
3652         }
3653
3654 #ifdef COFF_WITH_PE
3655       /* PE stores COMDAT section information in the symbol table.  If
3656          this section is supposed to have some COMDAT info, track down
3657          the symbol in the symbol table and modify it.  */
3658       if ((current->flags & SEC_LINK_ONCE) != 0)
3659         {
3660           unsigned int i, count;
3661           asymbol **psym;
3662           coff_symbol_type *csym = NULL;
3663           asymbol **psymsec;
3664
3665           psymsec = NULL;
3666           count = bfd_get_symcount (abfd);
3667           for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3668             {
3669               if ((*psym)->section != current)
3670                 continue;
3671
3672               /* Remember the location of the first symbol in this
3673                  section.  */
3674               if (psymsec == NULL)
3675                 psymsec = psym;
3676
3677               /* See if this is the section symbol.  */
3678               if (strcmp ((*psym)->name, current->name) == 0)
3679                 {
3680                   csym = coff_symbol_from (*psym);
3681                   if (csym == NULL
3682                       || csym->native == NULL
3683                       || ! csym->native->is_sym
3684                       || csym->native->u.syment.n_numaux < 1
3685                       || csym->native->u.syment.n_sclass != C_STAT
3686                       || csym->native->u.syment.n_type != T_NULL)
3687                     continue;
3688
3689                   /* Here *PSYM is the section symbol for CURRENT.  */
3690
3691                   break;
3692                 }
3693             }
3694
3695           /* Did we find it?
3696              Note that we might not if we're converting the file from
3697              some other object file format.  */
3698           if (i < count)
3699             {
3700               combined_entry_type *aux;
3701
3702               /* We don't touch the x_checksum field.  The
3703                  x_associated field is not currently supported.  */
3704
3705               aux = csym->native + 1;
3706               BFD_ASSERT (! aux->is_sym);
3707               switch (current->flags & SEC_LINK_DUPLICATES)
3708                 {
3709                 case SEC_LINK_DUPLICATES_DISCARD:
3710                   aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3711                   break;
3712
3713                 case SEC_LINK_DUPLICATES_ONE_ONLY:
3714                   aux->u.auxent.x_scn.x_comdat =
3715                     IMAGE_COMDAT_SELECT_NODUPLICATES;
3716                   break;
3717
3718                 case SEC_LINK_DUPLICATES_SAME_SIZE:
3719                   aux->u.auxent.x_scn.x_comdat =
3720                     IMAGE_COMDAT_SELECT_SAME_SIZE;
3721                   break;
3722
3723                 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3724                   aux->u.auxent.x_scn.x_comdat =
3725                     IMAGE_COMDAT_SELECT_EXACT_MATCH;
3726                   break;
3727                 }
3728
3729               /* The COMDAT symbol must be the first symbol from this
3730                  section in the symbol table.  In order to make this
3731                  work, we move the COMDAT symbol before the first
3732                  symbol we found in the search above.  It's OK to
3733                  rearrange the symbol table at this point, because
3734                  coff_renumber_symbols is going to rearrange it
3735                  further and fix up all the aux entries.  */
3736               if (psym != psymsec)
3737                 {
3738                   asymbol *hold;
3739                   asymbol **pcopy;
3740
3741                   hold = *psym;
3742                   for (pcopy = psym; pcopy > psymsec; pcopy--)
3743                     pcopy[0] = pcopy[-1];
3744                   *psymsec = hold;
3745                 }
3746             }
3747         }
3748 #endif /* COFF_WITH_PE */
3749     }
3750
3751 #ifdef RS6000COFF_C
3752 #ifndef XCOFF64
3753   /* XCOFF handles overflows in the reloc and line number count fields
3754      by creating a new section header to hold the correct values.  */
3755   for (current = abfd->sections; current != NULL; current = current->next)
3756     {
3757       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3758         {
3759           struct internal_scnhdr scnhdr;
3760           SCNHDR buff;
3761           bfd_size_type amt;
3762
3763           internal_f.f_nscns++;
3764           memcpy (scnhdr.s_name, ".ovrflo", 8);
3765           scnhdr.s_paddr = current->reloc_count;
3766           scnhdr.s_vaddr = current->lineno_count;
3767           scnhdr.s_size = 0;
3768           scnhdr.s_scnptr = 0;
3769           scnhdr.s_relptr = current->rel_filepos;
3770           scnhdr.s_lnnoptr = current->line_filepos;
3771           scnhdr.s_nreloc = current->target_index;
3772           scnhdr.s_nlnno = current->target_index;
3773           scnhdr.s_flags = STYP_OVRFLO;
3774           amt = bfd_coff_scnhsz (abfd);
3775           if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3776               || bfd_bwrite (& buff, amt, abfd) != amt)
3777             return FALSE;
3778         }
3779     }
3780 #endif
3781 #endif
3782
3783   /* OK, now set up the filehdr...  */
3784
3785   /* Don't include the internal abs section in the section count */
3786
3787   /* We will NOT put a fucking timestamp in the header here. Every time you
3788      put it back, I will come in and take it out again.  I'm sorry.  This
3789      field does not belong here.  We fill it with a 0 so it compares the
3790      same but is not a reasonable time. -- gnu@cygnus.com  */
3791   internal_f.f_timdat = 0;
3792   internal_f.f_flags = 0;
3793
3794   if (abfd->flags & EXEC_P)
3795     internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3796   else
3797     {
3798       internal_f.f_opthdr = 0;
3799 #ifdef RS6000COFF_C
3800 #ifndef XCOFF64
3801       if (xcoff_data (abfd)->full_aouthdr)
3802         internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3803       else
3804         internal_f.f_opthdr = SMALL_AOUTSZ;
3805 #endif
3806 #endif
3807     }
3808
3809   if (!hasrelocs)
3810     internal_f.f_flags |= F_RELFLG;
3811   if (!haslinno)
3812     internal_f.f_flags |= F_LNNO;
3813   if (abfd->flags & EXEC_P)
3814     internal_f.f_flags |= F_EXEC;
3815 #ifdef COFF_IMAGE_WITH_PE
3816   if (! hasdebug)
3817     internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3818   if (pe_data (abfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
3819     internal_f.f_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
3820 #endif
3821
3822 #ifndef COFF_WITH_pex64
3823 #ifdef COFF_WITH_PE
3824   internal_f.f_flags |= IMAGE_FILE_32BIT_MACHINE;
3825 #else
3826   if (bfd_little_endian (abfd))
3827     internal_f.f_flags |= F_AR32WR;
3828   else
3829     internal_f.f_flags |= F_AR32W;
3830 #endif
3831 #endif
3832
3833 #ifdef TI_TARGET_ID
3834   /* Target id is used in TI COFF v1 and later; COFF0 won't use this field,
3835      but it doesn't hurt to set it internally.  */
3836   internal_f.f_target_id = TI_TARGET_ID;
3837 #endif
3838 #ifdef TIC80_TARGET_ID
3839   internal_f.f_target_id = TIC80_TARGET_ID;
3840 #endif
3841
3842   /* FIXME, should do something about the other byte orders and
3843      architectures.  */
3844
3845 #ifdef RS6000COFF_C
3846   if ((abfd->flags & DYNAMIC) != 0)
3847     internal_f.f_flags |= F_SHROBJ;
3848   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3849     internal_f.f_flags |= F_DYNLOAD;
3850 #endif
3851
3852   memset (&internal_a, 0, sizeof internal_a);
3853
3854   /* Set up architecture-dependent stuff.  */
3855   {
3856     unsigned int magic = 0;
3857     unsigned short flags = 0;
3858
3859     coff_set_flags (abfd, &magic, &flags);
3860     internal_f.f_magic = magic;
3861     internal_f.f_flags |= flags;
3862     /* ...and the "opt"hdr...  */
3863
3864 #ifdef TICOFF_AOUT_MAGIC
3865     internal_a.magic = TICOFF_AOUT_MAGIC;
3866 #define __A_MAGIC_SET__
3867 #endif
3868 #ifdef TIC80COFF
3869     internal_a.magic = TIC80_ARCH_MAGIC;
3870 #define __A_MAGIC_SET__
3871 #endif /* TIC80 */
3872
3873 #if APOLLO_M68
3874 #define __A_MAGIC_SET__
3875     internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3876 #endif
3877
3878 #if defined(M68) || defined(M68K)
3879 #define __A_MAGIC_SET__
3880 #if defined(LYNXOS)
3881     internal_a.magic = LYNXCOFFMAGIC;
3882 #else
3883 #if defined(TARG_AUX)
3884     internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3885                         abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3886                         PAGEMAGICEXECSWAPPED);
3887 #else
3888 #if defined (PAGEMAGICPEXECPAGED)
3889     internal_a.magic = PAGEMAGICPEXECPAGED;
3890 #endif
3891 #endif /* TARG_AUX */
3892 #endif /* LYNXOS */
3893 #endif /* M68 || M68K */
3894
3895 #if defined(ARM)
3896 #define __A_MAGIC_SET__
3897     internal_a.magic = ZMAGIC;
3898 #endif
3899
3900 #if defined(PPC_PE)
3901 #define __A_MAGIC_SET__
3902     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3903 #endif
3904
3905 #if defined MCORE_PE
3906 #define __A_MAGIC_SET__
3907     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3908 #endif
3909
3910 #if defined(I386)
3911 #define __A_MAGIC_SET__
3912 #if defined LYNXOS
3913     internal_a.magic = LYNXCOFFMAGIC;
3914 #elif defined AMD64
3915     internal_a.magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
3916 #else
3917     internal_a.magic = ZMAGIC;
3918 #endif
3919 #endif /* I386 */
3920
3921 #if defined(IA64)
3922 #define __A_MAGIC_SET__
3923     internal_a.magic = PE32PMAGIC;
3924 #endif /* IA64 */
3925
3926 #if defined(SPARC)
3927 #define __A_MAGIC_SET__
3928 #if defined(LYNXOS)
3929     internal_a.magic = LYNXCOFFMAGIC;
3930 #endif /* LYNXOS */
3931 #endif /* SPARC */
3932
3933 #ifdef RS6000COFF_C
3934 #define __A_MAGIC_SET__
3935     internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
3936     (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
3937     RS6K_AOUTHDR_OMAGIC;
3938 #endif
3939
3940 #if defined(SH) && defined(COFF_WITH_PE)
3941 #define __A_MAGIC_SET__
3942     internal_a.magic = SH_PE_MAGIC;
3943 #endif
3944
3945 #if defined(MIPS) && defined(COFF_WITH_PE)
3946 #define __A_MAGIC_SET__
3947     internal_a.magic = MIPS_PE_MAGIC;
3948 #endif
3949
3950 #ifndef __A_MAGIC_SET__
3951 #include "Your aouthdr magic number is not being set!"
3952 #else
3953 #undef __A_MAGIC_SET__
3954 #endif
3955   }
3956
3957   /* FIXME: Does anybody ever set this to another value?  */
3958   internal_a.vstamp = 0;
3959
3960   /* Now should write relocs, strings, syms.  */
3961   obj_sym_filepos (abfd) = sym_base;
3962
3963   if (bfd_get_symcount (abfd) != 0)
3964     {
3965       int firstundef;
3966
3967       if (!coff_renumber_symbols (abfd, &firstundef))
3968         return FALSE;
3969       coff_mangle_symbols (abfd);
3970       if (! coff_write_symbols (abfd))
3971         return FALSE;
3972       if (! coff_write_linenumbers (abfd))
3973         return FALSE;
3974       if (! coff_write_relocs (abfd, firstundef))
3975         return FALSE;
3976     }
3977 #ifdef COFF_LONG_SECTION_NAMES
3978   else if (long_section_names && ! obj_coff_strings_written (abfd))
3979     {
3980       /* If we have long section names we have to write out the string
3981          table even if there are no symbols.  */
3982       if (! coff_write_symbols (abfd))
3983         return FALSE;
3984     }
3985 #endif
3986 #ifdef COFF_IMAGE_WITH_PE
3987 #ifdef PPC_PE
3988   else if ((abfd->flags & EXEC_P) != 0)
3989     {
3990       bfd_byte b;
3991
3992       /* PowerPC PE appears to require that all executable files be
3993          rounded up to the page size.  */
3994       b = 0;
3995       if (bfd_seek (abfd,
3996                     (file_ptr) BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3997                     SEEK_SET) != 0
3998           || bfd_bwrite (&b, (bfd_size_type) 1, abfd) != 1)
3999         return FALSE;
4000     }
4001 #endif
4002 #endif
4003
4004   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
4005      backend linker, and obj_raw_syment_count is not valid until after
4006      coff_write_symbols is called.  */
4007   if (obj_raw_syment_count (abfd) != 0)
4008     {
4009       internal_f.f_symptr = sym_base;
4010 #ifdef RS6000COFF_C
4011       /* AIX appears to require that F_RELFLG not be set if there are
4012          local symbols but no relocations.  */
4013       internal_f.f_flags &=~ F_RELFLG;
4014 #endif
4015     }
4016   else
4017     {
4018       if (long_section_names)
4019         internal_f.f_symptr = sym_base;
4020       else
4021         internal_f.f_symptr = 0;
4022       internal_f.f_flags |= F_LSYMS;
4023     }
4024
4025   if (text_sec)
4026     {
4027       internal_a.tsize = text_sec->size;
4028       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
4029     }
4030   if (data_sec)
4031     {
4032       internal_a.dsize = data_sec->size;
4033       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
4034     }
4035   if (bss_sec)
4036     {
4037       internal_a.bsize = bss_sec->size;
4038       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
4039         internal_a.data_start = bss_sec->vma;
4040     }
4041
4042   internal_a.entry = bfd_get_start_address (abfd);
4043   internal_f.f_nsyms = obj_raw_syment_count (abfd);
4044
4045 #ifdef RS6000COFF_C
4046   if (xcoff_data (abfd)->full_aouthdr)
4047     {
4048       bfd_vma toc;
4049       asection *loader_sec;
4050
4051       internal_a.vstamp = 1;
4052
4053       internal_a.o_snentry = xcoff_data (abfd)->snentry;
4054       if (internal_a.o_snentry == 0)
4055         internal_a.entry = (bfd_vma) -1;
4056
4057       if (text_sec != NULL)
4058         {
4059           internal_a.o_sntext = text_sec->target_index;
4060           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
4061         }
4062       else
4063         {
4064           internal_a.o_sntext = 0;
4065           internal_a.o_algntext = 0;
4066         }
4067       if (data_sec != NULL)
4068         {
4069           internal_a.o_sndata = data_sec->target_index;
4070           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
4071         }
4072       else
4073         {
4074           internal_a.o_sndata = 0;
4075           internal_a.o_algndata = 0;
4076         }
4077       loader_sec = bfd_get_section_by_name (abfd, ".loader");
4078       if (loader_sec != NULL)
4079         internal_a.o_snloader = loader_sec->target_index;
4080       else
4081         internal_a.o_snloader = 0;
4082       if (bss_sec != NULL)
4083         internal_a.o_snbss = bss_sec->target_index;
4084       else
4085         internal_a.o_snbss = 0;
4086
4087       toc = xcoff_data (abfd)->toc;
4088       internal_a.o_toc = toc;
4089       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
4090
4091       internal_a.o_modtype = xcoff_data (abfd)->modtype;
4092       if (xcoff_data (abfd)->cputype != -1)
4093         internal_a.o_cputype = xcoff_data (abfd)->cputype;
4094       else
4095         {
4096           switch (bfd_get_arch (abfd))
4097             {
4098             case bfd_arch_rs6000:
4099               internal_a.o_cputype = 4;
4100               break;
4101             case bfd_arch_powerpc:
4102               if (bfd_get_mach (abfd) == bfd_mach_ppc)
4103                 internal_a.o_cputype = 3;
4104               else
4105                 internal_a.o_cputype = 1;
4106               break;
4107             default:
4108               abort ();
4109             }
4110         }
4111       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
4112       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
4113     }
4114 #endif
4115
4116 #ifdef COFF_WITH_PE
4117   {
4118     /* After object contents are finalized so we can compute a reasonable hash,
4119        but before header is written so we can update it to point to debug directory.  */
4120     struct pe_tdata *pe = pe_data (abfd);
4121
4122     if (pe->build_id.after_write_object_contents != NULL)
4123       (*pe->build_id.after_write_object_contents) (abfd);
4124   }
4125 #endif
4126
4127   /* Now write header.  */
4128   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
4129     return FALSE;
4130
4131   {
4132     char * buff;
4133     bfd_size_type amount = bfd_coff_filhsz (abfd);
4134
4135     buff = (char *) bfd_malloc (amount);
4136     if (buff == NULL)
4137       return FALSE;
4138
4139     bfd_coff_swap_filehdr_out (abfd, & internal_f, buff);
4140     amount = bfd_bwrite (buff, amount, abfd);
4141
4142     free (buff);
4143
4144     if (amount != bfd_coff_filhsz (abfd))
4145       return FALSE;
4146   }
4147
4148   if (abfd->flags & EXEC_P)
4149     {
4150       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
4151          include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)).  */
4152       char * buff;
4153       bfd_size_type amount = bfd_coff_aoutsz (abfd);
4154
4155       buff = (char *) bfd_malloc (amount);
4156       if (buff == NULL)
4157         return FALSE;
4158
4159       coff_swap_aouthdr_out (abfd, & internal_a, buff);
4160       amount = bfd_bwrite (buff, amount, abfd);
4161
4162       free (buff);
4163
4164       if (amount != bfd_coff_aoutsz (abfd))
4165         return FALSE;
4166
4167 #ifdef COFF_IMAGE_WITH_PE
4168       if (! coff_apply_checksum (abfd))
4169         return FALSE;
4170 #endif
4171     }
4172 #ifdef RS6000COFF_C
4173   else
4174     {
4175       AOUTHDR buff;
4176       size_t size;
4177
4178       /* XCOFF seems to always write at least a small a.out header.  */
4179       coff_swap_aouthdr_out (abfd, & internal_a, & buff);
4180       if (xcoff_data (abfd)->full_aouthdr)
4181         size = bfd_coff_aoutsz (abfd);
4182       else
4183         size = SMALL_AOUTSZ;
4184       if (bfd_bwrite (& buff, (bfd_size_type) size, abfd) != size)
4185         return FALSE;
4186     }
4187 #endif
4188
4189   return TRUE;
4190 }
4191
4192 static bfd_boolean
4193 coff_set_section_contents (bfd * abfd,
4194                            sec_ptr section,
4195                            const void * location,
4196                            file_ptr offset,
4197                            bfd_size_type count)
4198 {
4199   if (! abfd->output_has_begun) /* Set by bfd.c handler.  */
4200     {
4201       if (! coff_compute_section_file_positions (abfd))
4202         return FALSE;
4203     }
4204
4205 #if defined(_LIB) && !defined(TARG_AUX)
4206    /* The physical address field of a .lib section is used to hold the
4207       number of shared libraries in the section.  This code counts the
4208       number of sections being written, and increments the lma field
4209       with the number.
4210
4211       I have found no documentation on the contents of this section.
4212       Experimentation indicates that the section contains zero or more
4213       records, each of which has the following structure:
4214
4215       - a (four byte) word holding the length of this record, in words,
4216       - a word that always seems to be set to "2",
4217       - the path to a shared library, null-terminated and then padded
4218         to a whole word boundary.
4219
4220       bfd_assert calls have been added to alert if an attempt is made
4221       to write a section which doesn't follow these assumptions.  The
4222       code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
4223       <robertl@arnet.com> (Thanks!).
4224
4225       Gvran Uddeborg <gvran@uddeborg.pp.se>.  */
4226     if (strcmp (section->name, _LIB) == 0)
4227       {
4228         bfd_byte *rec, *recend;
4229
4230         rec = (bfd_byte *) location;
4231         recend = rec + count;
4232         while (rec < recend)
4233           {
4234             ++section->lma;
4235             rec += bfd_get_32 (abfd, rec) * 4;
4236           }
4237
4238         BFD_ASSERT (rec == recend);
4239       }
4240 #endif
4241
4242   /* Don't write out bss sections - one way to do this is to
4243        see if the filepos has not been set.  */
4244   if (section->filepos == 0)
4245     return TRUE;
4246
4247   if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0)
4248     return FALSE;
4249
4250   if (count == 0)
4251     return TRUE;
4252
4253   return bfd_bwrite (location, count, abfd) == count;
4254 }
4255
4256 static void *
4257 buy_and_read (bfd *abfd, file_ptr where, bfd_size_type size)
4258 {
4259   void * area = bfd_alloc (abfd, size);
4260
4261   if (!area)
4262     return NULL;
4263   if (bfd_seek (abfd, where, SEEK_SET) != 0
4264       || bfd_bread (area, size, abfd) != size)
4265     return NULL;
4266   return area;
4267 }
4268
4269 /*
4270 SUBSUBSECTION
4271         Reading linenumbers
4272
4273         Creating the linenumber table is done by reading in the entire
4274         coff linenumber table, and creating another table for internal use.
4275
4276         A coff linenumber table is structured so that each function
4277         is marked as having a line number of 0. Each line within the
4278         function is an offset from the first line in the function. The
4279         base of the line number information for the table is stored in
4280         the symbol associated with the function.
4281
4282         Note: The PE format uses line number 0 for a flag indicating a
4283         new source file.
4284
4285         The information is copied from the external to the internal
4286         table, and each symbol which marks a function is marked by
4287         pointing its...
4288
4289         How does this work ?
4290 */
4291
4292 static int
4293 coff_sort_func_alent (const void * arg1, const void * arg2)
4294 {
4295   const alent *al1 = *(const alent **) arg1;
4296   const alent *al2 = *(const alent **) arg2;
4297   const coff_symbol_type *s1 = (const coff_symbol_type *) (al1->u.sym);
4298   const coff_symbol_type *s2 = (const coff_symbol_type *) (al2->u.sym);
4299
4300   if (s1 == NULL || s2 == NULL)
4301     return 0;
4302   if (s1->symbol.value < s2->symbol.value)
4303     return -1;
4304   else if (s1->symbol.value > s2->symbol.value)
4305     return 1;
4306
4307   return 0;
4308 }
4309
4310 static bfd_boolean
4311 coff_slurp_line_table (bfd *abfd, asection *asect)
4312 {
4313   LINENO *native_lineno;
4314   alent *lineno_cache;
4315   bfd_size_type amt;
4316   unsigned int counter;
4317   alent *cache_ptr;
4318   bfd_vma prev_offset = 0;
4319   bfd_boolean ordered = TRUE;
4320   unsigned int nbr_func;
4321   LINENO *src;
4322   bfd_boolean have_func;
4323   bfd_boolean ret = TRUE;
4324
4325   BFD_ASSERT (asect->lineno == NULL);
4326
4327   if (asect->lineno_count > asect->size)
4328     {
4329       _bfd_error_handler
4330         (_("%pB: warning: line number count (%#lx) exceeds section size (%#lx)"),
4331          abfd, (unsigned long) asect->lineno_count, (unsigned long) asect->size);
4332       return FALSE;
4333     }
4334
4335   amt = ((bfd_size_type) asect->lineno_count + 1) * sizeof (alent);
4336   lineno_cache = (alent *) bfd_alloc (abfd, amt);
4337   if (lineno_cache == NULL)
4338     return FALSE;
4339
4340   amt = (bfd_size_type) bfd_coff_linesz (abfd) * asect->lineno_count;
4341   native_lineno = (LINENO *) buy_and_read (abfd, asect->line_filepos, amt);
4342   if (native_lineno == NULL)
4343     {
4344       _bfd_error_handler
4345         (_("%pB: warning: line number table read failed"), abfd);
4346       bfd_release (abfd, lineno_cache);
4347       return FALSE;
4348     }
4349
4350   cache_ptr = lineno_cache;
4351   asect->lineno = lineno_cache;
4352   src = native_lineno;
4353   nbr_func = 0;
4354   have_func = FALSE;
4355
4356   for (counter = 0; counter < asect->lineno_count; counter++, src++)
4357     {
4358       struct internal_lineno dst;
4359
4360       bfd_coff_swap_lineno_in (abfd, src, &dst);
4361       cache_ptr->line_number = dst.l_lnno;
4362       /* Appease memory checkers that get all excited about
4363          uninitialised memory when copying alents if u.offset is
4364          larger than u.sym.  (64-bit BFD on 32-bit host.)  */
4365       memset (&cache_ptr->u, 0, sizeof (cache_ptr->u));
4366
4367       if (cache_ptr->line_number == 0)
4368         {
4369           combined_entry_type * ent;
4370           unsigned long symndx;
4371           coff_symbol_type *sym;
4372
4373           have_func = FALSE;
4374           symndx = dst.l_addr.l_symndx;
4375           if (symndx >= obj_raw_syment_count (abfd))
4376             {
4377               _bfd_error_handler
4378                 /* xgettext:c-format */
4379                 (_("%pB: warning: illegal symbol index 0x%lx in line number entry %d"),
4380                  abfd, symndx, counter);
4381               cache_ptr->line_number = -1;
4382               ret = FALSE;
4383               continue;
4384             }
4385
4386           ent = obj_raw_syments (abfd) + symndx;
4387           /* FIXME: We should not be casting between ints and
4388              pointers like this.  */
4389           if (! ent->is_sym)
4390             {
4391               _bfd_error_handler
4392                 /* xgettext:c-format */
4393                 (_("%pB: warning: illegal symbol index 0x%lx in line number entry %d"),
4394                  abfd, symndx, counter);
4395               cache_ptr->line_number = -1;
4396               ret = FALSE;
4397               continue;
4398             }
4399           sym = (coff_symbol_type *) (ent->u.syment._n._n_n._n_zeroes);
4400
4401           /* PR 17512 file: 078-10659-0.004  */
4402           if (sym < obj_symbols (abfd)
4403               || sym >= obj_symbols (abfd) + bfd_get_symcount (abfd))
4404             {
4405               _bfd_error_handler
4406                 /* xgettext:c-format */
4407                 (_("%pB: warning: illegal symbol in line number entry %d"),
4408                  abfd, counter);
4409               cache_ptr->line_number = -1;
4410               ret = FALSE;
4411               continue;
4412             }
4413
4414           have_func = TRUE;
4415           nbr_func++;
4416           cache_ptr->u.sym = (asymbol *) sym;
4417           if (sym->lineno != NULL)
4418             _bfd_error_handler
4419               /* xgettext:c-format */
4420               (_("%pB: warning: duplicate line number information for `%s'"),
4421                abfd, bfd_asymbol_name (&sym->symbol));
4422
4423           sym->lineno = cache_ptr;
4424           if (sym->symbol.value < prev_offset)
4425             ordered = FALSE;
4426           prev_offset = sym->symbol.value;
4427         }
4428       else if (!have_func)
4429         /* Drop line information that has no associated function.
4430            PR 17521: file: 078-10659-0.004.  */
4431         continue;
4432       else
4433         cache_ptr->u.offset = (dst.l_addr.l_paddr
4434                                - bfd_section_vma (abfd, asect));
4435       cache_ptr++;
4436     }
4437
4438   asect->lineno_count = cache_ptr - lineno_cache;
4439   memset (cache_ptr, 0, sizeof (*cache_ptr));
4440   bfd_release (abfd, native_lineno);
4441
4442   /* On some systems (eg AIX5.3) the lineno table may not be sorted.  */
4443   if (!ordered)
4444     {
4445       /* Sort the table.  */
4446       alent **func_table;
4447       alent *n_lineno_cache;
4448
4449       /* Create a table of functions.  */
4450       func_table = (alent **) bfd_alloc (abfd, nbr_func * sizeof (alent *));
4451       if (func_table != NULL)
4452         {
4453           alent **p = func_table;
4454           unsigned int i;
4455
4456           for (i = 0; i < asect->lineno_count; i++)
4457             if (lineno_cache[i].line_number == 0)
4458               *p++ = &lineno_cache[i];
4459
4460           BFD_ASSERT ((unsigned int) (p - func_table) == nbr_func);
4461
4462           /* Sort by functions.  */
4463           qsort (func_table, nbr_func, sizeof (alent *), coff_sort_func_alent);
4464
4465           /* Create the new sorted table.  */
4466           amt = (bfd_size_type) asect->lineno_count * sizeof (alent);
4467           n_lineno_cache = (alent *) bfd_alloc (abfd, amt);
4468           if (n_lineno_cache != NULL)
4469             {
4470               alent *n_cache_ptr = n_lineno_cache;
4471
4472               for (i = 0; i < nbr_func; i++)
4473                 {
4474                   coff_symbol_type *sym;
4475                   alent *old_ptr = func_table[i];
4476
4477                   /* Update the function entry.  */
4478                   sym = (coff_symbol_type *) old_ptr->u.sym;
4479                   /* PR binutils/17512: Point the lineno to where
4480                      this entry will be after the memcpy below.  */
4481                   sym->lineno = lineno_cache + (n_cache_ptr - n_lineno_cache);
4482                   /* Copy the function and line number entries.  */
4483                   do
4484                     *n_cache_ptr++ = *old_ptr++;
4485                   while (old_ptr->line_number != 0);
4486                 }
4487               BFD_ASSERT ((bfd_size_type) (n_cache_ptr - n_lineno_cache) == (amt / sizeof (alent)));
4488
4489               memcpy (lineno_cache, n_lineno_cache, amt);
4490             }
4491           else
4492             ret = FALSE;
4493           bfd_release (abfd, func_table);
4494         }
4495       else
4496         ret = FALSE;
4497     }
4498
4499   return ret;
4500 }
4501
4502 /* Slurp in the symbol table, converting it to generic form.  Note
4503    that if coff_relocate_section is defined, the linker will read
4504    symbols via coff_link_add_symbols, rather than via this routine.  */
4505
4506 static bfd_boolean
4507 coff_slurp_symbol_table (bfd * abfd)
4508 {
4509   combined_entry_type *native_symbols;
4510   coff_symbol_type *cached_area;
4511   unsigned int *table_ptr;
4512   bfd_size_type amt;
4513   unsigned int number_of_symbols = 0;
4514   bfd_boolean ret = TRUE;
4515
4516   if (obj_symbols (abfd))
4517     return TRUE;
4518
4519   /* Read in the symbol table.  */
4520   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
4521     return FALSE;
4522
4523   /* Allocate enough room for all the symbols in cached form.  */
4524   amt = obj_raw_syment_count (abfd);
4525   amt *= sizeof (coff_symbol_type);
4526   cached_area = (coff_symbol_type *) bfd_alloc (abfd, amt);
4527   if (cached_area == NULL)
4528     return FALSE;
4529
4530   amt = obj_raw_syment_count (abfd);
4531   amt *= sizeof (unsigned int);
4532   table_ptr = (unsigned int *) bfd_zalloc (abfd, amt);
4533
4534   if (table_ptr == NULL)
4535     return FALSE;
4536   else
4537     {
4538       coff_symbol_type *dst = cached_area;
4539       unsigned int last_native_index = obj_raw_syment_count (abfd);
4540       unsigned int this_index = 0;
4541
4542       while (this_index < last_native_index)
4543         {
4544           combined_entry_type *src = native_symbols + this_index;
4545           table_ptr[this_index] = number_of_symbols;
4546
4547           dst->symbol.the_bfd = abfd;
4548           BFD_ASSERT (src->is_sym);
4549           dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
4550           /* We use the native name field to point to the cached field.  */
4551           src->u.syment._n._n_n._n_zeroes = (bfd_hostptr_t) dst;
4552           dst->symbol.section = coff_section_from_bfd_index (abfd,
4553                                                      src->u.syment.n_scnum);
4554           dst->symbol.flags = 0;
4555           /* PR 17512: file: 079-7098-0.001:0.1.  */
4556           dst->symbol.value = 0;
4557           dst->done_lineno = FALSE;
4558
4559           switch (src->u.syment.n_sclass)
4560             {
4561             case C_EXT:
4562             case C_WEAKEXT:
4563 #if defined ARM
4564             case C_THUMBEXT:
4565             case C_THUMBEXTFUNC:
4566 #endif
4567 #ifdef RS6000COFF_C
4568             case C_HIDEXT:
4569 #if ! defined _AIX52 && ! defined AIX_WEAK_SUPPORT
4570             case C_AIX_WEAKEXT:
4571 #endif
4572 #endif
4573 #ifdef C_SYSTEM
4574             case C_SYSTEM:      /* System Wide variable.  */
4575 #endif
4576 #ifdef COFF_WITH_PE
4577             /* In PE, 0x68 (104) denotes a section symbol.  */
4578             case C_SECTION:
4579             /* In PE, 0x69 (105) denotes a weak external symbol.  */
4580             case C_NT_WEAK:
4581 #endif
4582               switch (coff_classify_symbol (abfd, &src->u.syment))
4583                 {
4584                 case COFF_SYMBOL_GLOBAL:
4585                   dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4586 #if defined COFF_WITH_PE
4587                   /* PE sets the symbol to a value relative to the
4588                      start of the section.  */
4589                   dst->symbol.value = src->u.syment.n_value;
4590 #else
4591                   dst->symbol.value = (src->u.syment.n_value
4592                                        - dst->symbol.section->vma);
4593 #endif
4594                   if (ISFCN ((src->u.syment.n_type)))
4595                     /* A function ext does not go at the end of a
4596                        file.  */
4597                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4598                   break;
4599
4600                 case COFF_SYMBOL_COMMON:
4601                   dst->symbol.section = bfd_com_section_ptr;
4602                   dst->symbol.value = src->u.syment.n_value;
4603                   break;
4604
4605                 case COFF_SYMBOL_UNDEFINED:
4606                   dst->symbol.section = bfd_und_section_ptr;
4607                   dst->symbol.value = 0;
4608                   break;
4609
4610                 case COFF_SYMBOL_PE_SECTION:
4611                   dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
4612                   dst->symbol.value = 0;
4613                   break;
4614
4615                 case COFF_SYMBOL_LOCAL:
4616                   dst->symbol.flags = BSF_LOCAL;
4617 #if defined COFF_WITH_PE
4618                   /* PE sets the symbol to a value relative to the
4619                      start of the section.  */
4620                   dst->symbol.value = src->u.syment.n_value;
4621 #else
4622                   dst->symbol.value = (src->u.syment.n_value
4623                                        - dst->symbol.section->vma);
4624 #endif
4625                   if (ISFCN ((src->u.syment.n_type)))
4626                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4627                   break;
4628                 }
4629
4630 #ifdef RS6000COFF_C
4631               /* A symbol with a csect entry should not go at the end.  */
4632               if (src->u.syment.n_numaux > 0)
4633                 dst->symbol.flags |= BSF_NOT_AT_END;
4634 #endif
4635
4636 #ifdef COFF_WITH_PE
4637               if (src->u.syment.n_sclass == C_NT_WEAK)
4638                 dst->symbol.flags |= BSF_WEAK;
4639
4640               if (src->u.syment.n_sclass == C_SECTION
4641                   && src->u.syment.n_scnum > 0)
4642                 dst->symbol.flags = BSF_LOCAL;
4643 #endif
4644               if (src->u.syment.n_sclass == C_WEAKEXT
4645 #ifdef RS6000COFF_C
4646                   || src->u.syment.n_sclass == C_AIX_WEAKEXT
4647 #endif
4648                   )
4649                 dst->symbol.flags |= BSF_WEAK;
4650
4651               break;
4652
4653             case C_STAT:         /* Static.  */
4654 #if defined ARM
4655             case C_THUMBSTAT:    /* Thumb static.  */
4656             case C_THUMBLABEL:   /* Thumb label.  */
4657             case C_THUMBSTATFUNC:/* Thumb static function.  */
4658 #endif
4659 #ifdef RS6000COFF_C
4660             case C_DWARF:        /* A label in a dwarf section.  */
4661             case C_INFO:         /* A label in a comment section.  */
4662 #endif
4663             case C_LABEL:        /* Label.  */
4664               if (src->u.syment.n_scnum == N_DEBUG)
4665                 dst->symbol.flags = BSF_DEBUGGING;
4666               else
4667                 dst->symbol.flags = BSF_LOCAL;
4668
4669               /* Base the value as an index from the base of the
4670                  section, if there is one.  */
4671               if (dst->symbol.section)
4672                 {
4673 #if defined COFF_WITH_PE
4674                   /* PE sets the symbol to a value relative to the
4675                      start of the section.  */
4676                   dst->symbol.value = src->u.syment.n_value;
4677 #else
4678                   dst->symbol.value = (src->u.syment.n_value
4679                                        - dst->symbol.section->vma);
4680 #endif
4681                 }
4682               else
4683                 dst->symbol.value = src->u.syment.n_value;
4684               break;
4685
4686             case C_MOS:         /* Member of structure.  */
4687             case C_EOS:         /* End of structure.  */
4688             case C_REGPARM:     /* Register parameter.  */
4689             case C_REG:         /* register variable.  */
4690               /* C_AUTOARG conflicts with TI COFF C_UEXT.  */
4691             case C_TPDEF:       /* Type definition.  */
4692             case C_ARG:
4693             case C_AUTO:        /* Automatic variable.  */
4694             case C_FIELD:       /* Bit field.  */
4695             case C_ENTAG:       /* Enumeration tag.  */
4696             case C_MOE:         /* Member of enumeration.  */
4697             case C_MOU:         /* Member of union.  */
4698             case C_UNTAG:       /* Union tag.  */
4699               dst->symbol.flags = BSF_DEBUGGING;
4700               dst->symbol.value = (src->u.syment.n_value);
4701               break;
4702
4703             case C_FILE:        /* File name.  */
4704             case C_STRTAG:      /* Structure tag.  */
4705 #ifdef RS6000COFF_C
4706             case C_GSYM:
4707             case C_LSYM:
4708             case C_PSYM:
4709             case C_RSYM:
4710             case C_RPSYM:
4711             case C_STSYM:
4712             case C_TCSYM:
4713             case C_BCOMM:
4714             case C_ECOML:
4715             case C_ECOMM:
4716             case C_DECL:
4717             case C_ENTRY:
4718             case C_FUN:
4719             case C_ESTAT:
4720 #endif
4721               dst->symbol.flags = BSF_DEBUGGING;
4722               dst->symbol.value = (src->u.syment.n_value);
4723               break;
4724
4725 #ifdef RS6000COFF_C
4726             case C_BINCL:       /* Beginning of include file.  */
4727             case C_EINCL:       /* Ending of include file.  */
4728               /* The value is actually a pointer into the line numbers
4729                  of the file.  We locate the line number entry, and
4730                  set the section to the section which contains it, and
4731                  the value to the index in that section.  */
4732               {
4733                 asection *sec;
4734
4735                 dst->symbol.flags = BSF_DEBUGGING;
4736                 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4737                   if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4738                       && ((file_ptr) (sec->line_filepos
4739                                       + sec->lineno_count * bfd_coff_linesz (abfd))
4740                           > (file_ptr) src->u.syment.n_value))
4741                     break;
4742                 if (sec == NULL)
4743                   dst->symbol.value = 0;
4744                 else
4745                   {
4746                     dst->symbol.section = sec;
4747                     dst->symbol.value = ((src->u.syment.n_value
4748                                           - sec->line_filepos)
4749                                          / bfd_coff_linesz (abfd));
4750                     src->fix_line = 1;
4751                   }
4752               }
4753               break;
4754
4755             case C_BSTAT:
4756               dst->symbol.flags = BSF_DEBUGGING;
4757
4758               /* The value is actually a symbol index.  Save a pointer
4759                  to the symbol instead of the index.  FIXME: This
4760                  should use a union.  */
4761               src->u.syment.n_value =
4762                 (long) (intptr_t) (native_symbols + src->u.syment.n_value);
4763               dst->symbol.value = src->u.syment.n_value;
4764               src->fix_value = 1;
4765               break;
4766 #endif
4767
4768             case C_BLOCK:       /* ".bb" or ".eb".  */
4769             case C_FCN:         /* ".bf" or ".ef" (or PE ".lf").  */
4770             case C_EFCN:        /* Physical end of function.  */
4771 #if defined COFF_WITH_PE
4772               /* PE sets the symbol to a value relative to the start
4773                  of the section.  */
4774               dst->symbol.value = src->u.syment.n_value;
4775               if (strcmp (dst->symbol.name, ".bf") != 0)
4776                 {
4777                   /* PE uses funny values for .ef and .lf; don't
4778                      relocate them.  */
4779                   dst->symbol.flags = BSF_DEBUGGING;
4780                 }
4781               else
4782                 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
4783 #else
4784               /* Base the value as an index from the base of the
4785                  section.  */
4786               dst->symbol.flags = BSF_LOCAL;
4787               dst->symbol.value = (src->u.syment.n_value
4788                                    - dst->symbol.section->vma);
4789 #endif
4790               break;
4791
4792             case C_STATLAB:     /* Static load time label.  */
4793               dst->symbol.value = src->u.syment.n_value;
4794               dst->symbol.flags = BSF_GLOBAL;
4795               break;
4796
4797             case C_NULL:
4798               /* PE DLLs sometimes have zeroed out symbols for some
4799                  reason.  Just ignore them without a warning.  */
4800               if (src->u.syment.n_type == 0
4801                   && src->u.syment.n_value == 0
4802                   && src->u.syment.n_scnum == 0)
4803                 break;
4804 #ifdef RS6000COFF_C
4805               /* XCOFF specific: deleted entry.  */
4806               if (src->u.syment.n_value == C_NULL_VALUE)
4807                 break;
4808 #endif
4809               /* Fall through.  */
4810             case C_EXTDEF:      /* External definition.  */
4811             case C_ULABEL:      /* Undefined label.  */
4812             case C_USTATIC:     /* Undefined static.  */
4813 #ifndef COFF_WITH_PE
4814             /* C_LINE in regular coff is 0x68.  NT has taken over this storage
4815                class to represent a section symbol.  */
4816             case C_LINE:        /* line # reformatted as symbol table entry.  */
4817               /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
4818             case C_ALIAS:       /* Duplicate tag.  */
4819 #endif
4820               /* New storage classes for TI COFF.  */
4821 #if defined(TIC80COFF) || defined(TICOFF)
4822             case C_UEXT:        /* Tentative external definition.  */
4823 #endif
4824             case C_EXTLAB:      /* External load time label.  */
4825             default:
4826               _bfd_error_handler
4827                 /* xgettext:c-format */
4828                 (_("%pB: unrecognized storage class %d for %s symbol `%s'"),
4829                  abfd, src->u.syment.n_sclass,
4830                  dst->symbol.section->name, dst->symbol.name);
4831               ret = FALSE;
4832               /* Fall through.  */
4833             case C_HIDDEN:      /* Ext symbol in dmert public lib.  */
4834               /* PR 20722: These symbols can also be generated by
4835                  building DLLs with --gc-sections enabled.  */
4836               dst->symbol.flags = BSF_DEBUGGING;
4837               dst->symbol.value = (src->u.syment.n_value);
4838               break;
4839             }
4840
4841           dst->native = src;
4842           dst->symbol.udata.i = 0;
4843           dst->lineno = NULL;
4844
4845           this_index += (src->u.syment.n_numaux) + 1;
4846           dst++;
4847           number_of_symbols++;
4848         }
4849     }
4850
4851   obj_symbols (abfd) = cached_area;
4852   obj_raw_syments (abfd) = native_symbols;
4853
4854   bfd_get_symcount (abfd) = number_of_symbols;
4855   obj_convert (abfd) = table_ptr;
4856   /* Slurp the line tables for each section too.  */
4857   {
4858     asection *p;
4859
4860     p = abfd->sections;
4861     while (p)
4862       {
4863         if (! coff_slurp_line_table (abfd, p))
4864           return FALSE;
4865         p = p->next;
4866       }
4867   }
4868
4869   return ret;
4870 }
4871
4872 /* Classify a COFF symbol.  A couple of targets have globally visible
4873    symbols which are not class C_EXT, and this handles those.  It also
4874    recognizes some special PE cases.  */
4875
4876 static enum coff_symbol_classification
4877 coff_classify_symbol (bfd *abfd,
4878                       struct internal_syment *syment)
4879 {
4880   /* FIXME: This partially duplicates the switch in
4881      coff_slurp_symbol_table.  */
4882   switch (syment->n_sclass)
4883     {
4884     case C_EXT:
4885     case C_WEAKEXT:
4886 #ifdef ARM
4887     case C_THUMBEXT:
4888     case C_THUMBEXTFUNC:
4889 #endif
4890 #ifdef C_SYSTEM
4891     case C_SYSTEM:
4892 #endif
4893 #ifdef COFF_WITH_PE
4894     case C_NT_WEAK:
4895 #endif
4896       if (syment->n_scnum == 0)
4897         {
4898           if (syment->n_value == 0)
4899             return COFF_SYMBOL_UNDEFINED;
4900           else
4901             return COFF_SYMBOL_COMMON;
4902         }
4903       return COFF_SYMBOL_GLOBAL;
4904
4905     default:
4906       break;
4907     }
4908
4909 #ifdef COFF_WITH_PE
4910   if (syment->n_sclass == C_STAT)
4911     {
4912       if (syment->n_scnum == 0)
4913         /* The Microsoft compiler sometimes generates these if a
4914            small static function is inlined every time it is used.
4915            The function is discarded, but the symbol table entry
4916            remains.  */
4917         return COFF_SYMBOL_LOCAL;
4918
4919 #ifdef STRICT_PE_FORMAT
4920       /* This is correct for Microsoft generated objects, but it
4921          breaks gas generated objects.  */
4922       if (syment->n_value == 0)
4923         {
4924           asection *sec;
4925           char * name;
4926           char buf[SYMNMLEN + 1];
4927
4928           name = _bfd_coff_internal_syment_name (abfd, syment, buf)
4929           sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4930           if (sec != NULL && name != NULL
4931               && (strcmp (bfd_get_section_name (abfd, sec), name) == 0))
4932             return COFF_SYMBOL_PE_SECTION;
4933         }
4934 #endif
4935
4936       return COFF_SYMBOL_LOCAL;
4937     }
4938
4939   if (syment->n_sclass == C_SECTION)
4940     {
4941       /* In some cases in a DLL generated by the Microsoft linker, the
4942          n_value field will contain garbage.  FIXME: This should
4943          probably be handled by the swapping function instead.  */
4944       syment->n_value = 0;
4945       if (syment->n_scnum == 0)
4946         return COFF_SYMBOL_UNDEFINED;
4947       return COFF_SYMBOL_PE_SECTION;
4948     }
4949 #endif /* COFF_WITH_PE */
4950
4951   /* If it is not a global symbol, we presume it is a local symbol.  */
4952   if (syment->n_scnum == 0)
4953     {
4954       char buf[SYMNMLEN + 1];
4955
4956       _bfd_error_handler
4957         /* xgettext:c-format */
4958         (_("warning: %pB: local symbol `%s' has no section"),
4959          abfd, _bfd_coff_internal_syment_name (abfd, syment, buf));
4960     }
4961
4962   return COFF_SYMBOL_LOCAL;
4963 }
4964
4965 /*
4966 SUBSUBSECTION
4967         Reading relocations
4968
4969         Coff relocations are easily transformed into the internal BFD form
4970         (@code{arelent}).
4971
4972         Reading a coff relocation table is done in the following stages:
4973
4974         o Read the entire coff relocation table into memory.
4975
4976         o Process each relocation in turn; first swap it from the
4977         external to the internal form.
4978
4979         o Turn the symbol referenced in the relocation's symbol index
4980         into a pointer into the canonical symbol table.
4981         This table is the same as the one returned by a call to
4982         @code{bfd_canonicalize_symtab}. The back end will call that
4983         routine and save the result if a canonicalization hasn't been done.
4984
4985         o The reloc index is turned into a pointer to a howto
4986         structure, in a back end specific way. For instance, the 386
4987         uses the @code{r_type} to directly produce an index
4988         into a howto table vector.
4989 */
4990
4991 #ifndef CALC_ADDEND
4992 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
4993   {                                                             \
4994     coff_symbol_type *coffsym = NULL;                           \
4995                                                                 \
4996     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
4997       coffsym = (obj_symbols (abfd)                             \
4998                  + (cache_ptr->sym_ptr_ptr - symbols));         \
4999     else if (ptr)                                               \
5000       coffsym = coff_symbol_from (ptr);                         \
5001     if (coffsym != NULL                                         \
5002         && coffsym->native->is_sym                              \
5003         && coffsym->native->u.syment.n_scnum == 0)              \
5004       cache_ptr->addend = 0;                                    \
5005     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
5006              && ptr->section != NULL)                           \
5007       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
5008     else                                                        \
5009       cache_ptr->addend = 0;                                    \
5010   }
5011 #endif
5012
5013 static bfd_boolean
5014 coff_slurp_reloc_table (bfd * abfd, sec_ptr asect, asymbol ** symbols)
5015 {
5016   RELOC *native_relocs;
5017   arelent *reloc_cache;
5018   arelent *cache_ptr;
5019   unsigned int idx;
5020   bfd_size_type amt;
5021
5022   if (asect->relocation)
5023     return TRUE;
5024   if (asect->reloc_count == 0)
5025     return TRUE;
5026   if (asect->flags & SEC_CONSTRUCTOR)
5027     return TRUE;
5028   if (!coff_slurp_symbol_table (abfd))
5029     return FALSE;
5030
5031   amt = (bfd_size_type) bfd_coff_relsz (abfd) * asect->reloc_count;
5032   native_relocs = (RELOC *) buy_and_read (abfd, asect->rel_filepos, amt);
5033   amt = (bfd_size_type) asect->reloc_count * sizeof (arelent);
5034   reloc_cache = (arelent *) bfd_alloc (abfd, amt);
5035
5036   if (reloc_cache == NULL || native_relocs == NULL)
5037     return FALSE;
5038
5039   for (idx = 0; idx < asect->reloc_count; idx++)
5040     {
5041       struct internal_reloc dst;
5042       struct external_reloc *src;
5043 #ifndef RELOC_PROCESSING
5044       asymbol *ptr;
5045 #endif
5046
5047       cache_ptr = reloc_cache + idx;
5048       src = native_relocs + idx;
5049
5050       dst.r_offset = 0;
5051       coff_swap_reloc_in (abfd, src, &dst);
5052
5053 #ifdef RELOC_PROCESSING
5054       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
5055 #else
5056       cache_ptr->address = dst.r_vaddr;
5057
5058       if (dst.r_symndx != -1 && symbols != NULL)
5059         {
5060           if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
5061             {
5062               _bfd_error_handler
5063                 /* xgettext:c-format */
5064                 (_("%pB: warning: illegal symbol index %ld in relocs"),
5065                  abfd, dst.r_symndx);
5066               cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
5067               ptr = NULL;
5068             }
5069           else
5070             {
5071               cache_ptr->sym_ptr_ptr = (symbols
5072                                         + obj_convert (abfd)[dst.r_symndx]);
5073               ptr = *(cache_ptr->sym_ptr_ptr);
5074             }
5075         }
5076       else
5077         {
5078           cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
5079           ptr = NULL;
5080         }
5081
5082       /* The symbols definitions that we have read in have been
5083          relocated as if their sections started at 0. But the offsets
5084          refering to the symbols in the raw data have not been
5085          modified, so we have to have a negative addend to compensate.
5086
5087          Note that symbols which used to be common must be left alone.  */
5088
5089       /* Calculate any reloc addend by looking at the symbol.  */
5090       CALC_ADDEND (abfd, ptr, dst, cache_ptr);
5091       (void) ptr;
5092
5093       cache_ptr->address -= asect->vma;
5094       /* !! cache_ptr->section = NULL;*/
5095
5096       /* Fill in the cache_ptr->howto field from dst.r_type.  */
5097       RTYPE2HOWTO (cache_ptr, &dst);
5098 #endif  /* RELOC_PROCESSING */
5099
5100       if (cache_ptr->howto == NULL)
5101         {
5102           _bfd_error_handler
5103             /* xgettext:c-format */
5104             (_("%pB: illegal relocation type %d at address %#" PRIx64),
5105              abfd, dst.r_type, (uint64_t) dst.r_vaddr);
5106           bfd_set_error (bfd_error_bad_value);
5107           return FALSE;
5108         }
5109     }
5110
5111   asect->relocation = reloc_cache;
5112   return TRUE;
5113 }
5114
5115 #ifndef coff_rtype_to_howto
5116 #ifdef RTYPE2HOWTO
5117
5118 /* Get the howto structure for a reloc.  This is only used if the file
5119    including this one defines coff_relocate_section to be
5120    _bfd_coff_generic_relocate_section, so it is OK if it does not
5121    always work.  It is the responsibility of the including file to
5122    make sure it is reasonable if it is needed.  */
5123
5124 static reloc_howto_type *
5125 coff_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
5126                      asection *sec ATTRIBUTE_UNUSED,
5127                      struct internal_reloc *rel ATTRIBUTE_UNUSED,
5128                      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED,
5129                      struct internal_syment *sym ATTRIBUTE_UNUSED,
5130                      bfd_vma *addendp ATTRIBUTE_UNUSED)
5131 {
5132   arelent genrel;
5133
5134   genrel.howto = NULL;
5135   RTYPE2HOWTO (&genrel, rel);
5136   return genrel.howto;
5137 }
5138
5139 #else /* ! defined (RTYPE2HOWTO) */
5140
5141 #define coff_rtype_to_howto NULL
5142
5143 #endif /* ! defined (RTYPE2HOWTO) */
5144 #endif /* ! defined (coff_rtype_to_howto) */
5145
5146 /* This is stupid.  This function should be a boolean predicate.  */
5147
5148 static long
5149 coff_canonicalize_reloc (bfd * abfd,
5150                          sec_ptr section,
5151                          arelent ** relptr,
5152                          asymbol ** symbols)
5153 {
5154   arelent *tblptr = section->relocation;
5155   unsigned int count = 0;
5156
5157   if (section->flags & SEC_CONSTRUCTOR)
5158     {
5159       /* This section has relocs made up by us, they are not in the
5160          file, so take them out of their chain and place them into
5161          the data area provided.  */
5162       arelent_chain *chain = section->constructor_chain;
5163
5164       for (count = 0; count < section->reloc_count; count++)
5165         {
5166           *relptr++ = &chain->relent;
5167           chain = chain->next;
5168         }
5169     }
5170   else
5171     {
5172       if (! coff_slurp_reloc_table (abfd, section, symbols))
5173         return -1;
5174
5175       tblptr = section->relocation;
5176
5177       for (; count++ < section->reloc_count;)
5178         *relptr++ = tblptr++;
5179     }
5180   *relptr = 0;
5181   return section->reloc_count;
5182 }
5183
5184 #ifndef coff_set_reloc
5185 #define coff_set_reloc _bfd_generic_set_reloc
5186 #endif
5187
5188 #ifndef coff_reloc16_estimate
5189 #define coff_reloc16_estimate dummy_reloc16_estimate
5190
5191 static int
5192 dummy_reloc16_estimate (bfd *abfd ATTRIBUTE_UNUSED,
5193                         asection *input_section ATTRIBUTE_UNUSED,
5194                         arelent *reloc ATTRIBUTE_UNUSED,
5195                         unsigned int shrink ATTRIBUTE_UNUSED,
5196                         struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
5197 {
5198   abort ();
5199   return 0;
5200 }
5201
5202 #endif
5203
5204 #ifndef coff_reloc16_extra_cases
5205
5206 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
5207
5208 /* This works even if abort is not declared in any header file.  */
5209
5210 static void
5211 dummy_reloc16_extra_cases (bfd *abfd ATTRIBUTE_UNUSED,
5212                            struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
5213                            struct bfd_link_order *link_order ATTRIBUTE_UNUSED,
5214                            arelent *reloc ATTRIBUTE_UNUSED,
5215                            bfd_byte *data ATTRIBUTE_UNUSED,
5216                            unsigned int *src_ptr ATTRIBUTE_UNUSED,
5217                            unsigned int *dst_ptr ATTRIBUTE_UNUSED)
5218 {
5219   abort ();
5220 }
5221 #endif
5222
5223 /* If coff_relocate_section is defined, we can use the optimized COFF
5224    backend linker.  Otherwise we must continue to use the old linker.  */
5225
5226 #ifdef coff_relocate_section
5227
5228 #ifndef coff_bfd_link_hash_table_create
5229 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
5230 #endif
5231 #ifndef coff_bfd_link_add_symbols
5232 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
5233 #endif
5234 #ifndef coff_bfd_final_link
5235 #define coff_bfd_final_link _bfd_coff_final_link
5236 #endif
5237
5238 #else /* ! defined (coff_relocate_section) */
5239
5240 #define coff_relocate_section NULL
5241 #ifndef coff_bfd_link_hash_table_create
5242 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
5243 #endif
5244 #ifndef coff_bfd_link_add_symbols
5245 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
5246 #endif
5247 #define coff_bfd_final_link _bfd_generic_final_link
5248
5249 #endif /* ! defined (coff_relocate_section) */
5250
5251 #define coff_bfd_link_just_syms      _bfd_generic_link_just_syms
5252 #define coff_bfd_copy_link_hash_symbol_type \
5253   _bfd_generic_copy_link_hash_symbol_type
5254 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
5255
5256 #define coff_bfd_link_check_relocs   _bfd_generic_link_check_relocs
5257
5258 #ifndef coff_start_final_link
5259 #define coff_start_final_link NULL
5260 #endif
5261
5262 #ifndef coff_adjust_symndx
5263 #define coff_adjust_symndx NULL
5264 #endif
5265
5266 #ifndef coff_link_add_one_symbol
5267 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
5268 #endif
5269
5270 #ifndef coff_link_output_has_begun
5271
5272 static bfd_boolean
5273 coff_link_output_has_begun (bfd * abfd,
5274                             struct coff_final_link_info * info ATTRIBUTE_UNUSED)
5275 {
5276   return abfd->output_has_begun;
5277 }
5278 #endif
5279
5280 #ifndef coff_final_link_postscript
5281
5282 static bfd_boolean
5283 coff_final_link_postscript (bfd * abfd ATTRIBUTE_UNUSED,
5284                             struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED)
5285 {
5286   return TRUE;
5287 }
5288 #endif
5289
5290 #ifndef coff_SWAP_aux_in
5291 #define coff_SWAP_aux_in coff_swap_aux_in
5292 #endif
5293 #ifndef coff_SWAP_sym_in
5294 #define coff_SWAP_sym_in coff_swap_sym_in
5295 #endif
5296 #ifndef coff_SWAP_lineno_in
5297 #define coff_SWAP_lineno_in coff_swap_lineno_in
5298 #endif
5299 #ifndef coff_SWAP_aux_out
5300 #define coff_SWAP_aux_out coff_swap_aux_out
5301 #endif
5302 #ifndef coff_SWAP_sym_out
5303 #define coff_SWAP_sym_out coff_swap_sym_out
5304 #endif
5305 #ifndef coff_SWAP_lineno_out
5306 #define coff_SWAP_lineno_out coff_swap_lineno_out
5307 #endif
5308 #ifndef coff_SWAP_reloc_out
5309 #define coff_SWAP_reloc_out coff_swap_reloc_out
5310 #endif
5311 #ifndef coff_SWAP_filehdr_out
5312 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
5313 #endif
5314 #ifndef coff_SWAP_aouthdr_out
5315 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
5316 #endif
5317 #ifndef coff_SWAP_scnhdr_out
5318 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
5319 #endif
5320 #ifndef coff_SWAP_reloc_in
5321 #define coff_SWAP_reloc_in coff_swap_reloc_in
5322 #endif
5323 #ifndef coff_SWAP_filehdr_in
5324 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
5325 #endif
5326 #ifndef coff_SWAP_aouthdr_in
5327 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
5328 #endif
5329 #ifndef coff_SWAP_scnhdr_in
5330 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
5331 #endif
5332
5333 static bfd_coff_backend_data bfd_coff_std_swap_table ATTRIBUTE_UNUSED =
5334 {
5335   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5336   coff_SWAP_aux_out, coff_SWAP_sym_out,
5337   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5338   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5339   coff_SWAP_scnhdr_out,
5340   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5341 #ifdef COFF_LONG_FILENAMES
5342   TRUE,
5343 #else
5344   FALSE,
5345 #endif
5346   COFF_DEFAULT_LONG_SECTION_NAMES,
5347   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5348 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5349   TRUE,
5350 #else
5351   FALSE,
5352 #endif
5353 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5354   4,
5355 #else
5356   2,
5357 #endif
5358   32768,
5359   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5360   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
5361   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5362   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5363   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5364   coff_classify_symbol, coff_compute_section_file_positions,
5365   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5366   coff_adjust_symndx, coff_link_add_one_symbol,
5367   coff_link_output_has_begun, coff_final_link_postscript,
5368   bfd_pe_print_pdata
5369 };
5370
5371 #ifdef TICOFF
5372 /* COFF0 differs in file/section header size and relocation entry size.  */
5373
5374 static bfd_coff_backend_data ticoff0_swap_table =
5375 {
5376   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5377   coff_SWAP_aux_out, coff_SWAP_sym_out,
5378   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5379   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5380   coff_SWAP_scnhdr_out,
5381   FILHSZ_V0, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ_V0, LINESZ, FILNMLEN,
5382 #ifdef COFF_LONG_FILENAMES
5383   TRUE,
5384 #else
5385   FALSE,
5386 #endif
5387   COFF_DEFAULT_LONG_SECTION_NAMES,
5388   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5389 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5390   TRUE,
5391 #else
5392   FALSE,
5393 #endif
5394 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5395   4,
5396 #else
5397   2,
5398 #endif
5399   32768,
5400   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5401   coff_SWAP_reloc_in, ticoff0_bad_format_hook, coff_set_arch_mach_hook,
5402   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5403   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5404   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5405   coff_classify_symbol, coff_compute_section_file_positions,
5406   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5407   coff_adjust_symndx, coff_link_add_one_symbol,
5408   coff_link_output_has_begun, coff_final_link_postscript,
5409   bfd_pe_print_pdata
5410 };
5411 #endif
5412
5413 #ifdef TICOFF
5414 /* COFF1 differs in section header size.  */
5415
5416 static bfd_coff_backend_data ticoff1_swap_table =
5417 {
5418   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5419   coff_SWAP_aux_out, coff_SWAP_sym_out,
5420   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5421   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5422   coff_SWAP_scnhdr_out,
5423   FILHSZ, AOUTSZ, SCNHSZ_V01, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5424 #ifdef COFF_LONG_FILENAMES
5425   TRUE,
5426 #else
5427   FALSE,
5428 #endif
5429   COFF_DEFAULT_LONG_SECTION_NAMES,
5430   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5431 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5432   TRUE,
5433 #else
5434   FALSE,
5435 #endif
5436 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5437   4,
5438 #else
5439   2,
5440 #endif
5441   32768,
5442   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5443   coff_SWAP_reloc_in, ticoff1_bad_format_hook, coff_set_arch_mach_hook,
5444   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5445   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5446   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5447   coff_classify_symbol, coff_compute_section_file_positions,
5448   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5449   coff_adjust_symndx, coff_link_add_one_symbol,
5450   coff_link_output_has_begun, coff_final_link_postscript,
5451   bfd_pe_print_pdata    /* huh */
5452 };
5453 #endif
5454
5455 #ifdef COFF_WITH_PE_BIGOBJ
5456 /* The UID for bigobj files.  */
5457
5458 static const char header_bigobj_classid[16] =
5459 {
5460   0xC7, 0xA1, 0xBA, 0xD1,
5461   0xEE, 0xBA,
5462   0xa9, 0x4b,
5463   0xAF, 0x20,
5464   0xFA, 0xF6, 0x6A, 0xA4, 0xDC, 0xB8
5465 };
5466
5467 /* Swap routines.  */
5468
5469 static void
5470 coff_bigobj_swap_filehdr_in (bfd * abfd, void * src, void * dst)
5471 {
5472   struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_src =
5473     (struct external_ANON_OBJECT_HEADER_BIGOBJ *) src;
5474   struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
5475
5476   filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->Machine);
5477   filehdr_dst->f_nscns  = H_GET_32 (abfd, filehdr_src->NumberOfSections);
5478   filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->TimeDateStamp);
5479   filehdr_dst->f_symptr =
5480     GET_FILEHDR_SYMPTR (abfd, filehdr_src->PointerToSymbolTable);
5481   filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->NumberOfSymbols);
5482   filehdr_dst->f_opthdr = 0;
5483   filehdr_dst->f_flags  = 0;
5484
5485   /* Check other magic numbers.  */
5486   if (H_GET_16 (abfd, filehdr_src->Sig1) != IMAGE_FILE_MACHINE_UNKNOWN
5487       || H_GET_16 (abfd, filehdr_src->Sig2) != 0xffff
5488       || H_GET_16 (abfd, filehdr_src->Version) != 2
5489       || memcmp (filehdr_src->ClassID, header_bigobj_classid, 16) != 0)
5490     filehdr_dst->f_opthdr = 0xffff;
5491
5492   /* Note that CLR metadata are ignored.  */
5493 }
5494
5495 static unsigned int
5496 coff_bigobj_swap_filehdr_out (bfd *abfd, void * in, void * out)
5497 {
5498   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
5499   struct external_ANON_OBJECT_HEADER_BIGOBJ *filehdr_out =
5500     (struct external_ANON_OBJECT_HEADER_BIGOBJ *) out;
5501
5502   memset (filehdr_out, 0, sizeof (*filehdr_out));
5503
5504   H_PUT_16 (abfd, IMAGE_FILE_MACHINE_UNKNOWN, filehdr_out->Sig1);
5505   H_PUT_16 (abfd, 0xffff, filehdr_out->Sig2);
5506   H_PUT_16 (abfd, 2, filehdr_out->Version);
5507   memcpy (filehdr_out->ClassID, header_bigobj_classid, 16);
5508   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->Machine);
5509   H_PUT_32 (abfd, filehdr_in->f_nscns, filehdr_out->NumberOfSections);
5510   H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->TimeDateStamp);
5511   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
5512                       filehdr_out->PointerToSymbolTable);
5513   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->NumberOfSymbols);
5514
5515   return bfd_coff_filhsz (abfd);
5516 }
5517
5518 static void
5519 coff_bigobj_swap_sym_in (bfd * abfd, void * ext1, void * in1)
5520 {
5521   SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) ext1;
5522   struct internal_syment *in = (struct internal_syment *) in1;
5523
5524   if (ext->e.e_name[0] == 0)
5525     {
5526       in->_n._n_n._n_zeroes = 0;
5527       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
5528     }
5529   else
5530     {
5531 #if SYMNMLEN != E_SYMNMLEN
5532 #error we need to cope with truncating or extending SYMNMLEN
5533 #else
5534       memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
5535 #endif
5536     }
5537
5538   in->n_value = H_GET_32 (abfd, ext->e_value);
5539   BFD_ASSERT (sizeof (in->n_scnum) >= 4);
5540   in->n_scnum = H_GET_32 (abfd, ext->e_scnum);
5541   in->n_type = H_GET_16 (abfd, ext->e_type);
5542   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
5543   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
5544 }
5545
5546 static unsigned int
5547 coff_bigobj_swap_sym_out (bfd * abfd, void * inp, void * extp)
5548 {
5549   struct internal_syment *in = (struct internal_syment *) inp;
5550   SYMENT_BIGOBJ *ext = (SYMENT_BIGOBJ *) extp;
5551
5552   if (in->_n._n_name[0] == 0)
5553     {
5554       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
5555       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
5556     }
5557   else
5558     {
5559 #if SYMNMLEN != E_SYMNMLEN
5560 #error we need to cope with truncating or extending SYMNMLEN
5561 #else
5562       memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
5563 #endif
5564     }
5565
5566   H_PUT_32 (abfd, in->n_value, ext->e_value);
5567   H_PUT_32 (abfd, in->n_scnum, ext->e_scnum);
5568
5569   H_PUT_16 (abfd, in->n_type, ext->e_type);
5570   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
5571   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
5572
5573   return SYMESZ_BIGOBJ;
5574 }
5575
5576 static void
5577 coff_bigobj_swap_aux_in (bfd *abfd,
5578                          void * ext1,
5579                          int type,
5580                          int in_class,
5581                          int indx,
5582                          int numaux,
5583                          void * in1)
5584 {
5585   AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) ext1;
5586   union internal_auxent *in = (union internal_auxent *) in1;
5587
5588   switch (in_class)
5589     {
5590     case C_FILE:
5591       if (numaux > 1)
5592         {
5593           if (indx == 0)
5594             memcpy (in->x_file.x_fname, ext->File.Name,
5595                     numaux * sizeof (AUXENT_BIGOBJ));
5596         }
5597       else
5598         memcpy (in->x_file.x_fname, ext->File.Name, sizeof (ext->File.Name));
5599       break;
5600
5601     case C_STAT:
5602     case C_LEAFSTAT:
5603     case C_HIDDEN:
5604       if (type == T_NULL)
5605         {
5606           in->x_scn.x_scnlen = H_GET_32 (abfd, ext->Section.Length);
5607           in->x_scn.x_nreloc =
5608             H_GET_16 (abfd, ext->Section.NumberOfRelocations);
5609           in->x_scn.x_nlinno =
5610             H_GET_16 (abfd, ext->Section.NumberOfLinenumbers);
5611           in->x_scn.x_checksum = H_GET_32 (abfd, ext->Section.Checksum);
5612           in->x_scn.x_associated = H_GET_16 (abfd, ext->Section.Number)
5613             | (H_GET_16 (abfd, ext->Section.HighNumber) << 16);
5614           in->x_scn.x_comdat = H_GET_8 (abfd, ext->Section.Selection);
5615           return;
5616         }
5617       break;
5618
5619     default:
5620       in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->Sym.WeakDefaultSymIndex);
5621       /* Characteristics is ignored.  */
5622       break;
5623     }
5624 }
5625
5626 static unsigned int
5627 coff_bigobj_swap_aux_out (bfd * abfd,
5628                           void * inp,
5629                           int type,
5630                           int in_class,
5631                           int indx ATTRIBUTE_UNUSED,
5632                           int numaux ATTRIBUTE_UNUSED,
5633                           void * extp)
5634 {
5635   union internal_auxent * in = (union internal_auxent *) inp;
5636   AUXENT_BIGOBJ *ext = (AUXENT_BIGOBJ *) extp;
5637
5638   memset (ext, 0, AUXESZ);
5639
5640   switch (in_class)
5641     {
5642     case C_FILE:
5643       memcpy (ext->File.Name, in->x_file.x_fname, sizeof (ext->File.Name));
5644
5645       return AUXESZ;
5646
5647     case C_STAT:
5648     case C_LEAFSTAT:
5649     case C_HIDDEN:
5650       if (type == T_NULL)
5651         {
5652           H_PUT_32 (abfd, in->x_scn.x_scnlen, ext->Section.Length);
5653           H_PUT_16 (abfd, in->x_scn.x_nreloc,
5654                     ext->Section.NumberOfRelocations);
5655           H_PUT_16 (abfd, in->x_scn.x_nlinno,
5656                     ext->Section.NumberOfLinenumbers);
5657           H_PUT_32 (abfd, in->x_scn.x_checksum, ext->Section.Checksum);
5658           H_PUT_16 (abfd, in->x_scn.x_associated & 0xffff,
5659                     ext->Section.Number);
5660           H_PUT_16 (abfd, (in->x_scn.x_associated >> 16),
5661                     ext->Section.HighNumber);
5662           H_PUT_8 (abfd, in->x_scn.x_comdat, ext->Section.Selection);
5663           return AUXESZ;
5664         }
5665       break;
5666     }
5667
5668   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->Sym.WeakDefaultSymIndex);
5669   H_PUT_32 (abfd, 1, ext->Sym.WeakSearchType);
5670
5671   return AUXESZ;
5672 }
5673
5674 static bfd_coff_backend_data bigobj_swap_table =
5675 {
5676   coff_bigobj_swap_aux_in, coff_bigobj_swap_sym_in, coff_SWAP_lineno_in,
5677   coff_bigobj_swap_aux_out, coff_bigobj_swap_sym_out,
5678   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5679   coff_bigobj_swap_filehdr_out, coff_SWAP_aouthdr_out,
5680   coff_SWAP_scnhdr_out,
5681   FILHSZ_BIGOBJ, AOUTSZ, SCNHSZ, SYMESZ_BIGOBJ, AUXESZ_BIGOBJ,
5682    RELSZ, LINESZ, FILNMLEN_BIGOBJ,
5683   TRUE,
5684   COFF_DEFAULT_LONG_SECTION_NAMES,
5685   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5686   FALSE,
5687   2,
5688   1U << 31,
5689   coff_bigobj_swap_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5690   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
5691   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5692   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5693   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5694   coff_classify_symbol, coff_compute_section_file_positions,
5695   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5696   coff_adjust_symndx, coff_link_add_one_symbol,
5697   coff_link_output_has_begun, coff_final_link_postscript,
5698   bfd_pe_print_pdata    /* huh */
5699 };
5700
5701 #endif /* COFF_WITH_PE_BIGOBJ */
5702
5703 #ifndef coff_close_and_cleanup
5704 #define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
5705 #endif
5706
5707 #ifndef coff_bfd_free_cached_info
5708 #define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
5709 #endif
5710
5711 #ifndef coff_get_section_contents
5712 #define coff_get_section_contents           _bfd_generic_get_section_contents
5713 #endif
5714
5715 #ifndef coff_bfd_copy_private_symbol_data
5716 #define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
5717 #endif
5718
5719 #ifndef coff_bfd_copy_private_header_data
5720 #define coff_bfd_copy_private_header_data   _bfd_generic_bfd_copy_private_header_data
5721 #endif
5722
5723 #ifndef coff_bfd_copy_private_section_data
5724 #define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
5725 #endif
5726
5727 #ifndef coff_bfd_copy_private_bfd_data
5728 #define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
5729 #endif
5730
5731 #ifndef coff_bfd_merge_private_bfd_data
5732 #define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
5733 #endif
5734
5735 #ifndef coff_bfd_set_private_flags
5736 #define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
5737 #endif
5738
5739 #ifndef coff_bfd_print_private_bfd_data
5740 #define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
5741 #endif
5742
5743 #ifndef coff_bfd_is_local_label_name
5744 #define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
5745 #endif
5746
5747 #ifndef coff_bfd_is_target_special_symbol
5748 #define coff_bfd_is_target_special_symbol   _bfd_bool_bfd_asymbol_false
5749 #endif
5750
5751 #ifndef coff_read_minisymbols
5752 #define coff_read_minisymbols               _bfd_generic_read_minisymbols
5753 #endif
5754
5755 #ifndef coff_minisymbol_to_symbol
5756 #define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
5757 #endif
5758
5759 /* The reloc lookup routine must be supplied by each individual COFF
5760    backend.  */
5761 #ifndef coff_bfd_reloc_type_lookup
5762 #define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
5763 #endif
5764 #ifndef coff_bfd_reloc_name_lookup
5765 #define coff_bfd_reloc_name_lookup    _bfd_norelocs_bfd_reloc_name_lookup
5766 #endif
5767
5768 #ifndef coff_bfd_get_relocated_section_contents
5769 #define coff_bfd_get_relocated_section_contents \
5770   bfd_generic_get_relocated_section_contents
5771 #endif
5772
5773 #ifndef coff_bfd_relax_section
5774 #define coff_bfd_relax_section              bfd_generic_relax_section
5775 #endif
5776
5777 #ifndef coff_bfd_gc_sections
5778 #define coff_bfd_gc_sections                bfd_coff_gc_sections
5779 #endif
5780
5781 #ifndef coff_bfd_lookup_section_flags
5782 #define coff_bfd_lookup_section_flags       bfd_generic_lookup_section_flags
5783 #endif
5784
5785 #ifndef coff_bfd_merge_sections
5786 #define coff_bfd_merge_sections             bfd_generic_merge_sections
5787 #endif
5788
5789 #ifndef coff_bfd_is_group_section
5790 #define coff_bfd_is_group_section           bfd_generic_is_group_section
5791 #endif
5792
5793 #ifndef coff_bfd_discard_group
5794 #define coff_bfd_discard_group              bfd_generic_discard_group
5795 #endif
5796
5797 #ifndef coff_section_already_linked
5798 #define coff_section_already_linked \
5799   _bfd_coff_section_already_linked
5800 #endif
5801
5802 #ifndef coff_bfd_define_common_symbol
5803 #define coff_bfd_define_common_symbol       bfd_generic_define_common_symbol
5804 #endif
5805
5806 #ifndef coff_bfd_define_start_stop
5807 #define coff_bfd_define_start_stop          bfd_generic_define_start_stop
5808 #endif
5809
5810 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)     \
5811 const bfd_target VAR =                                                  \
5812 {                                                                       \
5813   NAME ,                                                                \
5814   bfd_target_coff_flavour,                                              \
5815   BFD_ENDIAN_BIG,               /* Data byte order is big.  */          \
5816   BFD_ENDIAN_BIG,               /* Header byte order is big.  */        \
5817   /* object flags */                                                    \
5818   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
5819    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
5820   /* section flags */                                                   \
5821   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5822   UNDER,                        /* Leading symbol underscore.  */       \
5823   '/',                          /* AR_pad_char.  */                     \
5824   15,                           /* AR_max_namelen.  */                  \
5825   0,                            /* match priority.  */                  \
5826                                                                         \
5827   /* Data conversion functions.  */                                     \
5828   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5829   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5830   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5831                                                                         \
5832   /* Header conversion functions.  */                                   \
5833   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5834   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5835   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5836                                                                         \
5837   {                             /* bfd_check_format.  */                \
5838     _bfd_dummy_target,                                                  \
5839     coff_object_p,                                                      \
5840     bfd_generic_archive_p,                                              \
5841     _bfd_dummy_target                                                   \
5842   },                                                                    \
5843   {                             /* bfd_set_format.  */                  \
5844     _bfd_bool_bfd_false_error,                                          \
5845     coff_mkobject,                                                      \
5846     _bfd_generic_mkarchive,                                             \
5847     _bfd_bool_bfd_false_error                                           \
5848   },                                                                    \
5849   {                             /* bfd_write_contents.  */              \
5850     _bfd_bool_bfd_false_error,                                          \
5851     coff_write_object_contents,                                         \
5852     _bfd_write_archive_contents,                                        \
5853     _bfd_bool_bfd_false_error                                           \
5854   },                                                                    \
5855                                                                         \
5856   BFD_JUMP_TABLE_GENERIC (coff),                                        \
5857   BFD_JUMP_TABLE_COPY (coff),                                           \
5858   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5859   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5860   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5861   BFD_JUMP_TABLE_RELOCS (coff),                                         \
5862   BFD_JUMP_TABLE_WRITE (coff),                                          \
5863   BFD_JUMP_TABLE_LINK (coff),                                           \
5864   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5865                                                                         \
5866   ALTERNATIVE,                                                          \
5867                                                                         \
5868   SWAP_TABLE                                                            \
5869 };
5870
5871 #define CREATE_BIGHDR_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)  \
5872 const bfd_target VAR =                                                  \
5873 {                                                                       \
5874   NAME ,                                                                \
5875   bfd_target_coff_flavour,                                              \
5876   BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */       \
5877   BFD_ENDIAN_BIG,               /* Header byte order is big.  */        \
5878   /* object flags */                                                    \
5879   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
5880    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
5881   /* section flags */                                                   \
5882   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5883   UNDER,                        /* Leading symbol underscore.  */       \
5884   '/',                          /* AR_pad_char.  */                     \
5885   15,                           /* AR_max_namelen.  */                  \
5886   0,                            /* match priority.  */                  \
5887                                                                         \
5888   /* Data conversion functions.  */                                     \
5889   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5890   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5891   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5892                                                                         \
5893   /* Header conversion functions.  */                                   \
5894   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
5895   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
5896   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
5897                                                                         \
5898   {                             /* bfd_check_format.  */                \
5899     _bfd_dummy_target,                                                  \
5900     coff_object_p,                                                      \
5901     bfd_generic_archive_p,                                              \
5902     _bfd_dummy_target                                                   \
5903   },                                                                    \
5904   {                             /* bfd_set_format.  */                  \
5905     _bfd_bool_bfd_false_error,                                          \
5906     coff_mkobject,                                                      \
5907     _bfd_generic_mkarchive,                                             \
5908     _bfd_bool_bfd_false_error                                           \
5909   },                                                                    \
5910   {                             /* bfd_write_contents.  */              \
5911     _bfd_bool_bfd_false_error,                                          \
5912     coff_write_object_contents,                                         \
5913     _bfd_write_archive_contents,                                        \
5914     _bfd_bool_bfd_false_error                                           \
5915   },                                                                    \
5916                                                                         \
5917   BFD_JUMP_TABLE_GENERIC (coff),                                        \
5918   BFD_JUMP_TABLE_COPY (coff),                                           \
5919   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5920   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5921   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5922   BFD_JUMP_TABLE_RELOCS (coff),                                         \
5923   BFD_JUMP_TABLE_WRITE (coff),                                          \
5924   BFD_JUMP_TABLE_LINK (coff),                                           \
5925   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5926                                                                         \
5927   ALTERNATIVE,                                                          \
5928                                                                         \
5929   SWAP_TABLE                                                            \
5930 };
5931
5932 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE, SWAP_TABLE)  \
5933 const bfd_target VAR =                                                  \
5934 {                                                                       \
5935   NAME ,                                                                \
5936   bfd_target_coff_flavour,                                              \
5937   BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */       \
5938   BFD_ENDIAN_LITTLE,            /* Header byte order is little.  */     \
5939         /* object flags */                                              \
5940   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
5941    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
5942         /* section flags */                                             \
5943   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5944   UNDER,                        /* Leading symbol underscore.  */       \
5945   '/',                          /* AR_pad_char.  */                     \
5946   15,                           /* AR_max_namelen.  */                  \
5947   0,                            /* match priority.  */                  \
5948                                                                         \
5949   /* Data conversion functions.  */                                     \
5950   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
5951   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
5952   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
5953   /* Header conversion functions.  */                                   \
5954   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
5955   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
5956   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
5957                                                                         \
5958   {                             /* bfd_check_format.  */                \
5959     _bfd_dummy_target,                                                  \
5960     coff_object_p,                                                      \
5961     bfd_generic_archive_p,                                              \
5962     _bfd_dummy_target                                                   \
5963   },                                                                    \
5964   {                             /* bfd_set_format.  */                  \
5965     _bfd_bool_bfd_false_error,                                          \
5966     coff_mkobject,                                                      \
5967     _bfd_generic_mkarchive,                                             \
5968     _bfd_bool_bfd_false_error                                           \
5969   },                                                                    \
5970   {                             /* bfd_write_contents.  */              \
5971     _bfd_bool_bfd_false_error,                                          \
5972     coff_write_object_contents,                                         \
5973     _bfd_write_archive_contents,                                        \
5974     _bfd_bool_bfd_false_error                                           \
5975   },                                                                    \
5976                                                                         \
5977   BFD_JUMP_TABLE_GENERIC (coff),                                        \
5978   BFD_JUMP_TABLE_COPY (coff),                                           \
5979   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5980   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5981   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5982   BFD_JUMP_TABLE_RELOCS (coff),                                         \
5983   BFD_JUMP_TABLE_WRITE (coff),                                          \
5984   BFD_JUMP_TABLE_LINK (coff),                                           \
5985   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5986                                                                         \
5987   ALTERNATIVE,                                                          \
5988                                                                         \
5989   SWAP_TABLE                                                            \
5990 };