OSDN Git Service

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