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