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