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   coff->timestamp = internal_f->f_timdat;
1598
1599   obj_raw_syment_count (abfd) =
1600     obj_conv_table_size (abfd) =
1601       internal_f->f_nsyms;
1602
1603 #ifdef RS6000COFF_C
1604   if ((internal_f->f_flags & F_SHROBJ) != 0)
1605     abfd->flags |= DYNAMIC;
1606   if (aouthdr != NULL && internal_f->f_opthdr >= AOUTSZ)
1607     {
1608       struct internal_aouthdr *internal_a =
1609         (struct internal_aouthdr *) aouthdr;
1610       struct xcoff_tdata *xcoff;
1611
1612       xcoff = xcoff_data (abfd);
1613       xcoff->full_aouthdr = true;
1614       xcoff->toc = internal_a->o_toc;
1615       xcoff->sntoc = internal_a->o_sntoc;
1616       xcoff->snentry = internal_a->o_snentry;
1617       xcoff->text_align_power = internal_a->o_algntext;
1618       xcoff->data_align_power = internal_a->o_algndata;
1619       xcoff->modtype = internal_a->o_modtype;
1620       xcoff->cputype = internal_a->o_cputype;
1621       xcoff->maxdata = internal_a->o_maxdata;
1622       xcoff->maxstack = internal_a->o_maxstack;
1623     }
1624 #endif
1625
1626 #ifdef ARM 
1627   /* Set the flags field from the COFF header read in */
1628   if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
1629     coff->flags = 0;
1630 #endif
1631   
1632 #ifdef COFF_WITH_PE
1633   /* FIXME: I'm not sure this is ever executed, since peicode.h
1634      defines coff_mkobject_hook.  */
1635   if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
1636     abfd->flags |= HAS_DEBUG;
1637 #endif
1638
1639   return (PTR) coff;
1640 }
1641 #endif
1642
1643 /* Determine the machine architecture and type.  FIXME: This is target
1644    dependent because the magic numbers are defined in the target
1645    dependent header files.  But there is no particular need for this.
1646    If the magic numbers were moved to a separate file, this function
1647    would be target independent and would also be much more successful
1648    at linking together COFF files for different architectures.  */
1649
1650 static boolean
1651 coff_set_arch_mach_hook (abfd, filehdr)
1652      bfd *abfd;
1653      PTR filehdr;
1654 {
1655   long machine;
1656   enum bfd_architecture arch;
1657   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1658
1659   machine = 0;
1660   switch (internal_f->f_magic)
1661     {
1662 #ifdef PPCMAGIC
1663     case PPCMAGIC:
1664       arch = bfd_arch_powerpc;
1665       machine = 0; /* what does this mean? (krk) */
1666       break; 
1667 #endif
1668 #ifdef I386MAGIC
1669     case I386MAGIC:
1670     case I386PTXMAGIC:
1671     case I386AIXMAGIC:          /* Danbury PS/2 AIX C Compiler */
1672     case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1673       arch = bfd_arch_i386;
1674       machine = 0;
1675       break;
1676 #endif
1677 #ifdef A29K_MAGIC_BIG
1678     case A29K_MAGIC_BIG:
1679     case A29K_MAGIC_LITTLE:
1680       arch = bfd_arch_a29k;
1681       machine = 0;
1682       break;
1683 #endif
1684 #ifdef ARMMAGIC
1685     case ARMMAGIC:
1686       arch = bfd_arch_arm;
1687       switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1688         {
1689         case F_ARM_2:  machine = bfd_mach_arm_2;  break;
1690         case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1691         case F_ARM_3:  machine = bfd_mach_arm_3;  break;
1692         default:
1693         case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1694         case F_ARM_4:  machine = bfd_mach_arm_4;  break;
1695         case F_ARM_4T: machine = bfd_mach_arm_4T; break;
1696         case F_ARM_5:  machine = bfd_mach_arm_5;  break;
1697         }
1698       break;
1699 #endif
1700 #ifdef MC68MAGIC
1701     case MC68MAGIC:
1702     case M68MAGIC:
1703 #ifdef MC68KBCSMAGIC
1704     case MC68KBCSMAGIC:
1705 #endif
1706 #ifdef APOLLOM68KMAGIC
1707     case APOLLOM68KMAGIC:
1708 #endif
1709 #ifdef LYNXCOFFMAGIC
1710     case LYNXCOFFMAGIC:
1711 #endif
1712       arch = bfd_arch_m68k;
1713       machine = bfd_mach_m68020;
1714       break;
1715 #endif
1716 #ifdef MC88MAGIC
1717     case MC88MAGIC:
1718     case MC88DMAGIC:
1719     case MC88OMAGIC:
1720       arch = bfd_arch_m88k;
1721       machine = 88100;
1722       break;
1723 #endif
1724 #ifdef Z8KMAGIC
1725     case Z8KMAGIC:
1726       arch = bfd_arch_z8k;
1727       switch (internal_f->f_flags & F_MACHMASK)
1728         {
1729         case F_Z8001:
1730           machine = bfd_mach_z8001;
1731           break;
1732         case F_Z8002:
1733           machine = bfd_mach_z8002;
1734           break;
1735         default:
1736           return false;
1737         }
1738       break;
1739 #endif
1740 #ifdef I860
1741     case I860MAGIC:
1742       arch = bfd_arch_i860;
1743       break;
1744 #endif
1745 #ifdef I960
1746 #ifdef I960ROMAGIC
1747     case I960ROMAGIC:
1748     case I960RWMAGIC:
1749       arch = bfd_arch_i960;
1750       switch (F_I960TYPE & internal_f->f_flags)
1751         {
1752         default:
1753         case F_I960CORE:
1754           machine = bfd_mach_i960_core;
1755           break;
1756         case F_I960KB:
1757           machine = bfd_mach_i960_kb_sb;
1758           break;
1759         case F_I960MC:
1760           machine = bfd_mach_i960_mc;
1761           break;
1762         case F_I960XA:
1763           machine = bfd_mach_i960_xa;
1764           break;
1765         case F_I960CA:
1766           machine = bfd_mach_i960_ca;
1767           break;
1768         case F_I960KA:
1769           machine = bfd_mach_i960_ka_sa;
1770           break;
1771         case F_I960JX:
1772           machine = bfd_mach_i960_jx;
1773           break;
1774         case F_I960HX:
1775           machine = bfd_mach_i960_hx;
1776           break;
1777         }
1778       break;
1779 #endif
1780 #endif
1781
1782 #ifdef RS6000COFF_C
1783     case U802ROMAGIC:
1784     case U802WRMAGIC:
1785     case U802TOCMAGIC:
1786       {
1787         int cputype;
1788
1789         if (xcoff_data (abfd)->cputype != -1)
1790           cputype = xcoff_data (abfd)->cputype & 0xff;
1791         else
1792           {
1793             /* We did not get a value from the a.out header.  If the
1794                file has not been stripped, we may be able to get the
1795                architecture information from the first symbol, if it
1796                is a .file symbol.  */
1797             if (obj_raw_syment_count (abfd) == 0)
1798               cputype = 0;
1799             else
1800               {
1801                 bfd_byte buf[SYMESZ];
1802                 struct internal_syment sym;
1803
1804                 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1805                     || bfd_read (buf, 1, SYMESZ, abfd) != SYMESZ)
1806                   return false;
1807                 coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
1808                 if (sym.n_sclass == C_FILE)
1809                   cputype = sym.n_type & 0xff;
1810                 else
1811                   cputype = 0;
1812               }
1813           }
1814
1815         /* FIXME: We don't handle all cases here.  */
1816         switch (cputype)
1817           {
1818           default:
1819           case 0:
1820 #ifdef POWERMAC
1821             /* PowerPC Macs use the same magic numbers as RS/6000
1822                (because that's how they were bootstrapped originally),
1823                but they are always PowerPC architecture.  */
1824             arch = bfd_arch_powerpc;
1825             machine = 0;
1826 #else
1827             arch = bfd_arch_rs6000;
1828             machine = 6000;
1829 #endif /* POWERMAC */
1830             break;
1831
1832           case 1:
1833             arch = bfd_arch_powerpc;
1834             machine = 601;
1835             break;
1836           case 2: /* 64 bit PowerPC */
1837             arch = bfd_arch_powerpc;
1838             machine = 620;
1839             break;
1840           case 3:
1841             arch = bfd_arch_powerpc;
1842             machine = 0;
1843             break;
1844           case 4:
1845             arch = bfd_arch_rs6000;
1846             machine = 6000;
1847             break;
1848           }
1849       }
1850       break;
1851 #endif
1852
1853 #ifdef WE32KMAGIC
1854     case WE32KMAGIC:
1855       arch = bfd_arch_we32k;
1856       machine = 0;
1857       break;
1858 #endif
1859
1860 #ifdef H8300MAGIC
1861     case H8300MAGIC:
1862       arch = bfd_arch_h8300;
1863       machine = bfd_mach_h8300;
1864       /* !! FIXME this probably isn't the right place for this */
1865       abfd->flags |= BFD_IS_RELAXABLE;
1866       break;
1867 #endif
1868
1869 #ifdef H8300HMAGIC
1870     case H8300HMAGIC:
1871       arch = bfd_arch_h8300;
1872       machine = bfd_mach_h8300h;
1873       /* !! FIXME this probably isn't the right place for this */
1874       abfd->flags |= BFD_IS_RELAXABLE;
1875       break;
1876 #endif
1877
1878 #ifdef H8300SMAGIC
1879     case H8300SMAGIC:
1880       arch = bfd_arch_h8300;
1881       machine = bfd_mach_h8300s;
1882       /* !! FIXME this probably isn't the right place for this */
1883       abfd->flags |= BFD_IS_RELAXABLE;
1884       break;
1885 #endif
1886
1887 #ifdef SH_ARCH_MAGIC_BIG
1888     case SH_ARCH_MAGIC_BIG:
1889     case SH_ARCH_MAGIC_LITTLE:
1890       arch = bfd_arch_sh;
1891       machine = 0;
1892       break;
1893 #endif
1894
1895 #ifdef H8500MAGIC
1896     case H8500MAGIC:
1897       arch = bfd_arch_h8500;
1898       machine = 0;
1899       break;
1900 #endif
1901
1902 #ifdef SPARCMAGIC
1903     case SPARCMAGIC:
1904 #ifdef LYNXCOFFMAGIC
1905     case LYNXCOFFMAGIC:
1906 #endif
1907       arch = bfd_arch_sparc;
1908       machine = 0;
1909       break;
1910 #endif
1911
1912 #ifdef TIC30MAGIC
1913     case TIC30MAGIC:
1914       arch = bfd_arch_tic30;
1915       break;
1916 #endif
1917
1918 #ifdef TIC80_ARCH_MAGIC
1919     case TIC80_ARCH_MAGIC:
1920       arch = bfd_arch_tic80;
1921       break;
1922 #endif
1923
1924 #ifdef MCOREMAGIC
1925     case MCOREMAGIC:
1926       arch = bfd_arch_mcore;
1927       break;
1928 #endif
1929     default:                    /* Unreadable input file type */
1930       arch = bfd_arch_obscure;
1931       break;
1932     }
1933
1934   bfd_default_set_arch_mach (abfd, arch, machine);
1935   return true;
1936 }
1937
1938 #ifdef SYMNAME_IN_DEBUG
1939
1940 static boolean symname_in_debug_hook
1941   PARAMS ((bfd *, struct internal_syment *));
1942
1943 static boolean
1944 symname_in_debug_hook (abfd, sym)
1945      bfd * abfd ATTRIBUTE_UNUSED;
1946      struct internal_syment *sym;
1947 {
1948   return SYMNAME_IN_DEBUG (sym) ? true : false;
1949 }
1950
1951 #else
1952
1953 #define symname_in_debug_hook \
1954   (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
1955
1956 #endif
1957
1958 #ifdef RS6000COFF_C
1959
1960 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
1961
1962 static boolean coff_pointerize_aux_hook
1963   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1964            unsigned int, combined_entry_type *));
1965
1966 /*ARGSUSED*/
1967 static boolean
1968 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
1969      bfd *abfd ATTRIBUTE_UNUSED;
1970      combined_entry_type *table_base;
1971      combined_entry_type *symbol;
1972      unsigned int indaux;
1973      combined_entry_type *aux;
1974 {
1975   int class = symbol->u.syment.n_sclass;
1976
1977   if ((class == C_EXT || class == C_HIDEXT)
1978       && indaux + 1 == symbol->u.syment.n_numaux)
1979     {
1980       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
1981         {
1982           aux->u.auxent.x_csect.x_scnlen.p =
1983             table_base + aux->u.auxent.x_csect.x_scnlen.l;
1984           aux->fix_scnlen = 1;
1985         }
1986
1987       /* Return true to indicate that the caller should not do any
1988          further work on this auxent.  */
1989       return true;
1990     }
1991
1992   /* Return false to indicate that this auxent should be handled by
1993      the caller.  */
1994   return false;
1995 }
1996
1997 #else
1998 #ifdef I960
1999
2000 /* We don't want to pointerize bal entries.  */
2001
2002 static boolean coff_pointerize_aux_hook
2003   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2004            unsigned int, combined_entry_type *));
2005
2006 /*ARGSUSED*/
2007 static boolean
2008 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
2009      bfd *abfd ATTRIBUTE_UNUSED;
2010      combined_entry_type *table_base ATTRIBUTE_UNUSED;
2011      combined_entry_type *symbol;
2012      unsigned int indaux;
2013      combined_entry_type *aux ATTRIBUTE_UNUSED;
2014 {
2015   /* Return true if we don't want to pointerize this aux entry, which
2016      is the case for the lastfirst aux entry for a C_LEAFPROC symbol.  */
2017   return (indaux == 1
2018           && (symbol->u.syment.n_sclass == C_LEAFPROC
2019               || symbol->u.syment.n_sclass == C_LEAFSTAT
2020               || symbol->u.syment.n_sclass == C_LEAFEXT));
2021 }
2022
2023 #else /* ! I960 */
2024
2025 #define coff_pointerize_aux_hook 0
2026
2027 #endif /* ! I960 */
2028 #endif /* ! RS6000COFF_C */
2029
2030 /* Print an aux entry.  This returns true if it has printed it.  */
2031
2032 static boolean coff_print_aux
2033   PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
2034            combined_entry_type *, unsigned int));
2035
2036 static boolean
2037 coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
2038      bfd *abfd ATTRIBUTE_UNUSED;
2039      FILE *file ATTRIBUTE_UNUSED;
2040      combined_entry_type *table_base ATTRIBUTE_UNUSED;
2041      combined_entry_type *symbol ATTRIBUTE_UNUSED;
2042      combined_entry_type *aux ATTRIBUTE_UNUSED;
2043      unsigned int indaux ATTRIBUTE_UNUSED;
2044 {
2045 #ifdef RS6000COFF_C
2046   if ((symbol->u.syment.n_sclass == C_EXT
2047        || symbol->u.syment.n_sclass == C_HIDEXT)
2048       && indaux + 1 == symbol->u.syment.n_numaux)
2049     {
2050       /* This is a csect entry.  */
2051       fprintf (file, "AUX ");
2052       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2053         {
2054           BFD_ASSERT (! aux->fix_scnlen);
2055           fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
2056         }
2057       else
2058         {
2059           fprintf (file, "indx ");
2060           if (! aux->fix_scnlen)
2061             fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
2062           else
2063             fprintf (file, "%4ld",
2064                      (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2065         }
2066       fprintf (file,
2067                " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2068                aux->u.auxent.x_csect.x_parmhash,
2069                (unsigned int) aux->u.auxent.x_csect.x_snhash,
2070                SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2071                SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2072                (unsigned int) aux->u.auxent.x_csect.x_smclas,
2073                aux->u.auxent.x_csect.x_stab,
2074                (unsigned int) aux->u.auxent.x_csect.x_snstab);
2075       return true;
2076     }
2077 #endif
2078
2079   /* Return false to indicate that no special action was taken.  */
2080   return false;
2081 }
2082
2083 /*
2084 SUBSUBSECTION
2085         Writing relocations
2086
2087         To write relocations, the back end steps though the
2088         canonical relocation table and create an
2089         @code{internal_reloc}. The symbol index to use is removed from
2090         the @code{offset} field in the symbol table supplied.  The
2091         address comes directly from the sum of the section base
2092         address and the relocation offset; the type is dug directly
2093         from the howto field.  Then the @code{internal_reloc} is
2094         swapped into the shape of an @code{external_reloc} and written
2095         out to disk.
2096
2097 */
2098
2099 #ifdef TARG_AUX
2100
2101 static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2102
2103 /* AUX's ld wants relocations to be sorted */
2104 static int
2105 compare_arelent_ptr (x, y)
2106      const PTR x;
2107      const PTR y;
2108 {
2109   const arelent **a = (const arelent **) x;
2110   const arelent **b = (const arelent **) y;
2111   bfd_size_type aadr = (*a)->address;
2112   bfd_size_type badr = (*b)->address;
2113
2114   return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2115 }
2116
2117 #endif /* TARG_AUX */
2118
2119 static boolean
2120 coff_write_relocs (abfd, first_undef)
2121      bfd * abfd;
2122      int first_undef;
2123 {
2124   asection *s;
2125
2126   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2127     {
2128       unsigned int i;
2129       struct external_reloc dst;
2130       arelent **p;
2131
2132 #ifndef TARG_AUX
2133       p = s->orelocation;
2134 #else
2135       /* sort relocations before we write them out */
2136       p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
2137       if (p == NULL && s->reloc_count > 0)
2138         return false;
2139       memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2140       qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2141 #endif
2142
2143       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2144         return false;
2145       for (i = 0; i < s->reloc_count; i++)
2146         {
2147           struct internal_reloc n;
2148           arelent *q = p[i];
2149           memset ((PTR) & n, 0, sizeof (n));
2150
2151           /* Now we've renumbered the symbols we know where the
2152              undefined symbols live in the table.  Check the reloc
2153              entries for symbols who's output bfd isn't the right one.
2154              This is because the symbol was undefined (which means
2155              that all the pointers are never made to point to the same
2156              place). This is a bad thing,'cause the symbols attached
2157              to the output bfd are indexed, so that the relocation
2158              entries know which symbol index they point to.  So we
2159              have to look up the output symbol here. */
2160
2161           if (q->sym_ptr_ptr[0]->the_bfd != abfd)
2162             {
2163               int i;
2164               const char *sname = q->sym_ptr_ptr[0]->name;
2165               asymbol **outsyms = abfd->outsymbols;
2166               for (i = first_undef; outsyms[i]; i++)
2167                 {
2168                   const char *intable = outsyms[i]->name;
2169                   if (strcmp (intable, sname) == 0) {
2170                     /* got a hit, so repoint the reloc */
2171                     q->sym_ptr_ptr = outsyms + i;
2172                     break;
2173                   }
2174                 }
2175             }
2176
2177           n.r_vaddr = q->address + s->vma;
2178
2179 #ifdef R_IHCONST
2180           /* The 29k const/consth reloc pair is a real kludge.  The consth
2181              part doesn't have a symbol; it has an offset.  So rebuilt
2182              that here.  */
2183           if (q->howto->type == R_IHCONST)
2184             n.r_symndx = q->addend;
2185           else
2186 #endif
2187             if (q->sym_ptr_ptr)
2188               {
2189                 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
2190                   /* This is a relocation relative to the absolute symbol.  */
2191                   n.r_symndx = -1;
2192                 else
2193                   {
2194                     n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2195                     /* Take notice if the symbol reloc points to a symbol
2196                        we don't have in our symbol table.  What should we
2197                        do for this??  */
2198                     if (n.r_symndx > obj_conv_table_size (abfd))
2199                       abort ();
2200                   }
2201               }
2202
2203 #ifdef SWAP_OUT_RELOC_OFFSET
2204           n.r_offset = q->addend;
2205 #endif
2206
2207 #ifdef SELECT_RELOC
2208           /* Work out reloc type from what is required */
2209           SELECT_RELOC (n, q->howto);
2210 #else
2211           n.r_type = q->howto->type;
2212 #endif
2213           coff_swap_reloc_out (abfd, &n, &dst);
2214           if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
2215             return false;
2216         }
2217
2218 #ifdef TARG_AUX
2219       if (p != NULL)
2220         free (p);
2221 #endif
2222     }
2223
2224   return true;
2225 }
2226
2227 /* Set flags and magic number of a coff file from architecture and machine
2228    type.  Result is true if we can represent the arch&type, false if not.  */
2229
2230 static boolean
2231 coff_set_flags (abfd, magicp, flagsp)
2232      bfd * abfd;
2233      unsigned int *magicp ATTRIBUTE_UNUSED;
2234      unsigned short *flagsp ATTRIBUTE_UNUSED;
2235 {
2236   switch (bfd_get_arch (abfd))
2237     {
2238 #ifdef Z8KMAGIC
2239     case bfd_arch_z8k:
2240       *magicp = Z8KMAGIC;
2241       switch (bfd_get_mach (abfd))
2242         {
2243         case bfd_mach_z8001:
2244           *flagsp = F_Z8001;
2245           break;
2246         case bfd_mach_z8002:
2247           *flagsp = F_Z8002;
2248           break;
2249         default:
2250           return false;
2251         }
2252       return true;
2253 #endif
2254 #ifdef I960ROMAGIC
2255
2256     case bfd_arch_i960:
2257
2258       {
2259         unsigned flags;
2260         *magicp = I960ROMAGIC;
2261         /*
2262           ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
2263           I960RWMAGIC);   FIXME???
2264           */
2265         switch (bfd_get_mach (abfd))
2266           {
2267           case bfd_mach_i960_core:
2268             flags = F_I960CORE;
2269             break;
2270           case bfd_mach_i960_kb_sb:
2271             flags = F_I960KB;
2272             break;
2273           case bfd_mach_i960_mc:
2274             flags = F_I960MC;
2275             break;
2276           case bfd_mach_i960_xa:
2277             flags = F_I960XA;
2278             break;
2279           case bfd_mach_i960_ca:
2280             flags = F_I960CA;
2281             break;
2282           case bfd_mach_i960_ka_sa:
2283             flags = F_I960KA;
2284             break;
2285           case bfd_mach_i960_jx:
2286             flags = F_I960JX;
2287             break;
2288           case bfd_mach_i960_hx:
2289             flags = F_I960HX;
2290             break;
2291           default:
2292             return false;
2293           }
2294         *flagsp = flags;
2295         return true;
2296       }
2297       break;
2298 #endif
2299
2300 #ifdef TIC30MAGIC
2301     case bfd_arch_tic30:
2302       *magicp = TIC30MAGIC;
2303       return true;
2304 #endif
2305 #ifdef TIC80_ARCH_MAGIC
2306     case bfd_arch_tic80:
2307       *magicp = TIC80_ARCH_MAGIC;
2308       return true;
2309 #endif
2310 #ifdef ARMMAGIC
2311     case bfd_arch_arm:
2312       * magicp = ARMMAGIC;
2313       * flagsp = 0;
2314       if (APCS_SET (abfd))
2315         {
2316           if (APCS_26_FLAG (abfd))
2317             * flagsp |= F_APCS26;
2318           
2319           if (APCS_FLOAT_FLAG (abfd))
2320             * flagsp |= F_APCS_FLOAT;
2321           
2322           if (PIC_FLAG (abfd))
2323             * flagsp |= F_PIC;
2324         }
2325       if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2326         * flagsp |= F_INTERWORK;
2327       switch (bfd_get_mach (abfd))
2328         {
2329         case bfd_mach_arm_2:  * flagsp |= F_ARM_2;  break;
2330         case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2331         case bfd_mach_arm_3:  * flagsp |= F_ARM_3;  break;
2332         case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2333         case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
2334         case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2335         case bfd_mach_arm_5:  * flagsp |= F_ARM_5;  break;
2336         case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break; /* XXX - we do not have an F_ARM_5T */
2337         }
2338       return true;
2339 #endif
2340 #ifdef PPCMAGIC
2341     case bfd_arch_powerpc:
2342       *magicp = PPCMAGIC;
2343       return true;
2344       break;
2345 #endif
2346 #ifdef I386MAGIC
2347     case bfd_arch_i386:
2348       *magicp = I386MAGIC;
2349 #ifdef LYNXOS
2350       /* Just overwrite the usual value if we're doing Lynx. */
2351       *magicp = LYNXCOFFMAGIC;
2352 #endif
2353       return true;
2354       break;
2355 #endif
2356 #ifdef I860MAGIC
2357     case bfd_arch_i860:
2358       *magicp = I860MAGIC;
2359       return true;
2360       break;
2361 #endif
2362 #ifdef MC68MAGIC
2363     case bfd_arch_m68k:
2364 #ifdef APOLLOM68KMAGIC
2365       *magicp = APOLLO_COFF_VERSION_NUMBER;
2366 #else
2367       /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c.  */
2368 #ifdef NAMES_HAVE_UNDERSCORE
2369       *magicp = MC68KBCSMAGIC;
2370 #else
2371       *magicp = MC68MAGIC;
2372 #endif
2373 #endif
2374 #ifdef LYNXOS
2375       /* Just overwrite the usual value if we're doing Lynx. */
2376       *magicp = LYNXCOFFMAGIC;
2377 #endif
2378       return true;
2379       break;
2380 #endif
2381
2382 #ifdef MC88MAGIC
2383     case bfd_arch_m88k:
2384       *magicp = MC88OMAGIC;
2385       return true;
2386       break;
2387 #endif
2388 #ifdef H8300MAGIC
2389     case bfd_arch_h8300:
2390       switch (bfd_get_mach (abfd))
2391         {
2392         case bfd_mach_h8300:
2393           *magicp = H8300MAGIC;
2394           return true;
2395         case bfd_mach_h8300h:
2396           *magicp = H8300HMAGIC;
2397           return true;
2398         case bfd_mach_h8300s:
2399           *magicp = H8300SMAGIC;
2400           return true;
2401         }
2402       break;
2403 #endif
2404
2405 #ifdef SH_ARCH_MAGIC_BIG
2406     case bfd_arch_sh:
2407       if (bfd_big_endian (abfd))
2408         *magicp = SH_ARCH_MAGIC_BIG;
2409       else
2410         *magicp = SH_ARCH_MAGIC_LITTLE;
2411       return true;
2412       break;
2413 #endif
2414
2415 #ifdef SPARCMAGIC
2416     case bfd_arch_sparc:
2417       *magicp = SPARCMAGIC;
2418 #ifdef LYNXOS
2419       /* Just overwrite the usual value if we're doing Lynx. */
2420       *magicp = LYNXCOFFMAGIC;
2421 #endif
2422       return true;
2423       break;
2424 #endif
2425
2426 #ifdef H8500MAGIC
2427     case bfd_arch_h8500:
2428       *magicp = H8500MAGIC;
2429       return true;
2430       break;
2431 #endif
2432 #ifdef A29K_MAGIC_BIG
2433     case bfd_arch_a29k:
2434       if (bfd_big_endian (abfd))
2435         *magicp = A29K_MAGIC_BIG;
2436       else
2437         *magicp = A29K_MAGIC_LITTLE;
2438       return true;
2439       break;
2440 #endif
2441
2442 #ifdef WE32KMAGIC
2443     case bfd_arch_we32k:
2444       *magicp = WE32KMAGIC;
2445       return true;
2446       break;
2447 #endif
2448
2449 #ifdef U802TOCMAGIC
2450     case bfd_arch_rs6000:
2451 #ifndef PPCMAGIC
2452     case bfd_arch_powerpc:
2453 #endif
2454       *magicp = U802TOCMAGIC;
2455       return true;
2456       break;
2457 #endif
2458
2459 #ifdef MCOREMAGIC
2460     case bfd_arch_mcore:
2461       * magicp = MCOREMAGIC;
2462       return true;
2463 #endif
2464       
2465     default:                    /* Unknown architecture */
2466       /* return false;  -- fall through to "return false" below, to avoid
2467        "statement never reached" errors on the one below. */
2468       break;
2469     }
2470
2471   return false;
2472 }
2473
2474
2475 static boolean
2476 coff_set_arch_mach (abfd, arch, machine)
2477      bfd * abfd;
2478      enum bfd_architecture arch;
2479      unsigned long machine;
2480 {
2481   unsigned dummy1;
2482   unsigned short dummy2;
2483
2484   if (! bfd_default_set_arch_mach (abfd, arch, machine))
2485     return false;
2486
2487   if (arch != bfd_arch_unknown &&
2488       coff_set_flags (abfd, &dummy1, &dummy2) != true)
2489     return false;               /* We can't represent this type */
2490
2491   return true;                  /* We're easy ... */
2492 }
2493
2494 #ifdef COFF_IMAGE_WITH_PE
2495
2496 /* This is used to sort sections by VMA, as required by PE image
2497    files.  */
2498
2499 static int sort_by_secaddr PARAMS ((const PTR, const PTR));
2500
2501 static int
2502 sort_by_secaddr (arg1, arg2)
2503      const PTR arg1;
2504      const PTR arg2;
2505 {
2506   const asection *a = *(const asection **) arg1;
2507   const asection *b = *(const asection **) arg2;
2508
2509   if (a->vma < b->vma)
2510     return -1;
2511   else if (a->vma > b->vma)
2512     return 1;
2513   else
2514     return 0;
2515 }
2516
2517 #endif /* COFF_IMAGE_WITH_PE */
2518
2519 /* Calculate the file position for each section. */
2520
2521 #ifndef I960
2522 #define ALIGN_SECTIONS_IN_FILE
2523 #endif
2524 #ifdef TIC80COFF
2525 #undef ALIGN_SECTIONS_IN_FILE
2526 #endif
2527
2528 static boolean
2529 coff_compute_section_file_positions (abfd)
2530      bfd * abfd;
2531 {
2532   asection *current;
2533   asection *previous = (asection *) NULL;
2534   file_ptr sofar = FILHSZ;
2535   boolean align_adjust;
2536 #ifdef ALIGN_SECTIONS_IN_FILE
2537   file_ptr old_sofar;
2538 #endif
2539
2540 #ifdef RS6000COFF_C
2541   /* On XCOFF, if we have symbols, set up the .debug section.  */
2542   if (bfd_get_symcount (abfd) > 0)
2543     {
2544       bfd_size_type sz;
2545       bfd_size_type i, symcount;
2546       asymbol **symp;
2547
2548       sz = 0;
2549       symcount = bfd_get_symcount (abfd);
2550       for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2551         {
2552           coff_symbol_type *cf;
2553
2554           cf = coff_symbol_from (abfd, *symp);
2555           if (cf != NULL
2556               && cf->native != NULL
2557               && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2558             {
2559               size_t len;
2560
2561               len = strlen (bfd_asymbol_name (*symp));
2562               if (len > SYMNMLEN)
2563                 sz += len + 3;
2564             }
2565         }
2566       if (sz > 0)
2567         {
2568           asection *dsec;
2569
2570           dsec = bfd_make_section_old_way (abfd, ".debug");
2571           if (dsec == NULL)
2572             abort ();
2573           dsec->_raw_size = sz;
2574           dsec->flags |= SEC_HAS_CONTENTS;
2575         }
2576     }
2577 #endif
2578
2579 #ifdef COFF_IMAGE_WITH_PE
2580   int page_size;
2581   if (coff_data (abfd)->link_info) 
2582     {
2583       page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2584     }
2585   else
2586     page_size = PE_DEF_FILE_ALIGNMENT;
2587 #else
2588 #ifdef COFF_PAGE_SIZE
2589   int page_size = COFF_PAGE_SIZE;
2590 #endif
2591 #endif
2592
2593   if (bfd_get_start_address (abfd))
2594     {
2595       /*  A start address may have been added to the original file. In this
2596           case it will need an optional header to record it.  */
2597       abfd->flags |= EXEC_P;
2598     }
2599
2600   if (abfd->flags & EXEC_P)
2601     sofar += AOUTSZ;
2602 #ifdef RS6000COFF_C
2603   else if (xcoff_data (abfd)->full_aouthdr)
2604     sofar += AOUTSZ;
2605   else
2606     sofar += SMALL_AOUTSZ;
2607 #endif
2608
2609   sofar += abfd->section_count * SCNHSZ;
2610
2611 #ifdef RS6000COFF_C
2612   /* XCOFF handles overflows in the reloc and line number count fields
2613      by allocating a new section header to hold the correct counts.  */
2614   for (current = abfd->sections; current != NULL; current = current->next)
2615     if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2616       sofar += SCNHSZ;
2617 #endif
2618
2619 #ifdef COFF_IMAGE_WITH_PE
2620   {
2621     /* PE requires the sections to be in memory order when listed in
2622        the section headers.  It also does not like empty loadable
2623        sections.  The sections apparently do not have to be in the
2624        right order in the image file itself, but we do need to get the
2625        target_index values right.  */
2626
2627     int count;
2628     asection **section_list;
2629     int i;
2630     int target_index;
2631
2632     count = 0;
2633     for (current = abfd->sections; current != NULL; current = current->next)
2634       ++count;
2635
2636     /* We allocate an extra cell to simplify the final loop.  */
2637     section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
2638     if (section_list == NULL)
2639       return false;
2640
2641     i = 0;
2642     for (current = abfd->sections; current != NULL; current = current->next)
2643       {
2644         section_list[i] = current;
2645         ++i;
2646       }
2647     section_list[i] = NULL;
2648
2649     qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
2650
2651     /* Rethread the linked list into sorted order; at the same time,
2652        assign target_index values.  */
2653     target_index = 1;
2654     abfd->sections = section_list[0];
2655     for (i = 0; i < count; i++)
2656       {
2657         current = section_list[i];
2658         current->next = section_list[i + 1];
2659
2660         /* Later, if the section has zero size, we'll be throwing it
2661            away, so we don't want to number it now.  Note that having
2662            a zero size and having real contents are different
2663            concepts: .bss has no contents, but (usually) non-zero
2664            size.  */
2665         if (current->_raw_size == 0)
2666           {
2667             /* Discard.  However, it still might have (valid) symbols
2668                in it, so arbitrarily set it to section 1 (indexing is
2669                1-based here; usually .text).  __end__ and other
2670                contents of .endsection really have this happen.
2671                FIXME: This seems somewhat dubious.  */
2672             current->target_index = 1;
2673           }
2674         else
2675           current->target_index = target_index++;
2676       }
2677
2678     free (section_list);
2679   }
2680 #else /* ! COFF_IMAGE_WITH_PE */
2681   {
2682     /* Set the target_index field.  */
2683     int target_index;
2684
2685     target_index = 1;
2686     for (current = abfd->sections; current != NULL; current = current->next)
2687       current->target_index = target_index++;
2688   }
2689 #endif /* ! COFF_IMAGE_WITH_PE */
2690
2691   align_adjust = false;
2692   for (current = abfd->sections;
2693        current != (asection *) NULL;
2694        current = current->next)
2695     {
2696 #ifdef COFF_IMAGE_WITH_PE
2697       /* With PE we have to pad each section to be a multiple of its
2698          page size too, and remember both sizes.  */
2699       if (coff_section_data (abfd, current) == NULL)
2700         {
2701           current->used_by_bfd =
2702             (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
2703           if (current->used_by_bfd == NULL)
2704             return false;
2705         }
2706       if (pei_section_data (abfd, current) == NULL)
2707         {
2708           coff_section_data (abfd, current)->tdata =
2709             (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
2710           if (coff_section_data (abfd, current)->tdata == NULL)
2711             return false;
2712         }
2713       if (pei_section_data (abfd, current)->virt_size == 0)
2714         pei_section_data (abfd, current)->virt_size = current->_raw_size;
2715 #endif
2716
2717       /* Only deal with sections which have contents.  */
2718       if (!(current->flags & SEC_HAS_CONTENTS))
2719         continue;
2720
2721 #ifdef COFF_IMAGE_WITH_PE
2722       /* Make sure we skip empty sections in a PE image.  */
2723       if (current->_raw_size == 0)
2724         continue;
2725 #endif
2726
2727       /* Align the sections in the file to the same boundary on
2728          which they are aligned in virtual memory.  I960 doesn't
2729          do this (FIXME) so we can stay in sync with Intel.  960
2730          doesn't yet page from files... */
2731 #ifdef ALIGN_SECTIONS_IN_FILE
2732       if ((abfd->flags & EXEC_P) != 0)
2733         {
2734           /* make sure this section is aligned on the right boundary - by
2735              padding the previous section up if necessary */
2736
2737           old_sofar = sofar;
2738           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2739           if (previous != (asection *) NULL)
2740             {
2741               previous->_raw_size += sofar - old_sofar;
2742             }
2743         }
2744
2745 #endif
2746
2747       /* In demand paged files the low order bits of the file offset
2748          must match the low order bits of the virtual address.  */
2749 #ifdef COFF_PAGE_SIZE
2750       if ((abfd->flags & D_PAGED) != 0
2751           && (current->flags & SEC_ALLOC) != 0)
2752         sofar += (current->vma - sofar) % page_size;
2753 #endif
2754       current->filepos = sofar;
2755
2756 #ifdef COFF_IMAGE_WITH_PE
2757       /* Set the padded size.  */
2758       current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
2759 #endif
2760
2761       sofar += current->_raw_size;
2762
2763 #ifdef ALIGN_SECTIONS_IN_FILE
2764       /* make sure that this section is of the right size too */
2765       if ((abfd->flags & EXEC_P) == 0)
2766         {
2767           bfd_size_type old_size;
2768
2769           old_size = current->_raw_size;
2770           current->_raw_size = BFD_ALIGN (current->_raw_size,
2771                                           1 << current->alignment_power);
2772           align_adjust = current->_raw_size != old_size;
2773           sofar += current->_raw_size - old_size;
2774         }
2775       else
2776         {
2777           old_sofar = sofar;
2778           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2779           align_adjust = sofar != old_sofar;
2780           current->_raw_size += sofar - old_sofar;
2781         }
2782 #endif
2783
2784 #ifdef COFF_IMAGE_WITH_PE
2785       /* For PE we need to make sure we pad out to the aligned
2786          _raw_size, in case the caller only writes out data to the
2787          unaligned _raw_size.  */
2788       if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
2789         align_adjust = true;
2790 #endif
2791
2792 #ifdef _LIB
2793       /* Force .lib sections to start at zero.  The vma is then
2794          incremented in coff_set_section_contents.  This is right for
2795          SVR3.2.  */
2796       if (strcmp (current->name, _LIB) == 0)
2797         bfd_set_section_vma (abfd, current, 0);
2798 #endif
2799
2800       previous = current;
2801     }
2802
2803   /* It is now safe to write to the output file.  If we needed an
2804      alignment adjustment for the last section, then make sure that
2805      there is a byte at offset sofar.  If there are no symbols and no
2806      relocs, then nothing follows the last section.  If we don't force
2807      the last byte out, then the file may appear to be truncated.  */
2808   if (align_adjust)
2809     {
2810       bfd_byte b;
2811
2812       b = 0;
2813       if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
2814           || bfd_write (&b, 1, 1, abfd) != 1)
2815         return false;
2816     }
2817
2818   /* Make sure the relocations are aligned.  We don't need to make
2819      sure that this byte exists, because it will only matter if there
2820      really are relocs.  */
2821   sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
2822
2823   obj_relocbase (abfd) = sofar;
2824   abfd->output_has_begun = true;
2825
2826   return true;
2827 }
2828
2829 #if 0
2830
2831 /* This can never work, because it is called too late--after the
2832    section positions have been set.  I can't figure out what it is
2833    for, so I am going to disable it--Ian Taylor 20 March 1996.  */
2834
2835 /* If .file, .text, .data, .bss symbols are missing, add them.  */
2836 /* @@ Should we only be adding missing symbols, or overriding the aux
2837    values for existing section symbols?  */
2838 static boolean
2839 coff_add_missing_symbols (abfd)
2840      bfd *abfd;
2841 {
2842   unsigned int nsyms = bfd_get_symcount (abfd);
2843   asymbol **sympp = abfd->outsymbols;
2844   asymbol **sympp2;
2845   unsigned int i;
2846   int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
2847
2848   for (i = 0; i < nsyms; i++)
2849     {
2850       coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
2851       CONST char *name;
2852       if (csym)
2853         {
2854           /* only do this if there is a coff representation of the input
2855            symbol */
2856           if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
2857             {
2858               need_file = 0;
2859               continue;
2860             }
2861           name = csym->symbol.name;
2862           if (!name)
2863             continue;
2864           if (!strcmp (name, _TEXT))
2865             need_text = 0;
2866 #ifdef APOLLO_M68
2867           else if (!strcmp (name, ".wtext"))
2868             need_text = 0;
2869 #endif
2870           else if (!strcmp (name, _DATA))
2871             need_data = 0;
2872           else if (!strcmp (name, _BSS))
2873             need_bss = 0;
2874         }
2875     }
2876   /* Now i == bfd_get_symcount (abfd).  */
2877   /* @@ For now, don't deal with .file symbol.  */
2878   need_file = 0;
2879
2880   if (!need_text && !need_data && !need_bss && !need_file)
2881     return true;
2882   nsyms += need_text + need_data + need_bss + need_file;
2883   sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
2884   if (!sympp2)
2885     return false;
2886   memcpy (sympp2, sympp, i * sizeof (asymbol *));
2887   if (need_file)
2888     {
2889       /* @@ Generate fake .file symbol, in sympp2[i], and increment i.  */
2890       abort ();
2891     }
2892   if (need_text)
2893     sympp2[i++] = coff_section_symbol (abfd, _TEXT);
2894   if (need_data)
2895     sympp2[i++] = coff_section_symbol (abfd, _DATA);
2896   if (need_bss)
2897     sympp2[i++] = coff_section_symbol (abfd, _BSS);
2898   BFD_ASSERT (i == nsyms);
2899   bfd_set_symtab (abfd, sympp2, nsyms);
2900   return true;
2901 }
2902
2903 #endif /* 0 */
2904
2905 /* SUPPRESS 558 */
2906 /* SUPPRESS 529 */
2907 static boolean
2908 coff_write_object_contents (abfd)
2909      bfd * abfd;
2910 {
2911   asection *current;
2912   boolean hasrelocs = false;
2913   boolean haslinno = false;
2914   boolean hasdebug = false;
2915   file_ptr scn_base;
2916   file_ptr reloc_base;
2917   file_ptr lineno_base;
2918   file_ptr sym_base;
2919   unsigned long reloc_size = 0;
2920   unsigned long lnno_size = 0;
2921   boolean long_section_names;
2922   asection *text_sec = NULL;
2923   asection *data_sec = NULL;
2924   asection *bss_sec = NULL;
2925   struct internal_filehdr internal_f;
2926   struct internal_aouthdr internal_a;
2927 #ifdef COFF_LONG_SECTION_NAMES
2928   size_t string_size = STRING_SIZE_SIZE;
2929 #endif
2930
2931   bfd_set_error (bfd_error_system_call);
2932
2933   /* Make a pass through the symbol table to count line number entries and
2934      put them into the correct asections */
2935
2936   lnno_size = coff_count_linenumbers (abfd) * LINESZ;
2937
2938   if (abfd->output_has_begun == false)
2939     {
2940       if (! coff_compute_section_file_positions (abfd))
2941         return false;
2942     }
2943
2944   reloc_base = obj_relocbase (abfd);
2945
2946   /* Work out the size of the reloc and linno areas */
2947
2948   for (current = abfd->sections; current != NULL; current =
2949        current->next)
2950     reloc_size += current->reloc_count * RELSZ;
2951
2952   lineno_base = reloc_base + reloc_size;
2953   sym_base = lineno_base + lnno_size;
2954
2955   /* Indicate in each section->line_filepos its actual file address */
2956   for (current = abfd->sections; current != NULL; current =
2957        current->next)
2958     {
2959       if (current->lineno_count)
2960         {
2961           current->line_filepos = lineno_base;
2962           current->moving_line_filepos = lineno_base;
2963           lineno_base += current->lineno_count * LINESZ;
2964         }
2965       else
2966         {
2967           current->line_filepos = 0;
2968         }
2969       if (current->reloc_count)
2970         {
2971           current->rel_filepos = reloc_base;
2972           reloc_base += current->reloc_count * RELSZ;
2973         }
2974       else
2975         {
2976           current->rel_filepos = 0;
2977         }
2978     }
2979
2980   /* Write section headers to the file.  */
2981   internal_f.f_nscns = 0;
2982
2983   if ((abfd->flags & EXEC_P) != 0)
2984     scn_base = FILHSZ + AOUTSZ;
2985   else
2986     {
2987       scn_base = FILHSZ;
2988 #ifdef RS6000COFF_C
2989       if (xcoff_data (abfd)->full_aouthdr)
2990         scn_base += AOUTSZ;
2991       else
2992         scn_base += SMALL_AOUTSZ;
2993 #endif
2994     }
2995
2996   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
2997     return false;
2998
2999   long_section_names = false;
3000   for (current = abfd->sections;
3001        current != NULL;
3002        current = current->next)
3003     {
3004       struct internal_scnhdr section;
3005       boolean is_reloc_section = false;
3006
3007 #ifdef COFF_IMAGE_WITH_PE
3008       if (strcmp (current->name, ".reloc") == 0)
3009         {
3010           is_reloc_section = true;
3011           hasrelocs = true;
3012           pe_data (abfd)->has_reloc_section = 1;
3013         }
3014 #endif
3015
3016       internal_f.f_nscns++;
3017
3018       strncpy (section.s_name, current->name, SCNNMLEN);
3019
3020 #ifdef COFF_LONG_SECTION_NAMES
3021       /* Handle long section names as in PE.  This must be compatible
3022          with the code in coff_write_symbols and _bfd_coff_final_link.  */
3023       {
3024         size_t len;
3025
3026         len = strlen (current->name);
3027         if (len > SCNNMLEN)
3028           {
3029             memset (section.s_name, 0, SCNNMLEN);
3030             sprintf (section.s_name, "/%lu", (unsigned long) string_size);
3031             string_size += len + 1;
3032             long_section_names = true;
3033           }
3034       }
3035 #endif
3036
3037 #ifdef _LIB
3038       /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
3039          Ian Taylor <ian@cygnus.com>.  */
3040       if (strcmp (current->name, _LIB) == 0)
3041         section.s_vaddr = 0;
3042       else
3043 #endif
3044       section.s_vaddr = current->vma;
3045       section.s_paddr = current->lma;
3046       section.s_size =  current->_raw_size;
3047
3048 #ifdef COFF_WITH_PE
3049       section.s_paddr = 0;
3050 #endif
3051 #ifdef COFF_IMAGE_WITH_PE
3052       /* Reminder: s_paddr holds the virtual size of the section.  */
3053       if (coff_section_data (abfd, current) != NULL
3054           && pei_section_data (abfd, current) != NULL)
3055         section.s_paddr = pei_section_data (abfd, current)->virt_size;
3056       else
3057         section.s_paddr = 0;
3058 #endif
3059
3060       /*
3061          If this section has no size or is unloadable then the scnptr
3062          will be 0 too
3063          */
3064       if (current->_raw_size == 0 ||
3065           (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3066         {
3067           section.s_scnptr = 0;
3068         }
3069       else
3070         {
3071           section.s_scnptr = current->filepos;
3072         }
3073       section.s_relptr = current->rel_filepos;
3074       section.s_lnnoptr = current->line_filepos;
3075       section.s_nreloc = current->reloc_count;
3076       section.s_nlnno = current->lineno_count;
3077       if (current->reloc_count != 0)
3078         hasrelocs = true;
3079       if (current->lineno_count != 0)
3080         haslinno = true;
3081       if ((current->flags & SEC_DEBUGGING) != 0
3082           && ! is_reloc_section)
3083         hasdebug = true;
3084
3085 #ifdef RS6000COFF_C
3086       /* Indicate the use of an XCOFF overflow section header.  */
3087       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3088         {
3089           section.s_nreloc = 0xffff;
3090           section.s_nlnno = 0xffff;
3091         }
3092 #endif
3093
3094       section.s_flags = sec_to_styp_flags (current->name, current->flags);
3095
3096       if (!strcmp (current->name, _TEXT))
3097         {
3098           text_sec = current;
3099         }
3100       else if (!strcmp (current->name, _DATA))
3101         {
3102           data_sec = current;
3103         }
3104       else if (!strcmp (current->name, _BSS))
3105         {
3106           bss_sec = current;
3107         }
3108
3109 #ifdef I960
3110       section.s_align = (current->alignment_power
3111                          ? 1 << current->alignment_power
3112                          : 0);
3113 #else
3114 #ifdef TIC80COFF
3115       section.s_flags |= (current->alignment_power & 0xF) << 8;
3116 #endif
3117 #endif
3118
3119 #ifdef COFF_IMAGE_WITH_PE
3120       /* Suppress output of the sections if they are null.  ld
3121          includes the bss and data sections even if there is no size
3122          assigned to them.  NT loader doesn't like it if these section
3123          headers are included if the sections themselves are not
3124          needed.  See also coff_compute_section_file_positions.  */
3125       if (section.s_size == 0)
3126         internal_f.f_nscns--;
3127       else
3128 #endif
3129         {
3130           SCNHDR buff;
3131           if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3132               || bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
3133             return false;
3134         }
3135
3136 #ifdef COFF_WITH_PE
3137       /* PE stores COMDAT section information in the symbol table.  If
3138          this section is supposed to have some COMDAT info, track down
3139          the symbol in the symbol table and modify it.  */
3140       if ((current->flags & SEC_LINK_ONCE) != 0)
3141         {
3142           unsigned int i, count;
3143           asymbol **psym;
3144           coff_symbol_type *csym = NULL;
3145           asymbol **psymsec;
3146
3147           psymsec = NULL;
3148           count = bfd_get_symcount (abfd);
3149           for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3150             {
3151               if ((*psym)->section != current)
3152                 continue;
3153
3154               /* Remember the location of the first symbol in this
3155                  section.  */
3156               if (psymsec == NULL)
3157                 psymsec = psym;
3158
3159               /* See if this is the section symbol.  */
3160               if (strcmp ((*psym)->name, current->name) == 0)
3161                 {
3162                   csym = coff_symbol_from (abfd, *psym);
3163                   if (csym == NULL
3164                       || csym->native == NULL
3165                       || csym->native->u.syment.n_numaux < 1
3166                       || csym->native->u.syment.n_sclass != C_STAT
3167                       || csym->native->u.syment.n_type != T_NULL)
3168                     continue;
3169
3170                   /* Here *PSYM is the section symbol for CURRENT.  */
3171
3172                   break;
3173                 }
3174             }
3175
3176           /* Did we find it?
3177              Note that we might not if we're converting the file from
3178              some other object file format.  */
3179           if (i < count)
3180             {
3181               combined_entry_type *aux;
3182
3183               /* We don't touch the x_checksum field.  The
3184                  x_associated field is not currently supported.  */
3185
3186               aux = csym->native + 1;
3187               switch (current->flags & SEC_LINK_DUPLICATES)
3188                 {
3189                 case SEC_LINK_DUPLICATES_DISCARD:
3190                   aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3191                   break;
3192
3193                 case SEC_LINK_DUPLICATES_ONE_ONLY:
3194                   aux->u.auxent.x_scn.x_comdat =
3195                     IMAGE_COMDAT_SELECT_NODUPLICATES;
3196                   break;
3197
3198                 case SEC_LINK_DUPLICATES_SAME_SIZE:
3199                   aux->u.auxent.x_scn.x_comdat =
3200                     IMAGE_COMDAT_SELECT_SAME_SIZE;
3201                   break;
3202
3203                 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3204                   aux->u.auxent.x_scn.x_comdat =
3205                     IMAGE_COMDAT_SELECT_EXACT_MATCH;
3206                   break;
3207                 }
3208
3209               /* The COMDAT symbol must be the first symbol from this
3210                  section in the symbol table.  In order to make this
3211                  work, we move the COMDAT symbol before the first
3212                  symbol we found in the search above.  It's OK to
3213                  rearrange the symbol table at this point, because
3214                  coff_renumber_symbols is going to rearrange it
3215                  further and fix up all the aux entries.  */
3216               if (psym != psymsec)
3217                 {
3218                   asymbol *hold;
3219                   asymbol **pcopy;
3220
3221                   hold = *psym;
3222                   for (pcopy = psym; pcopy > psymsec; pcopy--)
3223                     pcopy[0] = pcopy[-1];
3224                   *psymsec = hold;
3225                 }
3226             }
3227         }
3228 #endif /* COFF_WITH_PE */
3229     }
3230
3231 #ifdef RS6000COFF_C
3232   /* XCOFF handles overflows in the reloc and line number count fields
3233      by creating a new section header to hold the correct values.  */
3234   for (current = abfd->sections; current != NULL; current = current->next)
3235     {
3236       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3237         {
3238           struct internal_scnhdr scnhdr;
3239           SCNHDR buff;
3240
3241           internal_f.f_nscns++;
3242           strncpy (&(scnhdr.s_name[0]), current->name, 8);
3243           scnhdr.s_paddr = current->reloc_count;
3244           scnhdr.s_vaddr = current->lineno_count;
3245           scnhdr.s_size = 0;
3246           scnhdr.s_scnptr = 0;
3247           scnhdr.s_relptr = current->rel_filepos;
3248           scnhdr.s_lnnoptr = current->line_filepos;
3249           scnhdr.s_nreloc = current->target_index;
3250           scnhdr.s_nlnno = current->target_index;
3251           scnhdr.s_flags = STYP_OVRFLO;
3252           if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3253               || bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ)
3254             return false;
3255         }
3256     }
3257 #endif
3258
3259   /* OK, now set up the filehdr... */
3260
3261   /* Don't include the internal abs section in the section count */
3262
3263   /*
3264      We will NOT put a fucking timestamp in the header here. Every time you
3265      put it back, I will come in and take it out again.  I'm sorry.  This
3266      field does not belong here.  We fill it with a 0 so it compares the
3267      same but is not a reasonable time. -- gnu@cygnus.com
3268      */
3269   internal_f.f_timdat = 0;
3270
3271   internal_f.f_flags = 0;
3272
3273   if (abfd->flags & EXEC_P)
3274     internal_f.f_opthdr = AOUTSZ;
3275   else
3276     {
3277       internal_f.f_opthdr = 0;
3278 #ifdef RS6000COFF_C
3279       if (xcoff_data (abfd)->full_aouthdr)
3280         internal_f.f_opthdr = AOUTSZ;
3281       else
3282         internal_f.f_opthdr = SMALL_AOUTSZ;
3283 #endif
3284     }
3285
3286   if (!hasrelocs)
3287     internal_f.f_flags |= F_RELFLG;
3288   if (!haslinno)
3289     internal_f.f_flags |= F_LNNO;
3290   if (abfd->flags & EXEC_P)
3291     internal_f.f_flags |= F_EXEC;
3292 #ifdef COFF_IMAGE_WITH_PE
3293   if (! hasdebug)
3294     internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3295 #endif
3296
3297 #ifndef COFF_WITH_PE
3298   if (bfd_little_endian (abfd))
3299     internal_f.f_flags |= F_AR32WR;
3300   else
3301     internal_f.f_flags |= F_AR32W;
3302 #endif
3303
3304 #ifdef TIC80_TARGET_ID
3305   internal_f.f_target_id = TIC80_TARGET_ID;
3306 #endif
3307
3308   /*
3309      FIXME, should do something about the other byte orders and
3310      architectures.
3311      */
3312
3313 #ifdef RS6000COFF_C
3314   if ((abfd->flags & DYNAMIC) != 0)
3315     internal_f.f_flags |= F_SHROBJ;
3316   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3317     internal_f.f_flags |= F_DYNLOAD;
3318 #endif
3319
3320   memset (&internal_a, 0, sizeof internal_a);
3321
3322   /* Set up architecture-dependent stuff */
3323
3324   {
3325     unsigned int magic = 0;
3326     unsigned short flags = 0;
3327     coff_set_flags (abfd, &magic, &flags);
3328     internal_f.f_magic = magic;
3329     internal_f.f_flags |= flags;
3330     /* ...and the "opt"hdr... */
3331
3332 #ifdef A29K
3333 #ifdef ULTRA3                   /* NYU's machine */
3334     /* FIXME: This is a bogus check.  I really want to see if there
3335      * is a .shbss or a .shdata section, if so then set the magic
3336      * number to indicate a shared data executable.
3337      */
3338     if (internal_f.f_nscns >= 7)
3339       internal_a.magic = SHMAGIC; /* Shared magic */
3340     else
3341 #endif /* ULTRA3 */
3342       internal_a.magic = NMAGIC; /* Assume separate i/d */
3343 #define __A_MAGIC_SET__
3344 #endif /* A29K */
3345 #ifdef TIC80COFF
3346     internal_a.magic = TIC80_ARCH_MAGIC;
3347 #define __A_MAGIC_SET__
3348 #endif /* TIC80 */
3349 #ifdef I860
3350     /* FIXME: What are the a.out magic numbers for the i860?  */
3351     internal_a.magic = 0;
3352 #define __A_MAGIC_SET__
3353 #endif /* I860 */
3354 #ifdef I960
3355     internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3356 #define __A_MAGIC_SET__
3357 #endif /* I960 */
3358 #if M88
3359 #define __A_MAGIC_SET__
3360     internal_a.magic = PAGEMAGICBCS;
3361 #endif /* M88 */
3362
3363 #if APOLLO_M68
3364 #define __A_MAGIC_SET__
3365     internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3366 #endif
3367
3368 #if defined(M68) || defined(WE32K) || defined(M68K)
3369 #define __A_MAGIC_SET__
3370 #if defined(LYNXOS)
3371     internal_a.magic = LYNXCOFFMAGIC;
3372 #else
3373 #if defined(TARG_AUX)
3374     internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3375                         abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3376                         PAGEMAGICEXECSWAPPED);
3377 #else
3378 #if defined (PAGEMAGICPEXECPAGED)
3379     internal_a.magic = PAGEMAGICPEXECPAGED;
3380 #endif
3381 #endif /* TARG_AUX */
3382 #endif /* LYNXOS */
3383 #endif /* M68 || WE32K || M68K */
3384
3385 #if defined(ARM)
3386 #define __A_MAGIC_SET__
3387     internal_a.magic = ZMAGIC;
3388 #endif 
3389
3390 #if defined(PPC_PE)
3391 #define __A_MAGIC_SET__
3392     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3393 #endif
3394
3395 #if defined MCORE_PE
3396 #define __A_MAGIC_SET__
3397     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3398 #endif 
3399
3400 #if defined(I386)
3401 #define __A_MAGIC_SET__
3402 #if defined(LYNXOS)
3403     internal_a.magic = LYNXCOFFMAGIC;
3404 #else  /* LYNXOS */
3405     internal_a.magic = ZMAGIC;
3406 #endif /* LYNXOS */
3407 #endif /* I386 */
3408
3409 #if defined(SPARC)
3410 #define __A_MAGIC_SET__
3411 #if defined(LYNXOS)
3412     internal_a.magic = LYNXCOFFMAGIC;
3413 #endif /* LYNXOS */
3414 #endif /* SPARC */
3415
3416 #ifdef RS6000COFF_C
3417 #define __A_MAGIC_SET__
3418     internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
3419     (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
3420     RS6K_AOUTHDR_OMAGIC;
3421 #endif
3422
3423 #ifndef __A_MAGIC_SET__
3424 #include "Your aouthdr magic number is not being set!"
3425 #else
3426 #undef __A_MAGIC_SET__
3427 #endif
3428   }
3429
3430   /* FIXME: Does anybody ever set this to another value?  */
3431   internal_a.vstamp = 0;
3432
3433   /* Now should write relocs, strings, syms */
3434   obj_sym_filepos (abfd) = sym_base;
3435
3436   if (bfd_get_symcount (abfd) != 0)
3437     {
3438       int firstundef;
3439 #if 0
3440       if (!coff_add_missing_symbols (abfd))
3441         return false;
3442 #endif
3443       if (!coff_renumber_symbols (abfd, &firstundef))
3444         return false;
3445       coff_mangle_symbols (abfd);
3446       if (! coff_write_symbols (abfd))
3447         return false;
3448       if (! coff_write_linenumbers (abfd))
3449         return false;
3450       if (! coff_write_relocs (abfd, firstundef))
3451         return false;
3452     }
3453 #ifdef COFF_LONG_SECTION_NAMES
3454   else if (long_section_names)
3455     {
3456       /* If we have long section names we have to write out the string
3457          table even if there are no symbols.  */
3458       if (! coff_write_symbols (abfd))
3459         return false;
3460     }
3461 #endif
3462 #ifdef COFF_IMAGE_WITH_PE
3463 #ifdef PPC_PE
3464   else if ((abfd->flags & EXEC_P) != 0)
3465     {
3466       bfd_byte b;
3467
3468       /* PowerPC PE appears to require that all executable files be
3469          rounded up to the page size.  */
3470       b = 0;
3471       if (bfd_seek (abfd,
3472                     BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3473                     SEEK_SET) != 0
3474           || bfd_write (&b, 1, 1, abfd) != 1)
3475         return false;
3476     }
3477 #endif
3478 #endif
3479
3480   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
3481      backend linker, and obj_raw_syment_count is not valid until after
3482      coff_write_symbols is called.  */
3483   if (obj_raw_syment_count (abfd) != 0)
3484     {
3485       internal_f.f_symptr = sym_base;
3486 #ifdef RS6000COFF_C
3487       /* AIX appears to require that F_RELFLG not be set if there are
3488          local symbols but no relocations.  */
3489       internal_f.f_flags &=~ F_RELFLG;
3490 #endif
3491     }
3492   else
3493     {
3494       if (long_section_names)
3495         internal_f.f_symptr = sym_base;
3496       else
3497         internal_f.f_symptr = 0;
3498       internal_f.f_flags |= F_LSYMS;
3499     }
3500
3501   if (text_sec)
3502     {
3503       internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3504       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3505     }
3506   if (data_sec)
3507     {
3508       internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3509       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
3510     }
3511   if (bss_sec)
3512     {
3513       internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
3514       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
3515         internal_a.data_start = bss_sec->vma;
3516     }
3517
3518   internal_a.entry = bfd_get_start_address (abfd);
3519   internal_f.f_nsyms = obj_raw_syment_count (abfd);
3520
3521 #ifdef RS6000COFF_C
3522   if (xcoff_data (abfd)->full_aouthdr)
3523     {
3524       bfd_vma toc;
3525       asection *loader_sec;
3526
3527       internal_a.vstamp = 1;
3528
3529       internal_a.o_snentry = xcoff_data (abfd)->snentry;
3530       if (internal_a.o_snentry == 0)
3531         internal_a.entry = (bfd_vma) -1;
3532
3533       if (text_sec != NULL)
3534         {
3535           internal_a.o_sntext = text_sec->target_index;
3536           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
3537         }
3538       else
3539         {
3540           internal_a.o_sntext = 0;
3541           internal_a.o_algntext = 0;
3542         }
3543       if (data_sec != NULL)
3544         {
3545           internal_a.o_sndata = data_sec->target_index;
3546           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
3547         }
3548       else
3549         {
3550           internal_a.o_sndata = 0;
3551           internal_a.o_algndata = 0;
3552         }
3553       loader_sec = bfd_get_section_by_name (abfd, ".loader");
3554       if (loader_sec != NULL)
3555         internal_a.o_snloader = loader_sec->target_index;
3556       else
3557         internal_a.o_snloader = 0;
3558       if (bss_sec != NULL)
3559         internal_a.o_snbss = bss_sec->target_index;
3560       else
3561         internal_a.o_snbss = 0;
3562
3563       toc = xcoff_data (abfd)->toc;
3564       internal_a.o_toc = toc;
3565       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
3566
3567       internal_a.o_modtype = xcoff_data (abfd)->modtype;
3568       if (xcoff_data (abfd)->cputype != -1)
3569         internal_a.o_cputype = xcoff_data (abfd)->cputype;
3570       else
3571         {
3572           switch (bfd_get_arch (abfd))
3573             {
3574             case bfd_arch_rs6000:
3575               internal_a.o_cputype = 4;
3576               break;
3577             case bfd_arch_powerpc:
3578               if (bfd_get_mach (abfd) == 0)
3579                 internal_a.o_cputype = 3;
3580               else
3581                 internal_a.o_cputype = 1;
3582               break;
3583             default:
3584               abort ();
3585             }
3586         }
3587       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
3588       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
3589     }
3590 #endif
3591
3592   /* now write them */
3593   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3594     return false;
3595   {
3596     char buff[FILHSZ];
3597     coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
3598     if (bfd_write ((PTR) buff, 1, FILHSZ, abfd) != FILHSZ)
3599       return false;
3600   }
3601   if (abfd->flags & EXEC_P)
3602     {
3603       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR. 
3604          include/coff/pe.h sets AOUTSZ == sizeof(PEAOUTHDR)) */
3605       char buff[AOUTSZ];
3606       coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
3607       if (bfd_write ((PTR) buff, 1, AOUTSZ, abfd) != AOUTSZ)
3608         return false;
3609     }
3610 #ifdef RS6000COFF_C
3611   else
3612     {
3613       AOUTHDR buff;
3614       size_t size;
3615
3616       /* XCOFF seems to always write at least a small a.out header.  */
3617       coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3618       if (xcoff_data (abfd)->full_aouthdr)
3619         size = AOUTSZ;
3620       else
3621         size = SMALL_AOUTSZ;
3622       if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
3623         return false;
3624     }
3625 #endif
3626
3627   return true;
3628 }
3629
3630 static boolean
3631 coff_set_section_contents (abfd, section, location, offset, count)
3632      bfd * abfd;
3633      sec_ptr section;
3634      PTR location;
3635      file_ptr offset;
3636      bfd_size_type count;
3637 {
3638   if (abfd->output_has_begun == false)  /* set by bfd.c handler */
3639     {
3640       if (! coff_compute_section_file_positions (abfd))
3641         return false;
3642     }
3643
3644 #if defined(_LIB) && !defined(TARG_AUX)
3645
3646    /* The physical address field of a .lib section is used to hold the
3647       number of shared libraries in the section.  This code counts the
3648       number of sections being written, and increments the lma field
3649       with the number.
3650
3651       I have found no documentation on the contents of this section.
3652       Experimentation indicates that the section contains zero or more
3653       records, each of which has the following structure:
3654
3655       - a (four byte) word holding the length of this record, in words,
3656       - a word that always seems to be set to "2",
3657       - the path to a shared library, null-terminated and then padded
3658         to a whole word boundary.
3659
3660       bfd_assert calls have been added to alert if an attempt is made
3661       to write a section which doesn't follow these assumptions.  The
3662       code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
3663       <robertl@arnet.com> (Thanks!).
3664   
3665       Gvran Uddeborg <gvran@uddeborg.pp.se> */
3666
3667     if (strcmp (section->name, _LIB) == 0)
3668       {
3669         bfd_byte *rec, *recend;
3670
3671         rec = (bfd_byte *) location;
3672         recend = rec + count;
3673         while (rec < recend)
3674           {
3675             ++section->lma;
3676             rec += bfd_get_32 (abfd, rec) * 4;
3677           }
3678
3679         BFD_ASSERT (rec == recend);
3680       }
3681
3682 #endif
3683
3684   /* Don't write out bss sections - one way to do this is to
3685        see if the filepos has not been set. */
3686   if (section->filepos == 0)
3687     return true;
3688
3689   if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
3690     return false;
3691
3692   if (count != 0)
3693     {
3694       return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3695     }
3696   return true;
3697 }
3698 #if 0
3699 static boolean
3700 coff_close_and_cleanup (abfd)
3701      bfd *abfd;
3702 {
3703   if (!bfd_read_p (abfd))
3704     switch (abfd->format)
3705       {
3706       case bfd_archive:
3707         if (!_bfd_write_archive_contents (abfd))
3708           return false;
3709         break;
3710       case bfd_object:
3711         if (!coff_write_object_contents (abfd))
3712           return false;
3713         break;
3714       default:
3715         bfd_set_error (bfd_error_invalid_operation);
3716         return false;
3717       }
3718
3719   /* We depend on bfd_close to free all the memory on the objalloc.  */
3720   return true;
3721 }
3722
3723 #endif
3724
3725 static PTR
3726 buy_and_read (abfd, where, seek_direction, size)
3727      bfd *abfd;
3728      file_ptr where;
3729      int seek_direction;
3730      size_t size;
3731 {
3732   PTR area = (PTR) bfd_alloc (abfd, size);
3733   if (!area)
3734     return (NULL);
3735   if (bfd_seek (abfd, where, seek_direction) != 0
3736       || bfd_read (area, 1, size, abfd) != size)
3737     return (NULL);
3738   return (area);
3739 }                               /* buy_and_read() */
3740
3741 /*
3742 SUBSUBSECTION
3743         Reading linenumbers
3744
3745         Creating the linenumber table is done by reading in the entire
3746         coff linenumber table, and creating another table for internal use.
3747
3748         A coff linenumber table is structured so that each function
3749         is marked as having a line number of 0. Each line within the
3750         function is an offset from the first line in the function. The
3751         base of the line number information for the table is stored in
3752         the symbol associated with the function.
3753
3754         Note: The PE format uses line number 0 for a flag indicating a
3755         new source file.
3756
3757         The information is copied from the external to the internal
3758         table, and each symbol which marks a function is marked by
3759         pointing its...
3760
3761         How does this work ?
3762
3763 */
3764
3765 static boolean
3766 coff_slurp_line_table (abfd, asect)
3767      bfd *abfd;
3768      asection *asect;
3769 {
3770   LINENO *native_lineno;
3771   alent *lineno_cache;
3772
3773   BFD_ASSERT (asect->lineno == (alent *) NULL);
3774
3775   native_lineno = (LINENO *) buy_and_read (abfd,
3776                                            asect->line_filepos,
3777                                            SEEK_SET,
3778                                            (size_t) (LINESZ *
3779                                                      asect->lineno_count));
3780   lineno_cache =
3781     (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
3782   if (lineno_cache == NULL)
3783     return false;
3784   else
3785     {
3786       unsigned int counter = 0;
3787       alent *cache_ptr = lineno_cache;
3788       LINENO *src = native_lineno;
3789
3790       while (counter < asect->lineno_count)
3791         {
3792           struct internal_lineno dst;
3793           coff_swap_lineno_in (abfd, src, &dst);
3794           cache_ptr->line_number = dst.l_lnno;
3795
3796           if (cache_ptr->line_number == 0)
3797             {
3798               boolean warned;
3799               long symndx;
3800               coff_symbol_type *sym;
3801
3802               warned = false;
3803               symndx = dst.l_addr.l_symndx;
3804               if (symndx < 0
3805                   || (unsigned long) symndx >= obj_raw_syment_count (abfd))
3806                 {
3807                   (*_bfd_error_handler)
3808                     (_("%s: warning: illegal symbol index %ld in line numbers"),
3809                      bfd_get_filename (abfd), dst.l_addr.l_symndx);
3810                   symndx = 0;
3811                   warned = true;
3812                 }
3813               /* FIXME: We should not be casting between ints and
3814                  pointers like this.  */
3815               sym = ((coff_symbol_type *)
3816                      ((symndx + obj_raw_syments (abfd))
3817                       ->u.syment._n._n_n._n_zeroes));
3818               cache_ptr->u.sym = (asymbol *) sym;
3819               if (sym->lineno != NULL && ! warned)
3820                 {
3821                   (*_bfd_error_handler)
3822                     (_("%s: warning: duplicate line number information for `%s'"),
3823                      bfd_get_filename (abfd),
3824                      bfd_asymbol_name (&sym->symbol));
3825                 }
3826               sym->lineno = cache_ptr;
3827             }
3828           else
3829             {
3830               cache_ptr->u.offset = dst.l_addr.l_paddr
3831                 - bfd_section_vma (abfd, asect);
3832             }                   /* If no linenumber expect a symbol index */
3833
3834           cache_ptr++;
3835           src++;
3836           counter++;
3837         }
3838       cache_ptr->line_number = 0;
3839
3840     }
3841   asect->lineno = lineno_cache;
3842   /* FIXME, free native_lineno here, or use alloca or something. */
3843   return true;
3844 }
3845
3846 /* Slurp in the symbol table, converting it to generic form.  Note
3847    that if coff_relocate_section is defined, the linker will read
3848    symbols via coff_link_add_symbols, rather than via this routine.  */
3849
3850 static boolean
3851 coff_slurp_symbol_table (abfd)
3852      bfd * abfd;
3853 {
3854   combined_entry_type *native_symbols;
3855   coff_symbol_type *cached_area;
3856   unsigned int *table_ptr;
3857
3858   unsigned int number_of_symbols = 0;
3859
3860   if (obj_symbols (abfd))
3861     return true;
3862
3863   /* Read in the symbol table */
3864   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
3865     {
3866       return (false);
3867     }                           /* on error */
3868
3869   /* Allocate enough room for all the symbols in cached form */
3870   cached_area = ((coff_symbol_type *)
3871                  bfd_alloc (abfd,
3872                             (obj_raw_syment_count (abfd)
3873                              * sizeof (coff_symbol_type))));
3874
3875   if (cached_area == NULL)
3876     return false;
3877   table_ptr = ((unsigned int *)
3878                bfd_alloc (abfd,
3879                           (obj_raw_syment_count (abfd)
3880                            * sizeof (unsigned int))));
3881
3882   if (table_ptr == NULL)
3883     return false;
3884   else
3885     {
3886       coff_symbol_type *dst = cached_area;
3887       unsigned int last_native_index = obj_raw_syment_count (abfd);
3888       unsigned int this_index = 0;
3889       while (this_index < last_native_index)
3890         {
3891           combined_entry_type *src = native_symbols + this_index;
3892           table_ptr[this_index] = number_of_symbols;
3893           dst->symbol.the_bfd = abfd;
3894
3895           dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
3896           /* We use the native name field to point to the cached field.  */
3897           src->u.syment._n._n_n._n_zeroes = (long) dst;
3898           dst->symbol.section = coff_section_from_bfd_index (abfd,
3899                                                      src->u.syment.n_scnum);
3900           dst->symbol.flags = 0;
3901           dst->done_lineno = false;
3902
3903           switch (src->u.syment.n_sclass)
3904             {
3905 #ifdef I960
3906             case C_LEAFEXT:
3907 #if 0
3908               dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
3909               dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3910               dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3911 #endif
3912               /* Fall through to next case */
3913
3914 #endif
3915
3916             case C_EXT:
3917             case C_WEAKEXT:
3918 #if defined ARM
3919             case C_THUMBEXT:
3920             case C_THUMBEXTFUNC:
3921 #endif
3922 #ifdef RS6000COFF_C
3923             case C_HIDEXT:
3924 #endif
3925 #ifdef C_SYSTEM
3926             case C_SYSTEM:      /* System Wide variable */
3927 #endif
3928 #ifdef COFF_WITH_PE
3929             /* In PE, 0x68 (104) denotes a section symbol */
3930             case C_SECTION:
3931             /* In PE, 0x69 (105) denotes a weak external symbol.  */
3932             case C_NT_WEAK:
3933 #endif
3934               switch (coff_classify_symbol (abfd, &src->u.syment))
3935                 {
3936                 case COFF_SYMBOL_GLOBAL:
3937                   dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3938 #if defined COFF_WITH_PE
3939                   /* PE sets the symbol to a value relative to the
3940                      start of the section.  */
3941                   dst->symbol.value = src->u.syment.n_value;
3942 #else
3943                   dst->symbol.value = (src->u.syment.n_value
3944                                        - dst->symbol.section->vma);
3945 #endif
3946                   if (ISFCN ((src->u.syment.n_type)))
3947                     {
3948                       /* A function ext does not go at the end of a
3949                          file.  */
3950                       dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3951                     }
3952                   break;
3953
3954                 case COFF_SYMBOL_COMMON:
3955                   dst->symbol.section = bfd_com_section_ptr;
3956                   dst->symbol.value = src->u.syment.n_value;
3957                   break;
3958
3959                 case COFF_SYMBOL_UNDEFINED:
3960                   dst->symbol.section = bfd_und_section_ptr;
3961                   dst->symbol.value = 0;
3962                   break; 
3963
3964                 case COFF_SYMBOL_PE_SECTION:
3965                   dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
3966                   dst->symbol.value = 0;
3967                   break;
3968
3969                 case COFF_SYMBOL_LOCAL:
3970                   dst->symbol.flags = BSF_LOCAL;
3971 #if defined COFF_WITH_PE
3972                   /* PE sets the symbol to a value relative to the
3973                      start of the section.  */
3974                   dst->symbol.value = src->u.syment.n_value;
3975 #else
3976                   dst->symbol.value = (src->u.syment.n_value
3977                                        - dst->symbol.section->vma);
3978 #endif
3979                   if (ISFCN ((src->u.syment.n_type)))
3980                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3981                   break;
3982                 }
3983
3984 #ifdef RS6000COFF_C
3985               /* A symbol with a csect entry should not go at the end.  */
3986               if (src->u.syment.n_numaux > 0)
3987                 dst->symbol.flags |= BSF_NOT_AT_END;
3988 #endif
3989
3990 #ifdef COFF_WITH_PE
3991               if (src->u.syment.n_sclass == C_NT_WEAK)
3992                 dst->symbol.flags = BSF_WEAK;
3993               if (src->u.syment.n_sclass == C_SECTION
3994                   && src->u.syment.n_scnum > 0)
3995                 {
3996                   dst->symbol.flags = BSF_LOCAL;
3997                 }
3998 #endif
3999
4000               if (src->u.syment.n_sclass == C_WEAKEXT)
4001                 dst->symbol.flags = BSF_WEAK;
4002
4003               break;
4004
4005             case C_STAT:        /* static                        */
4006 #ifdef I960
4007             case C_LEAFSTAT:    /* static leaf procedure        */
4008 #endif
4009 #if defined ARM 
4010             case C_THUMBSTAT:   /* Thumb static                  */
4011             case C_THUMBLABEL:  /* Thumb label                   */
4012             case C_THUMBSTATFUNC:/* Thumb static function        */
4013 #endif
4014             case C_LABEL:       /* label                         */
4015               if (src->u.syment.n_scnum == N_DEBUG)
4016                 dst->symbol.flags = BSF_DEBUGGING;
4017               else
4018                 dst->symbol.flags = BSF_LOCAL;
4019
4020               /* Base the value as an index from the base of the
4021                  section, if there is one.  */
4022               if (dst->symbol.section)
4023                 {
4024 #if defined COFF_WITH_PE
4025                   /* PE sets the symbol to a value relative to the
4026                      start of the section.  */
4027                   dst->symbol.value = src->u.syment.n_value;
4028 #else
4029                   dst->symbol.value = (src->u.syment.n_value
4030                                        - dst->symbol.section->vma);
4031 #endif
4032                 }
4033               else
4034                 dst->symbol.value = src->u.syment.n_value;
4035               break;
4036
4037             case C_MOS: /* member of structure   */
4038             case C_EOS: /* end of structure              */
4039 #ifdef NOTDEF                   /* C_AUTOARG has the same value */
4040 #ifdef C_GLBLREG
4041             case C_GLBLREG:     /* A29k-specific storage class */
4042 #endif
4043 #endif
4044             case C_REGPARM:     /* register parameter            */
4045             case C_REG: /* register variable             */
4046 #ifndef TIC80COFF
4047 #ifdef C_AUTOARG
4048             case C_AUTOARG:     /* 960-specific storage class */
4049 #endif
4050 #endif
4051             case C_TPDEF:       /* type definition               */
4052             case C_ARG:
4053             case C_AUTO:        /* automatic variable */
4054             case C_FIELD:       /* bit field */
4055             case C_ENTAG:       /* enumeration tag               */
4056             case C_MOE: /* member of enumeration         */
4057             case C_MOU: /* member of union               */
4058             case C_UNTAG:       /* union tag                     */
4059               dst->symbol.flags = BSF_DEBUGGING;
4060               dst->symbol.value = (src->u.syment.n_value);
4061               break;
4062
4063             case C_FILE:        /* file name                     */
4064             case C_STRTAG:      /* structure tag                 */
4065 #ifdef RS6000COFF_C
4066             case C_GSYM:
4067             case C_LSYM:
4068             case C_PSYM:
4069             case C_RSYM:
4070             case C_RPSYM:
4071             case C_STSYM:
4072             case C_BCOMM:
4073             case C_ECOMM:
4074             case C_DECL:
4075             case C_ENTRY:
4076             case C_FUN:
4077             case C_ESTAT:
4078 #endif
4079               dst->symbol.flags = BSF_DEBUGGING;
4080               dst->symbol.value = (src->u.syment.n_value);
4081               break;
4082
4083 #ifdef RS6000COFF_C
4084             case C_BINCL:       /* beginning of include file     */
4085             case C_EINCL:       /* ending of include file        */
4086               /* The value is actually a pointer into the line numbers
4087                  of the file.  We locate the line number entry, and
4088                  set the section to the section which contains it, and
4089                  the value to the index in that section.  */
4090               {
4091                 asection *sec;
4092
4093                 dst->symbol.flags = BSF_DEBUGGING;
4094                 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4095                   if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4096                       && ((file_ptr) (sec->line_filepos
4097                                       + sec->lineno_count * LINESZ)
4098                           > (file_ptr) src->u.syment.n_value))
4099                     break;
4100                 if (sec == NULL)
4101                   dst->symbol.value = 0;
4102                 else
4103                   {
4104                     dst->symbol.section = sec;
4105                     dst->symbol.value = ((src->u.syment.n_value
4106                                           - sec->line_filepos)
4107                                          / LINESZ);
4108                     src->fix_line = 1;
4109                   }
4110               }
4111               break;
4112
4113             case C_BSTAT:
4114               dst->symbol.flags = BSF_DEBUGGING;
4115
4116               /* The value is actually a symbol index.  Save a pointer
4117                  to the symbol instead of the index.  FIXME: This
4118                  should use a union.  */
4119               src->u.syment.n_value =
4120                 (long) (native_symbols + src->u.syment.n_value);
4121               dst->symbol.value = src->u.syment.n_value;
4122               src->fix_value = 1;
4123               break;
4124 #endif
4125
4126             case C_BLOCK:       /* ".bb" or ".eb"                */
4127             case C_FCN:         /* ".bf" or ".ef" (or PE ".lf")  */
4128             case C_EFCN:        /* physical end of function      */
4129 #if defined COFF_WITH_PE
4130               /* PE sets the symbol to a value relative to the start
4131                  of the section.  */
4132               dst->symbol.value = src->u.syment.n_value;
4133               if (strcmp (dst->symbol.name, ".bf") != 0)
4134                 {
4135                   /* PE uses funny values for .ef and .lf; don't
4136                      relocate them.  */
4137                   dst->symbol.flags = BSF_DEBUGGING;
4138                 }
4139               else
4140                 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
4141 #else
4142               /* Base the value as an index from the base of the
4143                  section.  */
4144               dst->symbol.flags = BSF_LOCAL;
4145               dst->symbol.value = (src->u.syment.n_value
4146                                    - dst->symbol.section->vma);
4147 #endif
4148               break;
4149
4150             case C_NULL:
4151               /* PE DLLs sometimes have zeroed out symbols for some
4152                  reason.  Just ignore them without a warning.  */
4153               if (src->u.syment.n_type == 0
4154                   && src->u.syment.n_value == 0
4155                   && src->u.syment.n_scnum == 0)
4156                 break;
4157               /* Fall through.  */
4158             case C_EXTDEF:      /* external definition           */
4159             case C_ULABEL:      /* undefined label               */
4160             case C_USTATIC:     /* undefined static              */
4161 #ifndef COFF_WITH_PE
4162             /* C_LINE in regular coff is 0x68.  NT has taken over this storage
4163                class to represent a section symbol */
4164             case C_LINE:        /* line # reformatted as symbol table entry */
4165               /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
4166             case C_ALIAS:       /* duplicate tag                 */
4167 #endif
4168               /* New storage classes for TIc80 */
4169 #ifdef TIC80COFF
4170             case C_UEXT:        /* Tentative external definition */
4171 #endif
4172             case C_STATLAB:     /* Static load time label */
4173             case C_EXTLAB:      /* External load time label */
4174             case C_HIDDEN:      /* ext symbol in dmert public lib */
4175             default:
4176               (*_bfd_error_handler)
4177                 (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
4178                  bfd_get_filename (abfd), src->u.syment.n_sclass,
4179                  dst->symbol.section->name, dst->symbol.name);
4180               dst->symbol.flags = BSF_DEBUGGING;
4181               dst->symbol.value = (src->u.syment.n_value);
4182               break;
4183             }
4184
4185 /*      BFD_ASSERT(dst->symbol.flags != 0);*/
4186
4187           dst->native = src;
4188
4189           dst->symbol.udata.i = 0;
4190           dst->lineno = (alent *) NULL;
4191           this_index += (src->u.syment.n_numaux) + 1;
4192           dst++;
4193           number_of_symbols++;
4194         }                       /* walk the native symtab */
4195     }                           /* bfdize the native symtab */
4196
4197   obj_symbols (abfd) = cached_area;
4198   obj_raw_syments (abfd) = native_symbols;
4199
4200   bfd_get_symcount (abfd) = number_of_symbols;
4201   obj_convert (abfd) = table_ptr;
4202   /* Slurp the line tables for each section too */
4203   {
4204     asection *p;
4205     p = abfd->sections;
4206     while (p)
4207       {
4208         coff_slurp_line_table (abfd, p);
4209         p = p->next;
4210       }
4211   }
4212   return true;
4213 }                               /* coff_slurp_symbol_table() */
4214
4215 /* Classify a COFF symbol.  A couple of targets have globally visible
4216    symbols which are not class C_EXT, and this handles those.  It also
4217    recognizes some special PE cases.  */
4218
4219 static enum coff_symbol_classification
4220 coff_classify_symbol (abfd, syment)
4221      bfd *abfd;
4222      struct internal_syment *syment;
4223 {
4224   /* FIXME: This partially duplicates the switch in
4225      coff_slurp_symbol_table.  */
4226   switch (syment->n_sclass)
4227     {
4228     case C_EXT:
4229     case C_WEAKEXT:
4230 #ifdef I960
4231     case C_LEAFEXT:
4232 #endif
4233 #ifdef ARM
4234     case C_THUMBEXT:
4235     case C_THUMBEXTFUNC:
4236 #endif
4237 #ifdef C_SYSTEM
4238     case C_SYSTEM:
4239 #endif
4240 #ifdef COFF_WITH_PE
4241     case C_NT_WEAK:
4242 #endif
4243       if (syment->n_scnum == 0)
4244         {
4245           if (syment->n_value == 0)
4246             return COFF_SYMBOL_UNDEFINED;
4247           else
4248             return COFF_SYMBOL_COMMON;
4249         }
4250       return COFF_SYMBOL_GLOBAL;
4251
4252     default:
4253       break;
4254     }
4255
4256 #ifdef COFF_WITH_PE
4257   if (syment->n_sclass == C_STAT)
4258     {
4259       if (syment->n_scnum == 0)
4260         {
4261           /* The Microsoft compiler sometimes generates these if a
4262              small static function is inlined every time it is used.
4263              The function is discarded, but the symbol table entry
4264              remains.  */
4265           return COFF_SYMBOL_LOCAL;
4266         }
4267
4268 #if 0
4269       /* This is correct for Microsoft generated objects, but it
4270          breaks gas generated objects.  */
4271
4272       if (syment->n_value == 0)
4273         {
4274           asection *sec;
4275           char buf[SYMNMLEN + 1];
4276
4277           sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4278           if (sec != NULL
4279               && (strcmp (bfd_get_section_name (abfd, sec),
4280                           _bfd_coff_internal_syment_name (abfd, syment, buf))
4281                   == 0))
4282             return COFF_SYMBOL_PE_SECTION;
4283         }
4284 #endif
4285
4286       return COFF_SYMBOL_LOCAL;
4287     }
4288
4289   if (syment->n_sclass == C_SECTION)
4290     {
4291       /* In some cases in a DLL generated by the Microsoft linker, the
4292          n_value field will contain garbage.  FIXME: This should
4293          probably be handled by the swapping function instead.  */
4294       syment->n_value = 0;
4295       if (syment->n_scnum == 0)
4296         return COFF_SYMBOL_UNDEFINED;
4297       return COFF_SYMBOL_PE_SECTION;
4298     }
4299 #endif /* COFF_WITH_PE */
4300
4301   /* If it is not a global symbol, we presume it is a local symbol.  */
4302
4303   if (syment->n_scnum == 0)
4304     {
4305       char buf[SYMNMLEN + 1];
4306
4307       (*_bfd_error_handler)
4308         (_("warning: %s: local symbol `%s' has no section"),
4309          bfd_get_filename (abfd),
4310          _bfd_coff_internal_syment_name (abfd, syment, buf));
4311     }
4312
4313   return COFF_SYMBOL_LOCAL;
4314 }
4315
4316 /*
4317 SUBSUBSECTION
4318         Reading relocations
4319
4320         Coff relocations are easily transformed into the internal BFD form
4321         (@code{arelent}).
4322
4323         Reading a coff relocation table is done in the following stages:
4324
4325         o Read the entire coff relocation table into memory.
4326
4327         o Process each relocation in turn; first swap it from the
4328         external to the internal form.
4329
4330         o Turn the symbol referenced in the relocation's symbol index
4331         into a pointer into the canonical symbol table.
4332         This table is the same as the one returned by a call to
4333         @code{bfd_canonicalize_symtab}. The back end will call that
4334         routine and save the result if a canonicalization hasn't been done.
4335
4336         o The reloc index is turned into a pointer to a howto
4337         structure, in a back end specific way. For instance, the 386
4338         and 960 use the @code{r_type} to directly produce an index
4339         into a howto table vector; the 88k subtracts a number from the
4340         @code{r_type} field and creates an addend field.
4341
4342
4343 */
4344
4345 #ifndef CALC_ADDEND
4346 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
4347   {                                                             \
4348     coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
4349     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
4350       coffsym = (obj_symbols (abfd)                             \
4351                  + (cache_ptr->sym_ptr_ptr - symbols));         \
4352     else if (ptr)                                               \
4353       coffsym = coff_symbol_from (abfd, ptr);                   \
4354     if (coffsym != (coff_symbol_type *) NULL                    \
4355         && coffsym->native->u.syment.n_scnum == 0)              \
4356       cache_ptr->addend = 0;                                    \
4357     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
4358              && ptr->section != (asection *) NULL)              \
4359       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
4360     else                                                        \
4361       cache_ptr->addend = 0;                                    \
4362   }
4363 #endif
4364
4365 static boolean
4366 coff_slurp_reloc_table (abfd, asect, symbols)
4367      bfd * abfd;
4368      sec_ptr asect;
4369      asymbol ** symbols;
4370 {
4371   RELOC *native_relocs;
4372   arelent *reloc_cache;
4373   arelent *cache_ptr;
4374
4375   unsigned int idx;
4376
4377   if (asect->relocation)
4378     return true;
4379   if (asect->reloc_count == 0)
4380     return true;
4381   if (asect->flags & SEC_CONSTRUCTOR)
4382     return true;
4383   if (!coff_slurp_symbol_table (abfd))
4384     return false;
4385   native_relocs =
4386     (RELOC *) buy_and_read (abfd,
4387                             asect->rel_filepos,
4388                             SEEK_SET,
4389                             (size_t) (RELSZ *
4390                                       asect->reloc_count));
4391   reloc_cache = (arelent *)
4392     bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
4393
4394   if (reloc_cache == NULL)
4395     return false;
4396
4397
4398   for (idx = 0; idx < asect->reloc_count; idx++)
4399     {
4400       struct internal_reloc dst;
4401       struct external_reloc *src;
4402 #ifndef RELOC_PROCESSING
4403       asymbol *ptr;
4404 #endif
4405
4406       cache_ptr = reloc_cache + idx;
4407       src = native_relocs + idx;
4408
4409       coff_swap_reloc_in (abfd, src, &dst);
4410
4411 #ifdef RELOC_PROCESSING
4412       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
4413 #else
4414       cache_ptr->address = dst.r_vaddr;
4415
4416       if (dst.r_symndx != -1)
4417         {
4418           if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
4419             {
4420               (*_bfd_error_handler)
4421                 (_("%s: warning: illegal symbol index %ld in relocs"),
4422                  bfd_get_filename (abfd), dst.r_symndx);
4423               cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4424               ptr = NULL;
4425             }
4426           else
4427             {
4428               cache_ptr->sym_ptr_ptr = (symbols
4429                                         + obj_convert (abfd)[dst.r_symndx]);
4430               ptr = *(cache_ptr->sym_ptr_ptr);
4431             }
4432         }
4433       else
4434         {
4435           cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4436           ptr = NULL;
4437         }
4438
4439       /* The symbols definitions that we have read in have been
4440          relocated as if their sections started at 0. But the offsets
4441          refering to the symbols in the raw data have not been
4442          modified, so we have to have a negative addend to compensate.
4443
4444          Note that symbols which used to be common must be left alone */
4445
4446       /* Calculate any reloc addend by looking at the symbol */
4447       CALC_ADDEND (abfd, ptr, dst, cache_ptr);
4448
4449       cache_ptr->address -= asect->vma;
4450 /* !!     cache_ptr->section = (asection *) NULL;*/
4451
4452       /* Fill in the cache_ptr->howto field from dst.r_type */
4453       RTYPE2HOWTO (cache_ptr, &dst);
4454 #endif  /* RELOC_PROCESSING */
4455
4456       if (cache_ptr->howto == NULL)
4457         {
4458           (*_bfd_error_handler)
4459             (_("%s: illegal relocation type %d at address 0x%lx"),
4460              bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
4461           bfd_set_error (bfd_error_bad_value);
4462           return false;
4463         }
4464     }
4465
4466   asect->relocation = reloc_cache;
4467   return true;
4468 }
4469
4470 #ifndef coff_rtype_to_howto
4471 #ifdef RTYPE2HOWTO
4472
4473 /* Get the howto structure for a reloc.  This is only used if the file
4474    including this one defines coff_relocate_section to be
4475    _bfd_coff_generic_relocate_section, so it is OK if it does not
4476    always work.  It is the responsibility of the including file to
4477    make sure it is reasonable if it is needed.  */
4478
4479 static reloc_howto_type *coff_rtype_to_howto
4480   PARAMS ((bfd *, asection *, struct internal_reloc *,
4481            struct coff_link_hash_entry *, struct internal_syment *,
4482            bfd_vma *));
4483
4484 /*ARGSUSED*/
4485 static reloc_howto_type *
4486 coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
4487      bfd *abfd ATTRIBUTE_UNUSED;
4488      asection *sec ATTRIBUTE_UNUSED;
4489      struct internal_reloc *rel;
4490      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
4491      struct internal_syment *sym ATTRIBUTE_UNUSED;
4492      bfd_vma *addendp ATTRIBUTE_UNUSED;
4493 {
4494   arelent genrel;
4495
4496   RTYPE2HOWTO (&genrel, rel);
4497   return genrel.howto;
4498 }
4499
4500 #else /* ! defined (RTYPE2HOWTO) */
4501
4502 #define coff_rtype_to_howto NULL
4503
4504 #endif /* ! defined (RTYPE2HOWTO) */
4505 #endif /* ! defined (coff_rtype_to_howto) */
4506
4507 /* This is stupid.  This function should be a boolean predicate.  */
4508 static long
4509 coff_canonicalize_reloc (abfd, section, relptr, symbols)
4510      bfd * abfd;
4511      sec_ptr section;
4512      arelent ** relptr;
4513      asymbol ** symbols;
4514 {
4515   arelent *tblptr = section->relocation;
4516   unsigned int count = 0;
4517
4518
4519   if (section->flags & SEC_CONSTRUCTOR)
4520     {
4521       /* this section has relocs made up by us, they are not in the
4522        file, so take them out of their chain and place them into
4523        the data area provided */
4524       arelent_chain *chain = section->constructor_chain;
4525       for (count = 0; count < section->reloc_count; count++)
4526         {
4527           *relptr++ = &chain->relent;
4528           chain = chain->next;
4529         }
4530
4531     }
4532   else
4533     {
4534       if (! coff_slurp_reloc_table (abfd, section, symbols))
4535         return -1;
4536
4537       tblptr = section->relocation;
4538
4539       for (; count++ < section->reloc_count;)
4540         *relptr++ = tblptr++;
4541
4542
4543     }
4544   *relptr = 0;
4545   return section->reloc_count;
4546 }
4547
4548 #ifdef GNU960
4549 file_ptr
4550 coff_sym_filepos (abfd)
4551      bfd *abfd;
4552 {
4553   return obj_sym_filepos (abfd);
4554 }
4555 #endif
4556
4557 #ifndef coff_reloc16_estimate
4558 #define coff_reloc16_estimate dummy_reloc16_estimate
4559
4560 static int dummy_reloc16_estimate
4561   PARAMS ((bfd *, asection *, arelent *, unsigned int,
4562            struct bfd_link_info *));
4563
4564 static int
4565 dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
4566      bfd *abfd ATTRIBUTE_UNUSED;
4567      asection *input_section ATTRIBUTE_UNUSED;
4568      arelent *reloc ATTRIBUTE_UNUSED;
4569      unsigned int shrink ATTRIBUTE_UNUSED;
4570      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4571 {
4572   abort ();
4573   return 0;
4574 }
4575
4576 #endif
4577
4578 #ifndef coff_reloc16_extra_cases
4579
4580 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
4581
4582 /* This works even if abort is not declared in any header file.  */
4583
4584 static void dummy_reloc16_extra_cases
4585   PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
4586            bfd_byte *, unsigned int *, unsigned int *));
4587
4588 static void
4589 dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
4590                            dst_ptr)
4591      bfd *abfd ATTRIBUTE_UNUSED;
4592      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4593      struct bfd_link_order *link_order ATTRIBUTE_UNUSED;
4594      arelent *reloc ATTRIBUTE_UNUSED;
4595      bfd_byte *data ATTRIBUTE_UNUSED;
4596      unsigned int *src_ptr ATTRIBUTE_UNUSED;
4597      unsigned int *dst_ptr ATTRIBUTE_UNUSED;
4598 {
4599   abort ();
4600 }
4601 #endif
4602
4603 /* If coff_relocate_section is defined, we can use the optimized COFF
4604    backend linker.  Otherwise we must continue to use the old linker.  */
4605 #ifdef coff_relocate_section
4606 #ifndef coff_bfd_link_hash_table_create
4607 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
4608 #endif
4609 #ifndef coff_bfd_link_add_symbols
4610 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
4611 #endif
4612 #ifndef coff_bfd_final_link
4613 #define coff_bfd_final_link _bfd_coff_final_link
4614 #endif
4615 #else /* ! defined (coff_relocate_section) */
4616 #define coff_relocate_section NULL
4617 #ifndef coff_bfd_link_hash_table_create
4618 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
4619 #endif
4620 #ifndef coff_bfd_link_add_symbols
4621 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
4622 #endif
4623 #define coff_bfd_final_link _bfd_generic_final_link
4624 #endif /* ! defined (coff_relocate_section) */
4625
4626 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
4627
4628 #ifndef coff_start_final_link
4629 #define coff_start_final_link NULL
4630 #endif
4631
4632 #ifndef coff_adjust_symndx
4633 #define coff_adjust_symndx NULL
4634 #endif
4635
4636 #ifndef coff_link_add_one_symbol
4637 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
4638 #endif
4639
4640 #ifndef coff_link_output_has_begun
4641
4642 static boolean coff_link_output_has_begun
4643   PARAMS ((bfd *, struct coff_final_link_info *));
4644
4645 static boolean
4646 coff_link_output_has_begun (abfd, info)
4647      bfd * abfd;
4648      struct coff_final_link_info * info ATTRIBUTE_UNUSED;
4649 {
4650   return abfd->output_has_begun;
4651 }
4652 #endif
4653
4654 #ifndef coff_final_link_postscript
4655
4656 static boolean coff_final_link_postscript
4657   PARAMS ((bfd *, struct coff_final_link_info *));
4658
4659 static boolean
4660 coff_final_link_postscript (abfd, pfinfo)
4661      bfd * abfd ATTRIBUTE_UNUSED;
4662      struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
4663 {
4664   return true;
4665 }
4666 #endif
4667
4668 #ifndef coff_SWAP_aux_in
4669 #define coff_SWAP_aux_in coff_swap_aux_in
4670 #endif
4671 #ifndef coff_SWAP_sym_in
4672 #define coff_SWAP_sym_in coff_swap_sym_in
4673 #endif
4674 #ifndef coff_SWAP_lineno_in
4675 #define coff_SWAP_lineno_in coff_swap_lineno_in
4676 #endif
4677 #ifndef coff_SWAP_aux_out
4678 #define coff_SWAP_aux_out coff_swap_aux_out
4679 #endif
4680 #ifndef coff_SWAP_sym_out
4681 #define coff_SWAP_sym_out coff_swap_sym_out
4682 #endif
4683 #ifndef coff_SWAP_lineno_out
4684 #define coff_SWAP_lineno_out coff_swap_lineno_out
4685 #endif
4686 #ifndef coff_SWAP_reloc_out
4687 #define coff_SWAP_reloc_out coff_swap_reloc_out
4688 #endif
4689 #ifndef coff_SWAP_filehdr_out
4690 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
4691 #endif
4692 #ifndef coff_SWAP_aouthdr_out
4693 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
4694 #endif
4695 #ifndef coff_SWAP_scnhdr_out
4696 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
4697 #endif
4698 #ifndef coff_SWAP_reloc_in
4699 #define coff_SWAP_reloc_in coff_swap_reloc_in
4700 #endif
4701 #ifndef coff_SWAP_filehdr_in
4702 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
4703 #endif
4704 #ifndef coff_SWAP_aouthdr_in
4705 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
4706 #endif
4707 #ifndef coff_SWAP_scnhdr_in
4708 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
4709 #endif
4710
4711 static const bfd_coff_backend_data bfd_coff_std_swap_table =
4712 {
4713   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
4714   coff_SWAP_aux_out, coff_SWAP_sym_out,
4715   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
4716   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
4717   coff_SWAP_scnhdr_out,
4718   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
4719 #ifdef COFF_LONG_FILENAMES
4720   true,
4721 #else
4722   false,
4723 #endif
4724 #ifdef COFF_LONG_SECTION_NAMES
4725   true,
4726 #else
4727   false,
4728 #endif
4729   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
4730   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
4731   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
4732   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
4733   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
4734   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
4735   coff_classify_symbol, coff_compute_section_file_positions,
4736   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
4737   coff_adjust_symndx, coff_link_add_one_symbol,
4738   coff_link_output_has_begun, coff_final_link_postscript
4739 };
4740
4741 #ifndef coff_close_and_cleanup
4742 #define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
4743 #endif
4744
4745 #ifndef coff_bfd_free_cached_info
4746 #define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
4747 #endif
4748
4749 #ifndef coff_get_section_contents
4750 #define coff_get_section_contents           _bfd_generic_get_section_contents
4751 #endif
4752
4753 #ifndef coff_bfd_copy_private_symbol_data
4754 #define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
4755 #endif
4756
4757 #ifndef coff_bfd_copy_private_section_data
4758 #define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
4759 #endif
4760
4761 #ifndef coff_bfd_copy_private_bfd_data 
4762 #define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
4763 #endif
4764
4765 #ifndef coff_bfd_merge_private_bfd_data
4766 #define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
4767 #endif
4768
4769 #ifndef coff_bfd_set_private_flags
4770 #define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
4771 #endif
4772
4773 #ifndef coff_bfd_print_private_bfd_data 
4774 #define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
4775 #endif
4776
4777 #ifndef coff_bfd_is_local_label_name
4778 #define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
4779 #endif
4780
4781 #ifndef coff_read_minisymbols
4782 #define coff_read_minisymbols               _bfd_generic_read_minisymbols
4783 #endif
4784
4785 #ifndef coff_minisymbol_to_symbol
4786 #define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
4787 #endif
4788
4789 /* The reloc lookup routine must be supplied by each individual COFF
4790    backend.  */
4791 #ifndef coff_bfd_reloc_type_lookup
4792 #define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
4793 #endif
4794
4795 #ifndef coff_bfd_get_relocated_section_contents
4796 #define coff_bfd_get_relocated_section_contents \
4797   bfd_generic_get_relocated_section_contents
4798 #endif
4799
4800 #ifndef coff_bfd_relax_section
4801 #define coff_bfd_relax_section              bfd_generic_relax_section
4802 #endif
4803
4804 #ifndef coff_bfd_gc_sections
4805 #define coff_bfd_gc_sections                bfd_generic_gc_sections
4806 #endif
4807
4808 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4809 const bfd_target VAR =                                                  \
4810 {                                                                       \
4811   NAME ,                                                                \
4812   bfd_target_coff_flavour,                                              \
4813   BFD_ENDIAN_BIG,               /* data byte order is big */            \
4814   BFD_ENDIAN_BIG,               /* header byte order is big */          \
4815   /* object flags */                                                    \
4816   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
4817    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
4818   /* section flags */                                                   \
4819   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
4820   UNDER,                        /* leading symbol underscore */         \
4821   '/',                          /* ar_pad_char */                       \
4822   15,                           /* ar_max_namelen */                    \
4823                                                                         \
4824   /* Data conversion functions.  */                                     \
4825   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
4826   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
4827   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
4828                                                                         \
4829   /* Header conversion functions.  */                                   \
4830   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
4831   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
4832   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
4833                                                                         \
4834         /* bfd_check_format */                                          \
4835   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
4836     _bfd_dummy_target },                                                \
4837         /* bfd_set_format */                                            \
4838   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
4839         /* bfd_write_contents */                                        \
4840   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
4841     bfd_false },                                                        \
4842                                                                         \
4843   BFD_JUMP_TABLE_GENERIC (coff),                                        \
4844   BFD_JUMP_TABLE_COPY (coff),                                           \
4845   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
4846   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
4847   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
4848   BFD_JUMP_TABLE_RELOCS (coff),                                         \
4849   BFD_JUMP_TABLE_WRITE (coff),                                          \
4850   BFD_JUMP_TABLE_LINK (coff),                                           \
4851   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
4852                                                                         \
4853   ALTERNATIVE,                                                          \
4854                                                                         \
4855   COFF_SWAP_TABLE                                                       \
4856 };
4857
4858 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE)      \
4859 const bfd_target VAR =                                                  \
4860 {                                                                       \
4861   NAME ,                                                                \
4862   bfd_target_coff_flavour,                                              \
4863   BFD_ENDIAN_LITTLE,            /* data byte order is little */         \
4864   BFD_ENDIAN_LITTLE,            /* header byte order is little */       \
4865         /* object flags */                                              \
4866   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
4867    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
4868         /* section flags */                                             \
4869   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
4870   UNDER,                        /* leading symbol underscore */         \
4871   '/',                          /* ar_pad_char */                       \
4872   15,                           /* ar_max_namelen */                    \
4873                                                                         \
4874   /* Data conversion functions.  */                                     \
4875   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
4876   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
4877   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
4878   /* Header conversion functions.  */                                   \
4879   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
4880   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
4881   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
4882         /* bfd_check_format */                                          \
4883   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
4884     _bfd_dummy_target },                                                \
4885        /* bfd_set_format */                                             \
4886   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
4887         /* bfd_write_contents */                                        \
4888   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
4889     bfd_false },                                                        \
4890                                                                         \
4891   BFD_JUMP_TABLE_GENERIC (coff),                                        \
4892   BFD_JUMP_TABLE_COPY (coff),                                           \
4893   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
4894   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
4895   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
4896   BFD_JUMP_TABLE_RELOCS (coff),                                         \
4897   BFD_JUMP_TABLE_WRITE (coff),                                          \
4898   BFD_JUMP_TABLE_LINK (coff),                                           \
4899   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
4900                                                                         \
4901   ALTERNATIVE,                                                          \
4902                                                                         \
4903   COFF_SWAP_TABLE                                                       \
4904 };