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