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