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