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