Add C_THUMBEXT etc.
[external/binutils.git] / bfd / coffcode.h
1 /* Support for the generic parts of most COFF variants, for BFD.
2    Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
3    Written by Cygnus Support.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /*
22 Most of this hacked by  Steve Chamberlain,
23                         sac@cygnus.com
24 */
25 /*
26
27 SECTION
28         coff backends
29
30         BFD supports a number of different flavours of coff format.
31         The major differences between formats are the sizes and
32         alignments of fields in structures on disk, and the occasional
33         extra field.
34
35         Coff in all its varieties is implemented with a few common
36         files and a number of implementation specific files. For
37         example, The 88k bcs coff format is implemented in the file
38         @file{coff-m88k.c}. This file @code{#include}s
39         @file{coff/m88k.h} which defines the external structure of the
40         coff format for the 88k, and @file{coff/internal.h} which
41         defines the internal structure. @file{coff-m88k.c} also
42         defines the relocations used by the 88k format
43         @xref{Relocations}.
44
45         The Intel i960 processor version of coff is implemented in
46         @file{coff-i960.c}. This file has the same structure as
47         @file{coff-m88k.c}, except that it includes @file{coff/i960.h}
48         rather than @file{coff-m88k.h}.
49
50 SUBSECTION
51         Porting to a new version of coff
52
53         The recommended method is to select from the existing
54         implementations the version of coff which is most like the one
55         you want to use.  For example, we'll say that i386 coff is
56         the one you select, and that your coff flavour is called foo.
57         Copy @file{i386coff.c} to @file{foocoff.c}, copy
58         @file{../include/coff/i386.h} to @file{../include/coff/foo.h},
59         and add the lines to @file{targets.c} and @file{Makefile.in}
60         so that your new back end is used. Alter the shapes of the
61         structures in @file{../include/coff/foo.h} so that they match
62         what you need. You will probably also have to add
63         @code{#ifdef}s to the code in @file{coff/internal.h} and
64         @file{coffcode.h} if your version of coff is too wild.
65
66         You can verify that your new BFD backend works quite simply by
67         building @file{objdump} from the @file{binutils} directory,
68         and making sure that its version of what's going on and your
69         host system's idea (assuming it has the pretty standard coff
70         dump utility, usually called @code{att-dump} or just
71         @code{dump}) are the same.  Then clean up your code, and send
72         what you've done to Cygnus. Then your stuff will be in the
73         next release, and you won't have to keep integrating it.
74
75 SUBSECTION
76         How the coff backend works
77
78 SUBSUBSECTION
79         File layout
80
81         The Coff backend is split into generic routines that are
82         applicable to any Coff target and routines that are specific
83         to a particular target.  The target-specific routines are
84         further split into ones which are basically the same for all
85         Coff targets except that they use the external symbol format
86         or use different values for certain constants.
87
88         The generic routines are in @file{coffgen.c}.  These routines
89         work for any Coff target.  They use some hooks into the target
90         specific code; the hooks are in a @code{bfd_coff_backend_data}
91         structure, one of which exists for each target.
92
93         The essentially similar target-specific routines are in
94         @file{coffcode.h}.  This header file includes executable C code.
95         The various Coff targets first include the appropriate Coff
96         header file, make any special defines that are needed, and
97         then include @file{coffcode.h}.
98
99         Some of the Coff targets then also have additional routines in
100         the target source file itself.
101
102         For example, @file{coff-i960.c} includes
103         @file{coff/internal.h} and @file{coff/i960.h}.  It then
104         defines a few constants, such as @code{I960}, and includes
105         @file{coffcode.h}.  Since the i960 has complex relocation
106         types, @file{coff-i960.c} also includes some code to
107         manipulate the i960 relocs.  This code is not in
108         @file{coffcode.h} because it would not be used by any other
109         target.
110
111 SUBSUBSECTION
112         Bit twiddling
113
114         Each flavour of coff supported in BFD has its own header file
115         describing the external layout of the structures. There is also
116         an internal description of the coff layout, in
117         @file{coff/internal.h}. A major function of the
118         coff backend is swapping the bytes and twiddling the bits to
119         translate the external form of the structures into the normal
120         internal form. This is all performed in the
121         @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
122         elements are different sizes between different versions of
123         coff; it is the duty of the coff version specific include file
124         to override the definitions of various packing routines in
125         @file{coffcode.h}. E.g., the size of line number entry in coff is
126         sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
127         @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
128         correct one. No doubt, some day someone will find a version of
129         coff which has a varying field size not catered to at the
130         moment. To port BFD, that person will have to add more @code{#defines}.
131         Three of the bit twiddling routines are exported to
132         @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
133         and @code{coff_swap_linno_in}. @code{GDB} reads the symbol
134         table on its own, but uses BFD to fix things up.  More of the
135         bit twiddlers are exported for @code{gas};
136         @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
137         @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
138         @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
139         @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
140         of all the symbol table and reloc drudgery itself, thereby
141         saving the internal BFD overhead, but uses BFD to swap things
142         on the way out, making cross ports much safer.  Doing so also
143         allows BFD (and thus the linker) to use the same header files
144         as @code{gas}, which makes one avenue to disaster disappear.
145
146 SUBSUBSECTION
147         Symbol reading
148
149         The simple canonical form for symbols used by BFD is not rich
150         enough to keep all the information available in a coff symbol
151         table. The back end gets around this problem by keeping the original
152         symbol table around, "behind the scenes".
153
154         When a symbol table is requested (through a call to
155         @code{bfd_canonicalize_symtab}), a request gets through to
156         @code{coff_get_normalized_symtab}. This reads the symbol table from
157         the coff file and swaps all the structures inside into the
158         internal form. It also fixes up all the pointers in the table
159         (represented in the file by offsets from the first symbol in
160         the table) into physical pointers to elements in the new
161         internal table. This involves some work since the meanings of
162         fields change depending upon context: a field that is a
163         pointer to another structure in the symbol table at one moment
164         may be the size in bytes of a structure at the next.  Another
165         pass is made over the table. All symbols which mark file names
166         (<<C_FILE>> symbols) are modified so that the internal
167         string points to the value in the auxent (the real filename)
168         rather than the normal text associated with the symbol
169         (@code{".file"}).
170
171         At this time the symbol names are moved around. Coff stores
172         all symbols less than nine characters long physically
173         within the symbol table; longer strings are kept at the end of
174         the file in the string  table. This pass moves all strings
175         into memory and replaces them with pointers to the strings.
176
177
178         The symbol table is massaged once again, this time to create
179         the canonical table used by the BFD application. Each symbol
180         is inspected in turn, and a decision made (using the
181         @code{sclass} field) about the various flags to set in the
182         @code{asymbol}.  @xref{Symbols}. The generated canonical table
183         shares strings with the hidden internal symbol table.
184
185         Any linenumbers are read from the coff file too, and attached
186         to the symbols which own the functions the linenumbers belong to.
187
188 SUBSUBSECTION
189         Symbol writing
190
191         Writing a symbol to a coff file which didn't come from a coff
192         file will lose any debugging information. The @code{asymbol}
193         structure remembers the BFD from which the symbol was taken, and on
194         output the back end makes sure that the same destination target as
195         source target is present.
196
197         When the symbols have come from a coff file then all the
198         debugging information is preserved.
199
200         Symbol tables are provided for writing to the back end in a
201         vector of pointers to pointers. This allows applications like
202         the linker to accumulate and output large symbol tables
203         without having to do too much byte copying.
204
205         This function runs through the provided symbol table and
206         patches each symbol marked as a file place holder
207         (@code{C_FILE}) to point to the next file place holder in the
208         list. It also marks each @code{offset} field in the list with
209         the offset from the first symbol of the current symbol.
210
211         Another function of this procedure is to turn the canonical
212         value form of BFD into the form used by coff. Internally, BFD
213         expects symbol values to be offsets from a section base; so a
214         symbol physically at 0x120, but in a section starting at
215         0x100, would have the value 0x20. Coff expects symbols to
216         contain their final value, so symbols have their values
217         changed at this point to reflect their sum with their owning
218         section.  This transformation uses the
219         <<output_section>> field of the @code{asymbol}'s
220         @code{asection} @xref{Sections}.
221
222         o <<coff_mangle_symbols>>
223
224         This routine runs though the provided symbol table and uses
225         the offsets generated by the previous pass and the pointers
226         generated when the symbol table was read in to create the
227         structured hierachy required by coff. It changes each pointer
228         to a symbol into the index into the symbol table of the asymbol.
229
230         o <<coff_write_symbols>>
231
232         This routine runs through the symbol table and patches up the
233         symbols from their internal form into the coff way, calls the
234         bit twiddlers, and writes out the table to the file.
235
236 */
237
238 /*
239 INTERNAL_DEFINITION
240         coff_symbol_type
241
242 DESCRIPTION
243         The hidden information for an <<asymbol>> is described in a
244         <<combined_entry_type>>:
245
246 CODE_FRAGMENT
247 .
248 .typedef struct coff_ptr_struct
249 .{
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
273 .          coff_slurp_symbol_table.  *}
274 .unsigned int fix_line : 1;
275 .
276 .       {* The container for the symbol structure as read and translated
277 .           from the file. *}
278 .
279 .union {
280 .   union internal_auxent auxent;
281 .   struct internal_syment syment;
282 . } u;
283 .} combined_entry_type;
284 .
285 .
286 .{* Each canonical asymbol really looks like this: *}
287 .
288 .typedef struct coff_symbol_struct
289 .{
290 .   {* The actual symbol which the rest of BFD works with *}
291 .asymbol symbol;
292 .
293 .   {* A pointer to the hidden information for this symbol *}
294 .combined_entry_type *native;
295 .
296 .   {* A pointer to the linenumber information for this symbol *}
297 .struct lineno_cache_entry *lineno;
298 .
299 .   {* Have the line numbers been relocated yet ? *}
300 .boolean done_lineno;
301 .} coff_symbol_type;
302
303
304 */
305
306 #ifdef COFF_WITH_PE
307 #include "peicode.h"
308 #else
309 #include "coffswap.h"
310 #endif
311
312 #define STRING_SIZE_SIZE (4)
313
314 static long sec_to_styp_flags PARAMS ((const char *, flagword));
315 static flagword styp_to_sec_flags PARAMS ((bfd *, PTR, const char *));
316 static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
317 static boolean coff_new_section_hook PARAMS ((bfd *, asection *));
318 static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR));
319 static boolean coff_write_relocs PARAMS ((bfd *, int));
320 static boolean coff_set_flags
321   PARAMS ((bfd *, unsigned int *, unsigned short *));
322 static boolean coff_set_arch_mach
323   PARAMS ((bfd *, enum bfd_architecture, unsigned long));
324 static boolean coff_compute_section_file_positions PARAMS ((bfd *));
325 static boolean coff_write_object_contents PARAMS ((bfd *));
326 static boolean coff_set_section_contents
327   PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
328 static PTR buy_and_read PARAMS ((bfd *, file_ptr, int, size_t));
329 static boolean coff_slurp_line_table PARAMS ((bfd *, asection *));
330 static boolean coff_slurp_symbol_table PARAMS ((bfd *));
331 static boolean coff_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
332 static long coff_canonicalize_reloc
333   PARAMS ((bfd *, asection *, arelent **, asymbol **));
334 #ifndef coff_mkobject_hook
335 static PTR coff_mkobject_hook PARAMS ((bfd *, PTR,  PTR));
336 #endif
337 \f
338 /* void warning(); */
339
340 /*
341  * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
342  * incoming SEC_* flags.  The inverse of this function is styp_to_sec_flags().
343  * NOTE: If you add to/change this routine, you should mirror the changes
344  *      in styp_to_sec_flags().
345  */
346 static long
347 sec_to_styp_flags (sec_name, sec_flags)
348      CONST char *sec_name;
349      flagword sec_flags;
350 {
351   long styp_flags = 0;
352
353   if (!strcmp (sec_name, _TEXT))
354     {
355       styp_flags = STYP_TEXT;
356     }
357   else if (!strcmp (sec_name, _DATA))
358     {
359       styp_flags = STYP_DATA;
360     }
361   else if (!strcmp (sec_name, _BSS))
362     {
363       styp_flags = STYP_BSS;
364 #ifdef _COMMENT
365     }
366   else if (!strcmp (sec_name, _COMMENT))
367     {
368       styp_flags = STYP_INFO;
369 #endif /* _COMMENT */
370 #ifdef _LIB
371     }
372   else if (!strcmp (sec_name, _LIB))
373     {
374       styp_flags = STYP_LIB;
375 #endif /* _LIB */
376 #ifdef _LIT
377     }
378   else if (!strcmp (sec_name, _LIT))
379     {
380       styp_flags = STYP_LIT;
381 #endif /* _LIT */
382     }
383   else if (!strcmp (sec_name, ".debug"))
384     {
385 #ifdef STYP_DEBUG
386       styp_flags = STYP_DEBUG;
387 #else
388       styp_flags = STYP_INFO;
389 #endif
390     }
391   else if (!strncmp (sec_name, ".stab", 5))
392     {
393       styp_flags = STYP_INFO;
394     }
395 #ifdef COFF_WITH_PE
396   else if (!strcmp (sec_name, ".edata"))
397     {
398       styp_flags = STYP_DATA;
399     }
400 #endif
401 #ifdef RS6000COFF_C
402   else if (!strcmp (sec_name, _PAD))
403     {
404       styp_flags = STYP_PAD;
405     }
406   else if (!strcmp (sec_name, _LOADER))
407     {
408       styp_flags = STYP_LOADER;
409     }
410 #endif
411   /* Try and figure out what it should be */
412   else if (sec_flags & SEC_CODE)
413     {
414       styp_flags = STYP_TEXT;
415     }
416   else if (sec_flags & SEC_DATA)
417     {
418       styp_flags = STYP_DATA;
419     }
420   else if (sec_flags & SEC_READONLY)
421     {
422 #ifdef STYP_LIT                 /* 29k readonly text/data section */
423       styp_flags = STYP_LIT;
424 #else
425       styp_flags = STYP_TEXT;
426 #endif /* STYP_LIT */
427     }
428   else if (sec_flags & SEC_LOAD)
429     {
430       styp_flags = STYP_TEXT;
431     }
432   else if (sec_flags & SEC_ALLOC)
433     {
434       styp_flags = STYP_BSS;
435     }
436
437 #ifdef STYP_NOLOAD
438   if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
439     styp_flags |= STYP_NOLOAD;
440 #endif
441
442 #ifdef COFF_WITH_PE
443   if (sec_flags & SEC_LINK_ONCE)
444     styp_flags |= IMAGE_SCN_LNK_COMDAT;
445 #endif
446
447   return (styp_flags);
448 }
449 /*
450  * Return a word with SEC_* flags set to represent the incoming
451  * STYP_* flags (from scnhdr.s_flags).   The inverse of this
452  * function is sec_to_styp_flags().
453  * NOTE: If you add to/change this routine, you should mirror the changes
454  *      in sec_to_styp_flags().
455  */
456 static flagword
457 styp_to_sec_flags (abfd, hdr, name)
458      bfd *abfd;
459      PTR hdr;
460      const char *name;
461 {
462   struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
463   long styp_flags = internal_s->s_flags;
464   flagword sec_flags = 0;
465
466 #ifdef STYP_NOLOAD
467   if (styp_flags & STYP_NOLOAD)
468     {
469       sec_flags |= SEC_NEVER_LOAD;
470     }
471 #endif /* STYP_NOLOAD */
472
473   /* For 386 COFF, at least, an unloadable text or data section is
474      actually a shared library section.  */
475   if (styp_flags & STYP_TEXT)
476     {
477       if (sec_flags & SEC_NEVER_LOAD)
478         sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
479       else
480         sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
481     }
482   else if (styp_flags & STYP_DATA)
483     {
484       if (sec_flags & SEC_NEVER_LOAD)
485         sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
486       else
487         sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
488     }
489   else if (styp_flags & STYP_BSS)
490     {
491 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
492       if (sec_flags & SEC_NEVER_LOAD)
493         sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
494       else
495 #endif
496         sec_flags |= SEC_ALLOC;
497     }
498   else if (styp_flags & STYP_INFO)
499     {
500       /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
501          defined.  coff_compute_section_file_positions uses
502          COFF_PAGE_SIZE to ensure that the low order bits of the
503          section VMA and the file offset match.  If we don't know
504          COFF_PAGE_SIZE, we can't ensure the correct correspondence,
505          and demand page loading of the file will fail.  */
506 #if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS)
507       sec_flags |= SEC_DEBUGGING;
508 #endif
509     }
510   else if (styp_flags & STYP_PAD)
511     {
512       sec_flags = 0;
513     }
514   else if (strcmp (name, _TEXT) == 0)
515     {
516       if (sec_flags & SEC_NEVER_LOAD)
517         sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
518       else
519         sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
520     }
521   else if (strcmp (name, _DATA) == 0)
522     {
523       if (sec_flags & SEC_NEVER_LOAD)
524         sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
525       else
526         sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
527     }
528   else if (strcmp (name, _BSS) == 0)
529     {
530 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
531       if (sec_flags & SEC_NEVER_LOAD)
532         sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
533       else
534 #endif
535         sec_flags |= SEC_ALLOC;
536     }
537   else if (strcmp (name, ".debug") == 0
538 #ifdef _COMMENT
539            || strcmp (name, _COMMENT) == 0
540 #endif
541            || strncmp (name, ".stab", 5) == 0)
542     {
543 #ifdef COFF_PAGE_SIZE
544       sec_flags |= SEC_DEBUGGING;
545 #endif
546     }
547 #ifdef _LIB
548   else if (strcmp (name, _LIB) == 0)
549     ;
550 #endif
551 #ifdef _LIT
552   else if (strcmp (name, _LIT) == 0)
553     {
554       sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
555     }
556 #endif
557   else
558     {
559       sec_flags |= SEC_ALLOC | SEC_LOAD;
560     }
561
562 #ifdef STYP_LIT                 /* A29k readonly text/data section type */
563   if ((styp_flags & STYP_LIT) == STYP_LIT)
564     {
565       sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
566     }
567 #endif /* STYP_LIT */
568 #ifdef STYP_OTHER_LOAD          /* Other loaded sections */
569   if (styp_flags & STYP_OTHER_LOAD)
570     {
571       sec_flags = (SEC_LOAD | SEC_ALLOC);
572     }
573 #endif /* STYP_SDATA */
574
575 #ifdef COFF_WITH_PE
576   if (styp_flags & IMAGE_SCN_LNK_REMOVE)
577     sec_flags |= SEC_EXCLUDE;
578
579   if (styp_flags & IMAGE_SCN_LNK_COMDAT)
580     {
581       sec_flags |= SEC_LINK_ONCE;
582
583       /* Unfortunately, the PE format stores essential information in
584          the symbol table, of all places.  We need to extract that
585          information now, so that objdump and the linker will know how
586          to handle the section without worrying about the symbols.  We
587          can't call slurp_symtab, because the linker doesn't want the
588          swapped symbols.  */
589
590       if (_bfd_coff_get_external_symbols (abfd))
591         {
592           bfd_byte *esym, *esymend;
593
594           esym = (bfd_byte *) obj_coff_external_syms (abfd);
595           esymend = esym + obj_raw_syment_count (abfd) * SYMESZ;
596
597           while (esym < esymend)
598             {
599               struct internal_syment isym;
600
601               bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
602
603               if (sizeof (internal_s->s_name) > SYMNMLEN)
604                 {
605                   /* This case implies that the matching symbol name
606                      will be in the string table.  */
607                   abort ();
608                 }
609
610               if (isym.n_sclass == C_STAT
611                   && isym.n_type == T_NULL
612                   && isym.n_numaux == 1)
613                 {
614                   char buf[SYMNMLEN + 1];
615                   const char *symname;
616
617                   symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
618                   if (symname == NULL)
619                     abort ();
620
621                   if (strcmp (name, symname) == 0)
622                     {
623                       union internal_auxent aux;
624
625                       /* This is the section symbol.  */
626
627                       bfd_coff_swap_aux_in (abfd, (PTR) (esym + SYMESZ),
628                                             isym.n_type, isym.n_sclass,
629                                             0, isym.n_numaux, (PTR) &aux);
630
631                       switch (aux.x_scn.x_comdat)
632                         {
633                         case IMAGE_COMDAT_SELECT_NODUPLICATES:
634                           sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
635                           break;
636
637                         default:
638                         case IMAGE_COMDAT_SELECT_ANY:
639                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
640                           break;
641
642                         case IMAGE_COMDAT_SELECT_SAME_SIZE:
643                           sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
644                           break;
645
646                         case IMAGE_COMDAT_SELECT_EXACT_MATCH:
647                           sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
648                           break;
649
650                         case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
651                           /* FIXME: This is not currently implemented.  */
652                           sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
653                           break;
654                         }
655
656                       break;
657                     }
658                 }
659
660               esym += (isym.n_numaux + 1) * SYMESZ;
661             }
662         }
663     }
664 #endif
665
666   return (sec_flags);
667 }
668
669 #define get_index(symbol)       ((symbol)->udata.i)
670
671 /*
672 INTERNAL_DEFINITION
673         bfd_coff_backend_data
674
675 CODE_FRAGMENT
676
677 Special entry points for gdb to swap in coff symbol table parts:
678 .typedef struct
679 .{
680 .  void (*_bfd_coff_swap_aux_in) PARAMS ((
681 .       bfd            *abfd,
682 .       PTR             ext,
683 .       int             type,
684 .       int             class,
685 .       int             indaux,
686 .       int             numaux,
687 .       PTR             in));
688 .
689 .  void (*_bfd_coff_swap_sym_in) PARAMS ((
690 .       bfd            *abfd ,
691 .       PTR             ext,
692 .       PTR             in));
693 .
694 .  void (*_bfd_coff_swap_lineno_in) PARAMS ((
695 .       bfd            *abfd,
696 .       PTR            ext,
697 .       PTR             in));
698 .
699
700 Special entry points for gas to swap out coff parts:
701
702 . unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
703 .       bfd     *abfd,
704 .       PTR     in,
705 .       int     type,
706 .       int     class,
707 .       int     indaux,
708 .       int     numaux,
709 .       PTR     ext));
710 .
711 . unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
712 .      bfd      *abfd,
713 .      PTR      in,
714 .      PTR      ext));
715 .
716 . unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
717 .       bfd     *abfd,
718 .       PTR     in,
719 .       PTR     ext));
720 .
721 . unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
722 .       bfd     *abfd,
723 .       PTR     src,
724 .       PTR     dst));
725 .
726 . unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
727 .       bfd     *abfd,
728 .       PTR     in,
729 .       PTR     out));
730 .
731 . unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
732 .       bfd     *abfd,
733 .       PTR     in,
734 .       PTR     out));
735 .
736 . unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
737 .       bfd     *abfd,
738 .       PTR     in,
739 .       PTR     out));
740 .
741
742 Special entry points for generic COFF routines to call target
743 dependent COFF routines:
744
745 . unsigned int _bfd_filhsz;
746 . unsigned int _bfd_aoutsz;
747 . unsigned int _bfd_scnhsz;
748 . unsigned int _bfd_symesz;
749 . unsigned int _bfd_auxesz;
750 . unsigned int _bfd_relsz;
751 . unsigned int _bfd_linesz;
752 . boolean _bfd_coff_long_filenames;
753 . boolean _bfd_coff_long_section_names;
754 . unsigned int _bfd_coff_default_section_alignment_power;
755 . void (*_bfd_coff_swap_filehdr_in) PARAMS ((
756 .       bfd     *abfd,
757 .       PTR     ext,
758 .       PTR     in));
759 . void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
760 .       bfd     *abfd,
761 .       PTR     ext,
762 .       PTR     in));
763 . void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
764 .       bfd     *abfd,
765 .       PTR     ext,
766 .       PTR     in));
767 . void (*_bfd_coff_swap_reloc_in) PARAMS ((
768 .       bfd     *abfd,
769 .       PTR     ext,
770 .       PTR     in));
771 . boolean (*_bfd_coff_bad_format_hook) PARAMS ((
772 .       bfd     *abfd,
773 .       PTR     internal_filehdr));
774 . boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
775 .       bfd     *abfd,
776 .       PTR     internal_filehdr));
777 . PTR (*_bfd_coff_mkobject_hook) PARAMS ((
778 .       bfd     *abfd,
779 .       PTR     internal_filehdr,
780 .       PTR     internal_aouthdr));
781 . flagword (*_bfd_styp_to_sec_flags_hook) PARAMS ((
782 .       bfd     *abfd,
783 .       PTR     internal_scnhdr,
784 .       const char *name));
785 . void (*_bfd_set_alignment_hook) PARAMS ((
786 .       bfd     *abfd,
787 .       asection *sec,
788 .       PTR     internal_scnhdr));
789 . boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
790 .       bfd     *abfd));
791 . boolean (*_bfd_coff_symname_in_debug) PARAMS ((
792 .       bfd     *abfd,
793 .       struct internal_syment *sym));
794 . boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
795 .       bfd *abfd,
796 .       combined_entry_type *table_base,
797 .       combined_entry_type *symbol,
798 .       unsigned int indaux,
799 .       combined_entry_type *aux));
800 . boolean (*_bfd_coff_print_aux) PARAMS ((
801 .       bfd *abfd,
802 .       FILE *file,
803 .       combined_entry_type *table_base,
804 .       combined_entry_type *symbol,
805 .       combined_entry_type *aux,
806 .       unsigned int indaux));
807 . void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
808 .       bfd     *abfd,
809 .       struct bfd_link_info *link_info,
810 .       struct bfd_link_order *link_order,
811 .       arelent *reloc,
812 .       bfd_byte *data,
813 .       unsigned int *src_ptr,
814 .       unsigned int *dst_ptr));
815 . int (*_bfd_coff_reloc16_estimate) PARAMS ((
816 .       bfd *abfd,
817 .       asection *input_section,
818 .       arelent *r,
819 .       unsigned int shrink,
820 .       struct bfd_link_info *link_info));
821 . boolean (*_bfd_coff_sym_is_global) PARAMS ((
822 .       bfd *abfd,
823 .       struct internal_syment *));
824 . boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
825 .       bfd *abfd));
826 . boolean (*_bfd_coff_start_final_link) PARAMS ((
827 .       bfd *output_bfd,
828 .       struct bfd_link_info *info));
829 . boolean (*_bfd_coff_relocate_section) PARAMS ((
830 .       bfd *output_bfd,
831 .       struct bfd_link_info *info,
832 .       bfd *input_bfd,
833 .       asection *input_section,
834 .       bfd_byte *contents,
835 .       struct internal_reloc *relocs,
836 .       struct internal_syment *syms,
837 .       asection **sections));
838 . reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
839 .       bfd *abfd,
840 .       asection *sec,
841 .       struct internal_reloc *rel,
842 .       struct coff_link_hash_entry *h,
843 .       struct internal_syment *sym,
844 .       bfd_vma *addendp));
845 . boolean (*_bfd_coff_adjust_symndx) PARAMS ((
846 .       bfd *obfd,
847 .       struct bfd_link_info *info,
848 .       bfd *ibfd,
849 .       asection *sec,
850 .       struct internal_reloc *reloc,
851 .       boolean *adjustedp));
852 . boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
853 .       struct bfd_link_info *info,
854 .       bfd *abfd,
855 .       const char *name,
856 .       flagword flags, 
857 .       asection *section,
858 .       bfd_vma value,
859 .       const char *string,
860 .       boolean copy,
861 .       boolean collect, 
862 .       struct bfd_link_hash_entry **hashp));
863 .
864 .} bfd_coff_backend_data;
865 .
866 .#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
867 .
868 .#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
869 .        ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
870 .
871 .#define bfd_coff_swap_sym_in(a,e,i) \
872 .        ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
873 .
874 .#define bfd_coff_swap_lineno_in(a,e,i) \
875 .        ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
876 .
877 .#define bfd_coff_swap_reloc_out(abfd, i, o) \
878 .        ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
879 .
880 .#define bfd_coff_swap_lineno_out(abfd, i, o) \
881 .        ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
882 .
883 .#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
884 .        ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
885 .
886 .#define bfd_coff_swap_sym_out(abfd, i,o) \
887 .        ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
888 .
889 .#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
890 .        ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
891 .
892 .#define bfd_coff_swap_filehdr_out(abfd, i,o) \
893 .        ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
894 .
895 .#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
896 .        ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
897 .
898 .#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
899 .#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
900 .#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
901 .#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
902 .#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
903 .#define bfd_coff_relsz(abfd)  (coff_backend_info (abfd)->_bfd_relsz)
904 .#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
905 .#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
906 .#define bfd_coff_long_section_names(abfd) \
907 .        (coff_backend_info (abfd)->_bfd_coff_long_section_names)
908 .#define bfd_coff_default_section_alignment_power(abfd) \
909 .        (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
910 .#define bfd_coff_swap_filehdr_in(abfd, i,o) \
911 .        ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
912 .
913 .#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
914 .        ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
915 .
916 .#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
917 .        ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
918 .
919 .#define bfd_coff_swap_reloc_in(abfd, i, o) \
920 .        ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
921 .
922 .#define bfd_coff_bad_format_hook(abfd, filehdr) \
923 .        ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
924 .
925 .#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
926 .        ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
927 .#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
928 .        ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
929 .
930 .#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name)\
931 .        ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr, name))
932 .
933 .#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
934 .        ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
935 .
936 .#define bfd_coff_slurp_symbol_table(abfd)\
937 .        ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
938 .
939 .#define bfd_coff_symname_in_debug(abfd, sym)\
940 .        ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
941 .
942 .#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
943 .        ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
944 .         (abfd, file, base, symbol, aux, indaux))
945 .
946 .#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
947 .        ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
948 .         (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
949 .
950 .#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
951 .        ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
952 .         (abfd, section, reloc, shrink, link_info))
953 .
954 .#define bfd_coff_sym_is_global(abfd, sym)\
955 .        ((coff_backend_info (abfd)->_bfd_coff_sym_is_global)\
956 .         (abfd, sym))
957 .
958 .#define bfd_coff_compute_section_file_positions(abfd)\
959 .        ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
960 .         (abfd))
961 .
962 .#define bfd_coff_start_final_link(obfd, info)\
963 .        ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
964 .         (obfd, info))
965 .#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
966 .        ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
967 .         (obfd, info, ibfd, o, con, rel, isyms, secs))
968 .#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
969 .        ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
970 .         (abfd, sec, rel, h, sym, addendp))
971 .#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
972 .        ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
973 .         (obfd, info, ibfd, sec, rel, adjustedp))
974 .#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\
975 .        ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
976 .         (info, abfd, name, flags, section, value, string, cp, coll, hashp))
977 .
978 */
979
980 /* See whether the magic number matches.  */
981
982 static boolean
983 coff_bad_format_hook (abfd, filehdr)
984      bfd * abfd;
985      PTR filehdr;
986 {
987   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
988
989   if (BADMAG (*internal_f))
990     return false;
991
992   /* if the optional header is NULL or not the correct size then
993      quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
994      and Intel 960 readwrite headers (I960WRMAGIC) is that the
995      optional header is of a different size.
996
997      But the mips keeps extra stuff in it's opthdr, so dont check
998      when doing that
999      */
1000
1001 #if defined(M88) || defined(I960)
1002   if (internal_f->f_opthdr != 0 && AOUTSZ != internal_f->f_opthdr)
1003     return false;
1004 #endif
1005
1006   return true;
1007 }
1008
1009 /*
1010    initialize a section structure with information peculiar to this
1011    particular implementation of coff
1012 */
1013
1014 static boolean
1015 coff_new_section_hook (abfd, section)
1016      bfd * abfd;
1017      asection * section;
1018 {
1019   section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1020
1021 #ifdef RS6000COFF_C
1022   if (xcoff_data (abfd)->text_align_power != 0
1023       && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
1024     section->alignment_power = xcoff_data (abfd)->text_align_power;
1025   if (xcoff_data (abfd)->data_align_power != 0
1026       && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
1027     section->alignment_power = xcoff_data (abfd)->data_align_power;
1028 #endif
1029
1030   /* Allocate aux records for section symbols, to store size and
1031      related info.
1032
1033      @@ The 10 is a guess at a plausible maximum number of aux entries
1034      (but shouldn't be a constant).  */
1035   coffsymbol (section->symbol)->native =
1036     (combined_entry_type *) bfd_zalloc (abfd,
1037                                         sizeof (combined_entry_type) * 10);
1038
1039   /* The .stab section must be aligned to 2**2 at most, because
1040      otherwise there may be gaps in the section which gdb will not
1041      know how to interpret.  Examining the section name is a hack, but
1042      that is also how gdb locates the section.
1043      We need to handle the .ctors and .dtors sections similarly, to
1044      avoid introducing null words in the tables.  */
1045   if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 2
1046       && (strncmp (section->name, ".stab", 5) == 0
1047           || strcmp (section->name, ".ctors") == 0
1048           || strcmp (section->name, ".dtors") == 0))
1049     section->alignment_power = 2;
1050
1051   /* Similarly, the .stabstr section must be aligned to 2**0 at most.  */
1052   if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 0
1053       && strncmp (section->name, ".stabstr", 8) == 0)
1054     section->alignment_power = 0;
1055
1056   return true;
1057 }
1058
1059 #ifdef COFF_ALIGN_IN_SECTION_HEADER
1060
1061 /* Set the alignment of a BFD section.  */
1062
1063 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1064
1065 static void
1066 coff_set_alignment_hook (abfd, section, scnhdr)
1067      bfd * abfd;
1068      asection * section;
1069      PTR scnhdr;
1070 {
1071   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1072   unsigned int i;
1073
1074 #ifdef I960
1075   /* Extract ALIGN from 2**ALIGN stored in section header */
1076   for (i = 0; i < 32; i++)
1077     if ((1 << i) >= hdr->s_align)
1078       break;
1079 #endif
1080 /* start-sanitize-tic80 */
1081 #ifdef TIC80COFF
1082   /* TI tools hijack bits 8-11 for the alignment */
1083   i = (hdr->s_flags >> 8) & 0xF ;
1084 #endif
1085 /* end-sanitize-tic80 */
1086   section->alignment_power = i;
1087 }
1088
1089 #else /* ! COFF_ALIGN_IN_SECTION_HEADER */
1090 #ifdef COFF_WITH_PE
1091
1092 /* a couple of macros to help setting the alignment power field */
1093 #define ALIGN_SET(field,x,y) \
1094   if (((field) & IMAGE_SCN_ALIGN_64BYTES) == x )\
1095   {\
1096      section->alignment_power = y;\
1097   }
1098
1099 #define ELIFALIGN_SET(field,x,y) \
1100   else if (( (field) & IMAGE_SCN_ALIGN_64BYTES) == x ) \
1101   {\
1102      section->alignment_power = y;\
1103   }
1104
1105 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1106
1107 static void
1108 coff_set_alignment_hook (abfd, section, scnhdr)
1109      bfd * abfd;
1110      asection * section;
1111      PTR scnhdr;
1112 {
1113   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1114
1115   ALIGN_SET     (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6)
1116   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5)
1117   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_16BYTES, 4)
1118   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_8BYTES,  3)
1119   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_4BYTES,  2)
1120   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_2BYTES,  1)
1121   ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_1BYTES,  0)
1122
1123 #ifdef POWERPC_LE_PE
1124   if (strcmp (section->name, ".idata$2") == 0)
1125     {
1126       section->alignment_power = 0;
1127     }
1128   else if (strcmp (section->name, ".idata$3") == 0)
1129     {
1130       section->alignment_power = 0;
1131     }
1132   else if (strcmp (section->name, ".idata$4") == 0)
1133     {
1134       section->alignment_power = 2;
1135     }
1136   else if (strcmp (section->name, ".idata$5") == 0)
1137     {
1138       section->alignment_power = 2;
1139     }
1140   else if (strcmp (section->name, ".idata$6") == 0)
1141     {
1142       section->alignment_power = 1;
1143     }
1144   else if (strcmp (section->name, ".reloc") == 0)
1145     {
1146       section->alignment_power = 1;
1147     }
1148   else if (strncmp (section->name, ".stab", 5) == 0)
1149     {
1150       section->alignment_power = 2;
1151     }
1152 #endif
1153
1154 #ifdef COFF_IMAGE_WITH_PE
1155   /* In a PE image file, the s_paddr field holds the virtual size of a
1156      section, while the s_size field holds the raw size.  */
1157   if (hdr->s_paddr != 0)
1158     {
1159       if (coff_section_data (abfd, section) == NULL)
1160         {
1161           section->used_by_bfd =
1162             (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
1163           if (section->used_by_bfd == NULL)
1164             {
1165               /* FIXME: Return error.  */
1166               abort ();
1167             }
1168         }
1169       if (pei_section_data (abfd, section) == NULL)
1170         {
1171           coff_section_data (abfd, section)->tdata =
1172             (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
1173           if (coff_section_data (abfd, section)->tdata == NULL)
1174             {
1175               /* FIXME: Return error.  */
1176               abort ();
1177             }
1178         }
1179       pei_section_data (abfd, section)->virt_size = hdr->s_paddr;
1180     }
1181 #endif
1182
1183 }
1184 #undef ALIGN_SET
1185 #undef ELIFALIGN_SET
1186
1187 #else /* ! COFF_WITH_PE */
1188 #ifdef RS6000COFF_C
1189
1190 /* We grossly abuse this function to handle XCOFF overflow headers.
1191    When we see one, we correct the reloc and line number counts in the
1192    real header, and remove the section we just created.  */
1193
1194 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1195
1196 static void
1197 coff_set_alignment_hook (abfd, section, scnhdr)
1198      bfd *abfd;
1199      asection *section;
1200      PTR scnhdr;
1201 {
1202   struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1203   asection *real_sec;
1204   asection **ps;
1205
1206   if ((hdr->s_flags & STYP_OVRFLO) == 0)
1207     return;
1208
1209   real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
1210   if (real_sec == NULL)
1211     return;
1212
1213   real_sec->reloc_count = hdr->s_paddr;
1214   real_sec->lineno_count = hdr->s_vaddr;
1215
1216   for (ps = &abfd->sections; *ps != NULL; ps = &(*ps)->next)
1217     {
1218       if (*ps == section)
1219         {
1220           *ps = (*ps)->next;
1221           --abfd->section_count;
1222           break;
1223         }
1224     }
1225 }
1226
1227 #else /* ! RS6000COFF_C */
1228
1229 #define coff_set_alignment_hook \
1230   ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
1231
1232 #endif /* ! RS6000COFF_C */
1233 #endif /* ! COFF_WITH_PE */
1234 #endif /* ! COFF_ALIGN_IN_SECTION_HEADER */
1235
1236 #ifndef coff_mkobject
1237
1238 static boolean coff_mkobject PARAMS ((bfd *));
1239
1240 static boolean
1241 coff_mkobject (abfd)
1242      bfd * abfd;
1243 {
1244   coff_data_type *coff;
1245
1246   abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
1247   if (abfd->tdata.coff_obj_data == 0)
1248     return false;
1249   coff = coff_data (abfd);
1250   coff->symbols = (coff_symbol_type *) NULL;
1251   coff->conversion_table = (unsigned int *) NULL;
1252   coff->raw_syments = (struct coff_ptr_struct *) NULL;
1253   coff->relocbase = 0;
1254   coff->local_toc_sym_map = 0;
1255
1256 /*  make_abs_section(abfd);*/
1257
1258   return true;
1259 }
1260 #endif
1261
1262 /* Create the COFF backend specific information.  */
1263 #ifndef coff_mkobject_hook
1264 static PTR
1265 coff_mkobject_hook (abfd, filehdr, aouthdr)
1266      bfd * abfd;
1267      PTR filehdr;
1268      PTR aouthdr;
1269 {
1270   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1271   coff_data_type *coff;
1272
1273   if (coff_mkobject (abfd) == false)
1274     return NULL;
1275
1276   coff = coff_data (abfd);
1277
1278   coff->sym_filepos = internal_f->f_symptr;
1279
1280   /* These members communicate important constants about the symbol
1281      table to GDB's symbol-reading code.  These `constants'
1282      unfortunately vary among coff implementations...  */
1283   coff->local_n_btmask = N_BTMASK;
1284   coff->local_n_btshft = N_BTSHFT;
1285   coff->local_n_tmask = N_TMASK;
1286   coff->local_n_tshift = N_TSHIFT;
1287   coff->local_symesz = SYMESZ;
1288   coff->local_auxesz = AUXESZ;
1289   coff->local_linesz = LINESZ;
1290
1291   obj_raw_syment_count (abfd) =
1292     obj_conv_table_size (abfd) =
1293       internal_f->f_nsyms;
1294
1295 #ifdef RS6000COFF_C
1296   if ((internal_f->f_flags & F_SHROBJ) != 0)
1297     abfd->flags |= DYNAMIC;
1298   if (aouthdr != NULL && internal_f->f_opthdr >= AOUTSZ)
1299     {
1300       struct internal_aouthdr *internal_a =
1301         (struct internal_aouthdr *) aouthdr;
1302       struct xcoff_tdata *xcoff;
1303
1304       xcoff = xcoff_data (abfd);
1305       xcoff->full_aouthdr = true;
1306       xcoff->toc = internal_a->o_toc;
1307       xcoff->sntoc = internal_a->o_sntoc;
1308       xcoff->snentry = internal_a->o_snentry;
1309       xcoff->text_align_power = internal_a->o_algntext;
1310       xcoff->data_align_power = internal_a->o_algndata;
1311       xcoff->modtype = internal_a->o_modtype;
1312       xcoff->cputype = internal_a->o_cputype;
1313       xcoff->maxdata = internal_a->o_maxdata;
1314       xcoff->maxstack = internal_a->o_maxstack;
1315     }
1316 #endif
1317
1318 #if defined  ARM && ! defined COFF_WITH_PE
1319   /* Set the flags field from the COFF header read in */
1320   if (! coff_arm_bfd_set_private_flags (abfd, internal_f->f_flags))
1321     coff->flags = 0;
1322 #endif
1323   
1324   return (PTR) coff;
1325 }
1326 #endif
1327
1328 /* Determine the machine architecture and type.  FIXME: This is target
1329    dependent because the magic numbers are defined in the target
1330    dependent header files.  But there is no particular need for this.
1331    If the magic numbers were moved to a separate file, this function
1332    would be target independent and would also be much more successful
1333    at linking together COFF files for different architectures.  */
1334
1335 static boolean
1336 coff_set_arch_mach_hook (abfd, filehdr)
1337      bfd *abfd;
1338      PTR filehdr;
1339 {
1340   long machine;
1341   enum bfd_architecture arch;
1342   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1343
1344   machine = 0;
1345   switch (internal_f->f_magic)
1346     {
1347 #ifdef PPCMAGIC
1348     case PPCMAGIC:
1349       arch = bfd_arch_powerpc;
1350       machine = 0; /* what does this mean? (krk) */
1351       break; 
1352 #endif
1353 #ifdef I386MAGIC
1354     case I386MAGIC:
1355     case I386PTXMAGIC:
1356     case I386AIXMAGIC:          /* Danbury PS/2 AIX C Compiler */
1357     case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1358       arch = bfd_arch_i386;
1359       machine = 0;
1360       break;
1361 #endif
1362 #ifdef A29K_MAGIC_BIG
1363     case A29K_MAGIC_BIG:
1364     case A29K_MAGIC_LITTLE:
1365       arch = bfd_arch_a29k;
1366       machine = 0;
1367       break;
1368 #endif
1369 #ifdef ARMMAGIC
1370     case ARMMAGIC:
1371       arch = bfd_arch_arm;
1372       switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1373         {
1374         case F_ARM_2:  machine = bfd_mach_arm_2;  break;
1375         case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1376         case F_ARM_3:  machine = bfd_mach_arm_3;  break;
1377         default:
1378         case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1379         case F_ARM_4:  machine = bfd_mach_arm_4;  break;
1380         case F_ARM_4T: machine = bfd_mach_arm_4T; break;
1381         }
1382       break;
1383 #endif
1384 #ifdef MC68MAGIC
1385     case MC68MAGIC:
1386     case M68MAGIC:
1387 #ifdef MC68KBCSMAGIC
1388     case MC68KBCSMAGIC:
1389 #endif
1390 #ifdef APOLLOM68KMAGIC
1391     case APOLLOM68KMAGIC:
1392 #endif
1393 #ifdef LYNXCOFFMAGIC
1394     case LYNXCOFFMAGIC:
1395 #endif
1396       arch = bfd_arch_m68k;
1397       machine = 68020;
1398       break;
1399 #endif
1400 #ifdef MC88MAGIC
1401     case MC88MAGIC:
1402     case MC88DMAGIC:
1403     case MC88OMAGIC:
1404       arch = bfd_arch_m88k;
1405       machine = 88100;
1406       break;
1407 #endif
1408 #ifdef Z8KMAGIC
1409     case Z8KMAGIC:
1410       arch = bfd_arch_z8k;
1411       switch (internal_f->f_flags & F_MACHMASK)
1412         {
1413         case F_Z8001:
1414           machine = bfd_mach_z8001;
1415           break;
1416         case F_Z8002:
1417           machine = bfd_mach_z8002;
1418           break;
1419         default:
1420           return false;
1421         }
1422       break;
1423 #endif
1424 #ifdef I860
1425     case I860MAGIC:
1426       arch = bfd_arch_i860;
1427       break;
1428 #endif
1429 #ifdef I960
1430 #ifdef I960ROMAGIC
1431     case I960ROMAGIC:
1432     case I960RWMAGIC:
1433       arch = bfd_arch_i960;
1434       switch (F_I960TYPE & internal_f->f_flags)
1435         {
1436         default:
1437         case F_I960CORE:
1438           machine = bfd_mach_i960_core;
1439           break;
1440         case F_I960KB:
1441           machine = bfd_mach_i960_kb_sb;
1442           break;
1443         case F_I960MC:
1444           machine = bfd_mach_i960_mc;
1445           break;
1446         case F_I960XA:
1447           machine = bfd_mach_i960_xa;
1448           break;
1449         case F_I960CA:
1450           machine = bfd_mach_i960_ca;
1451           break;
1452         case F_I960KA:
1453           machine = bfd_mach_i960_ka_sa;
1454           break;
1455         case F_I960JX:
1456           machine = bfd_mach_i960_jx;
1457           break;
1458         case F_I960HX:
1459           machine = bfd_mach_i960_hx;
1460           break;
1461         }
1462       break;
1463 #endif
1464 #endif
1465
1466 #ifdef RS6000COFF_C
1467     case U802ROMAGIC:
1468     case U802WRMAGIC:
1469     case U802TOCMAGIC:
1470       {
1471         int cputype;
1472
1473         if (xcoff_data (abfd)->cputype != -1)
1474           cputype = xcoff_data (abfd)->cputype & 0xff;
1475         else
1476           {
1477             /* We did not get a value from the a.out header.  If the
1478                file has not been stripped, we may be able to get the
1479                architecture information from the first symbol, if it
1480                is a .file symbol.  */
1481             if (obj_raw_syment_count (abfd) == 0)
1482               cputype = 0;
1483             else
1484               {
1485                 bfd_byte buf[SYMESZ];
1486                 struct internal_syment sym;
1487
1488                 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1489                     || bfd_read (buf, 1, SYMESZ, abfd) != SYMESZ)
1490                   return false;
1491                 coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
1492                 if (sym.n_sclass == C_FILE)
1493                   cputype = sym.n_type & 0xff;
1494                 else
1495                   cputype = 0;
1496               }
1497           }
1498
1499         /* FIXME: We don't handle all cases here.  */
1500         switch (cputype)
1501           {
1502           default:
1503           case 0:
1504 #ifdef POWERMAC
1505             /* PowerPC Macs use the same magic numbers as RS/6000
1506                (because that's how they were bootstrapped originally),
1507                but they are always PowerPC architecture.  */
1508             arch = bfd_arch_powerpc;
1509             machine = 0;
1510 #else
1511             arch = bfd_arch_rs6000;
1512             machine = 6000;
1513 #endif /* POWERMAC */
1514             break;
1515
1516           case 1:
1517             arch = bfd_arch_powerpc;
1518             machine = 601;
1519             break;
1520           case 2: /* 64 bit PowerPC */
1521             arch = bfd_arch_powerpc;
1522             machine = 620;
1523             break;
1524           case 3:
1525             arch = bfd_arch_powerpc;
1526             machine = 0;
1527             break;
1528           case 4:
1529             arch = bfd_arch_rs6000;
1530             machine = 6000;
1531             break;
1532           }
1533       }
1534       break;
1535 #endif
1536
1537 #ifdef WE32KMAGIC
1538     case WE32KMAGIC:
1539       arch = bfd_arch_we32k;
1540       machine = 0;
1541       break;
1542 #endif
1543
1544 #ifdef H8300MAGIC
1545     case H8300MAGIC:
1546       arch = bfd_arch_h8300;
1547       machine = bfd_mach_h8300;
1548       /* !! FIXME this probably isn't the right place for this */
1549       abfd->flags |= BFD_IS_RELAXABLE;
1550       break;
1551 #endif
1552
1553 #ifdef H8300HMAGIC
1554     case H8300HMAGIC:
1555       arch = bfd_arch_h8300;
1556       machine = bfd_mach_h8300h;
1557       /* !! FIXME this probably isn't the right place for this */
1558       abfd->flags |= BFD_IS_RELAXABLE;
1559       break;
1560 #endif
1561
1562 #ifdef H8300SMAGIC
1563     case H8300SMAGIC:
1564       arch = bfd_arch_h8300;
1565       machine = bfd_mach_h8300s;
1566       /* !! FIXME this probably isn't the right place for this */
1567       abfd->flags |= BFD_IS_RELAXABLE;
1568       break;
1569 #endif
1570
1571 #ifdef SH_ARCH_MAGIC_BIG
1572     case SH_ARCH_MAGIC_BIG:
1573     case SH_ARCH_MAGIC_LITTLE:
1574       arch = bfd_arch_sh;
1575       machine = 0;
1576       break;
1577 #endif
1578
1579 #ifdef H8500MAGIC
1580     case H8500MAGIC:
1581       arch = bfd_arch_h8500;
1582       machine = 0;
1583       break;
1584 #endif
1585
1586 #ifdef SPARCMAGIC
1587     case SPARCMAGIC:
1588 #ifdef LYNXCOFFMAGIC
1589     case LYNXCOFFMAGIC:
1590 #endif
1591       arch = bfd_arch_sparc;
1592       machine = 0;
1593       break;
1594 #endif
1595
1596 /* start-sanitize-tic80 */
1597 #ifdef TIC80_ARCH_MAGIC
1598     case TIC80_ARCH_MAGIC:
1599       arch = bfd_arch_tic80;
1600       break;
1601 #endif
1602 /* end-sanitize-tic80 */
1603
1604     default:                    /* Unreadable input file type */
1605       arch = bfd_arch_obscure;
1606       break;
1607     }
1608
1609   bfd_default_set_arch_mach (abfd, arch, machine);
1610   return true;
1611 }
1612
1613 #ifdef SYMNAME_IN_DEBUG
1614
1615 static boolean symname_in_debug_hook
1616   PARAMS ((bfd *, struct internal_syment *));
1617
1618 static boolean
1619 symname_in_debug_hook (abfd, sym)
1620      bfd * abfd;
1621      struct internal_syment *sym;
1622 {
1623   return SYMNAME_IN_DEBUG (sym) ? true : false;
1624 }
1625
1626 #else
1627
1628 #define symname_in_debug_hook \
1629   (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
1630
1631 #endif
1632
1633 #ifdef RS6000COFF_C
1634
1635 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol.  */
1636
1637 static boolean coff_pointerize_aux_hook
1638   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1639            unsigned int, combined_entry_type *));
1640
1641 /*ARGSUSED*/
1642 static boolean
1643 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
1644      bfd *abfd;
1645      combined_entry_type *table_base;
1646      combined_entry_type *symbol;
1647      unsigned int indaux;
1648      combined_entry_type *aux;
1649 {
1650   int class = symbol->u.syment.n_sclass;
1651
1652   if ((class == C_EXT || class == C_HIDEXT)
1653       && indaux + 1 == symbol->u.syment.n_numaux)
1654     {
1655       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
1656         {
1657           aux->u.auxent.x_csect.x_scnlen.p =
1658             table_base + aux->u.auxent.x_csect.x_scnlen.l;
1659           aux->fix_scnlen = 1;
1660         }
1661
1662       /* Return true to indicate that the caller should not do any
1663          further work on this auxent.  */
1664       return true;
1665     }
1666
1667   /* Return false to indicate that this auxent should be handled by
1668      the caller.  */
1669   return false;
1670 }
1671
1672 #else
1673 #ifdef I960
1674
1675 /* We don't want to pointerize bal entries.  */
1676
1677 static boolean coff_pointerize_aux_hook
1678   PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1679            unsigned int, combined_entry_type *));
1680
1681 /*ARGSUSED*/
1682 static boolean
1683 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
1684      bfd *abfd;
1685      combined_entry_type *table_base;
1686      combined_entry_type *symbol;
1687      unsigned int indaux;
1688      combined_entry_type *aux;
1689 {
1690   /* Return true if we don't want to pointerize this aux entry, which
1691      is the case for the lastfirst aux entry for a C_LEAFPROC symbol.  */
1692   return (indaux == 1
1693           && (symbol->u.syment.n_sclass == C_LEAFPROC
1694               || symbol->u.syment.n_sclass == C_LEAFSTAT
1695               || symbol->u.syment.n_sclass == C_LEAFEXT));
1696 }
1697
1698 #else /* ! I960 */
1699
1700 #define coff_pointerize_aux_hook 0
1701
1702 #endif /* ! I960 */
1703 #endif /* ! RS6000COFF_C */
1704
1705 /* Print an aux entry.  This returns true if it has printed it.  */
1706
1707 static boolean coff_print_aux
1708   PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
1709            combined_entry_type *, unsigned int));
1710
1711 static boolean
1712 coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
1713      bfd *abfd;
1714      FILE *file;
1715      combined_entry_type *table_base;
1716      combined_entry_type *symbol;
1717      combined_entry_type *aux;
1718      unsigned int indaux;
1719 {
1720 #ifdef RS6000COFF_C
1721   if ((symbol->u.syment.n_sclass == C_EXT
1722        || symbol->u.syment.n_sclass == C_HIDEXT)
1723       && indaux + 1 == symbol->u.syment.n_numaux)
1724     {
1725       /* This is a csect entry.  */
1726       fprintf (file, "AUX ");
1727       if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
1728         {
1729           BFD_ASSERT (! aux->fix_scnlen);
1730           fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
1731         }
1732       else
1733         {
1734           fprintf (file, "indx ");
1735           if (! aux->fix_scnlen)
1736             fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
1737           else
1738             fprintf (file, "%4ld",
1739                      (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
1740         }
1741       fprintf (file,
1742                " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
1743                aux->u.auxent.x_csect.x_parmhash,
1744                (unsigned int) aux->u.auxent.x_csect.x_snhash,
1745                SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
1746                SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
1747                (unsigned int) aux->u.auxent.x_csect.x_smclas,
1748                aux->u.auxent.x_csect.x_stab,
1749                (unsigned int) aux->u.auxent.x_csect.x_snstab);
1750       return true;
1751     }
1752 #endif
1753
1754   /* Return false to indicate that no special action was taken.  */
1755   return false;
1756 }
1757
1758 /*
1759 SUBSUBSECTION
1760         Writing relocations
1761
1762         To write relocations, the back end steps though the
1763         canonical relocation table and create an
1764         @code{internal_reloc}. The symbol index to use is removed from
1765         the @code{offset} field in the symbol table supplied.  The
1766         address comes directly from the sum of the section base
1767         address and the relocation offset; the type is dug directly
1768         from the howto field.  Then the @code{internal_reloc} is
1769         swapped into the shape of an @code{external_reloc} and written
1770         out to disk.
1771
1772 */
1773
1774 #ifdef TARG_AUX
1775
1776 static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
1777
1778 /* AUX's ld wants relocations to be sorted */
1779 static int
1780 compare_arelent_ptr (x, y)
1781      const PTR x;
1782      const PTR y;
1783 {
1784   const arelent **a = (const arelent **) x;
1785   const arelent **b = (const arelent **) y;
1786   bfd_size_type aadr = (*a)->address;
1787   bfd_size_type badr = (*b)->address;
1788
1789   return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
1790 }
1791
1792 #endif /* TARG_AUX */
1793
1794 static boolean
1795 coff_write_relocs (abfd, first_undef)
1796      bfd * abfd;
1797      int first_undef;
1798 {
1799   asection *s;
1800
1801   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1802     {
1803       unsigned int i;
1804       struct external_reloc dst;
1805       arelent **p;
1806
1807 #ifndef TARG_AUX
1808       p = s->orelocation;
1809 #else
1810       /* sort relocations before we write them out */
1811       p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
1812       if (p == NULL && s->reloc_count > 0)
1813         return false;
1814       memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
1815       qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
1816 #endif
1817
1818       if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
1819         return false;
1820       for (i = 0; i < s->reloc_count; i++)
1821         {
1822           struct internal_reloc n;
1823           arelent *q = p[i];
1824           memset ((PTR) & n, 0, sizeof (n));
1825
1826           /* Now we've renumbered the symbols we know where the
1827              undefined symbols live in the table.  Check the reloc
1828              entries for symbols who's output bfd isn't the right one.
1829              This is because the symbol was undefined (which means
1830              that all the pointers are never made to point to the same
1831              place). This is a bad thing,'cause the symbols attached
1832              to the output bfd are indexed, so that the relocation
1833              entries know which symbol index they point to.  So we
1834              have to look up the output symbol here. */
1835
1836           if (q->sym_ptr_ptr[0]->the_bfd != abfd)
1837             {
1838               int i;
1839               const char *sname = q->sym_ptr_ptr[0]->name;
1840               asymbol **outsyms = abfd->outsymbols;
1841               for (i = first_undef; outsyms[i]; i++)
1842                 {
1843                   const char *intable = outsyms[i]->name;
1844                   if (strcmp (intable, sname) == 0) {
1845                     /* got a hit, so repoint the reloc */
1846                     q->sym_ptr_ptr = outsyms + i;
1847                     break;
1848                   }
1849                 }
1850             }
1851
1852           n.r_vaddr = q->address + s->vma;
1853
1854 #ifdef R_IHCONST
1855           /* The 29k const/consth reloc pair is a real kludge.  The consth
1856              part doesn't have a symbol; it has an offset.  So rebuilt
1857              that here.  */
1858           if (q->howto->type == R_IHCONST)
1859             n.r_symndx = q->addend;
1860           else
1861 #endif
1862             if (q->sym_ptr_ptr)
1863               {
1864                 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
1865                   /* This is a relocation relative to the absolute symbol.  */
1866                   n.r_symndx = -1;
1867                 else
1868                   {
1869                     n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
1870                     /* Take notice if the symbol reloc points to a symbol
1871                        we don't have in our symbol table.  What should we
1872                        do for this??  */
1873                     if (n.r_symndx > obj_conv_table_size (abfd))
1874                       abort ();
1875                   }
1876               }
1877
1878 #ifdef SWAP_OUT_RELOC_OFFSET
1879           n.r_offset = q->addend;
1880 #endif
1881
1882 #ifdef SELECT_RELOC
1883           /* Work out reloc type from what is required */
1884           SELECT_RELOC (n, q->howto);
1885 #else
1886           n.r_type = q->howto->type;
1887 #endif
1888           coff_swap_reloc_out (abfd, &n, &dst);
1889           if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
1890             return false;
1891         }
1892
1893 #ifdef TARG_AUX
1894       if (p != NULL)
1895         free (p);
1896 #endif
1897     }
1898
1899   return true;
1900 }
1901
1902 /* Set flags and magic number of a coff file from architecture and machine
1903    type.  Result is true if we can represent the arch&type, false if not.  */
1904
1905 static boolean
1906 coff_set_flags (abfd, magicp, flagsp)
1907      bfd * abfd;
1908      unsigned int *magicp;
1909      unsigned short *flagsp;
1910 {
1911   switch (bfd_get_arch (abfd))
1912     {
1913 #ifdef Z8KMAGIC
1914     case bfd_arch_z8k:
1915       *magicp = Z8KMAGIC;
1916       switch (bfd_get_mach (abfd))
1917         {
1918         case bfd_mach_z8001:
1919           *flagsp = F_Z8001;
1920           break;
1921         case bfd_mach_z8002:
1922           *flagsp = F_Z8002;
1923           break;
1924         default:
1925           return false;
1926         }
1927       return true;
1928 #endif
1929 #ifdef I960ROMAGIC
1930
1931     case bfd_arch_i960:
1932
1933       {
1934         unsigned flags;
1935         *magicp = I960ROMAGIC;
1936         /*
1937           ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
1938           I960RWMAGIC);   FIXME???
1939           */
1940         switch (bfd_get_mach (abfd))
1941           {
1942           case bfd_mach_i960_core:
1943             flags = F_I960CORE;
1944             break;
1945           case bfd_mach_i960_kb_sb:
1946             flags = F_I960KB;
1947             break;
1948           case bfd_mach_i960_mc:
1949             flags = F_I960MC;
1950             break;
1951           case bfd_mach_i960_xa:
1952             flags = F_I960XA;
1953             break;
1954           case bfd_mach_i960_ca:
1955             flags = F_I960CA;
1956             break;
1957           case bfd_mach_i960_ka_sa:
1958             flags = F_I960KA;
1959             break;
1960           case bfd_mach_i960_jx:
1961             flags = F_I960JX;
1962             break;
1963           case bfd_mach_i960_hx:
1964             flags = F_I960HX;
1965             break;
1966           default:
1967             return false;
1968           }
1969         *flagsp = flags;
1970         return true;
1971       }
1972       break;
1973 #endif
1974 /* start-sanitize-tic80 */
1975 #ifdef TIC80_ARCH_MAGIC
1976     case bfd_arch_tic80:
1977       *magicp = TIC80_ARCH_MAGIC;
1978       return true;
1979 #endif
1980 /* end-sanitize-tic80 */
1981 #ifdef ARMMAGIC
1982     case bfd_arch_arm:
1983       * magicp = ARMMAGIC;
1984       * flagsp = 0;
1985       if (APCS_SET (abfd))
1986         {
1987           if (APCS_26_FLAG (abfd))
1988             * flagsp |= F_APCS26;
1989           
1990           if (APCS_FLOAT_FLAG (abfd))
1991             * flagsp |= F_APCS_FLOAT;
1992           
1993           if (PIC_FLAG (abfd))
1994             * flagsp |= F_PIC;
1995         }
1996       if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
1997         * flagsp |= F_INTERWORK;
1998       switch (bfd_get_mach (abfd))
1999         {
2000         case bfd_mach_arm_2:  * flagsp |= F_ARM_2;  break;
2001         case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2002         case bfd_mach_arm_3:  * flagsp |= F_ARM_3;  break;
2003         case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2004         case bfd_mach_arm_4:  * flagsp |= F_ARM_4;  break;
2005         case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2006         }
2007       return true;
2008 #endif
2009 #ifdef PPCMAGIC
2010     case bfd_arch_powerpc:
2011       *magicp = PPCMAGIC;
2012       return true;
2013       break;
2014 #endif
2015 #ifdef I386MAGIC
2016     case bfd_arch_i386:
2017       *magicp = I386MAGIC;
2018 #ifdef LYNXOS
2019       /* Just overwrite the usual value if we're doing Lynx. */
2020       *magicp = LYNXCOFFMAGIC;
2021 #endif
2022       return true;
2023       break;
2024 #endif
2025 #ifdef I860MAGIC
2026     case bfd_arch_i860:
2027       *magicp = I860MAGIC;
2028       return true;
2029       break;
2030 #endif
2031 #ifdef MC68MAGIC
2032     case bfd_arch_m68k:
2033 #ifdef APOLLOM68KMAGIC
2034       *magicp = APOLLO_COFF_VERSION_NUMBER;
2035 #else
2036       /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c.  */
2037 #ifdef NAMES_HAVE_UNDERSCORE
2038       *magicp = MC68KBCSMAGIC;
2039 #else
2040       *magicp = MC68MAGIC;
2041 #endif
2042 #endif
2043 #ifdef LYNXOS
2044       /* Just overwrite the usual value if we're doing Lynx. */
2045       *magicp = LYNXCOFFMAGIC;
2046 #endif
2047       return true;
2048       break;
2049 #endif
2050
2051 #ifdef MC88MAGIC
2052     case bfd_arch_m88k:
2053       *magicp = MC88OMAGIC;
2054       return true;
2055       break;
2056 #endif
2057 #ifdef H8300MAGIC
2058     case bfd_arch_h8300:
2059       switch (bfd_get_mach (abfd))
2060         {
2061         case bfd_mach_h8300:
2062           *magicp = H8300MAGIC;
2063           return true;
2064         case bfd_mach_h8300h:
2065           *magicp = H8300HMAGIC;
2066           return true;
2067         case bfd_mach_h8300s:
2068           *magicp = H8300SMAGIC;
2069           return true;
2070         }
2071       break;
2072 #endif
2073
2074 #ifdef SH_ARCH_MAGIC_BIG
2075     case bfd_arch_sh:
2076       if (bfd_big_endian (abfd))
2077         *magicp = SH_ARCH_MAGIC_BIG;
2078       else
2079         *magicp = SH_ARCH_MAGIC_LITTLE;
2080       return true;
2081       break;
2082 #endif
2083
2084 #ifdef SPARCMAGIC
2085     case bfd_arch_sparc:
2086       *magicp = SPARCMAGIC;
2087 #ifdef LYNXOS
2088       /* Just overwrite the usual value if we're doing Lynx. */
2089       *magicp = LYNXCOFFMAGIC;
2090 #endif
2091       return true;
2092       break;
2093 #endif
2094
2095 #ifdef H8500MAGIC
2096     case bfd_arch_h8500:
2097       *magicp = H8500MAGIC;
2098       return true;
2099       break;
2100 #endif
2101 #ifdef A29K_MAGIC_BIG
2102     case bfd_arch_a29k:
2103       if (bfd_big_endian (abfd))
2104         *magicp = A29K_MAGIC_BIG;
2105       else
2106         *magicp = A29K_MAGIC_LITTLE;
2107       return true;
2108       break;
2109 #endif
2110
2111 #ifdef WE32KMAGIC
2112     case bfd_arch_we32k:
2113       *magicp = WE32KMAGIC;
2114       return true;
2115       break;
2116 #endif
2117
2118 #ifdef U802TOCMAGIC
2119     case bfd_arch_rs6000:
2120 #ifndef PPCMAGIC
2121     case bfd_arch_powerpc:
2122 #endif
2123       *magicp = U802TOCMAGIC;
2124       return true;
2125       break;
2126 #endif
2127
2128     default:                    /* Unknown architecture */
2129       /* return false;  -- fall through to "return false" below, to avoid
2130        "statement never reached" errors on the one below. */
2131       break;
2132     }
2133
2134   return false;
2135 }
2136
2137
2138 static boolean
2139 coff_set_arch_mach (abfd, arch, machine)
2140      bfd * abfd;
2141      enum bfd_architecture arch;
2142      unsigned long machine;
2143 {
2144   unsigned dummy1;
2145   unsigned short dummy2;
2146
2147   if (! bfd_default_set_arch_mach (abfd, arch, machine))
2148     return false;
2149
2150   if (arch != bfd_arch_unknown &&
2151       coff_set_flags (abfd, &dummy1, &dummy2) != true)
2152     return false;               /* We can't represent this type */
2153
2154   return true;                  /* We're easy ... */
2155 }
2156
2157
2158 /* Calculate the file position for each section. */
2159
2160 static boolean
2161 coff_compute_section_file_positions (abfd)
2162      bfd * abfd;
2163 {
2164   asection *current;
2165   asection *previous = (asection *) NULL;
2166   file_ptr sofar = FILHSZ;
2167   boolean align_adjust;
2168
2169 #ifndef I960
2170   file_ptr old_sofar;
2171 #endif
2172   unsigned int count;
2173
2174 #ifdef RS6000COFF_C
2175   /* On XCOFF, if we have symbols, set up the .debug section.  */
2176   if (bfd_get_symcount (abfd) > 0)
2177     {
2178       bfd_size_type sz;
2179       bfd_size_type i, symcount;
2180       asymbol **symp;
2181
2182       sz = 0;
2183       symcount = bfd_get_symcount (abfd);
2184       for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2185         {
2186           coff_symbol_type *cf;
2187
2188           cf = coff_symbol_from (abfd, *symp);
2189           if (cf != NULL
2190               && cf->native != NULL
2191               && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2192             {
2193               size_t len;
2194
2195               len = strlen (bfd_asymbol_name (*symp));
2196               if (len > SYMNMLEN)
2197                 sz += len + 3;
2198             }
2199         }
2200       if (sz > 0)
2201         {
2202           asection *dsec;
2203
2204           dsec = bfd_make_section_old_way (abfd, ".debug");
2205           if (dsec == NULL)
2206             abort ();
2207           dsec->_raw_size = sz;
2208           dsec->flags |= SEC_HAS_CONTENTS;
2209         }
2210     }
2211 #endif
2212
2213 #ifdef COFF_IMAGE_WITH_PE
2214   int page_size;
2215   if (coff_data (abfd)->link_info) 
2216     {
2217       page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2218     }
2219   else
2220     page_size = PE_DEF_FILE_ALIGNMENT;
2221 #else
2222 #ifdef COFF_PAGE_SIZE
2223   int page_size = COFF_PAGE_SIZE;
2224 #endif
2225 #endif
2226
2227   if (bfd_get_start_address (abfd))
2228     {
2229       /*  A start address may have been added to the original file. In this
2230           case it will need an optional header to record it.  */
2231       abfd->flags |= EXEC_P;
2232     }
2233
2234   if (abfd->flags & EXEC_P)
2235     sofar += AOUTSZ;
2236 #ifdef RS6000COFF_C
2237   else if (xcoff_data (abfd)->full_aouthdr)
2238     sofar += AOUTSZ;
2239   else
2240     sofar += SMALL_AOUTSZ;
2241 #endif
2242
2243   sofar += abfd->section_count * SCNHSZ;
2244
2245 #ifdef RS6000COFF_C
2246   /* XCOFF handles overflows in the reloc and line number count fields
2247      by allocating a new section header to hold the correct counts.  */
2248   for (current = abfd->sections; current != NULL; current = current->next)
2249     if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2250       sofar += SCNHSZ;
2251 #endif
2252
2253   align_adjust = false;
2254   for (current = abfd->sections, count = 1;
2255        current != (asection *) NULL;
2256        current = current->next, ++count)
2257     {
2258       current->target_index = count;
2259
2260       /* Only deal with sections which have contents */
2261       if (!(current->flags & SEC_HAS_CONTENTS))
2262         continue;
2263
2264       /* Align the sections in the file to the same boundary on
2265          which they are aligned in virtual memory.  I960 doesn't
2266          do this (FIXME) so we can stay in sync with Intel.  960
2267          doesn't yet page from files... */
2268 #ifndef I960
2269       if ((abfd->flags & EXEC_P) != 0)
2270         {
2271           /* make sure this section is aligned on the right boundary - by
2272              padding the previous section up if necessary */
2273
2274           old_sofar = sofar;
2275           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2276           if (previous != (asection *) NULL)
2277             {
2278               previous->_raw_size += sofar - old_sofar;
2279             }
2280         }
2281
2282 #endif
2283
2284       /* In demand paged files the low order bits of the file offset
2285          must match the low order bits of the virtual address.  */
2286 #ifdef COFF_PAGE_SIZE
2287       if ((abfd->flags & D_PAGED) != 0
2288           && (current->flags & SEC_ALLOC) != 0)
2289         sofar += (current->vma - sofar) % page_size;
2290 #endif
2291       current->filepos = sofar;
2292
2293 #ifdef COFF_IMAGE_WITH_PE
2294       /* With PE we have to pad each section to be a multiple of its
2295          page size too, and remember both sizes.  */
2296
2297       if (coff_section_data (abfd, current) == NULL)
2298         {
2299           current->used_by_bfd =
2300             (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
2301           if (current->used_by_bfd == NULL)
2302             return false;
2303         }
2304       if (pei_section_data (abfd, current) == NULL)
2305         {
2306           coff_section_data (abfd, current)->tdata =
2307             (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
2308           if (coff_section_data (abfd, current)->tdata == NULL)
2309             return false;
2310         }
2311       if (pei_section_data (abfd, current)->virt_size == 0)
2312         pei_section_data (abfd, current)->virt_size = current->_raw_size;
2313
2314       current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
2315 #endif
2316
2317       sofar += current->_raw_size;
2318
2319 #ifndef I960
2320       /* make sure that this section is of the right size too */
2321       if ((abfd->flags & EXEC_P) == 0)
2322         {
2323           bfd_size_type old_size;
2324
2325           old_size = current->_raw_size;
2326           current->_raw_size = BFD_ALIGN (current->_raw_size,
2327                                           1 << current->alignment_power);
2328           align_adjust = current->_raw_size != old_size;
2329           sofar += current->_raw_size - old_size;
2330         }
2331       else
2332         {
2333           old_sofar = sofar;
2334           sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2335           align_adjust = sofar != old_sofar;
2336           current->_raw_size += sofar - old_sofar;
2337         }
2338 #endif
2339
2340 #ifdef COFF_IMAGE_WITH_PE
2341       /* For PE we need to make sure we pad out to the aligned
2342          _raw_size, in case the caller only writes out data to the
2343          unaligned _raw_size.  */
2344       if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
2345         align_adjust = true;
2346 #endif
2347
2348 #ifdef _LIB
2349       /* Force .lib sections to start at zero.  The vma is then
2350          incremented in coff_set_section_contents.  This is right for
2351          SVR3.2.  */
2352       if (strcmp (current->name, _LIB) == 0)
2353         bfd_set_section_vma (abfd, current, 0);
2354 #endif
2355
2356       previous = current;
2357     }
2358
2359   /* It is now safe to write to the output file.  If we needed an
2360      alignment adjustment for the last section, then make sure that
2361      there is a byte at offset sofar.  If there are no symbols and no
2362      relocs, then nothing follows the last section.  If we don't force
2363      the last byte out, then the file may appear to be truncated.  */
2364   if (align_adjust)
2365     {
2366       bfd_byte b;
2367
2368       b = 0;
2369       if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
2370           || bfd_write (&b, 1, 1, abfd) != 1)
2371         return false;
2372     }
2373
2374   /* Make sure the relocations are aligned.  We don't need to make
2375      sure that this byte exists, because it will only matter if there
2376      really are relocs.  */
2377   sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
2378
2379   obj_relocbase (abfd) = sofar;
2380   abfd->output_has_begun = true;
2381
2382   return true;
2383 }
2384
2385 #if 0
2386
2387 /* This can never work, because it is called too late--after the
2388    section positions have been set.  I can't figure out what it is
2389    for, so I am going to disable it--Ian Taylor 20 March 1996.  */
2390
2391 /* If .file, .text, .data, .bss symbols are missing, add them.  */
2392 /* @@ Should we only be adding missing symbols, or overriding the aux
2393    values for existing section symbols?  */
2394 static boolean
2395 coff_add_missing_symbols (abfd)
2396      bfd *abfd;
2397 {
2398   unsigned int nsyms = bfd_get_symcount (abfd);
2399   asymbol **sympp = abfd->outsymbols;
2400   asymbol **sympp2;
2401   unsigned int i;
2402   int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
2403
2404   for (i = 0; i < nsyms; i++)
2405     {
2406       coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
2407       CONST char *name;
2408       if (csym)
2409         {
2410           /* only do this if there is a coff representation of the input
2411            symbol */
2412           if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
2413             {
2414               need_file = 0;
2415               continue;
2416             }
2417           name = csym->symbol.name;
2418           if (!name)
2419             continue;
2420           if (!strcmp (name, _TEXT))
2421             need_text = 0;
2422 #ifdef APOLLO_M68
2423           else if (!strcmp (name, ".wtext"))
2424             need_text = 0;
2425 #endif
2426           else if (!strcmp (name, _DATA))
2427             need_data = 0;
2428           else if (!strcmp (name, _BSS))
2429             need_bss = 0;
2430         }
2431     }
2432   /* Now i == bfd_get_symcount (abfd).  */
2433   /* @@ For now, don't deal with .file symbol.  */
2434   need_file = 0;
2435
2436   if (!need_text && !need_data && !need_bss && !need_file)
2437     return true;
2438   nsyms += need_text + need_data + need_bss + need_file;
2439   sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
2440   if (!sympp2)
2441     return false;
2442   memcpy (sympp2, sympp, i * sizeof (asymbol *));
2443   if (need_file)
2444     {
2445       /* @@ Generate fake .file symbol, in sympp2[i], and increment i.  */
2446       abort ();
2447     }
2448   if (need_text)
2449     sympp2[i++] = coff_section_symbol (abfd, _TEXT);
2450   if (need_data)
2451     sympp2[i++] = coff_section_symbol (abfd, _DATA);
2452   if (need_bss)
2453     sympp2[i++] = coff_section_symbol (abfd, _BSS);
2454   BFD_ASSERT (i == nsyms);
2455   bfd_set_symtab (abfd, sympp2, nsyms);
2456   return true;
2457 }
2458
2459 #endif /* 0 */
2460
2461 /* SUPPRESS 558 */
2462 /* SUPPRESS 529 */
2463 static boolean
2464 coff_write_object_contents (abfd)
2465      bfd * abfd;
2466 {
2467   asection *current;
2468   boolean hasrelocs = false;
2469   boolean haslinno = false;
2470   file_ptr scn_base;
2471   file_ptr reloc_base;
2472   file_ptr lineno_base;
2473   file_ptr sym_base;
2474   unsigned long reloc_size = 0;
2475   unsigned long lnno_size = 0;
2476   boolean long_section_names;
2477   asection *text_sec = NULL;
2478   asection *data_sec = NULL;
2479   asection *bss_sec = NULL;
2480   struct internal_filehdr internal_f;
2481   struct internal_aouthdr internal_a;
2482 #ifdef COFF_LONG_SECTION_NAMES
2483   size_t string_size = STRING_SIZE_SIZE;
2484 #endif
2485
2486   bfd_set_error (bfd_error_system_call);
2487
2488   /* Make a pass through the symbol table to count line number entries and
2489      put them into the correct asections */
2490
2491   lnno_size = coff_count_linenumbers (abfd) * LINESZ;
2492
2493   if (abfd->output_has_begun == false)
2494     {
2495       if (! coff_compute_section_file_positions (abfd))
2496         return false;
2497     }
2498
2499   reloc_base = obj_relocbase (abfd);
2500
2501   /* Work out the size of the reloc and linno areas */
2502
2503   for (current = abfd->sections; current != NULL; current =
2504        current->next)
2505     reloc_size += current->reloc_count * RELSZ;
2506
2507   lineno_base = reloc_base + reloc_size;
2508   sym_base = lineno_base + lnno_size;
2509
2510   /* Indicate in each section->line_filepos its actual file address */
2511   for (current = abfd->sections; current != NULL; current =
2512        current->next)
2513     {
2514       if (current->lineno_count)
2515         {
2516           current->line_filepos = lineno_base;
2517           current->moving_line_filepos = lineno_base;
2518           lineno_base += current->lineno_count * LINESZ;
2519         }
2520       else
2521         {
2522           current->line_filepos = 0;
2523         }
2524       if (current->reloc_count)
2525         {
2526           current->rel_filepos = reloc_base;
2527           reloc_base += current->reloc_count * RELSZ;
2528         }
2529       else
2530         {
2531           current->rel_filepos = 0;
2532         }
2533     }
2534
2535   /* Write section headers to the file.  */
2536   internal_f.f_nscns = 0;
2537
2538   if ((abfd->flags & EXEC_P) != 0)
2539     scn_base = FILHSZ + AOUTSZ;
2540   else
2541     {
2542       scn_base = FILHSZ;
2543 #ifdef RS6000COFF_C
2544       if (xcoff_data (abfd)->full_aouthdr)
2545         scn_base += AOUTSZ;
2546       else
2547         scn_base += SMALL_AOUTSZ;
2548 #endif
2549     }
2550
2551   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
2552     return false;
2553
2554   long_section_names = false;
2555   for (current = abfd->sections;
2556        current != NULL;
2557        current = current->next)
2558     {
2559       struct internal_scnhdr section;
2560
2561 #ifdef COFF_WITH_PE
2562       /* If we've got a .reloc section, remember. */
2563
2564 #ifdef COFF_IMAGE_WITH_PE
2565       if (strcmp (current->name, ".reloc") == 0)
2566         {
2567           pe_data (abfd)->has_reloc_section = 1;
2568         }
2569 #endif
2570
2571 #endif
2572       internal_f.f_nscns++;
2573
2574       strncpy (section.s_name, current->name, SCNNMLEN);
2575
2576 #ifdef COFF_LONG_SECTION_NAMES
2577       /* Handle long section names as in PE.  This must be compatible
2578          with the code in coff_write_symbols.  */
2579       {
2580         size_t len;
2581
2582         len = strlen (current->name);
2583         if (len > SCNNMLEN)
2584           {
2585             memset (section.s_name, 0, SCNNMLEN);
2586             sprintf (section.s_name, "/%lu", (unsigned long) string_size);
2587             string_size += len + 1;
2588             long_section_names = true;
2589           }
2590       }
2591 #endif
2592
2593 #ifdef _LIB
2594       /* Always set s_vaddr of .lib to 0.  This is right for SVR3.2
2595          Ian Taylor <ian@cygnus.com>.  */
2596       if (strcmp (current->name, _LIB) == 0)
2597         section.s_vaddr = 0;
2598       else
2599 #endif
2600       section.s_vaddr = current->vma;
2601       section.s_paddr = current->lma;
2602       section.s_size =  current->_raw_size;
2603
2604 #ifdef COFF_WITH_PE
2605       section.s_paddr = 0;
2606 #endif
2607 #ifdef COFF_IMAGE_WITH_PE
2608       /* Reminder: s_paddr holds the virtual size of the section.  */
2609       if (coff_section_data (abfd, current) != NULL
2610           && pei_section_data (abfd, current) != NULL)
2611         section.s_paddr = pei_section_data (abfd, current)->virt_size;
2612       else
2613         section.s_paddr = 0;
2614 #endif
2615
2616       /*
2617          If this section has no size or is unloadable then the scnptr
2618          will be 0 too
2619          */
2620       if (current->_raw_size == 0 ||
2621           (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2622         {
2623           section.s_scnptr = 0;
2624         }
2625       else
2626         {
2627           section.s_scnptr = current->filepos;
2628         }
2629       section.s_relptr = current->rel_filepos;
2630       section.s_lnnoptr = current->line_filepos;
2631       section.s_nreloc = current->reloc_count;
2632       section.s_nlnno = current->lineno_count;
2633       if (current->reloc_count != 0)
2634         hasrelocs = true;
2635       if (current->lineno_count != 0)
2636         haslinno = true;
2637
2638 #ifdef RS6000COFF_C
2639       /* Indicate the use of an XCOFF overflow section header.  */
2640       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2641         {
2642           section.s_nreloc = 0xffff;
2643           section.s_nlnno = 0xffff;
2644         }
2645 #endif
2646
2647       section.s_flags = sec_to_styp_flags (current->name, current->flags);
2648
2649       if (!strcmp (current->name, _TEXT))
2650         {
2651           text_sec = current;
2652         }
2653       else if (!strcmp (current->name, _DATA))
2654         {
2655           data_sec = current;
2656         }
2657       else if (!strcmp (current->name, _BSS))
2658         {
2659           bss_sec = current;
2660         }
2661
2662 #ifdef I960
2663       section.s_align = (current->alignment_power
2664                          ? 1 << current->alignment_power
2665                          : 0);
2666 /* start-sanitize-tic80 */
2667 #else
2668 #ifdef TIC80COFF
2669       section.s_flags |= (current->alignment_power & 0xF) << 8;
2670 #endif
2671 /* end-sanitize-tic80 */
2672 #endif
2673
2674 #ifdef COFF_IMAGE_WITH_PE
2675       /* suppress output of the sections if they are null.  ld includes
2676          the bss and data sections even if there is no size assigned
2677          to them.  NT loader doesn't like it if these section headers are
2678          included if the sections themselves are not needed */
2679       if (section.s_size == 0)
2680         internal_f.f_nscns--;
2681       else
2682 #endif
2683         {
2684           SCNHDR buff;
2685           if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
2686               || bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
2687             return false;
2688         }
2689
2690 #ifdef COFF_WITH_PE
2691       /* PE stores COMDAT section information in the symbol table.  If
2692          this section is supposed to have some COMDAT info, track down
2693          the symbol in the symbol table and modify it.  */
2694       if ((current->flags & SEC_LINK_ONCE) != 0)
2695         {
2696           unsigned int i, count;
2697           asymbol **psym;
2698           coff_symbol_type *csym;
2699
2700           count = bfd_get_symcount (abfd);
2701           for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
2702             {
2703               /* Here *PSYM is the section symbol for CURRENT.  */
2704
2705               if (strcmp ((*psym)->name, current->name) == 0)
2706                 {
2707                   csym = coff_symbol_from (abfd, *psym);
2708                   if (csym == NULL
2709                       || csym->native == NULL
2710                       || csym->native->u.syment.n_numaux < 1
2711                       || csym->native->u.syment.n_sclass != C_STAT
2712                       || csym->native->u.syment.n_type != T_NULL)
2713                     continue;
2714                   break;
2715                 }
2716             }
2717
2718           /* Did we find it?
2719              Note that we might not if we're converting the file from
2720              some other object file format.  */
2721           if (i < count)
2722             {
2723               combined_entry_type *aux;
2724
2725               /* We don't touch the x_checksum field.  The
2726                  x_associated field is not currently supported.  */
2727
2728               aux = csym->native + 1;
2729               switch (current->flags & SEC_LINK_DUPLICATES)
2730                 {
2731                 case SEC_LINK_DUPLICATES_DISCARD:
2732                   aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
2733                   break;
2734
2735                 case SEC_LINK_DUPLICATES_ONE_ONLY:
2736                   aux->u.auxent.x_scn.x_comdat =
2737                     IMAGE_COMDAT_SELECT_NODUPLICATES;
2738                   break;
2739
2740                 case SEC_LINK_DUPLICATES_SAME_SIZE:
2741                   aux->u.auxent.x_scn.x_comdat =
2742                     IMAGE_COMDAT_SELECT_SAME_SIZE;
2743                   break;
2744
2745                 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
2746                   aux->u.auxent.x_scn.x_comdat =
2747                     IMAGE_COMDAT_SELECT_EXACT_MATCH;
2748                   break;
2749                 }
2750             }
2751         }
2752 #endif /* COFF_WITH_PE */
2753     }
2754
2755 #ifdef RS6000COFF_C
2756   /* XCOFF handles overflows in the reloc and line number count fields
2757      by creating a new section header to hold the correct values.  */
2758   for (current = abfd->sections; current != NULL; current = current->next)
2759     {
2760       if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2761         {
2762           struct internal_scnhdr scnhdr;
2763           SCNHDR buff;
2764
2765           internal_f.f_nscns++;
2766           strncpy (&(scnhdr.s_name[0]), current->name, 8);
2767           scnhdr.s_paddr = current->reloc_count;
2768           scnhdr.s_vaddr = current->lineno_count;
2769           scnhdr.s_size = 0;
2770           scnhdr.s_scnptr = 0;
2771           scnhdr.s_relptr = current->rel_filepos;
2772           scnhdr.s_lnnoptr = current->line_filepos;
2773           scnhdr.s_nreloc = current->target_index;
2774           scnhdr.s_nlnno = current->target_index;
2775           scnhdr.s_flags = STYP_OVRFLO;
2776           if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
2777               || bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ)
2778             return false;
2779         }
2780     }
2781 #endif
2782
2783   /* OK, now set up the filehdr... */
2784
2785   /* Don't include the internal abs section in the section count */
2786
2787   /*
2788      We will NOT put a fucking timestamp in the header here. Every time you
2789      put it back, I will come in and take it out again.  I'm sorry.  This
2790      field does not belong here.  We fill it with a 0 so it compares the
2791      same but is not a reasonable time. -- gnu@cygnus.com
2792      */
2793   internal_f.f_timdat = 0;
2794
2795   internal_f.f_flags = 0;
2796
2797   if (abfd->flags & EXEC_P)
2798     internal_f.f_opthdr = AOUTSZ;
2799   else
2800     {
2801       internal_f.f_opthdr = 0;
2802 #ifdef RS6000COFF_C
2803       if (xcoff_data (abfd)->full_aouthdr)
2804         internal_f.f_opthdr = AOUTSZ;
2805       else
2806         internal_f.f_opthdr = SMALL_AOUTSZ;
2807 #endif
2808     }
2809
2810   if (!hasrelocs)
2811     internal_f.f_flags |= F_RELFLG;
2812   if (!haslinno)
2813     internal_f.f_flags |= F_LNNO;
2814   if (abfd->flags & EXEC_P)
2815     internal_f.f_flags |= F_EXEC;
2816
2817   /* FIXME: this is wrong for PPC_PE! */
2818   if (bfd_little_endian (abfd))
2819     internal_f.f_flags |= F_AR32WR;
2820   else
2821     internal_f.f_flags |= F_AR32W;
2822
2823 /* start-sanitize-tic80 */
2824 #ifdef TIC80_TARGET_ID
2825   internal_f.f_target_id = TIC80_TARGET_ID;
2826 #endif
2827 /* end-sanitize-tic80 */
2828
2829   /*
2830      FIXME, should do something about the other byte orders and
2831      architectures.
2832      */
2833
2834 #ifdef RS6000COFF_C
2835   if ((abfd->flags & DYNAMIC) != 0)
2836     internal_f.f_flags |= F_SHROBJ;
2837   if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
2838     internal_f.f_flags |= F_DYNLOAD;
2839 #endif
2840
2841   memset (&internal_a, 0, sizeof internal_a);
2842
2843   /* Set up architecture-dependent stuff */
2844
2845   {
2846     unsigned int magic = 0;
2847     unsigned short flags = 0;
2848     coff_set_flags (abfd, &magic, &flags);
2849     internal_f.f_magic = magic;
2850     internal_f.f_flags |= flags;
2851     /* ...and the "opt"hdr... */
2852
2853 #ifdef A29K
2854 #ifdef ULTRA3                   /* NYU's machine */
2855     /* FIXME: This is a bogus check.  I really want to see if there
2856      * is a .shbss or a .shdata section, if so then set the magic
2857      * number to indicate a shared data executable.
2858      */
2859     if (internal_f.f_nscns >= 7)
2860       internal_a.magic = SHMAGIC; /* Shared magic */
2861     else
2862 #endif /* ULTRA3 */
2863       internal_a.magic = NMAGIC; /* Assume separate i/d */
2864 #define __A_MAGIC_SET__
2865 #endif /* A29K */
2866 /* start-sanitize-tic80 */
2867 #ifdef TIC80COFF
2868     internal_a.magic = TIC80_ARCH_MAGIC;
2869 #define __A_MAGIC_SET__
2870 #endif /* TIC80 */
2871 /* end-sanitize-tic80 */
2872 #ifdef I860
2873     /* FIXME: What are the a.out magic numbers for the i860?  */
2874     internal_a.magic = 0;
2875 #define __A_MAGIC_SET__
2876 #endif /* I860 */
2877 #ifdef I960
2878     internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
2879 #define __A_MAGIC_SET__
2880 #endif /* I960 */
2881 #if M88
2882 #define __A_MAGIC_SET__
2883     internal_a.magic = PAGEMAGICBCS;
2884 #endif /* M88 */
2885
2886 #if APOLLO_M68
2887 #define __A_MAGIC_SET__
2888     internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
2889 #endif
2890
2891 #if defined(M68) || defined(WE32K) || defined(M68K)
2892 #define __A_MAGIC_SET__
2893 #if defined(LYNXOS)
2894     internal_a.magic = LYNXCOFFMAGIC;
2895 #else
2896 #if defined(TARG_AUX)
2897     internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
2898                         abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
2899                         PAGEMAGICEXECSWAPPED);
2900 #else
2901 #if defined (PAGEMAGICPEXECPAGED)
2902     internal_a.magic = PAGEMAGICPEXECPAGED;
2903 #endif
2904 #endif /* TARG_AUX */
2905 #endif /* LYNXOS */
2906 #endif /* M68 || WE32K || M68K */
2907
2908 #if defined(ARM)
2909 #define __A_MAGIC_SET__
2910     internal_a.magic = ZMAGIC;
2911 #endif 
2912
2913 #if defined(PPC_PE)
2914 #define __A_MAGIC_SET__
2915     internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
2916 #endif
2917
2918 #if defined(I386)
2919 #define __A_MAGIC_SET__
2920 #if defined(LYNXOS)
2921     internal_a.magic = LYNXCOFFMAGIC;
2922 #else  /* LYNXOS */
2923     internal_a.magic = ZMAGIC;
2924 #endif /* LYNXOS */
2925 #endif /* I386 */
2926
2927 #if defined(SPARC)
2928 #define __A_MAGIC_SET__
2929 #if defined(LYNXOS)
2930     internal_a.magic = LYNXCOFFMAGIC;
2931 #endif /* LYNXOS */
2932 #endif /* SPARC */
2933
2934 #ifdef RS6000COFF_C
2935 #define __A_MAGIC_SET__
2936     internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
2937     (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
2938     RS6K_AOUTHDR_OMAGIC;
2939 #endif
2940
2941 #ifndef __A_MAGIC_SET__
2942 #include "Your aouthdr magic number is not being set!"
2943 #else
2944 #undef __A_MAGIC_SET__
2945 #endif
2946   }
2947
2948   /* FIXME: Does anybody ever set this to another value?  */
2949   internal_a.vstamp = 0;
2950
2951   /* Now should write relocs, strings, syms */
2952   obj_sym_filepos (abfd) = sym_base;
2953
2954   if (bfd_get_symcount (abfd) != 0)
2955     {
2956       int firstundef;
2957 #if 0
2958       if (!coff_add_missing_symbols (abfd))
2959         return false;
2960 #endif
2961       if (!coff_renumber_symbols (abfd, &firstundef))
2962         return false;
2963       coff_mangle_symbols (abfd);
2964       if (! coff_write_symbols (abfd))
2965         return false;
2966       if (! coff_write_linenumbers (abfd))
2967         return false;
2968       if (! coff_write_relocs (abfd, firstundef))
2969         return false;
2970     }
2971 #ifdef COFF_IMAGE_WITH_PE
2972 #ifdef PPC_PE
2973   else if ((abfd->flags & EXEC_P) != 0)
2974     {
2975       bfd_byte b;
2976
2977       /* PowerPC PE appears to require that all executable files be
2978          rounded up to the page size.  */
2979       b = 0;
2980       if (bfd_seek (abfd,
2981                     BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
2982                     SEEK_SET) != 0
2983           || bfd_write (&b, 1, 1, abfd) != 1)
2984         return false;
2985     }
2986 #endif
2987 #endif
2988
2989   /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
2990      backend linker, and obj_raw_syment_count is not valid until after
2991      coff_write_symbols is called.  */
2992   if (obj_raw_syment_count (abfd) != 0)
2993     {
2994       internal_f.f_symptr = sym_base;
2995 #ifdef RS6000COFF_C
2996       /* AIX appears to require that F_RELFLG not be set if there are
2997          local symbols but no relocations.  */
2998       internal_f.f_flags &=~ F_RELFLG;
2999 #endif
3000     }
3001   else
3002     {
3003       if (long_section_names)
3004         internal_f.f_symptr = sym_base;
3005       else
3006         internal_f.f_symptr = 0;
3007       internal_f.f_flags |= F_LSYMS;
3008     }
3009
3010   if (text_sec)
3011     {
3012       internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3013       internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3014     }
3015   if (data_sec)
3016     {
3017       internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3018       internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
3019     }
3020   if (bss_sec)
3021     {
3022       internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
3023       if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
3024         internal_a.data_start = bss_sec->vma;
3025     }
3026
3027   internal_a.entry = bfd_get_start_address (abfd);
3028   internal_f.f_nsyms = obj_raw_syment_count (abfd);
3029
3030 #ifdef RS6000COFF_C
3031   if (xcoff_data (abfd)->full_aouthdr)
3032     {
3033       bfd_vma toc;
3034       asection *loader_sec;
3035
3036       internal_a.vstamp = 1;
3037
3038       internal_a.o_snentry = xcoff_data (abfd)->snentry;
3039       if (internal_a.o_snentry == 0)
3040         internal_a.entry = (bfd_vma) -1;
3041
3042       if (text_sec != NULL)
3043         {
3044           internal_a.o_sntext = text_sec->target_index;
3045           internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
3046         }
3047       else
3048         {
3049           internal_a.o_sntext = 0;
3050           internal_a.o_algntext = 0;
3051         }
3052       if (data_sec != NULL)
3053         {
3054           internal_a.o_sndata = data_sec->target_index;
3055           internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
3056         }
3057       else
3058         {
3059           internal_a.o_sndata = 0;
3060           internal_a.o_algndata = 0;
3061         }
3062       loader_sec = bfd_get_section_by_name (abfd, ".loader");
3063       if (loader_sec != NULL)
3064         internal_a.o_snloader = loader_sec->target_index;
3065       else
3066         internal_a.o_snloader = 0;
3067       if (bss_sec != NULL)
3068         internal_a.o_snbss = bss_sec->target_index;
3069       else
3070         internal_a.o_snbss = 0;
3071
3072       toc = xcoff_data (abfd)->toc;
3073       internal_a.o_toc = toc;
3074       internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
3075
3076       internal_a.o_modtype = xcoff_data (abfd)->modtype;
3077       if (xcoff_data (abfd)->cputype != -1)
3078         internal_a.o_cputype = xcoff_data (abfd)->cputype;
3079       else
3080         {
3081           switch (bfd_get_arch (abfd))
3082             {
3083             case bfd_arch_rs6000:
3084               internal_a.o_cputype = 4;
3085               break;
3086             case bfd_arch_powerpc:
3087               if (bfd_get_mach (abfd) == 0)
3088                 internal_a.o_cputype = 3;
3089               else
3090                 internal_a.o_cputype = 1;
3091               break;
3092             default:
3093               abort ();
3094             }
3095         }
3096       internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
3097       internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
3098     }
3099 #endif
3100
3101   /* now write them */
3102   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3103     return false;
3104   {
3105     char buff[FILHSZ];
3106     coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
3107     if (bfd_write ((PTR) buff, 1, FILHSZ, abfd) != FILHSZ)
3108       return false;
3109   }
3110   if (abfd->flags & EXEC_P)
3111     {
3112       /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR. 
3113          include/coff/pe.h sets AOUTSZ == sizeof(PEAOUTHDR)) */
3114       char buff[AOUTSZ];
3115       coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
3116       if (bfd_write ((PTR) buff, 1, AOUTSZ, abfd) != AOUTSZ)
3117         return false;
3118     }
3119 #ifdef RS6000COFF_C
3120   else
3121     {
3122       AOUTHDR buff;
3123       size_t size;
3124
3125       /* XCOFF seems to always write at least a small a.out header.  */
3126       coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3127       if (xcoff_data (abfd)->full_aouthdr)
3128         size = AOUTSZ;
3129       else
3130         size = SMALL_AOUTSZ;
3131       if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
3132         return false;
3133     }
3134 #endif
3135
3136   return true;
3137 }
3138
3139 static boolean
3140 coff_set_section_contents (abfd, section, location, offset, count)
3141      bfd * abfd;
3142      sec_ptr section;
3143      PTR location;
3144      file_ptr offset;
3145      bfd_size_type count;
3146 {
3147   if (abfd->output_has_begun == false)  /* set by bfd.c handler */
3148     {
3149       if (! coff_compute_section_file_positions (abfd))
3150         return false;
3151     }
3152
3153 #if defined(_LIB) && !defined(TARG_AUX)
3154
3155    /* The physical address field of a .lib section is used to hold the
3156       number of shared libraries in the section.  This code counts the
3157       number of sections being written, and increments the lma field
3158       with the number.
3159
3160       I have found no documentation on the contents of this section.
3161       Experimentation indicates that the section contains zero or more
3162       records, each of which has the following structure:
3163
3164       - a (four byte) word holding the length of this record, in words,
3165       - a word that always seems to be set to "2",
3166       - the path to a shared library, null-terminated and then padded
3167         to a whole word boundary.
3168
3169       bfd_assert calls have been added to alert if an attempt is made
3170       to write a section which doesn't follow these assumptions.  The
3171       code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
3172       <robertl@arnet.com> (Thanks!).
3173   
3174       Gvran Uddeborg <gvran@uddeborg.pp.se> */
3175
3176     if (strcmp (section->name, _LIB) == 0)
3177       {
3178         bfd_byte *rec, *recend;
3179
3180         rec = (bfd_byte *) location;
3181         recend = rec + count;
3182         while (rec < recend)
3183           {
3184             ++section->lma;
3185             rec += bfd_get_32 (abfd, rec) * 4;
3186           }
3187
3188         BFD_ASSERT (rec == recend);
3189       }
3190
3191 #endif
3192
3193   /* Don't write out bss sections - one way to do this is to
3194        see if the filepos has not been set. */
3195   if (section->filepos == 0)
3196     return true;
3197
3198   if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
3199     return false;
3200
3201   if (count != 0)
3202     {
3203       return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3204     }
3205   return true;
3206 }
3207 #if 0
3208 static boolean
3209 coff_close_and_cleanup (abfd)
3210      bfd *abfd;
3211 {
3212   if (!bfd_read_p (abfd))
3213     switch (abfd->format)
3214       {
3215       case bfd_archive:
3216         if (!_bfd_write_archive_contents (abfd))
3217           return false;
3218         break;
3219       case bfd_object:
3220         if (!coff_write_object_contents (abfd))
3221           return false;
3222         break;
3223       default:
3224         bfd_set_error (bfd_error_invalid_operation);
3225         return false;
3226       }
3227
3228   /* We depend on bfd_close to free all the memory on the objalloc.  */
3229   return true;
3230 }
3231
3232 #endif
3233
3234 static PTR
3235 buy_and_read (abfd, where, seek_direction, size)
3236      bfd *abfd;
3237      file_ptr where;
3238      int seek_direction;
3239      size_t size;
3240 {
3241   PTR area = (PTR) bfd_alloc (abfd, size);
3242   if (!area)
3243     return (NULL);
3244   if (bfd_seek (abfd, where, seek_direction) != 0
3245       || bfd_read (area, 1, size, abfd) != size)
3246     return (NULL);
3247   return (area);
3248 }                               /* buy_and_read() */
3249
3250 /*
3251 SUBSUBSECTION
3252         Reading linenumbers
3253
3254         Creating the linenumber table is done by reading in the entire
3255         coff linenumber table, and creating another table for internal use.
3256
3257         A coff linenumber table is structured so that each function
3258         is marked as having a line number of 0. Each line within the
3259         function is an offset from the first line in the function. The
3260         base of the line number information for the table is stored in
3261         the symbol associated with the function.
3262
3263         The information is copied from the external to the internal
3264         table, and each symbol which marks a function is marked by
3265         pointing its...
3266
3267         How does this work ?
3268
3269 */
3270
3271 static boolean
3272 coff_slurp_line_table (abfd, asect)
3273      bfd *abfd;
3274      asection *asect;
3275 {
3276   LINENO *native_lineno;
3277   alent *lineno_cache;
3278
3279   BFD_ASSERT (asect->lineno == (alent *) NULL);
3280
3281   native_lineno = (LINENO *) buy_and_read (abfd,
3282                                            asect->line_filepos,
3283                                            SEEK_SET,
3284                                            (size_t) (LINESZ *
3285                                                      asect->lineno_count));
3286   lineno_cache =
3287     (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
3288   if (lineno_cache == NULL)
3289     return false;
3290   else
3291     {
3292       unsigned int counter = 0;
3293       alent *cache_ptr = lineno_cache;
3294       LINENO *src = native_lineno;
3295
3296       while (counter < asect->lineno_count)
3297         {
3298           struct internal_lineno dst;
3299           coff_swap_lineno_in (abfd, src, &dst);
3300           cache_ptr->line_number = dst.l_lnno;
3301
3302           if (cache_ptr->line_number == 0)
3303             {
3304               boolean warned;
3305               long symndx;
3306               coff_symbol_type *sym;
3307
3308               warned = false;
3309               symndx = dst.l_addr.l_symndx;
3310               if (symndx < 0 || symndx >= obj_raw_syment_count (abfd))
3311                 {
3312                   (*_bfd_error_handler)
3313                     ("%s: warning: illegal symbol index %ld in line numbers",
3314                      bfd_get_filename (abfd), dst.l_addr.l_symndx);
3315                   symndx = 0;
3316                   warned = true;
3317                 }
3318               /* FIXME: We should not be casting between ints and
3319                  pointers like this.  */
3320               sym = ((coff_symbol_type *)
3321                      ((symndx + obj_raw_syments (abfd))
3322                       ->u.syment._n._n_n._n_zeroes));
3323               cache_ptr->u.sym = (asymbol *) sym;
3324               if (sym->lineno != NULL && ! warned)
3325                 {
3326                   (*_bfd_error_handler)
3327                     ("%s: warning: duplicate line number information for `%s'",
3328                      bfd_get_filename (abfd),
3329                      bfd_asymbol_name (&sym->symbol));
3330                 }
3331               sym->lineno = cache_ptr;
3332             }
3333           else
3334             {
3335               cache_ptr->u.offset = dst.l_addr.l_paddr
3336                 - bfd_section_vma (abfd, asect);
3337             }                   /* If no linenumber expect a symbol index */
3338
3339           cache_ptr++;
3340           src++;
3341           counter++;
3342         }
3343       cache_ptr->line_number = 0;
3344
3345     }
3346   asect->lineno = lineno_cache;
3347   /* FIXME, free native_lineno here, or use alloca or something. */
3348   return true;
3349 }
3350
3351 static boolean
3352 coff_slurp_symbol_table (abfd)
3353      bfd * abfd;
3354 {
3355   combined_entry_type *native_symbols;
3356   coff_symbol_type *cached_area;
3357   unsigned int *table_ptr;
3358
3359   unsigned int number_of_symbols = 0;
3360
3361   if (obj_symbols (abfd))
3362     return true;
3363
3364   /* Read in the symbol table */
3365   if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
3366     {
3367       return (false);
3368     }                           /* on error */
3369
3370   /* Allocate enough room for all the symbols in cached form */
3371   cached_area = ((coff_symbol_type *)
3372                  bfd_alloc (abfd,
3373                             (obj_raw_syment_count (abfd)
3374                              * sizeof (coff_symbol_type))));
3375
3376   if (cached_area == NULL)
3377     return false;
3378   table_ptr = ((unsigned int *)
3379                bfd_alloc (abfd,
3380                           (obj_raw_syment_count (abfd)
3381                            * sizeof (unsigned int))));
3382
3383   if (table_ptr == NULL)
3384     return false;
3385   else
3386     {
3387       coff_symbol_type *dst = cached_area;
3388       unsigned int last_native_index = obj_raw_syment_count (abfd);
3389       unsigned int this_index = 0;
3390       while (this_index < last_native_index)
3391         {
3392           combined_entry_type *src = native_symbols + this_index;
3393           table_ptr[this_index] = number_of_symbols;
3394           dst->symbol.the_bfd = abfd;
3395
3396           dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
3397           /* We use the native name field to point to the cached field.  */
3398           src->u.syment._n._n_n._n_zeroes = (long) dst;
3399           dst->symbol.section = coff_section_from_bfd_index (abfd,
3400                                                      src->u.syment.n_scnum);
3401           dst->symbol.flags = 0;
3402           dst->done_lineno = false;
3403
3404           switch (src->u.syment.n_sclass)
3405             {
3406 #ifdef I960
3407             case C_LEAFEXT:
3408 #if 0
3409               dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
3410               dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3411               dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3412 #endif
3413               /* Fall through to next case */
3414
3415 #endif
3416
3417             case C_EXT:
3418 #ifdef ARM
3419             case C_THUMBEXT:
3420             case C_THUMBEXTFUNC:
3421 #endif
3422 #ifdef RS6000COFF_C
3423             case C_HIDEXT:
3424 #endif
3425 #ifdef C_SYSTEM
3426             case C_SYSTEM:      /* System Wide variable */
3427 #endif
3428 #ifdef COFF_WITH_PE
3429             /* PE uses storage class 0x68 to denote a section symbol */
3430             case C_SECTION:
3431             /* PE uses storage class 0x67 for a weak external symbol.  */
3432             case C_NT_WEAK:
3433 #endif
3434               if ((src->u.syment.n_scnum) == 0)
3435                 {
3436                   if ((src->u.syment.n_value) == 0)
3437                     {
3438                       dst->symbol.section = bfd_und_section_ptr;
3439                       dst->symbol.value = 0;
3440                     }
3441                   else
3442                     {
3443                       dst->symbol.section = bfd_com_section_ptr;
3444                       dst->symbol.value = (src->u.syment.n_value);
3445                     }
3446                 }
3447               else
3448                 {
3449                   /* Base the value as an index from the base of the
3450                      section */
3451
3452                   dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3453
3454 #if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE)
3455                   /* PE sets the symbol to a value relative to the
3456                      start of the section.  */
3457                   dst->symbol.value = src->u.syment.n_value;
3458 #else
3459                   dst->symbol.value = (src->u.syment.n_value
3460                                        - dst->symbol.section->vma);
3461 #endif
3462
3463                   if (ISFCN ((src->u.syment.n_type)))
3464                     {
3465                       /* A function ext does not go at the end of a
3466                          file.  */
3467                       dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3468                     }
3469                 }
3470
3471 #ifdef RS6000COFF_C
3472               /* A C_HIDEXT symbol is not global.  */
3473               if (src->u.syment.n_sclass == C_HIDEXT)
3474                 dst->symbol.flags = BSF_LOCAL;
3475               /* A symbol with a csect entry should not go at the end.  */
3476               if (src->u.syment.n_numaux > 0)
3477                 dst->symbol.flags |= BSF_NOT_AT_END;
3478 #endif
3479
3480 #ifdef COFF_WITH_PE
3481               if (src->u.syment.n_sclass == C_NT_WEAK)
3482                 dst->symbol.flags = BSF_WEAK;
3483 #endif
3484
3485               break;
3486
3487             case C_STAT:        /* static                        */
3488 #ifdef I960
3489             case C_LEAFSTAT:    /* static leaf procedure        */
3490 #endif
3491 #ifdef ARM
3492             case C_THUMBSTAT:   /* Thumb static                  */
3493             case C_THUMBLABEL:  /* Thumb label                   */
3494             case C_THUMBSTATFUNC:/* Thumb static function        */
3495 #endif
3496             case C_LABEL:       /* label                         */
3497               if (src->u.syment.n_scnum == -2)
3498                 dst->symbol.flags = BSF_DEBUGGING;
3499               else
3500                 dst->symbol.flags = BSF_LOCAL;
3501
3502               /* Base the value as an index from the base of the
3503                  section, if there is one.  */
3504               if (dst->symbol.section)
3505                 {
3506 #if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE)
3507                   /* PE sets the symbol to a value relative to the
3508                      start of the section.  */
3509                   dst->symbol.value = src->u.syment.n_value;
3510 #else
3511                   dst->symbol.value = (src->u.syment.n_value
3512                                        - dst->symbol.section->vma);
3513 #endif
3514                 }
3515               else
3516                 dst->symbol.value = src->u.syment.n_value;
3517               break;
3518
3519             case C_MOS: /* member of structure   */
3520             case C_EOS: /* end of structure              */
3521 #ifdef NOTDEF                   /* C_AUTOARG has the same value */
3522 #ifdef C_GLBLREG
3523             case C_GLBLREG:     /* A29k-specific storage class */
3524 #endif
3525 #endif
3526             case C_REGPARM:     /* register parameter            */
3527             case C_REG: /* register variable             */
3528 /* start-sanitize-tic80 */
3529 #ifndef TIC80COFF
3530 /* end-sanitize-tic80 */
3531 #ifdef C_AUTOARG
3532             case C_AUTOARG:     /* 960-specific storage class */
3533 #endif
3534 /* start-sanitize-tic80 */
3535 #endif
3536 /* end-sanitize-tic80 */
3537             case C_TPDEF:       /* type definition               */
3538             case C_ARG:
3539             case C_AUTO:        /* automatic variable */
3540             case C_FIELD:       /* bit field */
3541             case C_ENTAG:       /* enumeration tag               */
3542             case C_MOE: /* member of enumeration         */
3543             case C_MOU: /* member of union               */
3544             case C_UNTAG:       /* union tag                     */
3545               dst->symbol.flags = BSF_DEBUGGING;
3546               dst->symbol.value = (src->u.syment.n_value);
3547               break;
3548
3549             case C_FILE:        /* file name                     */
3550             case C_STRTAG:      /* structure tag                 */
3551 #ifdef RS6000COFF_C
3552             case C_GSYM:
3553             case C_LSYM:
3554             case C_PSYM:
3555             case C_RSYM:
3556             case C_RPSYM:
3557             case C_STSYM:
3558             case C_BCOMM:
3559             case C_ECOMM:
3560             case C_DECL:
3561             case C_ENTRY:
3562             case C_FUN:
3563             case C_ESTAT:
3564 #endif
3565               dst->symbol.flags = BSF_DEBUGGING;
3566               dst->symbol.value = (src->u.syment.n_value);
3567               break;
3568
3569 #ifdef RS6000COFF_C
3570             case C_BINCL:       /* beginning of include file     */
3571             case C_EINCL:       /* ending of include file        */
3572               /* The value is actually a pointer into the line numbers
3573                  of the file.  We locate the line number entry, and
3574                  set the section to the section which contains it, and
3575                  the value to the index in that section.  */
3576               {
3577                 asection *sec;
3578
3579                 dst->symbol.flags = BSF_DEBUGGING;
3580                 for (sec = abfd->sections; sec != NULL; sec = sec->next)
3581                   if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
3582                       && ((file_ptr) (sec->line_filepos
3583                                       + sec->lineno_count * LINESZ)
3584                           > (file_ptr) src->u.syment.n_value))
3585                     break;
3586                 if (sec == NULL)
3587                   dst->symbol.value = 0;
3588                 else
3589                   {
3590                     dst->symbol.section = sec;
3591                     dst->symbol.value = ((src->u.syment.n_value
3592                                           - sec->line_filepos)
3593                                          / LINESZ);
3594                     src->fix_line = 1;
3595                   }
3596               }
3597               break;
3598
3599             case C_BSTAT:
3600               dst->symbol.flags = BSF_DEBUGGING;
3601
3602               /* The value is actually a symbol index.  Save a pointer
3603                  to the symbol instead of the index.  FIXME: This
3604                  should use a union.  */
3605               src->u.syment.n_value =
3606                 (long) (native_symbols + src->u.syment.n_value);
3607               dst->symbol.value = src->u.syment.n_value;
3608               src->fix_value = 1;
3609               break;
3610 #endif
3611
3612             case C_BLOCK:       /* ".bb" or ".eb"                */
3613             case C_FCN:         /* ".bf" or ".ef"                */
3614             case C_EFCN:        /* physical end of function      */
3615               dst->symbol.flags = BSF_LOCAL;
3616 #if defined (COFF_WITH_PE) || defined (COFF_IMAGE_WITH_PE)
3617               /* PE sets the symbol to a value relative to the start
3618                  of the section.  */
3619               dst->symbol.value = src->u.syment.n_value;
3620 #else
3621               /* Base the value as an index from the base of the
3622                  section.  */
3623               dst->symbol.value = (src->u.syment.n_value
3624                                    - dst->symbol.section->vma);
3625 #endif
3626               break;
3627
3628             case C_NULL:
3629             case C_EXTDEF:      /* external definition           */
3630             case C_ULABEL:      /* undefined label               */
3631             case C_USTATIC:     /* undefined static              */
3632 #ifndef COFF_WITH_PE
3633             /* C_LINE in regular coff is 0x68.  NT has taken over this storage
3634                class to represent a section symbol */
3635             case C_LINE:        /* line # reformatted as symbol table entry */
3636               /* NT uses 0x67 for a weak symbol, not C_ALIAS.  */
3637             case C_ALIAS:       /* duplicate tag                 */
3638 #endif
3639 /* start-sanitize-tic80 */
3640               /* New storage classes for TIc80 */
3641 #ifdef TIC80COFF
3642             case C_UEXT:        /* Tentative external definition */
3643 #endif
3644             case C_STATLAB:     /* Static load time label */
3645             case C_EXTLAB:      /* External load time label */
3646 /* end-sanitize-tic80 */
3647             case C_HIDDEN:      /* ext symbol in dmert public lib */
3648             default:
3649               (*_bfd_error_handler)
3650                 ("%s: Unrecognized storage class %d for %s symbol `%s'",
3651                  bfd_get_filename (abfd), src->u.syment.n_sclass,
3652                  dst->symbol.section->name, dst->symbol.name);
3653               dst->symbol.flags = BSF_DEBUGGING;
3654               dst->symbol.value = (src->u.syment.n_value);
3655               break;
3656             }
3657
3658 /*      BFD_ASSERT(dst->symbol.flags != 0);*/
3659
3660           dst->native = src;
3661
3662           dst->symbol.udata.i = 0;
3663           dst->lineno = (alent *) NULL;
3664           this_index += (src->u.syment.n_numaux) + 1;
3665           dst++;
3666           number_of_symbols++;
3667         }                       /* walk the native symtab */
3668     }                           /* bfdize the native symtab */
3669
3670   obj_symbols (abfd) = cached_area;
3671   obj_raw_syments (abfd) = native_symbols;
3672
3673   bfd_get_symcount (abfd) = number_of_symbols;
3674   obj_convert (abfd) = table_ptr;
3675   /* Slurp the line tables for each section too */
3676   {
3677     asection *p;
3678     p = abfd->sections;
3679     while (p)
3680       {
3681         coff_slurp_line_table (abfd, p);
3682         p = p->next;
3683       }
3684   }
3685   return true;
3686 }                               /* coff_slurp_symbol_table() */
3687
3688 /* Check whether a symbol is globally visible.  This is used by the
3689    COFF backend linker code in cofflink.c, since a couple of targets
3690    have globally visible symbols which are not class C_EXT.  This
3691    function need not handle the case of n_class == C_EXT.  */
3692
3693 #undef OTHER_GLOBAL_CLASS
3694
3695 #ifdef I960
3696 #define OTHER_GLOBAL_CLASS C_LEAFEXT
3697 #endif
3698
3699 #ifdef COFFARM
3700 #ifdef COFF_WITH_PE
3701 #define OTHER_GLOBAL_CLASS C_SECTION || syment->n_sclass == C_THUMBEXT
3702 #else
3703 #define OTHER_GLOBAL_CLASS C_THUMBEXT || syment->n_sclass == C_THUMBEXTFUNC
3704 #endif
3705 #else
3706 #ifdef COFF_WITH_PE
3707 #define OTHER_GLOBAL_CLASS C_SECTION
3708 #endif
3709 #endif
3710
3711 #ifdef OTHER_GLOBAL_CLASS
3712
3713 static boolean coff_sym_is_global PARAMS ((bfd *, struct internal_syment *));
3714
3715 static boolean
3716 coff_sym_is_global (abfd, syment)
3717      bfd *abfd;
3718      struct internal_syment *syment;
3719 {
3720   if (syment->n_sclass == OTHER_GLOBAL_CLASS)
3721     return true;
3722   return false;
3723 }
3724
3725 #undef OTHER_GLOBAL_CLASS
3726
3727 #else /* ! defined (OTHER_GLOBAL_CLASS) */
3728
3729 /* sym_is_global should not be defined if it has nothing to do.  */
3730
3731 #define coff_sym_is_global 0
3732
3733 #endif /* ! defined (OTHER_GLOBAL_CLASS) */
3734
3735 /*
3736 SUBSUBSECTION
3737         Reading relocations
3738
3739         Coff relocations are easily transformed into the internal BFD form
3740         (@code{arelent}).
3741
3742         Reading a coff relocation table is done in the following stages:
3743
3744         o Read the entire coff relocation table into memory.
3745
3746         o Process each relocation in turn; first swap it from the
3747         external to the internal form.
3748
3749         o Turn the symbol referenced in the relocation's symbol index
3750         into a pointer into the canonical symbol table.
3751         This table is the same as the one returned by a call to
3752         @code{bfd_canonicalize_symtab}. The back end will call that
3753         routine and save the result if a canonicalization hasn't been done.
3754
3755         o The reloc index is turned into a pointer to a howto
3756         structure, in a back end specific way. For instance, the 386
3757         and 960 use the @code{r_type} to directly produce an index
3758         into a howto table vector; the 88k subtracts a number from the
3759         @code{r_type} field and creates an addend field.
3760
3761
3762 */
3763
3764 #ifndef CALC_ADDEND
3765 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr)                \
3766   {                                                             \
3767     coff_symbol_type *coffsym = (coff_symbol_type *) NULL;      \
3768     if (ptr && bfd_asymbol_bfd (ptr) != abfd)                   \
3769       coffsym = (obj_symbols (abfd)                             \
3770                  + (cache_ptr->sym_ptr_ptr - symbols));         \
3771     else if (ptr)                                               \
3772       coffsym = coff_symbol_from (abfd, ptr);                   \
3773     if (coffsym != (coff_symbol_type *) NULL                    \
3774         && coffsym->native->u.syment.n_scnum == 0)              \
3775       cache_ptr->addend = 0;                                    \
3776     else if (ptr && bfd_asymbol_bfd (ptr) == abfd               \
3777              && ptr->section != (asection *) NULL)              \
3778       cache_ptr->addend = - (ptr->section->vma + ptr->value);   \
3779     else                                                        \
3780       cache_ptr->addend = 0;                                    \
3781   }
3782 #endif
3783
3784 static boolean
3785 coff_slurp_reloc_table (abfd, asect, symbols)
3786      bfd * abfd;
3787      sec_ptr asect;
3788      asymbol ** symbols;
3789 {
3790   RELOC *native_relocs;
3791   arelent *reloc_cache;
3792   arelent *cache_ptr;
3793
3794   unsigned int idx;
3795
3796   if (asect->relocation)
3797     return true;
3798   if (asect->reloc_count == 0)
3799     return true;
3800   if (asect->flags & SEC_CONSTRUCTOR)
3801     return true;
3802   if (!coff_slurp_symbol_table (abfd))
3803     return false;
3804   native_relocs =
3805     (RELOC *) buy_and_read (abfd,
3806                             asect->rel_filepos,
3807                             SEEK_SET,
3808                             (size_t) (RELSZ *
3809                                       asect->reloc_count));
3810   reloc_cache = (arelent *)
3811     bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
3812
3813   if (reloc_cache == NULL)
3814     return false;
3815
3816
3817   for (idx = 0; idx < asect->reloc_count; idx++)
3818     {
3819       struct internal_reloc dst;
3820       struct external_reloc *src;
3821 #ifndef RELOC_PROCESSING
3822       asymbol *ptr;
3823 #endif
3824
3825       cache_ptr = reloc_cache + idx;
3826       src = native_relocs + idx;
3827
3828       coff_swap_reloc_in (abfd, src, &dst);
3829
3830 #ifdef RELOC_PROCESSING
3831       RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
3832 #else
3833       cache_ptr->address = dst.r_vaddr;
3834
3835       if (dst.r_symndx != -1)
3836         {
3837           if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
3838             {
3839               (*_bfd_error_handler)
3840                 ("%s: warning: illegal symbol index %ld in relocs",
3841                  bfd_get_filename (abfd), dst.r_symndx);
3842               cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3843               ptr = NULL;
3844             }
3845           else
3846             {
3847               cache_ptr->sym_ptr_ptr = (symbols
3848                                         + obj_convert (abfd)[dst.r_symndx]);
3849               ptr = *(cache_ptr->sym_ptr_ptr);
3850             }
3851         }
3852       else
3853         {
3854           cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3855           ptr = NULL;
3856         }
3857
3858       /* The symbols definitions that we have read in have been
3859          relocated as if their sections started at 0. But the offsets
3860          refering to the symbols in the raw data have not been
3861          modified, so we have to have a negative addend to compensate.
3862
3863          Note that symbols which used to be common must be left alone */
3864
3865       /* Calculate any reloc addend by looking at the symbol */
3866       CALC_ADDEND (abfd, ptr, dst, cache_ptr);
3867
3868       cache_ptr->address -= asect->vma;
3869 /* !!     cache_ptr->section = (asection *) NULL;*/
3870
3871       /* Fill in the cache_ptr->howto field from dst.r_type */
3872       RTYPE2HOWTO (cache_ptr, &dst);
3873 #endif  /* RELOC_PROCESSING */
3874
3875       if (cache_ptr->howto == NULL)
3876         {
3877           (*_bfd_error_handler)
3878             ("%s: illegal relocation type %d at address 0x%lx",
3879              bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
3880           bfd_set_error (bfd_error_bad_value);
3881           return false;
3882         }
3883     }
3884
3885   asect->relocation = reloc_cache;
3886   return true;
3887 }
3888
3889 #ifndef coff_rtype_to_howto
3890 #ifdef RTYPE2HOWTO
3891
3892 /* Get the howto structure for a reloc.  This is only used if the file
3893    including this one defines coff_relocate_section to be
3894    _bfd_coff_generic_relocate_section, so it is OK if it does not
3895    always work.  It is the responsibility of the including file to
3896    make sure it is reasonable if it is needed.  */
3897
3898 static reloc_howto_type *coff_rtype_to_howto
3899   PARAMS ((bfd *, asection *, struct internal_reloc *,
3900            struct coff_link_hash_entry *, struct internal_syment *,
3901            bfd_vma *));
3902
3903 /*ARGSUSED*/
3904 static reloc_howto_type *
3905 coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
3906      bfd *abfd;
3907      asection *sec;
3908      struct internal_reloc *rel;
3909      struct coff_link_hash_entry *h;
3910      struct internal_syment *sym;
3911      bfd_vma *addendp;
3912 {
3913   arelent genrel;
3914
3915   RTYPE2HOWTO (&genrel, rel);
3916   return genrel.howto;
3917 }
3918
3919 #else /* ! defined (RTYPE2HOWTO) */
3920
3921 #define coff_rtype_to_howto NULL
3922
3923 #endif /* ! defined (RTYPE2HOWTO) */
3924 #endif /* ! defined (coff_rtype_to_howto) */
3925
3926 /* This is stupid.  This function should be a boolean predicate.  */
3927 static long
3928 coff_canonicalize_reloc (abfd, section, relptr, symbols)
3929      bfd * abfd;
3930      sec_ptr section;
3931      arelent ** relptr;
3932      asymbol ** symbols;
3933 {
3934   arelent *tblptr = section->relocation;
3935   unsigned int count = 0;
3936
3937
3938   if (section->flags & SEC_CONSTRUCTOR)
3939     {
3940       /* this section has relocs made up by us, they are not in the
3941        file, so take them out of their chain and place them into
3942        the data area provided */
3943       arelent_chain *chain = section->constructor_chain;
3944       for (count = 0; count < section->reloc_count; count++)
3945         {
3946           *relptr++ = &chain->relent;
3947           chain = chain->next;
3948         }
3949
3950     }
3951   else
3952     {
3953       if (! coff_slurp_reloc_table (abfd, section, symbols))
3954         return -1;
3955
3956       tblptr = section->relocation;
3957
3958       for (; count++ < section->reloc_count;)
3959         *relptr++ = tblptr++;
3960
3961
3962     }
3963   *relptr = 0;
3964   return section->reloc_count;
3965 }
3966
3967 #ifdef GNU960
3968 file_ptr
3969 coff_sym_filepos (abfd)
3970      bfd *abfd;
3971 {
3972   return obj_sym_filepos (abfd);
3973 }
3974 #endif
3975
3976 #ifndef coff_reloc16_estimate
3977 #define coff_reloc16_estimate dummy_reloc16_estimate
3978
3979 static int dummy_reloc16_estimate
3980   PARAMS ((bfd *, asection *, arelent *, unsigned int,
3981            struct bfd_link_info *));
3982
3983 static int
3984 dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
3985      bfd *abfd;
3986      asection *input_section;
3987      arelent *reloc;
3988      unsigned int shrink;
3989      struct bfd_link_info *link_info;
3990 {
3991   abort ();
3992 }
3993
3994 #endif
3995
3996 #ifndef coff_reloc16_extra_cases
3997
3998 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
3999
4000 /* This works even if abort is not declared in any header file.  */
4001
4002 static void dummy_reloc16_extra_cases
4003   PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
4004            bfd_byte *, unsigned int *, unsigned int *));
4005
4006 static void
4007 dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
4008                            dst_ptr)
4009      bfd *abfd;
4010      struct bfd_link_info *link_info;
4011      struct bfd_link_order *link_order;
4012      arelent *reloc;
4013      bfd_byte *data;
4014      unsigned int *src_ptr;
4015      unsigned int *dst_ptr;
4016 {
4017   abort ();
4018 }
4019 #endif
4020
4021 /* If coff_relocate_section is defined, we can use the optimized COFF
4022    backend linker.  Otherwise we must continue to use the old linker.  */
4023 #ifdef coff_relocate_section
4024 #ifndef coff_bfd_link_hash_table_create
4025 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
4026 #endif
4027 #ifndef coff_bfd_link_add_symbols
4028 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
4029 #endif
4030 #ifndef coff_bfd_final_link
4031 #define coff_bfd_final_link _bfd_coff_final_link
4032 #endif
4033 #else /* ! defined (coff_relocate_section) */
4034 #define coff_relocate_section NULL
4035 #ifndef coff_bfd_link_hash_table_create
4036 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
4037 #endif
4038 #ifndef coff_bfd_link_add_symbols
4039 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
4040 #endif
4041 #define coff_bfd_final_link _bfd_generic_final_link
4042 #endif /* ! defined (coff_relocate_section) */
4043
4044 #define coff_bfd_link_split_section  _bfd_generic_link_split_section
4045
4046 #ifndef coff_start_final_link
4047 #define coff_start_final_link NULL
4048 #endif
4049
4050 #ifndef coff_adjust_symndx
4051 #define coff_adjust_symndx NULL
4052 #endif
4053
4054 #ifndef coff_link_add_one_symbol
4055 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
4056 #endif
4057
4058 static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
4059 {
4060   coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in,
4061   coff_swap_aux_out, coff_swap_sym_out,
4062   coff_swap_lineno_out, coff_swap_reloc_out,
4063   coff_swap_filehdr_out, coff_swap_aouthdr_out,
4064   coff_swap_scnhdr_out,
4065   FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ,
4066 #ifdef COFF_LONG_FILENAMES
4067   true,
4068 #else
4069   false,
4070 #endif
4071 #ifdef COFF_LONG_SECTION_NAMES
4072   true,
4073 #else
4074   false,
4075 #endif
4076   COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
4077   coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in,
4078   coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
4079   coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
4080   coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
4081   coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
4082   coff_sym_is_global, coff_compute_section_file_positions,
4083   coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
4084   coff_adjust_symndx, coff_link_add_one_symbol
4085 };
4086
4087 #ifndef coff_close_and_cleanup
4088 #define coff_close_and_cleanup              _bfd_generic_close_and_cleanup
4089 #endif
4090
4091 #ifndef coff_bfd_free_cached_info
4092 #define coff_bfd_free_cached_info           _bfd_generic_bfd_free_cached_info
4093 #endif
4094
4095 #ifndef coff_get_section_contents
4096 #define coff_get_section_contents           _bfd_generic_get_section_contents
4097 #endif
4098
4099 #ifndef coff_bfd_copy_private_symbol_data
4100 #define coff_bfd_copy_private_symbol_data   _bfd_generic_bfd_copy_private_symbol_data
4101 #endif
4102
4103 #ifndef coff_bfd_copy_private_section_data
4104 #define coff_bfd_copy_private_section_data  _bfd_generic_bfd_copy_private_section_data
4105 #endif
4106
4107 #ifndef coff_bfd_copy_private_bfd_data 
4108 #define coff_bfd_copy_private_bfd_data      _bfd_generic_bfd_copy_private_bfd_data
4109 #endif
4110
4111 #ifndef coff_bfd_merge_private_bfd_data
4112 #define coff_bfd_merge_private_bfd_data     _bfd_generic_bfd_merge_private_bfd_data
4113 #endif
4114
4115 #ifndef coff_bfd_set_private_flags
4116 #define coff_bfd_set_private_flags          _bfd_generic_bfd_set_private_flags
4117 #endif
4118
4119 #ifndef coff_bfd_print_private_bfd_data 
4120 #define coff_bfd_print_private_bfd_data     _bfd_generic_bfd_print_private_bfd_data
4121 #endif
4122
4123 #ifndef coff_bfd_is_local_label_name
4124 #define coff_bfd_is_local_label_name        _bfd_coff_is_local_label_name
4125 #endif
4126
4127 #ifndef coff_read_minisymbols
4128 #define coff_read_minisymbols               _bfd_generic_read_minisymbols
4129 #endif
4130
4131 #ifndef coff_minisymbol_to_symbol
4132 #define coff_minisymbol_to_symbol           _bfd_generic_minisymbol_to_symbol
4133 #endif
4134
4135 /* The reloc lookup routine must be supplied by each individual COFF
4136    backend.  */
4137 #ifndef coff_bfd_reloc_type_lookup
4138 #define coff_bfd_reloc_type_lookup          _bfd_norelocs_bfd_reloc_type_lookup
4139 #endif
4140
4141 #ifndef coff_bfd_get_relocated_section_contents
4142 #define coff_bfd_get_relocated_section_contents \
4143   bfd_generic_get_relocated_section_contents
4144 #endif
4145
4146 #ifndef coff_bfd_relax_section
4147 #define coff_bfd_relax_section              bfd_generic_relax_section
4148 #endif