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