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