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