Add hooks to support TI COFF handling.
[external/binutils.git] / bfd / coffcode.h
1 /* Support for the generic parts of most COFF variants, for BFD.
2    Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3    Free Software Foundation, Inc.
4    Written by Cygnus Support.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
21
22 /*
23 Most of this hacked by  Steve Chamberlain,
24                         sac@cygnus.com
25 */
26 /*
27
28 SECTION
29         coff backends
30
31         BFD supports a number of different flavours of coff format.
32         The major differences between formats are the sizes and
33         alignments of fields in structures on disk, and the occasional
34         extra field.
35
36         Coff in all its varieties is implemented with a few common
37         files and a number of implementation specific files. For
38         example, The 88k bcs coff format is implemented in the file
39         @file{coff-m88k.c}. This file @code{#include}s
40         @file{coff/m88k.h} which defines the external structure of the
41         coff format for the 88k, and @file{coff/internal.h} which
42         defines the internal structure. @file{coff-m88k.c} also
43         defines the relocations used by the 88k format
44         @xref{Relocations}.
45
46         The Intel i960 processor version of coff is implemented in
47         @file{coff-i960.c}. This file has the same structure as
48         @file{coff-m88k.c}, except that it includes @file{coff/i960.h}
49         rather than @file{coff-m88k.h}.
50
51 SUBSECTION
52         Porting to a new version of coff
53
54         The recommended method is to select from the existing
55         implementations the version of coff which is most like the one
56         you want to use.  For example, we'll say that i386 coff is
57         the one you select, and that your coff flavour is called foo.
58         Copy @file{i386coff.c} to @file{foocoff.c}, copy
59         @file{../include/coff/i386.h} to @file{../include/coff/foo.h},
60         and add the lines to @file{targets.c} and @file{Makefile.in}
61         so that your new back end is used. Alter the shapes of the
62         structures in @file{../include/coff/foo.h} so that they match
63         what you need. You will probably also have to add
64         @code{#ifdef}s to the code in @file{coff/internal.h} and
65         @file{coffcode.h} if your version of coff is too wild.
66
67         You can verify that your new BFD backend works quite simply by
68         building @file{objdump} from the @file{binutils} directory,
69         and making sure that its version of what's going on and your
70         host system's idea (assuming it has the pretty standard coff
71         dump utility, usually called @code{att-dump} or just
72         @code{dump}) are the same.  Then clean up your code, and send
73         what you've done to Cygnus. Then your stuff will be in the
74         next release, and you won't have to keep integrating it.
75
76 SUBSECTION
77         How the coff backend works
78
79 SUBSUBSECTION
80         File layout
81
82         The Coff backend is split into generic routines that are
83         applicable to any Coff target and routines that are specific
84         to a particular target.  The target-specific routines are
85         further split into ones which are basically the same for all
86         Coff targets except that they use the external symbol format
87         or use different values for certain constants.
88
89         The generic routines are in @file{coffgen.c}.  These routines
90         work for any Coff target.  They use some hooks into the target
91         specific code; the hooks are in a @code{bfd_coff_backend_data}
92         structure, one of which exists for each target.
93
94         The essentially similar target-specific routines are in
95         @file{coffcode.h}.  This header file includes executable C code.
96         The various Coff targets first include the appropriate Coff
97         header file, make any special defines that are needed, and
98         then include @file{coffcode.h}.
99
100         Some of the Coff targets then also have additional routines in
101         the target source file itself.
102
103         For example, @file{coff-i960.c} includes
104         @file{coff/internal.h} and @file{coff/i960.h}.  It then
105         defines a few constants, such as @code{I960}, and includes
106         @file{coffcode.h}.  Since the i960 has complex relocation
107         types, @file{coff-i960.c} also includes some code to
108         manipulate the i960 relocs.  This code is not in
109         @file{coffcode.h} because it would not be used by any other
110         target.
111
112 SUBSUBSECTION
113         Bit twiddling
114
115         Each flavour of coff supported in BFD has its own header file
116         describing the external layout of the structures. There is also
117         an internal description of the coff layout, in
118         @file{coff/internal.h}. A major function of the
119         coff backend is swapping the bytes and twiddling the bits to
120         translate the external form of the structures into the normal
121         internal form. This is all performed in the
122         @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
123         elements are different sizes between different versions of
124         coff; it is the duty of the coff version specific include file
125         to override the definitions of various packing routines in
126         @file{coffcode.h}. E.g., the size of line number entry in coff is
127         sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
128         @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
129         correct one. No doubt, some day someone will find a version of
130         coff which has a varying field size not catered to at the
131         moment. To port BFD, that person will have to add more @code{#defines}.
132         Three of the bit twiddling routines are exported to
133         @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
134         and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
135         table on its own, but uses BFD to fix things up.  More of the
136         bit twiddlers are exported for @code{gas};
137         @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
138         @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
139         @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
140         @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
141         of all the symbol table and reloc drudgery itself, thereby
142         saving the internal BFD overhead, but uses BFD to swap things
143         on the way out, making cross ports much safer.  Doing so also
144         allows BFD (and thus the linker) to use the same header files
145         as @code{gas}, which makes one avenue to disaster disappear.
146
147 SUBSUBSECTION
148         Symbol reading
149
150         The simple canonical form for symbols used by BFD is not rich
151         enough to keep all the information available in a coff symbol
152         table. The back end gets around this problem by keeping the original
153         symbol table around, "behind the scenes".
154
155         When a symbol table is requested (through a call to
156         @code{bfd_canonicalize_symtab}), a request gets through to
157         @code{coff_get_normalized_symtab}. This reads the symbol table from
158         the coff file and swaps all the structures inside into the
159         internal form. It also fixes up all the pointers in the table
160         (represented in the file by offsets from the first symbol in
161         the table) into physical pointers to elements in the new
162         internal table. This involves some work since the meanings of
163         fields change depending upon context: a field that is a
164         pointer to another structure in the symbol table at one moment
165         may be the size in bytes of a structure at the next.  Another
166         pass is made over the table. All symbols which mark file names
167         (<<C_FILE>> symbols) are modified so that the internal
168         string points to the value in the auxent (the real filename)
169         rather than the normal text associated with the symbol
170         (@code{".file"}).
171
172         At this time the symbol names are moved around. Coff stores
173         all symbols less than nine characters long physically
174         within the symbol table; longer strings are kept at the end of
175         the file in the string  table. This pass moves all strings
176         into memory and replaces them with pointers to the strings.
177
178
179         The symbol table is massaged once again, this time to create
180         the canonical table used by the BFD application. Each symbol
181         is inspected in turn, and a decision made (using the
182         @code{sclass} field) about the various flags to set in the
183         @code{asymbol}.  @xref{Symbols}. The generated canonical table
184         shares strings with the hidden internal symbol table.
185
186         Any linenumbers are read from the coff file too, and attached
187         to the symbols which own the functions the linenumbers belong to.
188
189 SUBSUBSECTION
190         Symbol writing
191
192         Writing a symbol to a coff file which didn't come from a coff
193         file will lose any debugging information. The @code{asymbol}
194         structure remembers the BFD from which the symbol was taken, and on
195         output the back end makes sure that the same destination target as
196         source target is present.
197
198         When the symbols have come from a coff file then all the
199         debugging information is preserved.
200
201         Symbol tables are provided for writing to the back end in a
202         vector of pointers to pointers. This allows applications like
203         the linker to accumulate and output large symbol tables
204         without having to do too much byte copying.
205
206         This function runs through the provided symbol table and
207         patches each symbol marked as a file place holder
208         (@code{C_FILE}) to point to the next file place holder in the
209         list. It also marks each @code{offset} field in the list with
210         the offset from the first symbol of the current symbol.
211
212         Another function of this procedure is to turn the canonical
213         value form of BFD into the form used by coff. Internally, BFD
214         expects symbol values to be offsets from a section base; so a
215         symbol physically at 0x120, but in a section starting at
216         0x100, would have the value 0x20. Coff expects symbols to
217         contain their final value, so symbols have their values
218         changed at this point to reflect their sum with their owning
219         section.  This transformation uses the
220         <<output_section>> field of the @code{asymbol}'s
221         @code{asection} @xref{Sections}.
222
223         o <<coff_mangle_symbols>>
224
225         This routine runs though the provided symbol table and uses
226         the offsets generated by the previous pass and the pointers
227         generated when the symbol table was read in to create the
228         structured hierachy required by coff. It changes each pointer
229         to a symbol into the index into the symbol table of the asymbol.
230
231         o <<coff_write_symbols>>
232
233         This routine runs through the symbol table and patches up the
234         symbols from their internal form into the coff way, calls the
235         bit twiddlers, and writes out the table to the file.
236
237 */
238
239 /*
240 INTERNAL_DEFINITION
241         coff_symbol_type
242
243 DESCRIPTION
244         The hidden information for an <<asymbol>> is described in a
245         <<combined_entry_type>>:
246
247 CODE_FRAGMENT
248 .
249 .typedef struct coff_ptr_struct
250 .{
251 .
252 .       {* Remembers the offset from the first symbol in the file for
253 .          this symbol. Generated by coff_renumber_symbols. *}
254 .unsigned int offset;
255 .
256 .       {* Should the value of this symbol be renumbered.  Used for
257 .          XCOFF C_BSTAT symbols.  Set by coff_slurp_symbol_table.  *}
258 .unsigned int fix_value : 1;
259 .
260 .       {* Should the tag field of this symbol be renumbered.
261 .          Created by coff_pointerize_aux. *}
262 .unsigned int fix_tag : 1;
263 .
264 .       {* Should the endidx field of this symbol be renumbered.
265 .          Created by coff_pointerize_aux. *}
266 .unsigned int fix_end : 1;
267 .
268 .       {* Should the x_csect.x_scnlen field be renumbered.
269 .          Created by coff_pointerize_aux. *}
270 .unsigned int fix_scnlen : 1;
271 .
272 .       {* Fix up an XCOFF C_BINCL/C_EINCL symbol.  The value is the
273 .          index into the line number entries.  Set by
274 .          coff_slurp_symbol_table.  *}
275 .unsigned int fix_line : 1;
276 .
277 .       {* The container for the symbol structure as read and translated
278 .           from the file. *}
279 .
280 .union {
281 .   union internal_auxent auxent;
282 .   struct internal_syment syment;
283 . } u;
284 .} combined_entry_type;
285 .
286 .
287 .{* Each canonical asymbol really looks like this: *}
288 .
289 .typedef struct coff_symbol_struct
290 .{
291 .   {* The actual symbol which the rest of BFD works with *}
292 .asymbol symbol;
293 .
294 .   {* A pointer to the hidden information for this symbol *}
295 .combined_entry_type *native;
296 .
297 .   {* A pointer to the linenumber information for this symbol *}
298 .struct lineno_cache_entry *lineno;
299 .
300 .   {* Have the line numbers been relocated yet ? *}
301 .boolean done_lineno;
302 .} coff_symbol_type;
303
304
305 */
306
307 #ifdef COFF_WITH_PE
308 #include "peicode.h"
309 #else
310 #include "coffswap.h"
311 #endif
312
313 #define STRING_SIZE_SIZE (4)
314
315 static long sec_to_styp_flags PARAMS ((const char *, flagword));
316 static flagword styp_to_sec_flags
317   PARAMS ((bfd *, PTR, const char *, asection *));
318 static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
319 static void coff_set_custom_section_alignment
320   PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *,
321            const unsigned int));
322 static boolean coff_new_section_hook PARAMS ((bfd *, asection *));
323 static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR));
324 static boolean coff_write_relocs PARAMS ((bfd *, int));
325 static boolean coff_set_flags
326   PARAMS ((bfd *, unsigned int *, unsigned short *));
327 static boolean coff_set_arch_mach
328   PARAMS ((bfd *, enum bfd_architecture, unsigned long));
329 static boolean coff_compute_section_file_positions PARAMS ((bfd *));
330 static boolean coff_write_object_contents PARAMS ((bfd *));
331 static boolean coff_set_section_contents
332   PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
333 static PTR buy_and_read PARAMS ((bfd *, file_ptr, int, size_t));
334 static boolean coff_slurp_line_table PARAMS ((bfd *, asection *));
335 static boolean coff_slurp_symbol_table PARAMS ((bfd *));
336 static enum coff_symbol_classification coff_classify_symbol
337   PARAMS ((bfd *, struct internal_syment *));
338 static boolean coff_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
339 static long coff_canonicalize_reloc
340   PARAMS ((bfd *, asection *, arelent **, asymbol **));
341 #ifndef coff_mkobject_hook
342 static PTR coff_mkobject_hook PARAMS ((bfd *, PTR,  PTR));
343 #endif
344 \f
345 /* void warning(); */
346
347 /* Return a word with STYP_* (scnhdr.s_flags) flags set to represent
348    the incoming SEC_* flags.  The inverse of this function is
349    styp_to_sec_flags().  NOTE: If you add to/change this routine, you
350    should probably mirror the changes in styp_to_sec_flags().  */
351
352 #ifndef COFF_WITH_PE
353
354 static long
355 sec_to_styp_flags (sec_name, sec_flags)
356      CONST char *sec_name;
357      flagword sec_flags;
358 {
359   long styp_flags = 0;
360
361   if (!strcmp (sec_name, _TEXT))
362     {
363       styp_flags = STYP_TEXT;
364     }
365   else if (!strcmp (sec_name, _DATA))
366     {
367       styp_flags = STYP_DATA;
368     }
369   else if (!strcmp (sec_name, _BSS))
370     {
371       styp_flags = STYP_BSS;
372 #ifdef _COMMENT
373     }
374   else if (!strcmp (sec_name, _COMMENT))
375     {
376       styp_flags = STYP_INFO;
377 #endif /* _COMMENT */
378 #ifdef _LIB
379     }
380   else if (!strcmp (sec_name, _LIB))
381     {
382       styp_flags = STYP_LIB;
383 #endif /* _LIB */
384 #ifdef _LIT
385     }
386   else if (!strcmp (sec_name, _LIT))
387     {
388       styp_flags = STYP_LIT;
389 #endif /* _LIT */
390     }
391   else if (!strcmp (sec_name, ".debug"))
392     {
393 #ifdef STYP_DEBUG
394       styp_flags = STYP_DEBUG;
395 #else
396       styp_flags = STYP_INFO;
397 #endif
398     }
399   else if (!strncmp (sec_name, ".stab", 5))
400     {
401       styp_flags = STYP_INFO;
402     }
403 #ifdef RS6000COFF_C
404   else if (!strcmp (sec_name, _PAD))
405     {
406       styp_flags = STYP_PAD;
407     }
408   else if (!strcmp (sec_name, _LOADER))
409     {
410       styp_flags = STYP_LOADER;
411     }
412 #endif
413   /* Try and figure out what it should be */
414   else if (sec_flags & SEC_CODE)
415     {
416       styp_flags = STYP_TEXT;
417     }
418   else if (sec_flags & SEC_DATA)
419     {
420       styp_flags = STYP_DATA;
421     }
422   else if (sec_flags & SEC_READONLY)
423     {
424 #ifdef STYP_LIT                 /* 29k readonly text/data section */
425       styp_flags = STYP_LIT;
426 #else
427       styp_flags = STYP_TEXT;
428 #endif /* STYP_LIT */
429     }
430   else if (sec_flags & SEC_LOAD)
431     {
432       styp_flags = STYP_TEXT;
433     }
434   else if (sec_flags & SEC_ALLOC)
435     {
436       styp_flags = STYP_BSS;
437     }
438
439 #ifdef STYP_NOLOAD
440   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
441     styp_flags |= STYP_NOLOAD;
442 #endif
443
444   return styp_flags;
445 }
446
447 #else /* COFF_WITH_PE */
448
449 /* The PE version; see above for the general comments.  The non-PE
450    case seems to be more guessing, and breaks PE format; specifically,
451    .rdata is readonly, but it sure ain't text.  Really, all this
452    should be set up properly in gas (or whatever assembler is in use),
453    and honor whatever objcopy/strip, etc. sent us as input.  */
454
455 static long
456 sec_to_styp_flags (sec_name, sec_flags)
457      const char *sec_name ATTRIBUTE_UNUSED;
458      flagword sec_flags;
459 {
460   long styp_flags = 0;
461
462   /* caution: there are at least three groups of symbols that have
463      very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
464      SEC_* are the BFD internal flags, used for generic BFD
465      information.  STYP_* are the COFF section flags which appear in
466      COFF files.  IMAGE_SCN_* are the PE section flags which appear in
467      PE files.  The STYP_* flags and the IMAGE_SCN_* flags overlap,
468      but there are more IMAGE_SCN_* flags.  */
469
470   /* skip LOAD */
471   /* READONLY later */
472   /* skip RELOC */
473   if ((sec_flags & SEC_CODE) != 0)
474     styp_flags |= IMAGE_SCN_CNT_CODE;
475   if ((sec_flags & SEC_DATA) != 0)
476     styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
477   if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
478     styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA;  /* ==STYP_BSS */
479   /* skip ROM */
480   /* skip CONSTRUCTOR */
481   /* skip CONTENTS */
482 #ifdef STYP_NOLOAD
483   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
484     styp_flags |= STYP_NOLOAD;
485 #endif
486   if ((sec_flags & SEC_IS_COMMON) != 0)
487     styp_flags |= IMAGE_SCN_LNK_COMDAT;
488   if ((sec_flags & SEC_DEBUGGING) != 0)
489     styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
490   if ((sec_flags & SEC_EXCLUDE) != 0)
491     styp_flags |= IMAGE_SCN_LNK_REMOVE;
492   if ((sec_flags & SEC_NEVER_LOAD) != 0)
493     styp_flags |= IMAGE_SCN_LNK_REMOVE;
494   /* skip IN_MEMORY */
495   /* skip SORT */
496   if (sec_flags & SEC_LINK_ONCE) 
497     styp_flags |= IMAGE_SCN_LNK_COMDAT; 
498   /* skip LINK_DUPLICATES */
499   /* skip LINKER_CREATED */
500
501   /* For now, the read/write bits are mapped onto SEC_READONLY, even
502      though the semantics don't quite match.  The bits from the input
503      are retained in pei_section_data(abfd, section)->pe_flags */
504
505   styp_flags |= IMAGE_SCN_MEM_READ;       /* always readable. */
506   if ((sec_flags & SEC_READONLY) == 0)
507     styp_flags |= IMAGE_SCN_MEM_WRITE;    /* Invert READONLY for write */
508   if (sec_flags & SEC_CODE)
509     styp_flags |= IMAGE_SCN_MEM_EXECUTE;  /* CODE->EXECUTE */
510   if (sec_flags & SEC_SHARED)
511     styp_flags |= IMAGE_SCN_MEM_SHARED;   /* Shared remains meaningful */
512
513   return styp_flags; 
514 }
515
516 #endif /* COFF_WITH_PE */
517
518 /* Return a word with SEC_* flags set to represent the incoming STYP_*
519    flags (from scnhdr.s_flags).  The inverse of this function is
520    sec_to_styp_flags().  NOTE: If you add to/change this routine, you
521    should probably mirror the changes in sec_to_styp_flags().  */
522
523 #ifndef COFF_WITH_PE
524
525 static flagword
526 styp_to_sec_flags (abfd, hdr, name, section)
527      bfd *abfd ATTRIBUTE_UNUSED;
528      PTR hdr;
529      const char *name;
530      asection *section ATTRIBUTE_UNUSED;
531 {
532   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
533   long styp_flags = internal_s->s_flags;
534   flagword sec_flags = 0;
535
536 #ifdef STYP_NOLOAD
537   if (styp_flags & STYP_NOLOAD)
538     {
539       sec_flags |= SEC_NEVER_LOAD;
540     }
541 #endif /* STYP_NOLOAD */
542
543   /* For 386 COFF, at least, an unloadable text or data section is
544      actually a shared library section.  */
545   if (styp_flags & STYP_TEXT)
546     {
547       if (sec_flags & SEC_NEVER_LOAD)
548         sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
549       else
550         sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
551     }
552   else if (styp_flags & STYP_DATA)
553     {
554       if (sec_flags & SEC_NEVER_LOAD)
555         sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
556       else
557         sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
558     }
559   else if (styp_flags & STYP_BSS)
560     {
561 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
562       if (sec_flags & SEC_NEVER_LOAD)
563         sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
564       else
565 #endif
566         sec_flags |= SEC_ALLOC;
567     }
568   else if (styp_flags & STYP_INFO)
569     {
570       /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
571          defined.  coff_compute_section_file_positions uses
572          COFF_PAGE_SIZE to ensure that the low order bits of the
573          section VMA and the file offset match.  If we don't know
574          COFF_PAGE_SIZE, we can't ensure the correct correspondence,
575          and demand page loading of the file will fail.  */
576 #if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS)
577       sec_flags |= SEC_DEBUGGING;
578 #endif
579     }
580   else if (styp_flags & STYP_PAD)
581     {
582       sec_flags = 0;
583     }
584   else if (strcmp (name, _TEXT) == 0)
585     {
586       if (sec_flags & SEC_NEVER_LOAD)
587         sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
588       else
589         sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
590     }
591   else if (strcmp (name, _DATA) == 0)
592     {
593       if (sec_flags & SEC_NEVER_LOAD)
594         sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
595       else
596         sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
597     }
598   else if (strcmp (name, _BSS) == 0)
599     {
600 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
601       if (sec_flags & SEC_NEVER_LOAD)
602         sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
603       else
604 #endif
605         sec_flags |= SEC_ALLOC;
606     }
607   else if (strcmp (name, ".debug") == 0
608 #ifdef _COMMENT
609            || strcmp (name, _COMMENT) == 0
610 #endif
611            || strncmp (name, ".stab", 5) == 0)
612     {
613 #ifdef COFF_PAGE_SIZE
614       sec_flags |= SEC_DEBUGGING;
615 #endif
616     }
617 #ifdef _LIB
618   else if (strcmp (name, _LIB) == 0)
619     ;
620 #endif
621 #ifdef _LIT
622   else if (strcmp (name, _LIT) == 0)
623     {
624       sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
625     }
626 #endif
627   else
628     {
629       sec_flags |= SEC_ALLOC | SEC_LOAD;
630     }
631
632 #ifdef STYP_LIT                 /* A29k readonly text/data section type */
633   if ((styp_flags & STYP_LIT) == STYP_LIT)
634     {
635       sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
636     }
637 #endif /* STYP_LIT */
638 #ifdef STYP_OTHER_LOAD          /* Other loaded sections */
639   if (styp_flags & STYP_OTHER_LOAD)
640     {
641       sec_flags = (SEC_LOAD | SEC_ALLOC);
642     }
643 #endif /* STYP_SDATA */
644
645 #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
646   /* As a GNU extension, if the name begins with .gnu.linkonce, we
647      only link a single copy of the section.  This is used to support
648      g++.  g++ will emit each template expansion in its own section.
649      The symbols will be defined as weak, so that multiple definitions
650      are permitted.  The GNU linker extension is to actually discard
651      all but one of the sections.  */
652   if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
653     sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
654 #endif
655
656   return sec_flags;
657 }
658
659 #else /* COFF_WITH_PE */
660
661 /* The PE version; see above for the general comments.
662
663    Since to set the SEC_LINK_ONCE and associated flags, we have to
664    look at the symbol table anyway, we return the symbol table index
665    of the symbol being used as the COMDAT symbol.  This is admittedly
666    ugly, but there's really nowhere else that we have access to the
667    required information.  FIXME: Is the COMDAT symbol index used for
668    any purpose other than objdump?  */
669
670 static flagword
671 styp_to_sec_flags (abfd, hdr, name, section)
672      bfd *abfd ATTRIBUTE_UNUSED;
673      PTR hdr;
674      const char *name;
675      asection *section;
676 {
677   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
678   long styp_flags = internal_s->s_flags;
679   flagword sec_flags = 0;
680
681   if (styp_flags & STYP_DSECT)
682     abort ();  /* Don't know what to do */
683 #ifdef SEC_NEVER_LOAD
684   if (styp_flags & STYP_NOLOAD)
685     sec_flags |= SEC_NEVER_LOAD;
686 #endif
687   if (styp_flags & STYP_GROUP)
688     abort ();  /* Don't know what to do */
689   /* skip IMAGE_SCN_TYPE_NO_PAD */
690   if (styp_flags & STYP_COPY)
691     abort ();  /* Don't know what to do */
692   if (styp_flags & IMAGE_SCN_CNT_CODE)
693     sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
694   if (styp_flags & IMAGE_SCN_CNT_INITIALIZED_DATA)
695     sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
696   if (styp_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
697     sec_flags |= SEC_ALLOC;
698   if (styp_flags & IMAGE_SCN_LNK_OTHER)
699     abort ();  /* Don't know what to do */
700   if (styp_flags & IMAGE_SCN_LNK_INFO)
701     {
702       /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
703          defined.  coff_compute_section_file_positions uses
704          COFF_PAGE_SIZE to ensure that the low order bits of the
705          section VMA and the file offset match.  If we don't know
706          COFF_PAGE_SIZE, we can't ensure the correct correspondence,
707          and demand page loading of the file will fail.  */
708 #ifdef COFF_PAGE_SIZE
709       sec_flags |= SEC_DEBUGGING;
710 #endif
711     }
712   if (styp_flags & STYP_OVER)
713     abort ();  /* Don't know what to do */
714   if (styp_flags & IMAGE_SCN_LNK_REMOVE)
715     sec_flags |= SEC_EXCLUDE;
716
717   if (styp_flags & IMAGE_SCN_MEM_SHARED)
718     sec_flags |= SEC_SHARED;
719   /* COMDAT: see below */
720   if (styp_flags & IMAGE_SCN_MEM_DISCARDABLE)
721     sec_flags |= SEC_DEBUGGING;
722   if (styp_flags & IMAGE_SCN_MEM_NOT_CACHED)
723     abort ();/* Don't know what to do */
724   if (styp_flags & IMAGE_SCN_MEM_NOT_PAGED)
725     abort (); /* Don't know what to do */
726
727   /* We infer from the distinct read/write/execute bits the settings
728      of some of the bfd flags; the actual values, should we need them,
729      are also in pei_section_data (abfd, section)->pe_flags.  */
730
731   if (styp_flags & IMAGE_SCN_MEM_EXECUTE)
732     sec_flags |= SEC_CODE;   /* Probably redundant */
733   /* IMAGE_SCN_MEM_READ is simply ignored, assuming it always to be true. */
734   if ((styp_flags & IMAGE_SCN_MEM_WRITE) == 0)
735     sec_flags |= SEC_READONLY;
736
737   /* COMDAT gets very special treatment.  */
738   if (styp_flags & IMAGE_SCN_LNK_COMDAT)
739     {
740       sec_flags |= SEC_LINK_ONCE;
741
742       /* Unfortunately, the PE format stores essential information in
743          the symbol table, of all places.  We need to extract that
744          information now, so that objdump and the linker will know how
745          to handle the section without worrying about the symbols.  We
746          can't call slurp_symtab, because the linker doesn't want the
747          swapped symbols.  */
748
749       /* COMDAT sections are special.  The first symbol is the section
750          symbol, which tells what kind of COMDAT section it is.  The
751          second symbol is the "comdat symbol" - the one with the
752          unique name.  GNU uses the section symbol for the unique
753          name; MS uses ".text" for every comdat section.  Sigh.  - DJ */
754
755       /* This is not mirrored in sec_to_styp_flags(), but there
756          doesn't seem to be a need to, either, and it would at best be
757          rather messy.  */
758
759       if (_bfd_coff_get_external_symbols (abfd))
760         {
761           bfd_byte *esymstart, *esym, *esymend;
762           int seen_state = 0;
763           char *target_name;
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       arch = bfd_arch_arm;
1769       switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1770         {
1771         case F_ARM_2:  machine = bfd_mach_arm_2;  break;
1772         case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1773         case F_ARM_3:  machine = bfd_mach_arm_3;  break;
1774         default:
1775         case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1776         case F_ARM_4:  machine = bfd_mach_arm_4;  break;
1777         case F_ARM_4T: machine = bfd_mach_arm_4T; break;
1778         case F_ARM_5:  machine = bfd_mach_arm_5;  break;
1779         }
1780       break;
1781 #endif
1782 #ifdef MC68MAGIC
1783     case MC68MAGIC:
1784     case M68MAGIC:
1785 #ifdef MC68KBCSMAGIC
1786     case MC68KBCSMAGIC:
1787 #endif
1788 #ifdef APOLLOM68KMAGIC
1789     case APOLLOM68KMAGIC:
1790 #endif
1791 #ifdef LYNXCOFFMAGIC
1792     case LYNXCOFFMAGIC:
1793 #endif
1794       arch = bfd_arch_m68k;
1795       machine = bfd_mach_m68020;
1796       break;
1797 #endif
1798 #ifdef MC88MAGIC
1799     case MC88MAGIC:
1800     case MC88DMAGIC:
1801     case MC88OMAGIC:
1802       arch = bfd_arch_m88k;
1803       machine = 88100;
1804       break;
1805 #endif
1806 #ifdef Z8KMAGIC
1807     case Z8KMAGIC:
1808       arch = bfd_arch_z8k;
1809       switch (internal_f->f_flags & F_MACHMASK)
1810         {
1811         case F_Z8001:
1812           machine = bfd_mach_z8001;
1813           break;
1814         case F_Z8002:
1815           machine = bfd_mach_z8002;
1816           break;
1817         default:
1818           return false;
1819         }
1820       break;
1821 #endif
1822 #ifdef I860
1823     case I860MAGIC:
1824       arch = bfd_arch_i860;
1825       break;
1826 #endif
1827 #ifdef I960
1828 #ifdef I960ROMAGIC
1829     case I960ROMAGIC:
1830     case I960RWMAGIC:
1831       arch = bfd_arch_i960;
1832       switch (F_I960TYPE & internal_f->f_flags)
1833         {
1834         default:
1835         case F_I960CORE:
1836           machine = bfd_mach_i960_core;
1837           break;
1838         case F_I960KB:
1839           machine = bfd_mach_i960_kb_sb;
1840           break;
1841         case F_I960MC:
1842           machine = bfd_mach_i960_mc;
1843           break;
1844         case F_I960XA:
1845           machine = bfd_mach_i960_xa;
1846           break;
1847         case F_I960CA:
1848           machine = bfd_mach_i960_ca;
1849           break;
1850         case F_I960KA:
1851           machine = bfd_mach_i960_ka_sa;
1852           break;
1853         case F_I960JX:
1854           machine = bfd_mach_i960_jx;
1855           break;
1856         case F_I960HX:
1857           machine = bfd_mach_i960_hx;
1858           break;
1859         }
1860       break;
1861 #endif
1862 #endif
1863
1864 #ifdef RS6000COFF_C
1865     case U802ROMAGIC:
1866     case U802WRMAGIC:
1867     case U802TOCMAGIC:
1868       {
1869         int cputype;
1870
1871         if (xcoff_data (abfd)->cputype != -1)
1872           cputype = xcoff_data (abfd)->cputype & 0xff;
1873         else
1874           {
1875             /* We did not get a value from the a.out header.  If the
1876                file has not been stripped, we may be able to get the
1877                architecture information from the first symbol, if it
1878                is a .file symbol.  */
1879             if (obj_raw_syment_count (abfd) == 0)
1880               cputype = 0;
1881             else
1882               {
1883                 bfd_byte buf[bfd_coff_symesz (abfd)];
1884                 struct internal_syment sym;
1885
1886                 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1887                     || bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd) != bfd_coff_symesz (abfd))
1888                   return false;
1889                 coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
1890                 if (sym.n_sclass == C_FILE)
1891                   cputype = sym.n_type & 0xff;
1892                 else
1893                   cputype = 0;
1894               }
1895           }
1896
1897         /* FIXME: We don't handle all cases here.  */
1898         switch (cputype)
1899           {
1900           default:
1901           case 0:
1902 #ifdef POWERMAC
1903             /* PowerPC Macs use the same magic numbers as RS/6000
1904                (because that's how they were bootstrapped originally),
1905                but they are always PowerPC architecture.  */
1906             arch = bfd_arch_powerpc;
1907             machine = 0;
1908 #else
1909             arch = bfd_arch_rs6000;
1910             machine = 6000;
1911 #endif /* POWERMAC */
1912             break;
1913
1914           case 1:
1915             arch = bfd_arch_powerpc;
1916             machine = 601;
1917             break;
1918           case 2: /* 64 bit PowerPC */
1919             arch = bfd_arch_powerpc;
1920             machine = 620;
1921             break;
1922           case 3:
1923             arch = bfd_arch_powerpc;
1924             machine = 0;
1925             break;
1926           case 4:
1927             arch = bfd_arch_rs6000;
1928             machine = 6000;
1929             break;
1930           }
1931       }
1932       break;
1933 #endif
1934
1935 #ifdef WE32KMAGIC
1936     case WE32KMAGIC:
1937       arch = bfd_arch_we32k;
1938       machine = 0;
1939       break;
1940 #endif
1941
1942 #ifdef H8300MAGIC
1943     case H8300MAGIC:
1944       arch = bfd_arch_h8300;
1945       machine = bfd_mach_h8300;
1946       /* !! FIXME this probably isn't the right place for this */
1947       abfd->flags |= BFD_IS_RELAXABLE;
1948       break;
1949 #endif
1950
1951 #ifdef H8300HMAGIC
1952     case H8300HMAGIC:
1953       arch = bfd_arch_h8300;
1954       machine = bfd_mach_h8300h;
1955       /* !! FIXME this probably isn't the right place for this */
1956       abfd->flags |= BFD_IS_RELAXABLE;
1957       break;
1958 #endif
1959
1960 #ifdef H8300SMAGIC
1961     case H8300SMAGIC:
1962       arch = bfd_arch_h8300;
1963       machine = bfd_mach_h8300s;
1964       /* !! FIXME this probably isn't the right place for this */
1965       abfd->flags |= BFD_IS_RELAXABLE;
1966       break;
1967 #endif
1968
1969 #ifdef SH_ARCH_MAGIC_BIG
1970     case SH_ARCH_MAGIC_BIG:
1971     case SH_ARCH_MAGIC_LITTLE:
1972       arch = bfd_arch_sh;
1973       machine = 0;
1974       break;
1975 #endif
1976
1977 #ifdef H8500MAGIC
1978     case H8500MAGIC:
1979       arch = bfd_arch_h8500;
1980       machine = 0;
1981       break;
1982 #endif
1983
1984 #ifdef SPARCMAGIC
1985     case SPARCMAGIC:
1986 #ifdef LYNXCOFFMAGIC
1987     case LYNXCOFFMAGIC:
1988 #endif
1989       arch = bfd_arch_sparc;
1990       machine = 0;
1991       break;
1992 #endif
1993
1994 #ifdef TIC30MAGIC
1995     case TIC30MAGIC:
1996       arch = bfd_arch_tic30;
1997       break;
1998 #endif
1999
2000 #ifdef TIC80_ARCH_MAGIC
2001     case TIC80_ARCH_MAGIC:
2002       arch = bfd_arch_tic80;
2003       break;
2004 #endif
2005
2006 #ifdef MCOREMAGIC
2007     case MCOREMAGIC:
2008       arch = bfd_arch_mcore;
2009       break;
2010 #endif
2011     default:                    /* Unreadable input file type */
2012       arch = bfd_arch_obscure;
2013       break;
2014     }
2015
2016   bfd_default_set_arch_mach (abfd, arch, machine);
2017   return true;
2018 }
2019
2020 #ifdef SYMNAME_IN_DEBUG
2021
2022 static boolean symname_in_debug_hook
2023   PARAMS ((bfd *, struct internal_syment *));
2024
2025 static boolean
2026 symname_in_debug_hook (abfd, sym)
2027      bfd * abfd ATTRIBUTE_UNUSED;
2028      struct internal_syment *sym;
2029 {
2030   return SYMNAME_IN_DEBUG (sym) ? true : false;
2031 }
2032
2033 #else
2034
2035 #define symname_in_debug_hook \
2036   (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
2037
2038 #endif
2039
2040 #ifdef RS6000COFF_C
2041
2042 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
2043
2044 static boolean coff_pointerize_aux_hook
2045   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2046            unsigned int, combined_entry_type *));
2047
2048 /*ARGSUSED*/
2049 static boolean
2050 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
2051      bfd *abfd ATTRIBUTE_UNUSED;
2052      combined_entry_type *table_base;
2053      combined_entry_type *symbol;
2054      unsigned int indaux;
2055      combined_entry_type *aux;
2056 {
2057   int class = symbol->u.syment.n_sclass;
2058
2059   if ((class == C_EXT || class == C_HIDEXT)
2060       && indaux + 1 == symbol->u.syment.n_numaux)
2061     {
2062       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2063         {
2064           aux->u.auxent.x_csect.x_scnlen.p =
2065             table_base + aux->u.auxent.x_csect.x_scnlen.l;
2066           aux->fix_scnlen = 1;
2067         }
2068
2069       /* Return true to indicate that the caller should not do any
2070          further work on this auxent.  */
2071       return true;
2072     }
2073
2074   /* Return false to indicate that this auxent should be handled by
2075      the caller.  */
2076   return false;
2077 }
2078
2079 #else
2080 #ifdef I960
2081
2082 /* We don't want to pointerize bal entries.  */
2083
2084 static boolean coff_pointerize_aux_hook
2085   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2086            unsigned int, combined_entry_type *));
2087
2088 /*ARGSUSED*/
2089 static boolean
2090 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
2091      bfd *abfd ATTRIBUTE_UNUSED;
2092      combined_entry_type *table_base ATTRIBUTE_UNUSED;
2093      combined_entry_type *symbol;
2094      unsigned int indaux;
2095      combined_entry_type *aux ATTRIBUTE_UNUSED;
2096 {
2097   /* Return true if we don't want to pointerize this aux entry, which
2098      is the case for the lastfirst aux entry for a C_LEAFPROC symbol.  */
2099   return (indaux == 1
2100           && (symbol->u.syment.n_sclass == C_LEAFPROC
2101               || symbol->u.syment.n_sclass == C_LEAFSTAT
2102               || symbol->u.syment.n_sclass == C_LEAFEXT));
2103 }
2104
2105 #else /* ! I960 */
2106
2107 #define coff_pointerize_aux_hook 0
2108
2109 #endif /* ! I960 */
2110 #endif /* ! RS6000COFF_C */
2111
2112 /* Print an aux entry.  This returns true if it has printed it.  */
2113
2114 static boolean coff_print_aux
2115   PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
2116            combined_entry_type *, unsigned int));
2117
2118 static boolean
2119 coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
2120      bfd *abfd ATTRIBUTE_UNUSED;
2121      FILE *file ATTRIBUTE_UNUSED;
2122      combined_entry_type *table_base ATTRIBUTE_UNUSED;
2123      combined_entry_type *symbol ATTRIBUTE_UNUSED;
2124      combined_entry_type *aux ATTRIBUTE_UNUSED;
2125      unsigned int indaux ATTRIBUTE_UNUSED;
2126 {
2127 #ifdef RS6000COFF_C
2128   if ((symbol->u.syment.n_sclass == C_EXT
2129        || symbol->u.syment.n_sclass == C_HIDEXT)
2130       && indaux + 1 == symbol->u.syment.n_numaux)
2131     {
2132       /* This is a csect entry.  */
2133       fprintf (file, "AUX ");
2134       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2135         {
2136           BFD_ASSERT (! aux->fix_scnlen);
2137           fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
2138         }
2139       else
2140         {
2141           fprintf (file, "indx ");
2142           if (! aux->fix_scnlen)
2143             fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
2144           else
2145             fprintf (file, "%4ld",
2146                      (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2147         }
2148       fprintf (file,
2149                " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2150                aux->u.auxent.x_csect.x_parmhash,
2151                (unsigned int) aux->u.auxent.x_csect.x_snhash,
2152                SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2153                SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2154                (unsigned int) aux->u.auxent.x_csect.x_smclas,
2155                aux->u.auxent.x_csect.x_stab,
2156                (unsigned int) aux->u.auxent.x_csect.x_snstab);
2157       return true;
2158     }
2159 #endif
2160
2161   /* Return false to indicate that no special action was taken.  */
2162   return false;
2163 }
2164
2165 /*
2166 SUBSUBSECTION
2167         Writing relocations
2168
2169         To write relocations, the back end steps though the
2170         canonical relocation table and create an
2171         @code{internal_reloc}. The symbol index to use is removed from
2172         the @code{offset} field in the symbol table supplied.  The
2173         address comes directly from the sum of the section base
2174         address and the relocation offset; the type is dug directly
2175         from the howto field.  Then the @code{internal_reloc} is
2176         swapped into the shape of an @code{external_reloc} and written
2177         out to disk.
2178
2179 */
2180
2181 #ifdef TARG_AUX
2182
2183 static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2184
2185 /* AUX's ld wants relocations to be sorted */
2186 static int
2187 compare_arelent_ptr (x, y)
2188      const PTR x;
2189      const PTR y;
2190 {
2191   const arelent **a = (const arelent **) x;
2192   const arelent **b = (const arelent **) y;
2193   bfd_size_type aadr = (*a)->address;
2194   bfd_size_type badr = (*b)->address;
2195
2196   return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2197 }
2198
2199 #endif /* TARG_AUX */
2200
2201 static boolean
2202 coff_write_relocs (abfd, first_undef)
2203      bfd * abfd;
2204      int first_undef;
2205 {
2206   asection *s;
2207
2208   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2209     {
2210       unsigned int i;
2211       struct external_reloc dst;
2212       arelent **p;
2213
2214 #ifndef TARG_AUX
2215       p = s->orelocation;
2216 #else
2217       /* sort relocations before we write them out */
2218       p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
2219       if (p == NULL && s->reloc_count > 0)
2220         return false;
2221       memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2222       qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2223 #endif
2224
2225       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2226         return false;
2227       for (i = 0; i < s->reloc_count; i++)
2228         {
2229           struct internal_reloc n;
2230           arelent *q = p[i];
2231           memset ((PTR) & n, 0, sizeof (n));
2232
2233           /* Now we've renumbered the symbols we know where the
2234              undefined symbols live in the table.  Check the reloc
2235              entries for symbols who's output bfd isn't the right one.
2236              This is because the symbol was undefined (which means
2237              that all the pointers are never made to point to the same
2238              place). This is a bad thing,'cause the symbols attached
2239              to the output bfd are indexed, so that the relocation
2240              entries know which symbol index they point to.  So we
2241              have to look up the output symbol here. */
2242
2243           if (q->sym_ptr_ptr[0]->the_bfd != abfd)
2244             {
2245               int i;
2246               const char *sname = q->sym_ptr_ptr[0]->name;
2247               asymbol **outsyms = abfd->outsymbols;
2248               for (i = first_undef; outsyms[i]; i++)
2249                 {
2250                   const char *intable = outsyms[i]->name;
2251                   if (strcmp (intable, sname) == 0) {
2252                     /* got a hit, so repoint the reloc */
2253                     q->sym_ptr_ptr = outsyms + i;
2254                     break;
2255                   }
2256                 }
2257             }
2258
2259           n.r_vaddr = q->address + s->vma;
2260
2261 #ifdef R_IHCONST
2262           /* The 29k const/consth reloc pair is a real kludge.  The consth
2263              part doesn't have a symbol; it has an offset.  So rebuilt
2264              that here.  */
2265           if (q->howto->type == R_IHCONST)
2266             n.r_symndx = q->addend;
2267           else
2268 #endif
2269             if (q->sym_ptr_ptr)
2270               {
2271 #ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
2272                 if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
2273 #else
2274                 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
2275 #endif
2276                   /* This is a relocation relative to the absolute symbol.  */
2277                   n.r_symndx = -1;
2278                 else
2279                   {
2280                     n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2281                     /* Take notice if the symbol reloc points to a symbol
2282                        we don't have in our symbol table.  What should we
2283                        do for this??  */
2284                     if (n.r_symndx > obj_conv_table_size (abfd))
2285                       abort ();
2286                   }
2287               }
2288
2289 #ifdef SWAP_OUT_RELOC_OFFSET
2290           n.r_offset = q->addend;
2291 #endif
2292
2293 #ifdef SELECT_RELOC
2294           /* Work out reloc type from what is required */
2295           SELECT_RELOC (n, q->howto);
2296 #else
2297           n.r_type = q->howto->type;
2298 #endif
2299           coff_swap_reloc_out (abfd, &n, &dst);
2300           if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
2301               != bfd_coff_relsz (abfd))
2302             return false;
2303         }
2304
2305 #ifdef TARG_AUX
2306       if (p != NULL)
2307         free (p);
2308 #endif
2309     }
2310
2311   return true;
2312 }
2313
2314 /* Set flags and magic number of a coff file from architecture and machine
2315    type.  Result is true if we can represent the arch&type, false if not.  */
2316
2317 static boolean
2318 coff_set_flags (abfd, magicp, flagsp)
2319      bfd * abfd;
2320      unsigned int *magicp ATTRIBUTE_UNUSED;
2321      unsigned short *flagsp ATTRIBUTE_UNUSED;
2322 {
2323   switch (bfd_get_arch (abfd))
2324     {
2325 #ifdef Z8KMAGIC
2326     case bfd_arch_z8k:
2327       *magicp = Z8KMAGIC;
2328       switch (bfd_get_mach (abfd))
2329         {
2330         case bfd_mach_z8001:
2331           *flagsp = F_Z8001;
2332           break;
2333         case bfd_mach_z8002:
2334           *flagsp = F_Z8002;
2335           break;
2336         default:
2337           return false;
2338         }
2339       return true;
2340 #endif
2341 #ifdef I960ROMAGIC
2342
2343     case bfd_arch_i960:
2344
2345       {
2346         unsigned flags;
2347         *magicp = I960ROMAGIC;
2348         /*
2349           ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
2350           I960RWMAGIC);   FIXME???
2351           */
2352         switch (bfd_get_mach (abfd))
2353           {
2354           case bfd_mach_i960_core:
2355             flags = F_I960CORE;
2356             break;
2357           case bfd_mach_i960_kb_sb:
2358             flags = F_I960KB;
2359             break;
2360           case bfd_mach_i960_mc:
2361             flags = F_I960MC;
2362             break;
2363           case bfd_mach_i960_xa:
2364             flags = F_I960XA;
2365             break;
2366           case bfd_mach_i960_ca:
2367             flags = F_I960CA;
2368             break;
2369           case bfd_mach_i960_ka_sa:
2370             flags = F_I960KA;
2371             break;
2372           case bfd_mach_i960_jx:
2373             flags = F_I960JX;
2374             break;
2375           case bfd_mach_i960_hx:
2376             flags = F_I960HX;
2377             break;
2378           default:
2379             return false;
2380           }
2381         *flagsp = flags;
2382         return true;
2383       }
2384       break;
2385 #endif
2386
2387 #ifdef TIC30MAGIC
2388     case bfd_arch_tic30:
2389       *magicp = TIC30MAGIC;
2390       return true;
2391 #endif
2392 #ifdef TIC80_ARCH_MAGIC
2393     case bfd_arch_tic80:
2394       *magicp = TIC80_ARCH_MAGIC;
2395       return true;
2396 #endif
2397 #ifdef ARMMAGIC
2398     case bfd_arch_arm:
2399       * magicp = ARMMAGIC;
2400       * flagsp = 0;
2401       if (APCS_SET (abfd))
2402         {
2403           if (APCS_26_FLAG (abfd))
2404             * flagsp |= F_APCS26;
2405           
2406           if (APCS_FLOAT_FLAG (abfd))
2407             * flagsp |= F_APCS_FLOAT;
2408           
2409           if (PIC_FLAG (abfd))
2410             * flagsp |= F_PIC;
2411         }
2412       if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2413         * flagsp |= F_INTERWORK;
2414       switch (bfd_get_mach (abfd))
2415         {
2416         case bfd_mach_arm_2:  * flagsp |= F_ARM_2;  break;
2417         case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2418         case bfd_mach_arm_3:  * flagsp |= F_ARM_3;  break;
2419         case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2420         case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
2421         case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2422         case bfd_mach_arm_5:  * flagsp |= F_ARM_5;  break;
2423         case bfd_mach_arm_5T: * flagsp |= F_ARM_5;  break; /* XXX - we do not have an F_ARM_5T */
2424         }
2425       return true;
2426 #endif
2427 #ifdef PPCMAGIC
2428     case bfd_arch_powerpc:
2429       *magicp = PPCMAGIC;
2430       return true;
2431       break;
2432 #endif
2433 #ifdef I386MAGIC
2434     case bfd_arch_i386:
2435       *magicp = I386MAGIC;
2436 #ifdef LYNXOS
2437       /* Just overwrite the usual value if we're doing Lynx. */
2438       *magicp = LYNXCOFFMAGIC;
2439 #endif
2440       return true;
2441       break;
2442 #endif
2443 #ifdef I860MAGIC
2444     case bfd_arch_i860:
2445       *magicp = I860MAGIC;
2446       return true;
2447       break;
2448 #endif
2449 #ifdef MC68MAGIC
2450     case bfd_arch_m68k:
2451 #ifdef APOLLOM68KMAGIC
2452       *magicp = APOLLO_COFF_VERSION_NUMBER;
2453 #else
2454       /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c.  */
2455 #ifdef NAMES_HAVE_UNDERSCORE
2456       *magicp = MC68KBCSMAGIC;
2457 #else
2458       *magicp = MC68MAGIC;
2459 #endif
2460 #endif
2461 #ifdef LYNXOS
2462       /* Just overwrite the usual value if we're doing Lynx. */
2463       *magicp = LYNXCOFFMAGIC;
2464 #endif
2465       return true;
2466       break;
2467 #endif
2468
2469 #ifdef MC88MAGIC
2470     case bfd_arch_m88k:
2471       *magicp = MC88OMAGIC;
2472       return true;
2473       break;
2474 #endif
2475 #ifdef H8300MAGIC
2476     case bfd_arch_h8300:
2477       switch (bfd_get_mach (abfd))
2478         {
2479         case bfd_mach_h8300:
2480           *magicp = H8300MAGIC;
2481           return true;
2482         case bfd_mach_h8300h:
2483           *magicp = H8300HMAGIC;
2484           return true;
2485         case bfd_mach_h8300s:
2486           *magicp = H8300SMAGIC;
2487           return true;
2488         }
2489       break;
2490 #endif
2491
2492 #ifdef SH_ARCH_MAGIC_BIG
2493     case bfd_arch_sh:
2494       if (bfd_big_endian (abfd))
2495         *magicp = SH_ARCH_MAGIC_BIG;
2496       else
2497         *magicp = SH_ARCH_MAGIC_LITTLE;
2498       return true;
2499       break;
2500 #endif
2501
2502 #ifdef SPARCMAGIC
2503     case bfd_arch_sparc:
2504       *magicp = SPARCMAGIC;
2505 #ifdef LYNXOS
2506       /* Just overwrite the usual value if we're doing Lynx. */
2507       *magicp = LYNXCOFFMAGIC;
2508 #endif
2509       return true;
2510       break;
2511 #endif
2512
2513 #ifdef H8500MAGIC
2514     case bfd_arch_h8500:
2515       *magicp = H8500MAGIC;
2516       return true;
2517       break;
2518 #endif
2519 #ifdef A29K_MAGIC_BIG
2520     case bfd_arch_a29k:
2521       if (bfd_big_endian (abfd))
2522         *magicp = A29K_MAGIC_BIG;
2523       else
2524         *magicp = A29K_MAGIC_LITTLE;
2525       return true;
2526       break;
2527 #endif
2528
2529 #ifdef WE32KMAGIC
2530     case bfd_arch_we32k:
2531       *magicp = WE32KMAGIC;
2532       return true;
2533       break;
2534 #endif
2535
2536 #ifdef U802TOCMAGIC
2537     case bfd_arch_rs6000:
2538 #ifndef PPCMAGIC
2539     case bfd_arch_powerpc:
2540 #endif
2541       *magicp = U802TOCMAGIC;
2542       return true;
2543       break;
2544 #endif
2545
2546 #ifdef MCOREMAGIC
2547     case bfd_arch_mcore:
2548       * magicp = MCOREMAGIC;
2549       return true;
2550 #endif
2551       
2552     default:                    /* Unknown architecture */
2553       /* return false;  -- fall through to "return false" below, to avoid
2554        "statement never reached" errors on the one below. */
2555       break;
2556     }
2557
2558   return false;
2559 }
2560
2561
2562 static boolean
2563 coff_set_arch_mach (abfd, arch, machine)
2564      bfd * abfd;
2565      enum bfd_architecture arch;
2566      unsigned long machine;
2567 {
2568   unsigned dummy1;
2569   unsigned short dummy2;
2570
2571   if (! bfd_default_set_arch_mach (abfd, arch, machine))
2572     return false;
2573
2574   if (arch != bfd_arch_unknown &&
2575       coff_set_flags (abfd, &dummy1, &dummy2) != true)
2576     return false;               /* We can't represent this type */
2577
2578   return true;                  /* We're easy ... */
2579 }
2580
2581 #ifdef COFF_IMAGE_WITH_PE
2582
2583 /* This is used to sort sections by VMA, as required by PE image
2584    files.  */
2585
2586 static int sort_by_secaddr PARAMS ((const PTR, const PTR));
2587
2588 static int
2589 sort_by_secaddr (arg1, arg2)
2590      const PTR arg1;
2591      const PTR arg2;
2592 {
2593   const asection *a = *(const asection **) arg1;
2594   const asection *b = *(const asection **) arg2;
2595
2596   if (a->vma < b->vma)
2597     return -1;
2598   else if (a->vma > b->vma)
2599     return 1;
2600   else
2601     return 0;
2602 }
2603
2604 #endif /* COFF_IMAGE_WITH_PE */
2605
2606 /* Calculate the file position for each section. */
2607
2608 #ifndef I960
2609 #define ALIGN_SECTIONS_IN_FILE
2610 #endif
2611 #ifdef TIC80COFF
2612 #undef ALIGN_SECTIONS_IN_FILE
2613 #endif
2614
2615 static boolean
2616 coff_compute_section_file_positions (abfd)
2617      bfd * abfd;
2618 {
2619   asection *current;
2620   asection *previous = (asection *) NULL;
2621   file_ptr sofar = bfd_coff_filhsz (abfd);
2622   boolean align_adjust;
2623 #ifdef ALIGN_SECTIONS_IN_FILE
2624   file_ptr old_sofar;
2625 #endif
2626
2627 #ifdef RS6000COFF_C
2628   /* On XCOFF, if we have symbols, set up the .debug section.  */
2629   if (bfd_get_symcount (abfd) > 0)
2630     {
2631       bfd_size_type sz;
2632       bfd_size_type i, symcount;
2633       asymbol **symp;
2634
2635       sz = 0;
2636       symcount = bfd_get_symcount (abfd);
2637       for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2638         {
2639           coff_symbol_type *cf;
2640
2641           cf = coff_symbol_from (abfd, *symp);
2642           if (cf != NULL
2643               && cf->native != NULL
2644               && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2645             {
2646               size_t len;
2647
2648               len = strlen (bfd_asymbol_name (*symp));
2649               if (len > SYMNMLEN)
2650                 sz += len + 3;
2651             }
2652         }
2653       if (sz > 0)
2654         {
2655           asection *dsec;
2656
2657           dsec = bfd_make_section_old_way (abfd, ".debug");
2658           if (dsec == NULL)
2659             abort ();
2660           dsec->_raw_size = sz;
2661           dsec->flags |= SEC_HAS_CONTENTS;
2662         }
2663     }
2664 #endif
2665
2666 #ifdef COFF_IMAGE_WITH_PE
2667   int page_size;
2668   if (coff_data (abfd)->link_info) 
2669     {
2670       page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2671     }
2672   else
2673     page_size = PE_DEF_FILE_ALIGNMENT;
2674 #else
2675 #ifdef COFF_PAGE_SIZE
2676   int page_size = COFF_PAGE_SIZE;
2677 #endif
2678 #endif
2679
2680   if (bfd_get_start_address (abfd))
2681     {
2682       /*  A start address may have been added to the original file. In this
2683           case it will need an optional header to record it.  */
2684       abfd->flags |= EXEC_P;
2685     }
2686
2687   if (abfd->flags & EXEC_P)
2688     sofar += bfd_coff_aoutsz (abfd);
2689 #ifdef RS6000COFF_C
2690   else if (xcoff_data (abfd)->full_aouthdr)
2691     sofar += bfd_coff_aoutsz (abfd);
2692   else
2693     sofar += SMALL_AOUTSZ;
2694 #endif
2695
2696   sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
2697
2698 #ifdef RS6000COFF_C
2699   /* XCOFF handles overflows in the reloc and line number count fields
2700      by allocating a new section header to hold the correct counts.  */
2701   for (current = abfd->sections; current != NULL; current = current->next)
2702     if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2703       sofar += bfd_coff_scnhsz (abfd);
2704 #endif
2705
2706 #ifdef COFF_IMAGE_WITH_PE
2707   {
2708     /* PE requires the sections to be in memory order when listed in
2709        the section headers.  It also does not like empty loadable
2710        sections.  The sections apparently do not have to be in the
2711        right order in the image file itself, but we do need to get the
2712        target_index values right.  */
2713
2714     int count;
2715     asection **section_list;
2716     int i;
2717     int target_index;
2718
2719     count = 0;
2720     for (current = abfd->sections; current != NULL; current = current->next)
2721       ++count;
2722
2723     /* We allocate an extra cell to simplify the final loop.  */
2724     section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
2725     if (section_list == NULL)
2726       return false;
2727
2728     i = 0;
2729     for (current = abfd->sections; current != NULL; current = current->next)
2730       {
2731         section_list[i] = current;
2732         ++i;
2733       }
2734     section_list[i] = NULL;
2735
2736     qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
2737
2738     /* Rethread the linked list into sorted order; at the same time,
2739        assign target_index values.  */
2740     target_index = 1;
2741     abfd->sections = section_list[0];
2742     for (i = 0; i < count; i++)
2743       {
2744         current = section_list[i];
2745         current->next = section_list[i + 1];
2746
2747         /* Later, if the section has zero size, we'll be throwing it
2748            away, so we don't want to number it now.  Note that having
2749            a zero size and having real contents are different
2750            concepts: .bss has no contents, but (usually) non-zero
2751            size.  */
2752         if (current->_raw_size == 0)
2753           {
2754             /* Discard.  However, it still might have (valid) symbols
2755                in it, so arbitrarily set it to section 1 (indexing is
2756                1-based here; usually .text).  __end__ and other
2757                contents of .endsection really have this happen.
2758                FIXME: This seems somewhat dubious.  */
2759             current->target_index = 1;
2760           }
2761         else
2762           current->target_index = target_index++;
2763       }
2764
2765     free (section_list);
2766   }
2767 #else /* ! COFF_IMAGE_WITH_PE */
2768   {
2769     /* Set the target_index field.  */
2770     int target_index;
2771
2772     target_index = 1;
2773     for (current = abfd->sections; current != NULL; current = current->next)
2774       current->target_index = target_index++;
2775   }
2776 #endif /* ! COFF_IMAGE_WITH_PE */
2777
2778   align_adjust = false;
2779   for (current = abfd->sections;
2780        current != (asection *) NULL;
2781        current = current->next)
2782     {
2783 #ifdef COFF_IMAGE_WITH_PE
2784       /* With PE we have to pad each section to be a multiple of its
2785          page size too, and remember both sizes.  */
2786       if (coff_section_data (abfd, current) == NULL)
2787         {
2788           current->used_by_bfd =
2789             (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
2790           if (current->used_by_bfd == NULL)
2791             return false;
2792         }
2793       if (pei_section_data (abfd, current) == NULL)
2794         {
2795           coff_section_data (abfd, current)->tdata =
2796             (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
2797           if (coff_section_data (abfd, current)->tdata == NULL)
2798             return false;
2799         }
2800       if (pei_section_data (abfd, current)->virt_size == 0)
2801         pei_section_data (abfd, current)->virt_size = current->_raw_size;
2802 #endif
2803
2804       /* Only deal with sections which have contents.  */
2805       if (!(current->flags & SEC_HAS_CONTENTS))
2806         continue;
2807
2808 #ifdef COFF_IMAGE_WITH_PE
2809       /* Make sure we skip empty sections in a PE image.  */
2810       if (current->_raw_size == 0)
2811         continue;
2812 #endif
2813
2814       /* Align the sections in the file to the same boundary on
2815          which they are aligned in virtual memory.  I960 doesn't
2816          do this (FIXME) so we can stay in sync with Intel.  960
2817          doesn't yet page from files... */
2818 #ifdef ALIGN_SECTIONS_IN_FILE
2819       if ((abfd->flags & EXEC_P) != 0)
2820         {
2821           /* make sure this section is aligned on the right boundary - by
2822              padding the previous section up if necessary */
2823
2824           old_sofar = sofar;
2825           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2826           if (previous != (asection *) NULL)
2827             {
2828               previous->_raw_size += sofar - old_sofar;
2829             }
2830         }
2831
2832 #endif
2833
2834       /* In demand paged files the low order bits of the file offset
2835          must match the low order bits of the virtual address.  */
2836 #ifdef COFF_PAGE_SIZE
2837       if ((abfd->flags & D_PAGED) != 0
2838           && (current->flags & SEC_ALLOC) != 0)
2839         sofar += (current->vma - sofar) % page_size;
2840 #endif
2841       current->filepos = sofar;
2842
2843 #ifdef COFF_IMAGE_WITH_PE
2844       /* Set the padded size.  */
2845       current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
2846 #endif
2847
2848       sofar += current->_raw_size;
2849
2850 #ifdef ALIGN_SECTIONS_IN_FILE
2851       /* make sure that this section is of the right size too */
2852       if ((abfd->flags & EXEC_P) == 0)
2853         {
2854           bfd_size_type old_size;
2855
2856           old_size = current->_raw_size;
2857           current->_raw_size = BFD_ALIGN (current->_raw_size,
2858                                           1 << current->alignment_power);
2859           align_adjust = current->_raw_size != old_size;
2860           sofar += current->_raw_size - old_size;
2861         }
2862       else
2863         {
2864           old_sofar = sofar;
2865           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2866           align_adjust = sofar != old_sofar;
2867           current->_raw_size += sofar - old_sofar;
2868         }
2869 #endif
2870
2871 #ifdef COFF_IMAGE_WITH_PE
2872       /* For PE we need to make sure we pad out to the aligned
2873          _raw_size, in case the caller only writes out data to the
2874          unaligned _raw_size.  */
2875       if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
2876         align_adjust = true;
2877 #endif
2878
2879 #ifdef _LIB
2880       /* Force .lib sections to start at zero.  The vma is then
2881          incremented in coff_set_section_contents.  This is right for
2882          SVR3.2.  */
2883       if (strcmp (current->name, _LIB) == 0)
2884         bfd_set_section_vma (abfd, current, 0);
2885 #endif
2886
2887       previous = current;
2888     }
2889
2890   /* It is now safe to write to the output file.  If we needed an
2891      alignment adjustment for the last section, then make sure that
2892      there is a byte at offset sofar.  If there are no symbols and no
2893      relocs, then nothing follows the last section.  If we don't force
2894      the last byte out, then the file may appear to be truncated.  */
2895   if (align_adjust)
2896     {
2897       bfd_byte b;
2898
2899       b = 0;
2900       if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
2901           || bfd_write (&b, 1, 1, abfd) != 1)
2902         return false;
2903     }
2904
2905   /* Make sure the relocations are aligned.  We don't need to make
2906      sure that this byte exists, because it will only matter if there
2907      really are relocs.  */
2908   sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
2909
2910   obj_relocbase (abfd) = sofar;
2911   abfd->output_has_begun = true;
2912
2913   return true;
2914 }
2915
2916 #if 0
2917
2918 /* This can never work, because it is called too late--after the
2919    section positions have been set.  I can't figure out what it is
2920    for, so I am going to disable it--Ian Taylor 20 March 1996.  */
2921
2922 /* If .file, .text, .data, .bss symbols are missing, add them.  */
2923 /* @@ Should we only be adding missing symbols, or overriding the aux
2924    values for existing section symbols?  */
2925 static boolean
2926 coff_add_missing_symbols (abfd)
2927      bfd *abfd;
2928 {
2929   unsigned int nsyms = bfd_get_symcount (abfd);
2930   asymbol **sympp = abfd->outsymbols;
2931   asymbol **sympp2;
2932   unsigned int i;
2933   int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
2934
2935   for (i = 0; i < nsyms; i++)
2936     {
2937       coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
2938       CONST char *name;
2939       if (csym)
2940         {
2941           /* only do this if there is a coff representation of the input
2942            symbol */
2943           if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
2944             {
2945               need_file = 0;
2946               continue;
2947             }
2948           name = csym->symbol.name;
2949           if (!name)
2950             continue;
2951           if (!strcmp (name, _TEXT))
2952             need_text = 0;
2953 #ifdef APOLLO_M68
2954           else if (!strcmp (name, ".wtext"))
2955             need_text = 0;
2956 #endif
2957           else if (!strcmp (name, _DATA))
2958             need_data = 0;
2959           else if (!strcmp (name, _BSS))
2960             need_bss = 0;
2961         }
2962     }
2963   /* Now i == bfd_get_symcount (abfd).  */
2964   /* @@ For now, don't deal with .file symbol.  */
2965   need_file = 0;
2966
2967   if (!need_text && !need_data && !need_bss && !need_file)
2968     return true;
2969   nsyms += need_text + need_data + need_bss + need_file;
2970   sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
2971   if (!sympp2)
2972     return false;
2973   memcpy (sympp2, sympp, i * sizeof (asymbol *));
2974   if (need_file)
2975     {
2976       /* @@ Generate fake .file symbol, in sympp2[i], and increment i.  */
2977       abort ();
2978     }
2979   if (need_text)
2980     sympp2[i++] = coff_section_symbol (abfd, _TEXT);
2981   if (need_data)
2982     sympp2[i++] = coff_section_symbol (abfd, _DATA);
2983   if (need_bss)
2984     sympp2[i++] = coff_section_symbol (abfd, _BSS);
2985   BFD_ASSERT (i == nsyms);
2986   bfd_set_symtab (abfd, sympp2, nsyms);
2987   return true;
2988 }
2989
2990 #endif /* 0 */
2991
2992 /* SUPPRESS 558 */
2993 /* SUPPRESS 529 */
2994 static boolean
2995 coff_write_object_contents (abfd)
2996      bfd * abfd;
2997 {
2998   asection *current;
2999   boolean hasrelocs = false;
3000   boolean haslinno = false;
3001   boolean hasdebug = false;
3002   file_ptr scn_base;
3003   file_ptr reloc_base;
3004   file_ptr lineno_base;
3005   file_ptr sym_base;
3006   unsigned long reloc_size = 0;
3007   unsigned long lnno_size = 0;
3008   boolean long_section_names;
3009   asection *text_sec = NULL;
3010   asection *data_sec = NULL;
3011   asection *bss_sec = NULL;
3012   struct internal_filehdr internal_f;
3013   struct internal_aouthdr internal_a;
3014 #ifdef COFF_LONG_SECTION_NAMES
3015   size_t string_size = STRING_SIZE_SIZE;
3016 #endif
3017
3018   bfd_set_error (bfd_error_system_call);
3019
3020   /* Make a pass through the symbol table to count line number entries and
3021      put them into the correct asections */
3022
3023   lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
3024
3025   if (abfd->output_has_begun == false)
3026     {
3027       if (! coff_compute_section_file_positions (abfd))
3028         return false;
3029     }
3030
3031   reloc_base = obj_relocbase (abfd);
3032
3033   /* Work out the size of the reloc and linno areas */
3034
3035   for (current = abfd->sections; current != NULL; current =
3036        current->next)
3037     reloc_size += current->reloc_count * bfd_coff_relsz (abfd);
3038
3039   lineno_base = reloc_base + reloc_size;
3040   sym_base = lineno_base + lnno_size;
3041
3042   /* Indicate in each section->line_filepos its actual file address */
3043   for (current = abfd->sections; current != NULL; current =
3044        current->next)
3045     {
3046       if (current->lineno_count)
3047         {
3048           current->line_filepos = lineno_base;
3049           current->moving_line_filepos = lineno_base;
3050           lineno_base += current->lineno_count * bfd_coff_linesz (abfd);
3051         }
3052       else
3053         {
3054           current->line_filepos = 0;
3055         }
3056       if (current->reloc_count)
3057         {
3058           current->rel_filepos = reloc_base;
3059           reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
3060         }
3061       else
3062         {
3063           current->rel_filepos = 0;
3064         }
3065     }
3066
3067   /* Write section headers to the file.  */
3068   internal_f.f_nscns = 0;
3069
3070   if ((abfd->flags & EXEC_P) != 0)
3071     scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
3072   else
3073     {
3074       scn_base = bfd_coff_filhsz (abfd);
3075 #ifdef RS6000COFF_C
3076       if (xcoff_data (abfd)->full_aouthdr)
3077         scn_base += bfd_coff_aoutsz (abfd);
3078       else
3079         scn_base += SMALL_AOUTSZ;
3080 #endif
3081     }
3082
3083   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
3084     return false;
3085
3086   long_section_names = false;
3087   for (current = abfd->sections;
3088        current != NULL;
3089        current = current->next)
3090     {
3091       struct internal_scnhdr section;
3092       boolean is_reloc_section = false;
3093
3094 #ifdef COFF_IMAGE_WITH_PE
3095       if (strcmp (current->name, ".reloc") == 0)
3096         {
3097           is_reloc_section = true;
3098           hasrelocs = true;
3099           pe_data (abfd)->has_reloc_section = 1;
3100         }
3101 #endif
3102
3103       internal_f.f_nscns++;
3104
3105       strncpy (section.s_name, current->name, SCNNMLEN);
3106
3107 #ifdef COFF_LONG_SECTION_NAMES
3108       /* Handle long section names as in PE.  This must be compatible
3109          with the code in coff_write_symbols and _bfd_coff_final_link.  */
3110       {
3111         size_t len;
3112
3113         len = strlen (current->name);
3114         if (len > SCNNMLEN)
3115           {
3116             memset (section.s_name, 0, SCNNMLEN);
3117             sprintf (section.s_name, "/%lu", (unsigned long) string_size);
3118             string_size += len + 1;
3119             long_section_names = true;
3120           }
3121       }
3122 #endif
3123
3124 #ifdef _LIB
3125       /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
3126          Ian Taylor <ian@cygnus.com>.  */
3127       if (strcmp (current->name, _LIB) == 0)
3128         section.s_vaddr = 0;
3129       else
3130 #endif
3131       section.s_vaddr = current->vma;
3132       section.s_paddr = current->lma;
3133       section.s_size =  current->_raw_size;
3134
3135 #ifdef COFF_WITH_PE
3136       section.s_paddr = 0;
3137 #endif
3138 #ifdef COFF_IMAGE_WITH_PE
3139       /* Reminder: s_paddr holds the virtual size of the section.  */
3140       if (coff_section_data (abfd, current) != NULL
3141           && pei_section_data (abfd, current) != NULL)
3142         section.s_paddr = pei_section_data (abfd, current)->virt_size;
3143       else
3144         section.s_paddr = 0;
3145 #endif
3146
3147       /*
3148          If this section has no size or is unloadable then the scnptr
3149          will be 0 too
3150          */
3151       if (current->_raw_size == 0 ||
3152           (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3153         {
3154           section.s_scnptr = 0;
3155         }
3156       else
3157         {
3158           section.s_scnptr = current->filepos;
3159         }
3160       section.s_relptr = current->rel_filepos;
3161       section.s_lnnoptr = current->line_filepos;
3162       section.s_nreloc = current->reloc_count;
3163       section.s_nlnno = current->lineno_count;
3164 #ifndef COFF_IMAGE_WITH_PE
3165       /* In PEI, relocs come in the .reloc section.  */
3166       if (current->reloc_count != 0)
3167         hasrelocs = true;
3168 #endif
3169       if (current->lineno_count != 0)
3170         haslinno = true;
3171       if ((current->flags & SEC_DEBUGGING) != 0
3172           && ! is_reloc_section)
3173         hasdebug = true;
3174
3175 #ifdef RS6000COFF_C
3176       /* Indicate the use of an XCOFF overflow section header.  */
3177       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3178         {
3179           section.s_nreloc = 0xffff;
3180           section.s_nlnno = 0xffff;
3181         }
3182 #endif
3183
3184       section.s_flags = sec_to_styp_flags (current->name, current->flags);
3185
3186       if (!strcmp (current->name, _TEXT))
3187         {
3188           text_sec = current;
3189         }
3190       else if (!strcmp (current->name, _DATA))
3191         {
3192           data_sec = current;
3193         }
3194       else if (!strcmp (current->name, _BSS))
3195         {
3196           bss_sec = current;
3197         }
3198
3199 #ifdef I960
3200       section.s_align = (current->alignment_power
3201                          ? 1 << current->alignment_power
3202                          : 0);
3203 #else
3204 #ifdef TIC80COFF
3205       section.s_flags |= (current->alignment_power & 0xF) << 8;
3206 #endif
3207 #endif
3208
3209 #ifdef COFF_IMAGE_WITH_PE
3210       /* Suppress output of the sections if they are null.  ld
3211          includes the bss and data sections even if there is no size
3212          assigned to them.  NT loader doesn't like it if these section
3213          headers are included if the sections themselves are not
3214          needed.  See also coff_compute_section_file_positions.  */
3215       if (section.s_size == 0)
3216         internal_f.f_nscns--;
3217       else
3218 #endif
3219         {
3220           SCNHDR buff;
3221           if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3222               || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
3223                    != bfd_coff_scnhsz (abfd))
3224             return false;
3225         }
3226
3227 #ifdef COFF_WITH_PE
3228       /* PE stores COMDAT section information in the symbol table.  If
3229          this section is supposed to have some COMDAT info, track down
3230          the symbol in the symbol table and modify it.  */
3231       if ((current->flags & SEC_LINK_ONCE) != 0)
3232         {
3233           unsigned int i, count;
3234           asymbol **psym;
3235           coff_symbol_type *csym = NULL;
3236           asymbol **psymsec;
3237
3238           psymsec = NULL;
3239           count = bfd_get_symcount (abfd);
3240           for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3241             {
3242               if ((*psym)->section != current)
3243                 continue;
3244
3245               /* Remember the location of the first symbol in this
3246                  section.  */
3247               if (psymsec == NULL)
3248                 psymsec = psym;
3249
3250               /* See if this is the section symbol.  */
3251               if (strcmp ((*psym)->name, current->name) == 0)
3252                 {
3253                   csym = coff_symbol_from (abfd, *psym);
3254                   if (csym == NULL
3255                       || csym->native == NULL
3256                       || csym->native->u.syment.n_numaux < 1
3257                       || csym->native->u.syment.n_sclass != C_STAT
3258                       || csym->native->u.syment.n_type != T_NULL)
3259                     continue;
3260
3261                   /* Here *PSYM is the section symbol for CURRENT.  */
3262
3263                   break;
3264                 }
3265             }
3266
3267           /* Did we find it?
3268              Note that we might not if we're converting the file from
3269              some other object file format.  */
3270           if (i < count)
3271             {
3272               combined_entry_type *aux;
3273
3274               /* We don't touch the x_checksum field.  The
3275                  x_associated field is not currently supported.  */
3276
3277               aux = csym->native + 1;
3278               switch (current->flags & SEC_LINK_DUPLICATES)
3279                 {
3280                 case SEC_LINK_DUPLICATES_DISCARD:
3281                   aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3282                   break;
3283
3284                 case SEC_LINK_DUPLICATES_ONE_ONLY:
3285                   aux->u.auxent.x_scn.x_comdat =
3286                     IMAGE_COMDAT_SELECT_NODUPLICATES;
3287                   break;
3288
3289                 case SEC_LINK_DUPLICATES_SAME_SIZE:
3290                   aux->u.auxent.x_scn.x_comdat =
3291                     IMAGE_COMDAT_SELECT_SAME_SIZE;
3292                   break;
3293
3294                 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3295                   aux->u.auxent.x_scn.x_comdat =
3296                     IMAGE_COMDAT_SELECT_EXACT_MATCH;
3297                   break;
3298                 }
3299
3300               /* The COMDAT symbol must be the first symbol from this
3301                  section in the symbol table.  In order to make this
3302                  work, we move the COMDAT symbol before the first
3303                  symbol we found in the search above.  It's OK to
3304                  rearrange the symbol table at this point, because
3305                  coff_renumber_symbols is going to rearrange it
3306                  further and fix up all the aux entries.  */
3307               if (psym != psymsec)
3308                 {
3309                   asymbol *hold;
3310                   asymbol **pcopy;
3311
3312                   hold = *psym;
3313                   for (pcopy = psym; pcopy > psymsec; pcopy--)
3314                     pcopy[0] = pcopy[-1];
3315                   *psymsec = hold;
3316                 }
3317             }
3318         }
3319 #endif /* COFF_WITH_PE */
3320     }
3321
3322 #ifdef RS6000COFF_C
3323   /* XCOFF handles overflows in the reloc and line number count fields
3324      by creating a new section header to hold the correct values.  */
3325   for (current = abfd->sections; current != NULL; current = current->next)
3326     {
3327       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3328         {
3329           struct internal_scnhdr scnhdr;
3330           SCNHDR buff;
3331
3332           internal_f.f_nscns++;
3333           strncpy (&(scnhdr.s_name[0]), current->name, 8);
3334           scnhdr.s_paddr = current->reloc_count;
3335           scnhdr.s_vaddr = current->lineno_count;
3336           scnhdr.s_size = 0;
3337           scnhdr.s_scnptr = 0;
3338           scnhdr.s_relptr = current->rel_filepos;
3339           scnhdr.s_lnnoptr = current->line_filepos;
3340           scnhdr.s_nreloc = current->target_index;
3341           scnhdr.s_nlnno = current->target_index;
3342           scnhdr.s_flags = STYP_OVRFLO;
3343           if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3344               || bfd_write ((PTR) &buff, 1, bfd_coff_scnhsz (abfd), abfd)
3345                    != bfd_coff_scnhsz (abfd))
3346             return false;
3347         }
3348     }
3349 #endif
3350
3351   /* OK, now set up the filehdr... */
3352
3353   /* Don't include the internal abs section in the section count */
3354
3355   /*
3356      We will NOT put a fucking timestamp in the header here. Every time you
3357      put it back, I will come in and take it out again.  I'm sorry.  This
3358      field does not belong here.  We fill it with a 0 so it compares the
3359      same but is not a reasonable time. -- gnu@cygnus.com
3360      */
3361   internal_f.f_timdat = 0;
3362
3363   internal_f.f_flags = 0;
3364
3365   if (abfd->flags & EXEC_P)
3366     internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3367   else
3368     {
3369       internal_f.f_opthdr = 0;
3370 #ifdef RS6000COFF_C
3371       if (xcoff_data (abfd)->full_aouthdr)
3372         internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3373       else
3374         internal_f.f_opthdr = SMALL_AOUTSZ;
3375 #endif
3376     }
3377
3378   if (!hasrelocs)
3379     internal_f.f_flags |= F_RELFLG;
3380   if (!haslinno)
3381     internal_f.f_flags |= F_LNNO;
3382   if (abfd->flags & EXEC_P)
3383     internal_f.f_flags |= F_EXEC;
3384 #ifdef COFF_IMAGE_WITH_PE
3385   if (! hasdebug)
3386     internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3387 #endif
3388
3389 #ifndef COFF_WITH_PE
3390   if (bfd_little_endian (abfd))
3391     internal_f.f_flags |= F_AR32WR;
3392   else
3393     internal_f.f_flags |= F_AR32W;
3394 #endif
3395
3396 #ifdef TIC80_TARGET_ID
3397   internal_f.f_target_id = TIC80_TARGET_ID;
3398 #endif
3399
3400   /*
3401      FIXME, should do something about the other byte orders and
3402      architectures.
3403      */
3404
3405 #ifdef RS6000COFF_C
3406   if ((abfd->flags & DYNAMIC) != 0)
3407     internal_f.f_flags |= F_SHROBJ;
3408   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3409     internal_f.f_flags |= F_DYNLOAD;
3410 #endif
3411
3412   memset (&internal_a, 0, sizeof internal_a);
3413
3414   /* Set up architecture-dependent stuff */
3415
3416   {
3417     unsigned int magic = 0;
3418     unsigned short flags = 0;
3419     coff_set_flags (abfd, &magic, &flags);
3420     internal_f.f_magic = magic;
3421     internal_f.f_flags |= flags;
3422     /* ...and the "opt"hdr... */
3423
3424 #ifdef A29K
3425 #ifdef ULTRA3                   /* NYU's machine */
3426     /* FIXME: This is a bogus check.  I really want to see if there
3427      * is a .shbss or a .shdata section, if so then set the magic
3428      * number to indicate a shared data executable.
3429      */
3430     if (internal_f.f_nscns >= 7)
3431       internal_a.magic = SHMAGIC; /* Shared magic */
3432     else
3433 #endif /* ULTRA3 */
3434       internal_a.magic = NMAGIC; /* Assume separate i/d */
3435 #define __A_MAGIC_SET__
3436 #endif /* A29K */
3437 #ifdef TIC80COFF
3438     internal_a.magic = TIC80_ARCH_MAGIC;
3439 #define __A_MAGIC_SET__
3440 #endif /* TIC80 */
3441 #ifdef I860
3442     /* FIXME: What are the a.out magic numbers for the i860?  */
3443     internal_a.magic = 0;
3444 #define __A_MAGIC_SET__
3445 #endif /* I860 */
3446 #ifdef I960
3447     internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3448 #define __A_MAGIC_SET__
3449 #endif /* I960 */
3450 #if M88
3451 #define __A_MAGIC_SET__
3452     internal_a.magic = PAGEMAGICBCS;
3453 #endif /* M88 */
3454
3455 #if APOLLO_M68
3456 #define __A_MAGIC_SET__
3457     internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3458 #endif
3459
3460 #if defined(M68) || defined(WE32K) || defined(M68K)
3461 #define __A_MAGIC_SET__
3462 #if defined(LYNXOS)
3463     internal_a.magic = LYNXCOFFMAGIC;
3464 #else
3465 #if defined(TARG_AUX)
3466     internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3467                         abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3468                         PAGEMAGICEXECSWAPPED);
3469 #else
3470 #if defined (PAGEMAGICPEXECPAGED)
3471     internal_a.magic = PAGEMAGICPEXECPAGED;
3472 #endif
3473 #endif /* TARG_AUX */
3474 #endif /* LYNXOS */
3475 #endif /* M68 || WE32K || M68K */
3476
3477 #if defined(ARM)
3478 #define __A_MAGIC_SET__
3479     internal_a.magic = ZMAGIC;
3480 #endif 
3481
3482 #if defined(PPC_PE)
3483 #define __A_MAGIC_SET__
3484     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3485 #endif
3486
3487 #if defined MCORE_PE
3488 #define __A_MAGIC_SET__
3489     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3490 #endif 
3491
3492 #if defined(I386)
3493 #define __A_MAGIC_SET__
3494 #if defined(LYNXOS)
3495     internal_a.magic = LYNXCOFFMAGIC;
3496 #else  /* LYNXOS */
3497     internal_a.magic = ZMAGIC;
3498 #endif /* LYNXOS */
3499 #endif /* I386 */
3500
3501 #if defined(SPARC)
3502 #define __A_MAGIC_SET__
3503 #if defined(LYNXOS)
3504     internal_a.magic = LYNXCOFFMAGIC;
3505 #endif /* LYNXOS */
3506 #endif /* SPARC */
3507
3508 #ifdef RS6000COFF_C
3509 #define __A_MAGIC_SET__
3510     internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
3511     (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
3512     RS6K_AOUTHDR_OMAGIC;
3513 #endif
3514
3515 #ifndef __A_MAGIC_SET__
3516 #include "Your aouthdr magic number is not being set!"
3517 #else
3518 #undef __A_MAGIC_SET__
3519 #endif
3520   }
3521
3522   /* FIXME: Does anybody ever set this to another value?  */
3523   internal_a.vstamp = 0;
3524
3525   /* Now should write relocs, strings, syms */
3526   obj_sym_filepos (abfd) = sym_base;
3527
3528   if (bfd_get_symcount (abfd) != 0)
3529     {
3530       int firstundef;
3531 #if 0
3532       if (!coff_add_missing_symbols (abfd))
3533         return false;
3534 #endif
3535       if (!coff_renumber_symbols (abfd, &firstundef))
3536         return false;
3537       coff_mangle_symbols (abfd);
3538       if (! coff_write_symbols (abfd))
3539         return false;
3540       if (! coff_write_linenumbers (abfd))
3541         return false;
3542       if (! coff_write_relocs (abfd, firstundef))
3543         return false;
3544     }
3545 #ifdef COFF_LONG_SECTION_NAMES
3546   else if (long_section_names)
3547     {
3548       /* If we have long section names we have to write out the string
3549          table even if there are no symbols.  */
3550       if (! coff_write_symbols (abfd))
3551         return false;
3552     }
3553 #endif
3554 #ifdef COFF_IMAGE_WITH_PE
3555 #ifdef PPC_PE
3556   else if ((abfd->flags & EXEC_P) != 0)
3557     {
3558       bfd_byte b;
3559
3560       /* PowerPC PE appears to require that all executable files be
3561          rounded up to the page size.  */
3562       b = 0;
3563       if (bfd_seek (abfd,
3564                     BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3565                     SEEK_SET) != 0
3566           || bfd_write (&b, 1, 1, abfd) != 1)
3567         return false;
3568     }
3569 #endif
3570 #endif
3571
3572   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
3573      backend linker, and obj_raw_syment_count is not valid until after
3574      coff_write_symbols is called.  */
3575   if (obj_raw_syment_count (abfd) != 0)
3576     {
3577       internal_f.f_symptr = sym_base;
3578 #ifdef RS6000COFF_C
3579       /* AIX appears to require that F_RELFLG not be set if there are
3580          local symbols but no relocations.  */
3581       internal_f.f_flags &=~ F_RELFLG;
3582 #endif
3583     }
3584   else
3585     {
3586       if (long_section_names)
3587         internal_f.f_symptr = sym_base;
3588       else
3589         internal_f.f_symptr = 0;
3590       internal_f.f_flags |= F_LSYMS;
3591     }
3592
3593   if (text_sec)
3594     {
3595       internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3596       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3597     }
3598   if (data_sec)
3599     {
3600       internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3601       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
3602     }
3603   if (bss_sec)
3604     {
3605       internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
3606       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
3607         internal_a.data_start = bss_sec->vma;
3608     }
3609
3610   internal_a.entry = bfd_get_start_address (abfd);
3611   internal_f.f_nsyms = obj_raw_syment_count (abfd);
3612
3613 #ifdef RS6000COFF_C
3614   if (xcoff_data (abfd)->full_aouthdr)
3615     {
3616       bfd_vma toc;
3617       asection *loader_sec;
3618
3619       internal_a.vstamp = 1;
3620
3621       internal_a.o_snentry = xcoff_data (abfd)->snentry;
3622       if (internal_a.o_snentry == 0)
3623         internal_a.entry = (bfd_vma) -1;
3624
3625       if (text_sec != NULL)
3626         {
3627           internal_a.o_sntext = text_sec->target_index;
3628           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
3629         }
3630       else
3631         {
3632           internal_a.o_sntext = 0;
3633           internal_a.o_algntext = 0;
3634         }
3635       if (data_sec != NULL)
3636         {
3637           internal_a.o_sndata = data_sec->target_index;
3638           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
3639         }
3640       else
3641         {
3642           internal_a.o_sndata = 0;
3643           internal_a.o_algndata = 0;
3644         }
3645       loader_sec = bfd_get_section_by_name (abfd, ".loader");
3646       if (loader_sec != NULL)
3647         internal_a.o_snloader = loader_sec->target_index;
3648       else
3649         internal_a.o_snloader = 0;
3650       if (bss_sec != NULL)
3651         internal_a.o_snbss = bss_sec->target_index;
3652       else
3653         internal_a.o_snbss = 0;
3654
3655       toc = xcoff_data (abfd)->toc;
3656       internal_a.o_toc = toc;
3657       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
3658
3659       internal_a.o_modtype = xcoff_data (abfd)->modtype;
3660       if (xcoff_data (abfd)->cputype != -1)
3661         internal_a.o_cputype = xcoff_data (abfd)->cputype;
3662       else
3663         {
3664           switch (bfd_get_arch (abfd))
3665             {
3666             case bfd_arch_rs6000:
3667               internal_a.o_cputype = 4;
3668               break;
3669             case bfd_arch_powerpc:
3670               if (bfd_get_mach (abfd) == 0)
3671                 internal_a.o_cputype = 3;
3672               else
3673                 internal_a.o_cputype = 1;
3674               break;
3675             default:
3676               abort ();
3677             }
3678         }
3679       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
3680       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
3681     }
3682 #endif
3683
3684   /* now write them */
3685   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3686     return false;
3687   
3688   {
3689     char * buff;
3690     bfd_size_type amount;
3691     
3692     buff = bfd_malloc (bfd_coff_filhsz (abfd));
3693     if (buff == NULL) 
3694       return false;
3695     
3696     coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
3697     amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
3698     
3699     free (buff);
3700     
3701     if (amount != bfd_coff_filhsz (abfd))
3702       return false;
3703   }
3704   
3705   if (abfd->flags & EXEC_P)
3706     {
3707       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR. 
3708          include/coff/pe.h sets AOUTSZ == sizeof(PEAOUTHDR)) */
3709       char * buff;
3710       bfd_size_type amount;
3711
3712       buff = bfd_malloc (bfd_coff_aoutsz (abfd));
3713       if (buff == NULL) 
3714         return false;
3715       
3716       coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
3717       amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
3718       
3719       free (buff);
3720       
3721       if (amount != bfd_coff_aoutsz (abfd))
3722         return false;
3723     }
3724 #ifdef RS6000COFF_C
3725   else
3726     {
3727       AOUTHDR buff;
3728       size_t size;
3729
3730       /* XCOFF seems to always write at least a small a.out header.  */
3731       coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3732       if (xcoff_data (abfd)->full_aouthdr)
3733         size = bfd_coff_aoutsz (abfd);
3734       else
3735         size = SMALL_AOUTSZ;
3736       if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
3737         return false;
3738     }
3739 #endif
3740
3741   return true;
3742 }
3743
3744 static boolean
3745 coff_set_section_contents (abfd, section, location, offset, count)
3746      bfd * abfd;
3747      sec_ptr section;
3748      PTR location;
3749      file_ptr offset;
3750      bfd_size_type count;
3751 {
3752   if (abfd->output_has_begun == false)  /* set by bfd.c handler */
3753     {
3754       if (! coff_compute_section_file_positions (abfd))
3755         return false;
3756     }
3757
3758 #if defined(_LIB) && !defined(TARG_AUX)
3759
3760    /* The physical address field of a .lib section is used to hold the
3761       number of shared libraries in the section.  This code counts the
3762       number of sections being written, and increments the lma field
3763       with the number.
3764
3765       I have found no documentation on the contents of this section.
3766       Experimentation indicates that the section contains zero or more
3767       records, each of which has the following structure:
3768
3769       - a (four byte) word holding the length of this record, in words,
3770       - a word that always seems to be set to "2",
3771       - the path to a shared library, null-terminated and then padded
3772         to a whole word boundary.
3773
3774       bfd_assert calls have been added to alert if an attempt is made
3775       to write a section which doesn't follow these assumptions.  The
3776       code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
3777       <robertl@arnet.com> (Thanks!).
3778   
3779       Gvran Uddeborg <gvran@uddeborg.pp.se> */
3780
3781     if (strcmp (section->name, _LIB) == 0)
3782       {
3783         bfd_byte *rec, *recend;
3784
3785         rec = (bfd_byte *) location;
3786         recend = rec + count;
3787         while (rec < recend)
3788           {
3789             ++section->lma;
3790             rec += bfd_get_32 (abfd, rec) * 4;
3791           }
3792
3793         BFD_ASSERT (rec == recend);
3794       }
3795
3796 #endif
3797
3798   /* Don't write out bss sections - one way to do this is to
3799        see if the filepos has not been set. */
3800   if (section->filepos == 0)
3801     return true;
3802
3803   if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
3804     return false;
3805
3806   if (count != 0)
3807     {
3808       return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3809     }
3810   return true;
3811 }
3812 #if 0
3813 static boolean
3814 coff_close_and_cleanup (abfd)
3815      bfd *abfd;
3816 {
3817   if (!bfd_read_p (abfd))
3818     switch (abfd->format)
3819       {
3820       case bfd_archive:
3821         if (!_bfd_write_archive_contents (abfd))
3822           return false;
3823         break;
3824       case bfd_object:
3825         if (!coff_write_object_contents (abfd))
3826           return false;
3827         break;
3828       default:
3829         bfd_set_error (bfd_error_invalid_operation);
3830         return false;
3831       }
3832
3833   /* We depend on bfd_close to free all the memory on the objalloc.  */
3834   return true;
3835 }
3836
3837 #endif
3838
3839 static PTR
3840 buy_and_read (abfd, where, seek_direction, size)
3841      bfd *abfd;
3842      file_ptr where;
3843      int seek_direction;
3844      size_t size;
3845 {
3846   PTR area = (PTR) bfd_alloc (abfd, size);
3847   if (!area)
3848     return (NULL);
3849   if (bfd_seek (abfd, where, seek_direction) != 0
3850       || bfd_read (area, 1, size, abfd) != size)
3851     return (NULL);
3852   return (area);
3853 }                               /* buy_and_read() */
3854
3855 /*
3856 SUBSUBSECTION
3857         Reading linenumbers
3858
3859         Creating the linenumber table is done by reading in the entire
3860         coff linenumber table, and creating another table for internal use.
3861
3862         A coff linenumber table is structured so that each function
3863         is marked as having a line number of 0. Each line within the
3864         function is an offset from the first line in the function. The
3865         base of the line number information for the table is stored in
3866         the symbol associated with the function.
3867
3868         Note: The PE format uses line number 0 for a flag indicating a
3869         new source file.
3870
3871         The information is copied from the external to the internal
3872         table, and each symbol which marks a function is marked by
3873         pointing its...
3874
3875         How does this work ?
3876
3877 */
3878
3879 static boolean
3880 coff_slurp_line_table (abfd, asect)
3881      bfd *abfd;
3882      asection *asect;
3883 {
3884   LINENO *native_lineno;
3885   alent *lineno_cache;
3886
3887   BFD_ASSERT (asect->lineno == (alent *) NULL);
3888
3889   native_lineno = (LINENO *) buy_and_read (abfd,
3890                                            asect->line_filepos,
3891                                            SEEK_SET,
3892                                            (size_t) (bfd_coff_linesz (abfd) *
3893                                                      asect->lineno_count));
3894   lineno_cache =
3895     (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
3896   if (lineno_cache == NULL)
3897     return false;
3898   else
3899     {
3900       unsigned int counter = 0;
3901       alent *cache_ptr = lineno_cache;
3902       LINENO *src = native_lineno;
3903
3904       while (counter < asect->lineno_count)
3905         {
3906           struct internal_lineno dst;
3907           coff_swap_lineno_in (abfd, src, &dst);
3908           cache_ptr->line_number = dst.l_lnno;
3909
3910           if (cache_ptr->line_number == 0)
3911             {
3912               boolean warned;
3913               long symndx;
3914               coff_symbol_type *sym;
3915
3916               warned = false;
3917               symndx = dst.l_addr.l_symndx;
3918               if (symndx < 0
3919                   || (unsigned long) symndx >= obj_raw_syment_count (abfd))
3920                 {
3921                   (*_bfd_error_handler)
3922                     (_("%s: warning: illegal symbol index %ld in line numbers"),
3923                      bfd_get_filename (abfd), dst.l_addr.l_symndx);
3924                   symndx = 0;
3925                   warned = true;
3926                 }
3927               /* FIXME: We should not be casting between ints and
3928                  pointers like this.  */
3929               sym = ((coff_symbol_type *)
3930                      ((symndx + obj_raw_syments (abfd))
3931                       ->u.syment._n._n_n._n_zeroes));
3932               cache_ptr->u.sym = (asymbol *) sym;
3933               if (sym->lineno != NULL && ! warned)
3934                 {
3935                   (*_bfd_error_handler)
3936                     (_("%s: warning: duplicate line number information for `%s'"),
3937                      bfd_get_filename (abfd),
3938                      bfd_asymbol_name (&sym->symbol));
3939                 }
3940               sym->lineno = cache_ptr;
3941             }
3942           else
3943             {
3944               cache_ptr->u.offset = dst.l_addr.l_paddr
3945                 - bfd_section_vma (abfd, asect);
3946             }                   /* If no linenumber expect a symbol index */
3947
3948           cache_ptr++;
3949           src++;
3950           counter++;
3951         }
3952       cache_ptr->line_number = 0;
3953
3954     }
3955   asect->lineno = lineno_cache;
3956   /* FIXME, free native_lineno here, or use alloca or something. */
3957   return true;
3958 }
3959
3960 /* Slurp in the symbol table, converting it to generic form.  Note
3961    that if coff_relocate_section is defined, the linker will read
3962    symbols via coff_link_add_symbols, rather than via this routine.  */
3963
3964 static boolean
3965 coff_slurp_symbol_table (abfd)
3966      bfd * abfd;
3967 {
3968   combined_entry_type *native_symbols;
3969   coff_symbol_type *cached_area;
3970   unsigned int *table_ptr;
3971
3972   unsigned int number_of_symbols = 0;
3973
3974   if (obj_symbols (abfd))
3975     return true;
3976
3977   /* Read in the symbol table */
3978   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
3979     {
3980       return (false);
3981     }                           /* on error */
3982
3983   /* Allocate enough room for all the symbols in cached form */
3984   cached_area = ((coff_symbol_type *)
3985                  bfd_alloc (abfd,
3986                             (obj_raw_syment_count (abfd)
3987                              * sizeof (coff_symbol_type))));
3988
3989   if (cached_area == NULL)
3990     return false;
3991   table_ptr = ((unsigned int *)
3992                bfd_alloc (abfd,
3993                           (obj_raw_syment_count (abfd)
3994                            * sizeof (unsigned int))));
3995
3996   if (table_ptr == NULL)
3997     return false;
3998   else
3999     {
4000       coff_symbol_type *dst = cached_area;
4001       unsigned int last_native_index = obj_raw_syment_count (abfd);
4002       unsigned int this_index = 0;
4003       while (this_index < last_native_index)
4004         {
4005           combined_entry_type *src = native_symbols + this_index;
4006           table_ptr[this_index] = number_of_symbols;
4007           dst->symbol.the_bfd = abfd;
4008
4009           dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
4010           /* We use the native name field to point to the cached field.  */
4011           src->u.syment._n._n_n._n_zeroes = (long) dst;
4012           dst->symbol.section = coff_section_from_bfd_index (abfd,
4013                                                      src->u.syment.n_scnum);
4014           dst->symbol.flags = 0;
4015           dst->done_lineno = false;
4016
4017           switch (src->u.syment.n_sclass)
4018             {
4019 #ifdef I960
4020             case C_LEAFEXT:
4021 #if 0
4022               dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
4023               dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4024               dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4025 #endif
4026               /* Fall through to next case */
4027
4028 #endif
4029
4030             case C_EXT:
4031             case C_WEAKEXT:
4032 #if defined ARM
4033             case C_THUMBEXT:
4034             case C_THUMBEXTFUNC:
4035 #endif
4036 #ifdef RS6000COFF_C
4037             case C_HIDEXT:
4038 #endif
4039 #ifdef C_SYSTEM
4040             case C_SYSTEM:      /* System Wide variable */
4041 #endif
4042 #ifdef COFF_WITH_PE
4043             /* In PE, 0x68 (104) denotes a section symbol */
4044             case C_SECTION:
4045             /* In PE, 0x69 (105) denotes a weak external symbol.  */
4046             case C_NT_WEAK:
4047 #endif
4048               switch (coff_classify_symbol (abfd, &src->u.syment))
4049                 {
4050                 case COFF_SYMBOL_GLOBAL:
4051                   dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4052 #if defined COFF_WITH_PE
4053                   /* PE sets the symbol to a value relative to the
4054                      start of the section.  */
4055                   dst->symbol.value = src->u.syment.n_value;
4056 #else
4057                   dst->symbol.value = (src->u.syment.n_value
4058                                        - dst->symbol.section->vma);
4059 #endif
4060                   if (ISFCN ((src->u.syment.n_type)))
4061                     {
4062                       /* A function ext does not go at the end of a
4063                          file.  */
4064                       dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4065                     }
4066                   break;
4067
4068                 case COFF_SYMBOL_COMMON:
4069                   dst->symbol.section = bfd_com_section_ptr;
4070                   dst->symbol.value = src->u.syment.n_value;
4071                   break;
4072
4073                 case COFF_SYMBOL_UNDEFINED:
4074                   dst->symbol.section = bfd_und_section_ptr;
4075                   dst->symbol.value = 0;
4076                   break; 
4077
4078                 case COFF_SYMBOL_PE_SECTION:
4079                   dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
4080                   dst->symbol.value = 0;
4081                   break;
4082
4083                 case COFF_SYMBOL_LOCAL:
4084                   dst->symbol.flags = BSF_LOCAL;
4085 #if defined COFF_WITH_PE
4086                   /* PE sets the symbol to a value relative to the
4087                      start of the section.  */
4088                   dst->symbol.value = src->u.syment.n_value;
4089 #else
4090                   dst->symbol.value = (src->u.syment.n_value
4091                                        - dst->symbol.section->vma);
4092 #endif
4093                   if (ISFCN ((src->u.syment.n_type)))
4094                     dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4095                   break;
4096                 }
4097
4098 #ifdef RS6000COFF_C
4099               /* A symbol with a csect entry should not go at the end.  */
4100               if (src->u.syment.n_numaux > 0)
4101                 dst->symbol.flags |= BSF_NOT_AT_END;
4102 #endif
4103
4104 #ifdef COFF_WITH_PE
4105               if (src->u.syment.n_sclass == C_NT_WEAK)
4106                 dst->symbol.flags = BSF_WEAK;
4107               if (src->u.syment.n_sclass == C_SECTION
4108                   && src->u.syment.n_scnum > 0)
4109                 {
4110                   dst->symbol.flags = BSF_LOCAL;
4111                 }
4112 #endif
4113
4114               if (src->u.syment.n_sclass == C_WEAKEXT)
4115                 dst->symbol.flags = BSF_WEAK;
4116
4117               break;
4118
4119             case C_STAT:        /* static                        */
4120 #ifdef I960
4121             case C_LEAFSTAT:    /* static leaf procedure        */
4122 #endif
4123 #if defined ARM 
4124             case C_THUMBSTAT:   /* Thumb static                  */
4125             case C_THUMBLABEL:  /* Thumb label                   */
4126             case C_THUMBSTATFUNC:/* Thumb static function        */
4127 #endif
4128             case C_LABEL:       /* label                         */
4129               if (src->u.syment.n_scnum == N_DEBUG)
4130                 dst->symbol.flags = BSF_DEBUGGING;
4131               else
4132                 dst->symbol.flags = BSF_LOCAL;
4133
4134               /* Base the value as an index from the base of the
4135                  section, if there is one.  */
4136               if (dst->symbol.section)
4137                 {
4138 #if defined COFF_WITH_PE
4139                   /* PE sets the symbol to a value relative to the
4140                      start of the section.  */
4141                   dst->symbol.value = src->u.syment.n_value;
4142 #else
4143                   dst->symbol.value = (src->u.syment.n_value
4144                                        - dst->symbol.section->vma);
4145 #endif
4146                 }
4147               else
4148                 dst->symbol.value = src->u.syment.n_value;
4149               break;
4150
4151             case C_MOS: /* member of structure   */
4152             case C_EOS: /* end of structure              */
4153 #ifdef NOTDEF                   /* C_AUTOARG has the same value */
4154 #ifdef C_GLBLREG
4155             case C_GLBLREG:     /* A29k-specific storage class */
4156 #endif
4157 #endif
4158             case C_REGPARM:     /* register parameter            */
4159             case C_REG: /* register variable             */
4160 #ifndef TIC80COFF
4161 #ifdef C_AUTOARG
4162             case C_AUTOARG:     /* 960-specific storage class */
4163 #endif
4164 #endif
4165             case C_TPDEF:       /* type definition               */
4166             case C_ARG:
4167             case C_AUTO:        /* automatic variable */
4168             case C_FIELD:       /* bit field */
4169             case C_ENTAG:       /* enumeration tag               */
4170             case C_MOE: /* member of enumeration         */
4171             case C_MOU: /* member of union               */
4172             case C_UNTAG:       /* union tag                     */
4173               dst->symbol.flags = BSF_DEBUGGING;
4174               dst->symbol.value = (src->u.syment.n_value);
4175               break;
4176
4177             case C_FILE:        /* file name                     */
4178             case C_STRTAG:      /* structure tag                 */
4179 #ifdef RS6000COFF_C
4180             case C_GSYM:
4181             case C_LSYM:
4182             case C_PSYM:
4183             case C_RSYM:
4184             case C_RPSYM:
4185             case C_STSYM:
4186             case C_BCOMM:
4187             case C_ECOMM:
4188             case C_DECL:
4189             case C_ENTRY:
4190             case C_FUN:
4191             case C_ESTAT:
4192 #endif
4193               dst->symbol.flags = BSF_DEBUGGING;
4194               dst->symbol.value = (src->u.syment.n_value);
4195               break;
4196
4197 #ifdef RS6000COFF_C
4198             case C_BINCL:       /* beginning of include file     */
4199             case C_EINCL:       /* ending of include file        */
4200               /* The value is actually a pointer into the line numbers
4201                  of the file.  We locate the line number entry, and
4202                  set the section to the section which contains it, and
4203                  the value to the index in that section.  */
4204               {
4205                 asection *sec;
4206
4207                 dst->symbol.flags = BSF_DEBUGGING;
4208                 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4209                   if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4210                       && ((file_ptr) (sec->line_filepos
4211                                       + sec->lineno_count * bfd_coff_linesz (abfd))
4212                           > (file_ptr) src->u.syment.n_value))
4213                     break;
4214                 if (sec == NULL)
4215                   dst->symbol.value = 0;
4216                 else
4217                   {
4218                     dst->symbol.section = sec;
4219                     dst->symbol.value = ((src->u.syment.n_value
4220                                           - sec->line_filepos)
4221                                          / bfd_coff_linesz (abfd));
4222                     src->fix_line = 1;
4223                   }
4224               }
4225               break;
4226
4227             case C_BSTAT:
4228               dst->symbol.flags = BSF_DEBUGGING;
4229
4230               /* The value is actually a symbol index.  Save a pointer
4231                  to the symbol instead of the index.  FIXME: This
4232                  should use a union.  */
4233               src->u.syment.n_value =
4234                 (long) (native_symbols + src->u.syment.n_value);
4235               dst->symbol.value = src->u.syment.n_value;
4236               src->fix_value = 1;
4237               break;
4238 #endif
4239
4240             case C_BLOCK:       /* ".bb" or ".eb"                */
4241             case C_FCN:         /* ".bf" or ".ef" (or PE ".lf")  */
4242             case C_EFCN:        /* physical end of function      */
4243 #if defined COFF_WITH_PE
4244               /* PE sets the symbol to a value relative to the start
4245                  of the section.  */
4246               dst->symbol.value = src->u.syment.n_value;
4247               if (strcmp (dst->symbol.name, ".bf") != 0)
4248                 {
4249                   /* PE uses funny values for .ef and .lf; don't
4250                      relocate them.  */
4251                   dst->symbol.flags = BSF_DEBUGGING;
4252                 }
4253               else
4254                 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
4255 #else
4256               /* Base the value as an index from the base of the
4257                  section.  */
4258               dst->symbol.flags = BSF_LOCAL;
4259               dst->symbol.value = (src->u.syment.n_value
4260                                    - dst->symbol.section->vma);
4261 #endif
4262               break;
4263
4264             case C_NULL:
4265               /* PE DLLs sometimes have zeroed out symbols for some
4266                  reason.  Just ignore them without a warning.  */
4267               if (src->u.syment.n_type == 0
4268                   && src->u.syment.n_value == 0
4269                   && src->u.syment.n_scnum == 0)
4270                 break;
4271               /* Fall through.  */
4272             case C_EXTDEF:      /* external definition           */
4273             case C_ULABEL:      /* undefined label               */
4274             case C_USTATIC:     /* undefined static              */
4275 #ifndef COFF_WITH_PE
4276             /* C_LINE in regular coff is 0x68.  NT has taken over this storage
4277                class to represent a section symbol */
4278             case C_LINE:        /* line # reformatted as symbol table entry */
4279               /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
4280             case C_ALIAS:       /* duplicate tag                 */
4281 #endif
4282               /* New storage classes for TIc80 */
4283 #ifdef TIC80COFF
4284             case C_UEXT:        /* Tentative external definition */
4285 #endif
4286             case C_STATLAB:     /* Static load time label */
4287             case C_EXTLAB:      /* External load time label */
4288             case C_HIDDEN:      /* ext symbol in dmert public lib */
4289             default:
4290               (*_bfd_error_handler)
4291                 (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
4292                  bfd_get_filename (abfd), src->u.syment.n_sclass,
4293                  dst->symbol.section->name, dst->symbol.name);
4294               dst->symbol.flags = BSF_DEBUGGING;
4295               dst->symbol.value = (src->u.syment.n_value);
4296               break;
4297             }
4298
4299 /*      BFD_ASSERT(dst->symbol.flags != 0);*/
4300
4301           dst->native = src;
4302
4303           dst->symbol.udata.i = 0;
4304           dst->lineno = (alent *) NULL;
4305           this_index += (src->u.syment.n_numaux) + 1;
4306           dst++;
4307           number_of_symbols++;
4308         }                       /* walk the native symtab */
4309     }                           /* bfdize the native symtab */
4310
4311   obj_symbols (abfd) = cached_area;
4312   obj_raw_syments (abfd) = native_symbols;
4313
4314   bfd_get_symcount (abfd) = number_of_symbols;
4315   obj_convert (abfd) = table_ptr;
4316   /* Slurp the line tables for each section too */
4317   {
4318     asection *p;
4319     p = abfd->sections;
4320     while (p)
4321       {
4322         coff_slurp_line_table (abfd, p);
4323         p = p->next;
4324       }
4325   }
4326   return true;
4327 }                               /* coff_slurp_symbol_table() */
4328
4329 /* Classify a COFF symbol.  A couple of targets have globally visible
4330    symbols which are not class C_EXT, and this handles those.  It also
4331    recognizes some special PE cases.  */
4332
4333 static enum coff_symbol_classification
4334 coff_classify_symbol (abfd, syment)
4335      bfd *abfd;
4336      struct internal_syment *syment;
4337 {
4338   /* FIXME: This partially duplicates the switch in
4339      coff_slurp_symbol_table.  */
4340   switch (syment->n_sclass)
4341     {
4342     case C_EXT:
4343     case C_WEAKEXT:
4344 #ifdef I960
4345     case C_LEAFEXT:
4346 #endif
4347 #ifdef ARM
4348     case C_THUMBEXT:
4349     case C_THUMBEXTFUNC:
4350 #endif
4351 #ifdef C_SYSTEM
4352     case C_SYSTEM:
4353 #endif
4354 #ifdef COFF_WITH_PE
4355     case C_NT_WEAK:
4356 #endif
4357       if (syment->n_scnum == 0)
4358         {
4359           if (syment->n_value == 0)
4360             return COFF_SYMBOL_UNDEFINED;
4361           else
4362             return COFF_SYMBOL_COMMON;
4363         }
4364       return COFF_SYMBOL_GLOBAL;
4365
4366     default:
4367       break;
4368     }
4369
4370 #ifdef COFF_WITH_PE
4371   if (syment->n_sclass == C_STAT)
4372     {
4373       if (syment->n_scnum == 0)
4374         {
4375           /* The Microsoft compiler sometimes generates these if a
4376              small static function is inlined every time it is used.
4377              The function is discarded, but the symbol table entry
4378              remains.  */
4379           return COFF_SYMBOL_LOCAL;
4380         }
4381
4382 #ifdef STRICT_PE_FORMAT
4383       /* This is correct for Microsoft generated objects, but it
4384          breaks gas generated objects.  */
4385
4386       if (syment->n_value == 0)
4387         {
4388           asection *sec;
4389           char buf[SYMNMLEN + 1];
4390
4391           sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4392           if (sec != NULL
4393               && (strcmp (bfd_get_section_name (abfd, sec),
4394                           _bfd_coff_internal_syment_name (abfd, syment, buf))
4395                   == 0))
4396             return COFF_SYMBOL_PE_SECTION;
4397         }
4398 #endif
4399
4400       return COFF_SYMBOL_LOCAL;
4401     }
4402
4403   if (syment->n_sclass == C_SECTION)
4404     {
4405       /* In some cases in a DLL generated by the Microsoft linker, the
4406          n_value field will contain garbage.  FIXME: This should
4407          probably be handled by the swapping function instead.  */
4408       syment->n_value = 0;
4409       if (syment->n_scnum == 0)
4410         return COFF_SYMBOL_UNDEFINED;
4411       return COFF_SYMBOL_PE_SECTION;
4412     }
4413 #endif /* COFF_WITH_PE */
4414
4415   /* If it is not a global symbol, we presume it is a local symbol.  */
4416
4417   if (syment->n_scnum == 0)
4418     {
4419       char buf[SYMNMLEN + 1];
4420
4421       (*_bfd_error_handler)
4422         (_("warning: %s: local symbol `%s' has no section"),
4423          bfd_get_filename (abfd),
4424          _bfd_coff_internal_syment_name (abfd, syment, buf));
4425     }
4426
4427   return COFF_SYMBOL_LOCAL;
4428 }
4429
4430 /*
4431 SUBSUBSECTION
4432         Reading relocations
4433
4434         Coff relocations are easily transformed into the internal BFD form
4435         (@code{arelent}).
4436
4437         Reading a coff relocation table is done in the following stages:
4438
4439         o Read the entire coff relocation table into memory.
4440
4441         o Process each relocation in turn; first swap it from the
4442         external to the internal form.
4443
4444         o Turn the symbol referenced in the relocation's symbol index
4445         into a pointer into the canonical symbol table.
4446         This table is the same as the one returned by a call to
4447         @code{bfd_canonicalize_symtab}. The back end will call that
4448         routine and save the result if a canonicalization hasn't been done.
4449
4450         o The reloc index is turned into a pointer to a howto
4451         structure, in a back end specific way. For instance, the 386
4452         and 960 use the @code{r_type} to directly produce an index
4453         into a howto table vector; the 88k subtracts a number from the
4454         @code{r_type} field and creates an addend field.
4455
4456
4457 */
4458
4459 #ifndef CALC_ADDEND
4460 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
4461   {                                                             \
4462     coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
4463     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
4464       coffsym = (obj_symbols (abfd)                             \
4465                  + (cache_ptr->sym_ptr_ptr - symbols));         \
4466     else if (ptr)                                               \
4467       coffsym = coff_symbol_from (abfd, ptr);                   \
4468     if (coffsym != (coff_symbol_type *) NULL                    \
4469         && coffsym->native->u.syment.n_scnum == 0)              \
4470       cache_ptr->addend = 0;                                    \
4471     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
4472              && ptr->section != (asection *) NULL)              \
4473       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
4474     else                                                        \
4475       cache_ptr->addend = 0;                                    \
4476   }
4477 #endif
4478
4479 static boolean
4480 coff_slurp_reloc_table (abfd, asect, symbols)
4481      bfd * abfd;
4482      sec_ptr asect;
4483      asymbol ** symbols;
4484 {
4485   RELOC *native_relocs;
4486   arelent *reloc_cache;
4487   arelent *cache_ptr;
4488
4489   unsigned int idx;
4490
4491   if (asect->relocation)
4492     return true;
4493   if (asect->reloc_count == 0)
4494     return true;
4495   if (asect->flags & SEC_CONSTRUCTOR)
4496     return true;
4497   if (!coff_slurp_symbol_table (abfd))
4498     return false;
4499   native_relocs =
4500     (RELOC *) buy_and_read (abfd,
4501                             asect->rel_filepos,
4502                             SEEK_SET,
4503                             (size_t) (bfd_coff_relsz (abfd) *
4504                                       asect->reloc_count));
4505   reloc_cache = (arelent *)
4506     bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
4507
4508   if (reloc_cache == NULL)
4509     return false;
4510
4511
4512   for (idx = 0; idx < asect->reloc_count; idx++)
4513     {
4514       struct internal_reloc dst;
4515       struct external_reloc *src;
4516 #ifndef RELOC_PROCESSING
4517       asymbol *ptr;
4518 #endif
4519
4520       cache_ptr = reloc_cache + idx;
4521       src = native_relocs + idx;
4522
4523       coff_swap_reloc_in (abfd, src, &dst);
4524
4525 #ifdef RELOC_PROCESSING
4526       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
4527 #else
4528       cache_ptr->address = dst.r_vaddr;
4529
4530       if (dst.r_symndx != -1)
4531         {
4532           if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
4533             {
4534               (*_bfd_error_handler)
4535                 (_("%s: warning: illegal symbol index %ld in relocs"),
4536                  bfd_get_filename (abfd), dst.r_symndx);
4537               cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4538               ptr = NULL;
4539             }
4540           else
4541             {
4542               cache_ptr->sym_ptr_ptr = (symbols
4543                                         + obj_convert (abfd)[dst.r_symndx]);
4544               ptr = *(cache_ptr->sym_ptr_ptr);
4545             }
4546         }
4547       else
4548         {
4549           cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4550           ptr = NULL;
4551         }
4552
4553       /* The symbols definitions that we have read in have been
4554          relocated as if their sections started at 0. But the offsets
4555          refering to the symbols in the raw data have not been
4556          modified, so we have to have a negative addend to compensate.
4557
4558          Note that symbols which used to be common must be left alone */
4559
4560       /* Calculate any reloc addend by looking at the symbol */
4561       CALC_ADDEND (abfd, ptr, dst, cache_ptr);
4562
4563       cache_ptr->address -= asect->vma;
4564 /* !!     cache_ptr->section = (asection *) NULL;*/
4565
4566       /* Fill in the cache_ptr->howto field from dst.r_type */
4567       RTYPE2HOWTO (cache_ptr, &dst);
4568 #endif  /* RELOC_PROCESSING */
4569
4570       if (cache_ptr->howto == NULL)
4571         {
4572           (*_bfd_error_handler)
4573             (_("%s: illegal relocation type %d at address 0x%lx"),
4574              bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
4575           bfd_set_error (bfd_error_bad_value);
4576           return false;
4577         }
4578     }
4579
4580   asect->relocation = reloc_cache;
4581   return true;
4582 }
4583
4584 #ifndef coff_rtype_to_howto
4585 #ifdef RTYPE2HOWTO
4586
4587 /* Get the howto structure for a reloc.  This is only used if the file
4588    including this one defines coff_relocate_section to be
4589    _bfd_coff_generic_relocate_section, so it is OK if it does not
4590    always work.  It is the responsibility of the including file to
4591    make sure it is reasonable if it is needed.  */
4592
4593 static reloc_howto_type *coff_rtype_to_howto
4594   PARAMS ((bfd *, asection *, struct internal_reloc *,
4595            struct coff_link_hash_entry *, struct internal_syment *,
4596            bfd_vma *));
4597
4598 /*ARGSUSED*/
4599 static reloc_howto_type *
4600 coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
4601      bfd *abfd ATTRIBUTE_UNUSED;
4602      asection *sec ATTRIBUTE_UNUSED;
4603      struct internal_reloc *rel;
4604      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
4605      struct internal_syment *sym ATTRIBUTE_UNUSED;
4606      bfd_vma *addendp ATTRIBUTE_UNUSED;
4607 {
4608   arelent genrel;
4609
4610   RTYPE2HOWTO (&genrel, rel);
4611   return genrel.howto;
4612 }
4613
4614 #else /* ! defined (RTYPE2HOWTO) */
4615
4616 #define coff_rtype_to_howto NULL
4617
4618 #endif /* ! defined (RTYPE2HOWTO) */
4619 #endif /* ! defined (coff_rtype_to_howto) */
4620
4621 /* This is stupid.  This function should be a boolean predicate.  */
4622 static long
4623 coff_canonicalize_reloc (abfd, section, relptr, symbols)
4624      bfd * abfd;
4625      sec_ptr section;
4626      arelent ** relptr;
4627      asymbol ** symbols;
4628 {
4629   arelent *tblptr = section->relocation;
4630   unsigned int count = 0;
4631
4632
4633   if (section->flags & SEC_CONSTRUCTOR)
4634     {
4635       /* this section has relocs made up by us, they are not in the
4636        file, so take them out of their chain and place them into
4637        the data area provided */
4638       arelent_chain *chain = section->constructor_chain;
4639       for (count = 0; count < section->reloc_count; count++)
4640         {
4641           *relptr++ = &chain->relent;
4642           chain = chain->next;
4643         }
4644
4645     }
4646   else
4647     {
4648       if (! coff_slurp_reloc_table (abfd, section, symbols))
4649         return -1;
4650
4651       tblptr = section->relocation;
4652
4653       for (; count++ < section->reloc_count;)
4654         *relptr++ = tblptr++;
4655
4656
4657     }
4658   *relptr = 0;
4659   return section->reloc_count;
4660 }
4661
4662 #ifdef GNU960
4663 file_ptr
4664 coff_sym_filepos (abfd)
4665      bfd *abfd;
4666 {
4667   return obj_sym_filepos (abfd);
4668 }
4669 #endif
4670
4671 #ifndef coff_reloc16_estimate
4672 #define coff_reloc16_estimate dummy_reloc16_estimate
4673
4674 static int dummy_reloc16_estimate
4675   PARAMS ((bfd *, asection *, arelent *, unsigned int,
4676            struct bfd_link_info *));
4677
4678 static int
4679 dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
4680      bfd *abfd ATTRIBUTE_UNUSED;
4681      asection *input_section ATTRIBUTE_UNUSED;
4682      arelent *reloc ATTRIBUTE_UNUSED;
4683      unsigned int shrink ATTRIBUTE_UNUSED;
4684      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4685 {
4686   abort ();
4687   return 0;
4688 }
4689
4690 #endif
4691
4692 #ifndef coff_reloc16_extra_cases
4693
4694 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
4695
4696 /* This works even if abort is not declared in any header file.  */
4697
4698 static void dummy_reloc16_extra_cases
4699   PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
4700            bfd_byte *, unsigned int *, unsigned int *));
4701
4702 static void
4703 dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
4704                            dst_ptr)
4705      bfd *abfd ATTRIBUTE_UNUSED;
4706      struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4707      struct bfd_link_order *link_order ATTRIBUTE_UNUSED;
4708      arelent *reloc ATTRIBUTE_UNUSED;
4709      bfd_byte *data ATTRIBUTE_UNUSED;
4710      unsigned int *src_ptr ATTRIBUTE_UNUSED;
4711      unsigned int *dst_ptr ATTRIBUTE_UNUSED;
4712 {
4713   abort ();
4714 }
4715 #endif
4716
4717 /* If coff_relocate_section is defined, we can use the optimized COFF
4718    backend linker.  Otherwise we must continue to use the old linker.  */
4719 #ifdef coff_relocate_section
4720 #ifndef coff_bfd_link_hash_table_create
4721 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
4722 #endif
4723 #ifndef coff_bfd_link_add_symbols
4724 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
4725 #endif
4726 #ifndef coff_bfd_final_link
4727 #define coff_bfd_final_link _bfd_coff_final_link
4728 #endif
4729 #else /* ! defined (coff_relocate_section) */
4730 #define coff_relocate_section NULL
4731 #ifndef coff_bfd_link_hash_table_create
4732 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
4733 #endif
4734 #ifndef coff_bfd_link_add_symbols
4735 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
4736 #endif
4737 #define coff_bfd_final_link _bfd_generic_final_link
4738 #endif /* ! defined (coff_relocate_section) */
4739
4740 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
4741
4742 #ifndef coff_start_final_link
4743 #define coff_start_final_link NULL
4744 #endif
4745
4746 #ifndef coff_adjust_symndx
4747 #define coff_adjust_symndx NULL
4748 #endif
4749
4750 #ifndef coff_link_add_one_symbol
4751 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
4752 #endif
4753
4754 #ifndef coff_link_output_has_begun
4755
4756 static boolean coff_link_output_has_begun
4757   PARAMS ((bfd *, struct coff_final_link_info *));
4758
4759 static boolean
4760 coff_link_output_has_begun (abfd, info)
4761      bfd * abfd;
4762      struct coff_final_link_info * info ATTRIBUTE_UNUSED;
4763 {
4764   return abfd->output_has_begun;
4765 }
4766 #endif
4767
4768 #ifndef coff_final_link_postscript
4769
4770 static boolean coff_final_link_postscript
4771   PARAMS ((bfd *, struct coff_final_link_info *));
4772
4773 static boolean
4774 coff_final_link_postscript (abfd, pfinfo)
4775      bfd * abfd ATTRIBUTE_UNUSED;
4776      struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
4777 {
4778   return true;
4779 }
4780 #endif
4781
4782 #ifndef coff_SWAP_aux_in
4783 #define coff_SWAP_aux_in coff_swap_aux_in
4784 #endif
4785 #ifndef coff_SWAP_sym_in
4786 #define coff_SWAP_sym_in coff_swap_sym_in
4787 #endif
4788 #ifndef coff_SWAP_lineno_in
4789 #define coff_SWAP_lineno_in coff_swap_lineno_in
4790 #endif
4791 #ifndef coff_SWAP_aux_out
4792 #define coff_SWAP_aux_out coff_swap_aux_out
4793 #endif
4794 #ifndef coff_SWAP_sym_out
4795 #define coff_SWAP_sym_out coff_swap_sym_out
4796 #endif
4797 #ifndef coff_SWAP_lineno_out
4798 #define coff_SWAP_lineno_out coff_swap_lineno_out
4799 #endif
4800 #ifndef coff_SWAP_reloc_out
4801 #define coff_SWAP_reloc_out coff_swap_reloc_out
4802 #endif
4803 #ifndef coff_SWAP_filehdr_out
4804 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
4805 #endif
4806 #ifndef coff_SWAP_aouthdr_out
4807 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
4808 #endif
4809 #ifndef coff_SWAP_scnhdr_out
4810 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
4811 #endif
4812 #ifndef coff_SWAP_reloc_in
4813 #define coff_SWAP_reloc_in coff_swap_reloc_in
4814 #endif
4815 #ifndef coff_SWAP_filehdr_in
4816 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
4817 #endif
4818 #ifndef coff_SWAP_aouthdr_in
4819 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
4820 #endif
4821 #ifndef coff_SWAP_scnhdr_in
4822 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
4823 #endif
4824
4825 static const bfd_coff_backend_data bfd_coff_std_swap_table =
4826 {
4827   coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
4828   coff_SWAP_aux_out, coff_SWAP_sym_out,
4829   coff_SWAP_lineno_out, coff_SWAP_reloc_out,
4830   coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
4831   coff_SWAP_scnhdr_out,
4832   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
4833 #ifdef COFF_LONG_FILENAMES
4834   true,
4835 #else
4836   false,
4837 #endif
4838 #ifdef COFF_LONG_SECTION_NAMES
4839   true,
4840 #else
4841   false,
4842 #endif
4843   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
4844   coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
4845   coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
4846   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
4847   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
4848   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
4849   coff_classify_symbol, coff_compute_section_file_positions,
4850   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
4851   coff_adjust_symndx, coff_link_add_one_symbol,
4852   coff_link_output_has_begun, coff_final_link_postscript
4853 };
4854
4855 #ifndef coff_close_and_cleanup
4856 #define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
4857 #endif
4858
4859 #ifndef coff_bfd_free_cached_info
4860 #define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
4861 #endif
4862
4863 #ifndef coff_get_section_contents
4864 #define coff_get_section_contents           _bfd_generic_get_section_contents
4865 #endif
4866
4867 #ifndef coff_bfd_copy_private_symbol_data
4868 #define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
4869 #endif
4870
4871 #ifndef coff_bfd_copy_private_section_data
4872 #define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
4873 #endif
4874
4875 #ifndef coff_bfd_copy_private_bfd_data 
4876 #define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
4877 #endif
4878
4879 #ifndef coff_bfd_merge_private_bfd_data
4880 #define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
4881 #endif
4882
4883 #ifndef coff_bfd_set_private_flags
4884 #define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
4885 #endif
4886
4887 #ifndef coff_bfd_print_private_bfd_data 
4888 #define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
4889 #endif
4890
4891 #ifndef coff_bfd_is_local_label_name
4892 #define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
4893 #endif
4894
4895 #ifndef coff_read_minisymbols
4896 #define coff_read_minisymbols               _bfd_generic_read_minisymbols
4897 #endif
4898
4899 #ifndef coff_minisymbol_to_symbol
4900 #define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
4901 #endif
4902
4903 /* The reloc lookup routine must be supplied by each individual COFF
4904    backend.  */
4905 #ifndef coff_bfd_reloc_type_lookup
4906 #define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
4907 #endif
4908
4909 #ifndef coff_bfd_get_relocated_section_contents
4910 #define coff_bfd_get_relocated_section_contents \
4911   bfd_generic_get_relocated_section_contents
4912 #endif
4913
4914 #ifndef coff_bfd_relax_section
4915 #define coff_bfd_relax_section              bfd_generic_relax_section
4916 #endif
4917
4918 #ifndef coff_bfd_gc_sections
4919 #define coff_bfd_gc_sections                bfd_generic_gc_sections
4920 #endif
4921
4922 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4923 const bfd_target VAR =                                                  \
4924 {                                                                       \
4925   NAME ,                                                                \
4926   bfd_target_coff_flavour,                                              \
4927   BFD_ENDIAN_BIG,               /* data byte order is big */            \
4928   BFD_ENDIAN_BIG,               /* header byte order is big */          \
4929   /* object flags */                                                    \
4930   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
4931    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
4932   /* section flags */                                                   \
4933   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
4934   UNDER,                        /* leading symbol underscore */         \
4935   '/',                          /* ar_pad_char */                       \
4936   15,                           /* ar_max_namelen */                    \
4937                                                                         \
4938   /* Data conversion functions.  */                                     \
4939   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
4940   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
4941   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
4942                                                                         \
4943   /* Header conversion functions.  */                                   \
4944   bfd_getb64, bfd_getb_signed_64, bfd_putb64,                           \
4945   bfd_getb32, bfd_getb_signed_32, bfd_putb32,                           \
4946   bfd_getb16, bfd_getb_signed_16, bfd_putb16,                           \
4947                                                                         \
4948         /* bfd_check_format */                                          \
4949   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
4950     _bfd_dummy_target },                                                \
4951         /* bfd_set_format */                                            \
4952   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
4953         /* bfd_write_contents */                                        \
4954   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
4955     bfd_false },                                                        \
4956                                                                         \
4957   BFD_JUMP_TABLE_GENERIC (coff),                                        \
4958   BFD_JUMP_TABLE_COPY (coff),                                           \
4959   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
4960   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
4961   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
4962   BFD_JUMP_TABLE_RELOCS (coff),                                         \
4963   BFD_JUMP_TABLE_WRITE (coff),                                          \
4964   BFD_JUMP_TABLE_LINK (coff),                                           \
4965   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
4966                                                                         \
4967   ALTERNATIVE,                                                          \
4968                                                                         \
4969   COFF_SWAP_TABLE                                                       \
4970 };
4971
4972 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE)      \
4973 const bfd_target VAR =                                                  \
4974 {                                                                       \
4975   NAME ,                                                                \
4976   bfd_target_coff_flavour,                                              \
4977   BFD_ENDIAN_LITTLE,            /* data byte order is little */         \
4978   BFD_ENDIAN_LITTLE,            /* header byte order is little */       \
4979         /* object flags */                                              \
4980   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG |                        \
4981    HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS),                    \
4982         /* section flags */                                             \
4983   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
4984   UNDER,                        /* leading symbol underscore */         \
4985   '/',                          /* ar_pad_char */                       \
4986   15,                           /* ar_max_namelen */                    \
4987                                                                         \
4988   /* Data conversion functions.  */                                     \
4989   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
4990   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
4991   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
4992   /* Header conversion functions.  */                                   \
4993   bfd_getl64, bfd_getl_signed_64, bfd_putl64,                           \
4994   bfd_getl32, bfd_getl_signed_32, bfd_putl32,                           \
4995   bfd_getl16, bfd_getl_signed_16, bfd_putl16,                           \
4996         /* bfd_check_format */                                          \
4997   { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p,            \
4998     _bfd_dummy_target },                                                \
4999        /* bfd_set_format */                                             \
5000   { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false },      \
5001         /* bfd_write_contents */                                        \
5002   { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5003     bfd_false },                                                        \
5004                                                                         \
5005   BFD_JUMP_TABLE_GENERIC (coff),                                        \
5006   BFD_JUMP_TABLE_COPY (coff),                                           \
5007   BFD_JUMP_TABLE_CORE (_bfd_nocore),                                    \
5008   BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),                           \
5009   BFD_JUMP_TABLE_SYMBOLS (coff),                                        \
5010   BFD_JUMP_TABLE_RELOCS (coff),                                         \
5011   BFD_JUMP_TABLE_WRITE (coff),                                          \
5012   BFD_JUMP_TABLE_LINK (coff),                                           \
5013   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),                              \
5014                                                                         \
5015   ALTERNATIVE,                                                          \
5016                                                                         \
5017   COFF_SWAP_TABLE                                                       \
5018 };