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