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