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