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