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