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