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