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, §ion, &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