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