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