* targmatch.sed: Delete case statements.
[binutils.git] / bfd / coffcode.h
blob3683fac76fda2f766d6f876af65d7bbf55f0d67a
1 /* Support for the generic parts of most COFF variants, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
24 Most of this hacked by Steve Chamberlain,
25 sac@cygnus.com
29 SECTION
30 coff backends
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.
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}.
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}.
52 SUBSECTION
53 Porting to a new version of coff
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.
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.
77 SUBSECTION
78 How the coff backend works
80 SUBSUBSECTION
81 File layout
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.
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.
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}.
101 Some of the Coff targets then also have additional routines in
102 the target source file itself.
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.
113 SUBSUBSECTION
114 Bit twiddling
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}
135 and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
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.
148 SUBSUBSECTION
149 Symbol reading
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".
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"}).
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.
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.
186 Any linenumbers are read from the coff file too, and attached
187 to the symbols which own the functions the linenumbers belong to.
189 SUBSUBSECTION
190 Symbol writing
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.
198 When the symbols have come from a coff file then all the
199 debugging information is preserved.
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.
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.
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}.
223 o <<coff_mangle_symbols>>
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
228 structured hierachy required by coff. It changes each pointer
229 to a symbol into the index into the symbol table of the asymbol.
231 o <<coff_write_symbols>>
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.
240 INTERNAL_DEFINITION
241 coff_symbol_type
243 DESCRIPTION
244 The hidden information for an <<asymbol>> is described in a
245 <<combined_entry_type>>:
247 CODE_FRAGMENT
249 .typedef struct coff_ptr_struct
252 . {* Remembers the offset from the first symbol in the file for
253 . this symbol. Generated by coff_renumber_symbols. *}
254 .unsigned int offset;
256 . {* Should the value of this symbol be renumbered. Used for
257 . XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. *}
258 .unsigned int fix_value : 1;
260 . {* Should the tag field of this symbol be renumbered.
261 . Created by coff_pointerize_aux. *}
262 .unsigned int fix_tag : 1;
264 . {* Should the endidx field of this symbol be renumbered.
265 . Created by coff_pointerize_aux. *}
266 .unsigned int fix_end : 1;
268 . {* Should the x_csect.x_scnlen field be renumbered.
269 . Created by coff_pointerize_aux. *}
270 .unsigned int fix_scnlen : 1;
272 . {* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the
273 . index into the line number entries. Set by
274 . coff_slurp_symbol_table. *}
275 .unsigned int fix_line : 1;
277 . {* The container for the symbol structure as read and translated
278 . from the file. *}
280 .union {
281 . union internal_auxent auxent;
282 . struct internal_syment syment;
283 . } u;
284 .} combined_entry_type;
287 .{* Each canonical asymbol really looks like this: *}
289 .typedef struct coff_symbol_struct
291 . {* The actual symbol which the rest of BFD works with *}
292 .asymbol symbol;
294 . {* A pointer to the hidden information for this symbol *}
295 .combined_entry_type *native;
297 . {* A pointer to the linenumber information for this symbol *}
298 .struct lineno_cache_entry *lineno;
300 . {* Have the line numbers been relocated yet ? *}
301 .boolean done_lineno;
302 .} coff_symbol_type;
306 #ifdef COFF_WITH_PE
307 #include "peicode.h"
308 #else
309 #include "coffswap.h"
310 #endif
312 #define STRING_SIZE_SIZE (4)
314 static long sec_to_styp_flags PARAMS ((const char *, flagword));
315 static boolean styp_to_sec_flags
316 PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
317 static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
318 static void coff_set_custom_section_alignment
319 PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *,
320 const unsigned int));
321 static boolean coff_new_section_hook PARAMS ((bfd *, asection *));
322 static boolean coff_set_arch_mach_hook PARAMS ((bfd *, PTR));
323 static boolean coff_write_relocs PARAMS ((bfd *, int));
324 static boolean coff_set_flags
325 PARAMS ((bfd *, unsigned int *, unsigned short *));
326 static boolean coff_set_arch_mach
327 PARAMS ((bfd *, enum bfd_architecture, unsigned long));
328 static boolean coff_compute_section_file_positions PARAMS ((bfd *));
329 static boolean coff_write_object_contents PARAMS ((bfd *)) ATTRIBUTE_UNUSED;
330 static boolean coff_set_section_contents
331 PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
332 static PTR buy_and_read PARAMS ((bfd *, file_ptr, int, size_t));
333 static boolean coff_slurp_line_table PARAMS ((bfd *, asection *));
334 static boolean coff_slurp_symbol_table PARAMS ((bfd *));
335 static enum coff_symbol_classification coff_classify_symbol
336 PARAMS ((bfd *, struct internal_syment *));
337 static boolean coff_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **));
338 static long coff_canonicalize_reloc
339 PARAMS ((bfd *, asection *, arelent **, asymbol **));
340 #ifndef coff_mkobject_hook
341 static PTR coff_mkobject_hook PARAMS ((bfd *, PTR, PTR));
342 #endif
343 #ifdef COFF_WITH_PE
344 static flagword handle_COMDAT PARAMS ((bfd *, flagword, PTR, const char *, asection *));
345 #endif
347 /* void warning(); */
349 /* Return a word with STYP_* (scnhdr.s_flags) flags set to represent
350 the incoming SEC_* flags. The inverse of this function is
351 styp_to_sec_flags(). NOTE: If you add to/change this routine, you
352 should probably mirror the changes in styp_to_sec_flags(). */
354 #ifndef COFF_WITH_PE
356 /* Macros for setting debugging flags. */
357 #ifdef STYP_DEBUG
358 #define STYP_XCOFF_DEBUG STYP_DEBUG
359 #else
360 #define STYP_XCOFF_DEBUG STYP_INFO
361 #endif
363 #ifdef COFF_ALIGN_IN_S_FLAGS
364 #define STYP_DEBUG_INFO STYP_DSECT
365 #else
366 #define STYP_DEBUG_INFO STYP_INFO
367 #endif
369 static long
370 sec_to_styp_flags (sec_name, sec_flags)
371 CONST char *sec_name;
372 flagword sec_flags;
374 long styp_flags = 0;
376 if (!strcmp (sec_name, _TEXT))
378 styp_flags = STYP_TEXT;
380 else if (!strcmp (sec_name, _DATA))
382 styp_flags = STYP_DATA;
384 else if (!strcmp (sec_name, _BSS))
386 styp_flags = STYP_BSS;
387 #ifdef _COMMENT
389 else if (!strcmp (sec_name, _COMMENT))
391 styp_flags = STYP_INFO;
392 #endif /* _COMMENT */
393 #ifdef _LIB
395 else if (!strcmp (sec_name, _LIB))
397 styp_flags = STYP_LIB;
398 #endif /* _LIB */
399 #ifdef _LIT
401 else if (!strcmp (sec_name, _LIT))
403 styp_flags = STYP_LIT;
404 #endif /* _LIT */
406 else if (!strncmp (sec_name, ".debug", 6))
408 /* Handle the XCOFF debug section and DWARF2 debug sections. */
409 if (!sec_name[6])
410 styp_flags = STYP_XCOFF_DEBUG;
411 else
412 styp_flags = STYP_DEBUG_INFO;
414 else if (!strncmp (sec_name, ".stab", 5))
416 styp_flags = STYP_DEBUG_INFO;
418 #ifdef COFF_LONG_SECTION_NAMES
419 else if (!strncmp (sec_name, ".gnu.linkonce.wi.", 17))
421 styp_flags = STYP_DEBUG_INFO;
423 #endif
424 #ifdef RS6000COFF_C
425 else if (!strcmp (sec_name, _PAD))
427 styp_flags = STYP_PAD;
429 else if (!strcmp (sec_name, _LOADER))
431 styp_flags = STYP_LOADER;
433 #endif
434 /* Try and figure out what it should be */
435 else if (sec_flags & SEC_CODE)
437 styp_flags = STYP_TEXT;
439 else if (sec_flags & SEC_DATA)
441 styp_flags = STYP_DATA;
443 else if (sec_flags & SEC_READONLY)
445 #ifdef STYP_LIT /* 29k readonly text/data section */
446 styp_flags = STYP_LIT;
447 #else
448 styp_flags = STYP_TEXT;
449 #endif /* STYP_LIT */
451 else if (sec_flags & SEC_LOAD)
453 styp_flags = STYP_TEXT;
455 else if (sec_flags & SEC_ALLOC)
457 styp_flags = STYP_BSS;
460 #ifdef STYP_CLINK
461 if (sec_flags & SEC_CLINK)
462 styp_flags |= STYP_CLINK;
463 #endif
465 #ifdef STYP_BLOCK
466 if (sec_flags & SEC_BLOCK)
467 styp_flags |= STYP_BLOCK;
468 #endif
470 #ifdef STYP_NOLOAD
471 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
472 styp_flags |= STYP_NOLOAD;
473 #endif
475 return styp_flags;
478 #else /* COFF_WITH_PE */
480 /* The PE version; see above for the general comments. The non-PE
481 case seems to be more guessing, and breaks PE format; specifically,
482 .rdata is readonly, but it sure ain't text. Really, all this
483 should be set up properly in gas (or whatever assembler is in use),
484 and honor whatever objcopy/strip, etc. sent us as input. */
486 static long
487 sec_to_styp_flags (sec_name, sec_flags)
488 const char *sec_name ATTRIBUTE_UNUSED;
489 flagword sec_flags;
491 long styp_flags = 0;
493 /* caution: there are at least three groups of symbols that have
494 very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
495 SEC_* are the BFD internal flags, used for generic BFD
496 information. STYP_* are the COFF section flags which appear in
497 COFF files. IMAGE_SCN_* are the PE section flags which appear in
498 PE files. The STYP_* flags and the IMAGE_SCN_* flags overlap,
499 but there are more IMAGE_SCN_* flags. */
501 /* skip LOAD */
502 /* READONLY later */
503 /* skip RELOC */
504 if ((sec_flags & SEC_CODE) != 0)
505 styp_flags |= IMAGE_SCN_CNT_CODE;
506 if ((sec_flags & SEC_DATA) != 0)
507 styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
508 if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
509 styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */
510 /* skip ROM */
511 /* skip CONSTRUCTOR */
512 /* skip CONTENTS */
513 #ifdef STYP_NOLOAD
514 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
515 styp_flags |= STYP_NOLOAD;
516 #endif
517 if ((sec_flags & SEC_IS_COMMON) != 0)
518 styp_flags |= IMAGE_SCN_LNK_COMDAT;
519 if ((sec_flags & SEC_DEBUGGING) != 0)
520 styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
521 if ((sec_flags & SEC_EXCLUDE) != 0)
522 styp_flags |= IMAGE_SCN_LNK_REMOVE;
523 if ((sec_flags & SEC_NEVER_LOAD) != 0)
524 styp_flags |= IMAGE_SCN_LNK_REMOVE;
525 /* skip IN_MEMORY */
526 /* skip SORT */
527 if (sec_flags & SEC_LINK_ONCE)
528 styp_flags |= IMAGE_SCN_LNK_COMDAT;
529 /* skip LINK_DUPLICATES */
530 /* skip LINKER_CREATED */
532 /* For now, the read/write bits are mapped onto SEC_READONLY, even
533 though the semantics don't quite match. The bits from the input
534 are retained in pei_section_data(abfd, section)->pe_flags */
536 styp_flags |= IMAGE_SCN_MEM_READ; /* always readable. */
537 if ((sec_flags & SEC_READONLY) == 0)
538 styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write */
539 if (sec_flags & SEC_CODE)
540 styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE */
541 if (sec_flags & SEC_SHARED)
542 styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful */
544 return styp_flags;
547 #endif /* COFF_WITH_PE */
549 /* Return a word with SEC_* flags set to represent the incoming STYP_*
550 flags (from scnhdr.s_flags). The inverse of this function is
551 sec_to_styp_flags(). NOTE: If you add to/change this routine, you
552 should probably mirror the changes in sec_to_styp_flags(). */
554 #ifndef COFF_WITH_PE
556 static boolean
557 styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
558 bfd *abfd ATTRIBUTE_UNUSED;
559 PTR hdr;
560 const char *name;
561 asection *section ATTRIBUTE_UNUSED;
562 flagword *flags_ptr;
564 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
565 long styp_flags = internal_s->s_flags;
566 flagword sec_flags = 0;
568 #ifdef STYP_BLOCK
569 if (styp_flags & STYP_BLOCK)
570 sec_flags |= SEC_BLOCK;
571 #endif
573 #ifdef STYP_CLINK
574 if (styp_flags & STYP_CLINK)
575 sec_flags |= SEC_CLINK;
576 #endif
578 #ifdef STYP_NOLOAD
579 if (styp_flags & STYP_NOLOAD)
580 sec_flags |= SEC_NEVER_LOAD;
581 #endif /* STYP_NOLOAD */
583 /* For 386 COFF, at least, an unloadable text or data section is
584 actually a shared library section. */
585 if (styp_flags & STYP_TEXT)
587 if (sec_flags & SEC_NEVER_LOAD)
588 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
589 else
590 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
592 else if (styp_flags & STYP_DATA)
594 if (sec_flags & SEC_NEVER_LOAD)
595 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
596 else
597 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
599 else if (styp_flags & STYP_BSS)
601 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
602 if (sec_flags & SEC_NEVER_LOAD)
603 sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
604 else
605 #endif
606 sec_flags |= SEC_ALLOC;
608 else if (styp_flags & STYP_INFO)
610 /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
611 defined. coff_compute_section_file_positions uses
612 COFF_PAGE_SIZE to ensure that the low order bits of the
613 section VMA and the file offset match. If we don't know
614 COFF_PAGE_SIZE, we can't ensure the correct correspondence,
615 and demand page loading of the file will fail. */
616 #if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS)
617 sec_flags |= SEC_DEBUGGING;
618 #endif
620 else if (styp_flags & STYP_PAD)
621 sec_flags = 0;
622 else if (strcmp (name, _TEXT) == 0)
624 if (sec_flags & SEC_NEVER_LOAD)
625 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
626 else
627 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
629 else if (strcmp (name, _DATA) == 0)
631 if (sec_flags & SEC_NEVER_LOAD)
632 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
633 else
634 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
636 else if (strcmp (name, _BSS) == 0)
638 #ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
639 if (sec_flags & SEC_NEVER_LOAD)
640 sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
641 else
642 #endif
643 sec_flags |= SEC_ALLOC;
645 else if (strncmp (name, ".debug", 6) == 0
646 #ifdef _COMMENT
647 || strcmp (name, _COMMENT) == 0
648 #endif
649 #ifdef COFF_LONG_SECTION_NAMES
650 || strncmp (name, ".gnu.linkonce.wi.", 17) == 0
651 #endif
652 || strncmp (name, ".stab", 5) == 0)
654 #ifdef COFF_PAGE_SIZE
655 sec_flags |= SEC_DEBUGGING;
656 #endif
658 #ifdef _LIB
659 else if (strcmp (name, _LIB) == 0)
661 #endif
662 #ifdef _LIT
663 else if (strcmp (name, _LIT) == 0)
664 sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
665 #endif
666 else
667 sec_flags |= SEC_ALLOC | SEC_LOAD;
669 #ifdef STYP_LIT /* A29k readonly text/data section type */
670 if ((styp_flags & STYP_LIT) == STYP_LIT)
671 sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
672 #endif /* STYP_LIT */
674 #ifdef STYP_OTHER_LOAD /* Other loaded sections */
675 if (styp_flags & STYP_OTHER_LOAD)
676 sec_flags = (SEC_LOAD | SEC_ALLOC);
677 #endif /* STYP_SDATA */
679 #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
680 /* As a GNU extension, if the name begins with .gnu.linkonce, we
681 only link a single copy of the section. This is used to support
682 g++. g++ will emit each template expansion in its own section.
683 The symbols will be defined as weak, so that multiple definitions
684 are permitted. The GNU linker extension is to actually discard
685 all but one of the sections. */
686 if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
687 sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
688 #endif
690 if (flags_ptr == NULL)
691 return false;
693 * flags_ptr = sec_flags;
694 return true;
697 #else /* COFF_WITH_PE */
699 static flagword
700 handle_COMDAT (abfd, sec_flags, hdr, name, section)
701 bfd * abfd;
702 flagword sec_flags;
703 PTR hdr;
704 const char *name;
705 asection *section;
707 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
708 bfd_byte *esymstart, *esym, *esymend;
709 int seen_state = 0;
710 char *target_name = NULL;
712 sec_flags |= SEC_LINK_ONCE;
714 /* Unfortunately, the PE format stores essential information in
715 the symbol table, of all places. We need to extract that
716 information now, so that objdump and the linker will know how
717 to handle the section without worrying about the symbols. We
718 can't call slurp_symtab, because the linker doesn't want the
719 swapped symbols. */
721 /* COMDAT sections are special. The first symbol is the section
722 symbol, which tells what kind of COMDAT section it is. The
723 second symbol is the "comdat symbol" - the one with the
724 unique name. GNU uses the section symbol for the unique
725 name; MS uses ".text" for every comdat section. Sigh. - DJ */
727 /* This is not mirrored in sec_to_styp_flags(), but there
728 doesn't seem to be a need to, either, and it would at best be
729 rather messy. */
731 if (! _bfd_coff_get_external_symbols (abfd))
732 return sec_flags;
734 esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
735 esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
737 while (esym < esymend)
739 struct internal_syment isym;
740 char buf[SYMNMLEN + 1];
741 const char *symname;
743 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
745 if (sizeof (internal_s->s_name) > SYMNMLEN)
747 /* This case implies that the matching
748 symbol name will be in the string table. */
749 abort ();
752 if (isym.n_scnum == section->target_index)
754 /* According to the MSVC documentation, the first
755 TWO entries with the section # are both of
756 interest to us. The first one is the "section
757 symbol" (section name). The second is the comdat
758 symbol name. Here, we've found the first
759 qualifying entry; we distinguish it from the
760 second with a state flag.
762 In the case of gas-generated (at least until that
763 is fixed) .o files, it isn't necessarily the
764 second one. It may be some other later symbol.
766 Since gas also doesn't follow MS conventions and
767 emits the section similar to .text$<name>, where
768 <something> is the name we're looking for, we
769 distinguish the two as follows:
771 If the section name is simply a section name (no
772 $) we presume it's MS-generated, and look at
773 precisely the second symbol for the comdat name.
774 If the section name has a $, we assume it's
775 gas-generated, and look for <something> (whatever
776 follows the $) as the comdat symbol. */
778 /* All 3 branches use this */
779 symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
781 if (symname == NULL)
782 abort ();
784 switch (seen_state)
786 case 0:
788 /* The first time we've seen the symbol. */
789 union internal_auxent aux;
791 seen_state = 1;
793 /* If it isn't the stuff we're expecting, die;
794 The MS documentation is vague, but it
795 appears that the second entry serves BOTH
796 as the comdat symbol and the defining
797 symbol record (either C_STAT or C_EXT,
798 possibly with an aux entry with debug
799 information if it's a function.) It
800 appears the only way to find the second one
801 is to count. (On Intel, they appear to be
802 adjacent, but on Alpha, they have been
803 found separated.)
805 Here, we think we've found the first one,
806 but there's some checking we can do to be
807 sure. */
809 if (! (isym.n_sclass == C_STAT
810 && isym.n_type == T_NULL
811 && isym.n_value == 0))
812 abort ();
814 /* FIXME LATER: MSVC generates section names
815 like .text for comdats. Gas generates
816 names like .text$foo__Fv (in the case of a
817 function). See comment above for more. */
819 if (strcmp (name, symname) != 0)
820 abort ();
822 /* This is the section symbol. */
823 bfd_coff_swap_aux_in (abfd, (PTR) (esym + bfd_coff_symesz (abfd)),
824 isym.n_type, isym.n_sclass,
825 0, isym.n_numaux, (PTR) &aux);
827 target_name = strchr (name, '$');
828 if (target_name != NULL)
830 /* Gas mode. */
831 seen_state = 2;
832 /* Skip the `$'. */
833 target_name += 1;
836 /* FIXME: Microsoft uses NODUPLICATES and
837 ASSOCIATIVE, but gnu uses ANY and
838 SAME_SIZE. Unfortunately, gnu doesn't do
839 the comdat symbols right. So, until we can
840 fix it to do the right thing, we are
841 temporarily disabling comdats for the MS
842 types (they're used in DLLs and C++, but we
843 don't support *their* C++ libraries anyway
844 - DJ. */
846 /* Cygwin does not follow the MS style, and
847 uses ANY and SAME_SIZE where NODUPLICATES
848 and ASSOCIATIVE should be used. For
849 Interix, we just do the right thing up
850 front. */
852 switch (aux.x_scn.x_comdat)
854 case IMAGE_COMDAT_SELECT_NODUPLICATES:
855 #ifdef STRICT_PE_FORMAT
856 sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
857 #else
858 sec_flags &= ~SEC_LINK_ONCE;
859 #endif
860 break;
862 case IMAGE_COMDAT_SELECT_ANY:
863 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
864 break;
866 case IMAGE_COMDAT_SELECT_SAME_SIZE:
867 sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
868 break;
870 case IMAGE_COMDAT_SELECT_EXACT_MATCH:
871 /* Not yet fully implemented ??? */
872 sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
873 break;
875 /* debug$S gets this case; other
876 implications ??? */
878 /* There may be no symbol... we'll search
879 the whole table... Is this the right
880 place to play this game? Or should we do
881 it when reading it in. */
882 case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
883 #ifdef STRICT_PE_FORMAT
884 /* FIXME: This is not currently implemented. */
885 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
886 #else
887 sec_flags &= ~SEC_LINK_ONCE;
888 #endif
889 break;
891 default: /* 0 means "no symbol" */
892 /* debug$F gets this case; other
893 implications ??? */
894 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
895 break;
898 break;
900 case 2:
901 /* Gas mode: the first matching on partial name. */
903 #ifndef TARGET_UNDERSCORE
904 #define TARGET_UNDERSCORE 0
905 #endif
906 /* Is this the name we're looking for? */
907 if (strcmp (target_name,
908 symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
910 /* Not the name we're looking for */
911 esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
912 continue;
914 /* Fall through. */
915 case 1:
916 /* MSVC mode: the lexically second symbol (or
917 drop through from the above). */
919 char *newname;
921 /* This must the the second symbol with the
922 section #. It is the actual symbol name.
923 Intel puts the two adjacent, but Alpha (at
924 least) spreads them out. */
926 section->comdat =
927 bfd_alloc (abfd, sizeof (struct bfd_comdat_info));
928 if (section->comdat == NULL)
929 abort ();
931 section->comdat->symbol =
932 (esym - esymstart) / bfd_coff_symesz (abfd);
934 newname = bfd_alloc (abfd, strlen (symname) + 1);
935 if (newname == NULL)
936 abort ();
938 strcpy (newname, symname);
939 section->comdat->name = newname;
942 goto breakloop;
946 esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
949 breakloop:
950 return sec_flags;
954 /* The PE version; see above for the general comments.
956 Since to set the SEC_LINK_ONCE and associated flags, we have to
957 look at the symbol table anyway, we return the symbol table index
958 of the symbol being used as the COMDAT symbol. This is admittedly
959 ugly, but there's really nowhere else that we have access to the
960 required information. FIXME: Is the COMDAT symbol index used for
961 any purpose other than objdump? */
963 static boolean
964 styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
965 bfd *abfd;
966 PTR hdr;
967 const char *name;
968 asection *section;
969 flagword *flags_ptr;
971 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
972 long styp_flags = internal_s->s_flags;
973 flagword sec_flags;
974 boolean result = true;
976 /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */
977 sec_flags = SEC_READONLY;
979 /* Process each flag bit in styp_flags in turn. */
980 while (styp_flags)
982 long flag = styp_flags & - styp_flags;
983 char * unhandled = NULL;
985 styp_flags &= ~ flag;
987 /* We infer from the distinct read/write/execute bits the settings
988 of some of the bfd flags; the actual values, should we need them,
989 are also in pei_section_data (abfd, section)->pe_flags. */
991 switch (flag)
993 case STYP_DSECT:
994 unhandled = "STYP_DSECT";
995 break;
996 case STYP_GROUP:
997 unhandled = "STYP_GROUP";
998 break;
999 case STYP_COPY:
1000 unhandled = "STYP_COPY";
1001 break;
1002 case STYP_OVER:
1003 unhandled = "STYP_OVER";
1004 break;
1005 #ifdef SEC_NEVER_LOAD
1006 case STYP_NOLOAD:
1007 sec_flags |= SEC_NEVER_LOAD;
1008 break;
1009 #endif
1010 case IMAGE_SCN_MEM_READ:
1011 /* Ignored, assume it always to be true. */
1012 break;
1013 case IMAGE_SCN_TYPE_NO_PAD:
1014 /* Skip. */
1015 break;
1016 case IMAGE_SCN_LNK_OTHER:
1017 unhandled = "IMAGE_SCN_LNK_OTHER";
1018 break;
1019 case IMAGE_SCN_MEM_NOT_CACHED:
1020 unhandled = "IMAGE_SCN_MEM_NOT_CACHED";
1021 break;
1022 case IMAGE_SCN_MEM_NOT_PAGED:
1023 unhandled = "IMAGE_SCN_MEM_NOT_PAGED";
1024 break;
1025 case IMAGE_SCN_MEM_EXECUTE:
1026 sec_flags |= SEC_CODE;
1027 break;
1028 case IMAGE_SCN_MEM_WRITE:
1029 sec_flags &= ~ SEC_READONLY;
1030 break;
1031 case IMAGE_SCN_MEM_DISCARDABLE:
1032 sec_flags |= SEC_DEBUGGING;
1033 break;
1034 case IMAGE_SCN_MEM_SHARED:
1035 sec_flags |= SEC_SHARED;
1036 break;
1037 case IMAGE_SCN_LNK_REMOVE:
1038 sec_flags |= SEC_EXCLUDE;
1039 break;
1040 case IMAGE_SCN_CNT_CODE:
1041 sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
1042 break;
1043 case IMAGE_SCN_CNT_INITIALIZED_DATA:
1044 sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
1045 break;
1046 case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
1047 sec_flags |= SEC_ALLOC;
1048 break;
1049 case IMAGE_SCN_LNK_INFO:
1050 /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
1051 defined. coff_compute_section_file_positions uses
1052 COFF_PAGE_SIZE to ensure that the low order bits of the
1053 section VMA and the file offset match. If we don't know
1054 COFF_PAGE_SIZE, we can't ensure the correct correspondence,
1055 and demand page loading of the file will fail. */
1056 #ifdef COFF_PAGE_SIZE
1057 sec_flags |= SEC_DEBUGGING;
1058 #endif
1059 break;
1060 case IMAGE_SCN_LNK_COMDAT:
1061 /* COMDAT gets very special treatment. */
1062 sec_flags = handle_COMDAT (abfd, sec_flags, hdr, name, section);
1063 break;
1064 default:
1065 /* Silently ignore for now. */
1066 break;
1069 /* If the section flag was not handled, report it here. */
1070 if (unhandled != NULL)
1072 (*_bfd_error_handler)
1073 (_("%s (%s): Section flag %s (0x%x) ignored"),
1074 bfd_get_filename (abfd), name, unhandled, flag);
1075 result = false;
1079 #if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
1080 /* As a GNU extension, if the name begins with .gnu.linkonce, we
1081 only link a single copy of the section. This is used to support
1082 g++. g++ will emit each template expansion in its own section.
1083 The symbols will be defined as weak, so that multiple definitions
1084 are permitted. The GNU linker extension is to actually discard
1085 all but one of the sections. */
1086 if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
1087 sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1088 #endif
1090 if (flags_ptr)
1091 * flags_ptr = sec_flags;
1093 return result;
1096 #endif /* COFF_WITH_PE */
1098 #define get_index(symbol) ((symbol)->udata.i)
1101 INTERNAL_DEFINITION
1102 bfd_coff_backend_data
1104 CODE_FRAGMENT
1106 .{* COFF symbol classifications. *}
1108 .enum coff_symbol_classification
1110 . {* Global symbol. *}
1111 . COFF_SYMBOL_GLOBAL,
1112 . {* Common symbol. *}
1113 . COFF_SYMBOL_COMMON,
1114 . {* Undefined symbol. *}
1115 . COFF_SYMBOL_UNDEFINED,
1116 . {* Local symbol. *}
1117 . COFF_SYMBOL_LOCAL,
1118 . {* PE section symbol. *}
1119 . COFF_SYMBOL_PE_SECTION
1122 Special entry points for gdb to swap in coff symbol table parts:
1123 .typedef struct
1125 . void (*_bfd_coff_swap_aux_in) PARAMS ((
1126 . bfd *abfd,
1127 . PTR ext,
1128 . int type,
1129 . int class,
1130 . int indaux,
1131 . int numaux,
1132 . PTR in));
1134 . void (*_bfd_coff_swap_sym_in) PARAMS ((
1135 . bfd *abfd ,
1136 . PTR ext,
1137 . PTR in));
1139 . void (*_bfd_coff_swap_lineno_in) PARAMS ((
1140 . bfd *abfd,
1141 . PTR ext,
1142 . PTR in));
1145 Special entry points for gas to swap out coff parts:
1147 . unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
1148 . bfd *abfd,
1149 . PTR in,
1150 . int type,
1151 . int class,
1152 . int indaux,
1153 . int numaux,
1154 . PTR ext));
1156 . unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
1157 . bfd *abfd,
1158 . PTR in,
1159 . PTR ext));
1161 . unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
1162 . bfd *abfd,
1163 . PTR in,
1164 . PTR ext));
1166 . unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
1167 . bfd *abfd,
1168 . PTR src,
1169 . PTR dst));
1171 . unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
1172 . bfd *abfd,
1173 . PTR in,
1174 . PTR out));
1176 . unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
1177 . bfd *abfd,
1178 . PTR in,
1179 . PTR out));
1181 . unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
1182 . bfd *abfd,
1183 . PTR in,
1184 . PTR out));
1187 Special entry points for generic COFF routines to call target
1188 dependent COFF routines:
1190 . unsigned int _bfd_filhsz;
1191 . unsigned int _bfd_aoutsz;
1192 . unsigned int _bfd_scnhsz;
1193 . unsigned int _bfd_symesz;
1194 . unsigned int _bfd_auxesz;
1195 . unsigned int _bfd_relsz;
1196 . unsigned int _bfd_linesz;
1197 . unsigned int _bfd_filnmlen;
1198 . boolean _bfd_coff_long_filenames;
1199 . boolean _bfd_coff_long_section_names;
1200 . unsigned int _bfd_coff_default_section_alignment_power;
1201 . boolean _bfd_coff_force_symnames_in_strings;
1202 . unsigned int _bfd_coff_debug_string_prefix_length;
1203 . void (*_bfd_coff_swap_filehdr_in) PARAMS ((
1204 . bfd *abfd,
1205 . PTR ext,
1206 . PTR in));
1207 . void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
1208 . bfd *abfd,
1209 . PTR ext,
1210 . PTR in));
1211 . void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
1212 . bfd *abfd,
1213 . PTR ext,
1214 . PTR in));
1215 . void (*_bfd_coff_swap_reloc_in) PARAMS ((
1216 . bfd *abfd,
1217 . PTR ext,
1218 . PTR in));
1219 . boolean (*_bfd_coff_bad_format_hook) PARAMS ((
1220 . bfd *abfd,
1221 . PTR internal_filehdr));
1222 . boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
1223 . bfd *abfd,
1224 . PTR internal_filehdr));
1225 . PTR (*_bfd_coff_mkobject_hook) PARAMS ((
1226 . bfd *abfd,
1227 . PTR internal_filehdr,
1228 . PTR internal_aouthdr));
1229 . boolean (*_bfd_styp_to_sec_flags_hook) PARAMS ((
1230 . bfd *abfd,
1231 . PTR internal_scnhdr,
1232 . const char *name,
1233 . asection *section,
1234 . flagword *flags_ptr));
1235 . void (*_bfd_set_alignment_hook) PARAMS ((
1236 . bfd *abfd,
1237 . asection *sec,
1238 . PTR internal_scnhdr));
1239 . boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
1240 . bfd *abfd));
1241 . boolean (*_bfd_coff_symname_in_debug) PARAMS ((
1242 . bfd *abfd,
1243 . struct internal_syment *sym));
1244 . boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
1245 . bfd *abfd,
1246 . combined_entry_type *table_base,
1247 . combined_entry_type *symbol,
1248 . unsigned int indaux,
1249 . combined_entry_type *aux));
1250 . boolean (*_bfd_coff_print_aux) PARAMS ((
1251 . bfd *abfd,
1252 . FILE *file,
1253 . combined_entry_type *table_base,
1254 . combined_entry_type *symbol,
1255 . combined_entry_type *aux,
1256 . unsigned int indaux));
1257 . void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
1258 . bfd *abfd,
1259 . struct bfd_link_info *link_info,
1260 . struct bfd_link_order *link_order,
1261 . arelent *reloc,
1262 . bfd_byte *data,
1263 . unsigned int *src_ptr,
1264 . unsigned int *dst_ptr));
1265 . int (*_bfd_coff_reloc16_estimate) PARAMS ((
1266 . bfd *abfd,
1267 . asection *input_section,
1268 . arelent *r,
1269 . unsigned int shrink,
1270 . struct bfd_link_info *link_info));
1271 . enum coff_symbol_classification (*_bfd_coff_classify_symbol) PARAMS ((
1272 . bfd *abfd,
1273 . struct internal_syment *));
1274 . boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
1275 . bfd *abfd));
1276 . boolean (*_bfd_coff_start_final_link) PARAMS ((
1277 . bfd *output_bfd,
1278 . struct bfd_link_info *info));
1279 . boolean (*_bfd_coff_relocate_section) PARAMS ((
1280 . bfd *output_bfd,
1281 . struct bfd_link_info *info,
1282 . bfd *input_bfd,
1283 . asection *input_section,
1284 . bfd_byte *contents,
1285 . struct internal_reloc *relocs,
1286 . struct internal_syment *syms,
1287 . asection **sections));
1288 . reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
1289 . bfd *abfd,
1290 . asection *sec,
1291 . struct internal_reloc *rel,
1292 . struct coff_link_hash_entry *h,
1293 . struct internal_syment *sym,
1294 . bfd_vma *addendp));
1295 . boolean (*_bfd_coff_adjust_symndx) PARAMS ((
1296 . bfd *obfd,
1297 . struct bfd_link_info *info,
1298 . bfd *ibfd,
1299 . asection *sec,
1300 . struct internal_reloc *reloc,
1301 . boolean *adjustedp));
1302 . boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
1303 . struct bfd_link_info *info,
1304 . bfd *abfd,
1305 . const char *name,
1306 . flagword flags,
1307 . asection *section,
1308 . bfd_vma value,
1309 . const char *string,
1310 . boolean copy,
1311 . boolean collect,
1312 . struct bfd_link_hash_entry **hashp));
1314 . boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
1315 . bfd * abfd,
1316 . struct coff_final_link_info * pfinfo));
1317 . boolean (*_bfd_coff_final_link_postscript) PARAMS ((
1318 . bfd * abfd,
1319 . struct coff_final_link_info * pfinfo));
1321 .} bfd_coff_backend_data;
1323 .#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
1325 .#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
1326 . ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
1328 .#define bfd_coff_swap_sym_in(a,e,i) \
1329 . ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
1331 .#define bfd_coff_swap_lineno_in(a,e,i) \
1332 . ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
1334 .#define bfd_coff_swap_reloc_out(abfd, i, o) \
1335 . ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
1337 .#define bfd_coff_swap_lineno_out(abfd, i, o) \
1338 . ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
1340 .#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
1341 . ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
1343 .#define bfd_coff_swap_sym_out(abfd, i,o) \
1344 . ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
1346 .#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
1347 . ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
1349 .#define bfd_coff_swap_filehdr_out(abfd, i,o) \
1350 . ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
1352 .#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
1353 . ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
1355 .#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
1356 .#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
1357 .#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
1358 .#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
1359 .#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
1360 .#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
1361 .#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
1362 .#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
1363 .#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
1364 .#define bfd_coff_long_section_names(abfd) \
1365 . (coff_backend_info (abfd)->_bfd_coff_long_section_names)
1366 .#define bfd_coff_default_section_alignment_power(abfd) \
1367 . (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
1368 .#define bfd_coff_swap_filehdr_in(abfd, i,o) \
1369 . ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
1371 .#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
1372 . ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
1374 .#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
1375 . ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
1377 .#define bfd_coff_swap_reloc_in(abfd, i, o) \
1378 . ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
1380 .#define bfd_coff_bad_format_hook(abfd, filehdr) \
1381 . ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
1383 .#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
1384 . ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
1385 .#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
1386 . ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
1388 .#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
1389 . ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
1390 . (abfd, scnhdr, name, section, flags_ptr))
1392 .#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
1393 . ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
1395 .#define bfd_coff_slurp_symbol_table(abfd)\
1396 . ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
1398 .#define bfd_coff_symname_in_debug(abfd, sym)\
1399 . ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
1401 .#define bfd_coff_force_symnames_in_strings(abfd)\
1402 . (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
1404 .#define bfd_coff_debug_string_prefix_length(abfd)\
1405 . (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
1407 .#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
1408 . ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
1409 . (abfd, file, base, symbol, aux, indaux))
1411 .#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
1412 . ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
1413 . (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
1415 .#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
1416 . ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
1417 . (abfd, section, reloc, shrink, link_info))
1419 .#define bfd_coff_classify_symbol(abfd, sym)\
1420 . ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
1421 . (abfd, sym))
1423 .#define bfd_coff_compute_section_file_positions(abfd)\
1424 . ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
1425 . (abfd))
1427 .#define bfd_coff_start_final_link(obfd, info)\
1428 . ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
1429 . (obfd, info))
1430 .#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
1431 . ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
1432 . (obfd, info, ibfd, o, con, rel, isyms, secs))
1433 .#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
1434 . ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
1435 . (abfd, sec, rel, h, sym, addendp))
1436 .#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
1437 . ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
1438 . (obfd, info, ibfd, sec, rel, adjustedp))
1439 .#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\
1440 . ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
1441 . (info, abfd, name, flags, section, value, string, cp, coll, hashp))
1443 .#define bfd_coff_link_output_has_begun(a,p) \
1444 . ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
1445 .#define bfd_coff_final_link_postscript(a,p) \
1446 . ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
1450 /* See whether the magic number matches. */
1452 static boolean
1453 coff_bad_format_hook (abfd, filehdr)
1454 bfd * abfd ATTRIBUTE_UNUSED;
1455 PTR filehdr;
1457 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1459 if (BADMAG (*internal_f))
1460 return false;
1462 /* if the optional header is NULL or not the correct size then
1463 quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
1464 and Intel 960 readwrite headers (I960WRMAGIC) is that the
1465 optional header is of a different size.
1467 But the mips keeps extra stuff in it's opthdr, so dont check
1468 when doing that
1471 #if defined(M88) || defined(I960)
1472 if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr)
1473 return false;
1474 #endif
1476 return true;
1479 /* Check whether this section uses an alignment other than the
1480 default. */
1482 static void
1483 coff_set_custom_section_alignment (abfd, section, alignment_table, table_size)
1484 bfd *abfd ATTRIBUTE_UNUSED;
1485 asection *section;
1486 const struct coff_section_alignment_entry *alignment_table;
1487 const unsigned int table_size;
1489 const unsigned int default_alignment = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1490 unsigned int i;
1492 for (i = 0; i < table_size; ++i)
1494 const char *secname = bfd_get_section_name (abfd, section);
1495 if (alignment_table[i].comparison_length == (unsigned int) -1
1496 ? strcmp (alignment_table[i].name, secname) == 0
1497 : strncmp (alignment_table[i].name, secname,
1498 alignment_table[i].comparison_length) == 0)
1499 break;
1501 if (i >= table_size)
1502 return;
1504 if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY
1505 && default_alignment < alignment_table[i].default_alignment_min)
1506 return;
1508 if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
1509 && default_alignment > alignment_table[i].default_alignment_max)
1510 return;
1512 section->alignment_power = alignment_table[i].alignment_power;
1515 /* Custom section alignment records. */
1517 static const struct coff_section_alignment_entry
1518 coff_section_alignment_table[] =
1520 #ifdef COFF_SECTION_ALIGNMENT_ENTRIES
1521 COFF_SECTION_ALIGNMENT_ENTRIES,
1522 #endif
1523 /* There must not be any gaps between .stabstr sections. */
1524 { COFF_SECTION_NAME_PARTIAL_MATCH (".stabstr"),
1525 1, COFF_ALIGNMENT_FIELD_EMPTY, 0 },
1526 /* The .stab section must be aligned to 2**2 at most, to avoid gaps. */
1527 { COFF_SECTION_NAME_PARTIAL_MATCH (".stab"),
1528 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1529 /* Similarly for the .ctors and .dtors sections. */
1530 { COFF_SECTION_NAME_EXACT_MATCH (".ctors"),
1531 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1532 { COFF_SECTION_NAME_EXACT_MATCH (".dtors"),
1533 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }
1536 static const unsigned int coff_section_alignment_table_size =
1537 sizeof coff_section_alignment_table / sizeof coff_section_alignment_table[0];
1539 /* Initialize a section structure with information peculiar to this
1540 particular implementation of COFF. */
1542 static boolean
1543 coff_new_section_hook (abfd, section)
1544 bfd * abfd;
1545 asection * section;
1547 combined_entry_type *native;
1549 section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1551 #ifdef RS6000COFF_C
1552 if (xcoff_data (abfd)->text_align_power != 0
1553 && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
1554 section->alignment_power = xcoff_data (abfd)->text_align_power;
1555 if (xcoff_data (abfd)->data_align_power != 0
1556 && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
1557 section->alignment_power = xcoff_data (abfd)->data_align_power;
1558 #endif
1560 /* Allocate aux records for section symbols, to store size and
1561 related info.
1563 @@ The 10 is a guess at a plausible maximum number of aux entries
1564 (but shouldn't be a constant). */
1565 native = ((combined_entry_type *)
1566 bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
1567 if (native == NULL)
1568 return false;
1570 /* We don't need to set up n_name, n_value, or n_scnum in the native
1571 symbol information, since they'll be overriden by the BFD symbol
1572 anyhow. However, we do need to set the type and storage class,
1573 in case this symbol winds up getting written out. The value 0
1574 for n_numaux is already correct. */
1576 native->u.syment.n_type = T_NULL;
1577 native->u.syment.n_sclass = C_STAT;
1579 coffsymbol (section->symbol)->native = native;
1581 coff_set_custom_section_alignment (abfd, section,
1582 coff_section_alignment_table,
1583 coff_section_alignment_table_size);
1585 return true;
1588 #ifdef COFF_ALIGN_IN_SECTION_HEADER
1590 /* Set the alignment of a BFD section. */
1592 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1594 static void
1595 coff_set_alignment_hook (abfd, section, scnhdr)
1596 bfd * abfd ATTRIBUTE_UNUSED;
1597 asection * section;
1598 PTR scnhdr;
1600 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1601 unsigned int i;
1603 #ifdef I960
1604 /* Extract ALIGN from 2**ALIGN stored in section header */
1605 for (i = 0; i < 32; i++)
1606 if ((1 << i) >= hdr->s_align)
1607 break;
1608 #endif
1609 #ifdef TIC80COFF
1610 /* TI tools puts the alignment power in bits 8-11 */
1611 i = (hdr->s_flags >> 8) & 0xF ;
1612 #endif
1613 #ifdef COFF_DECODE_ALIGNMENT
1614 i = COFF_DECODE_ALIGNMENT(hdr->s_flags);
1615 #endif
1616 section->alignment_power = i;
1618 #ifdef coff_set_section_load_page
1619 coff_set_section_load_page (section, hdr->s_page);
1620 #endif
1623 #else /* ! COFF_ALIGN_IN_SECTION_HEADER */
1624 #ifdef COFF_WITH_PE
1626 /* a couple of macros to help setting the alignment power field */
1627 #define ALIGN_SET(field,x,y) \
1628 if (((field) & IMAGE_SCN_ALIGN_64BYTES) == x )\
1630 section->alignment_power = y;\
1633 #define ELIFALIGN_SET(field,x,y) \
1634 else if (( (field) & IMAGE_SCN_ALIGN_64BYTES) == x ) \
1636 section->alignment_power = y;\
1639 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1641 static void
1642 coff_set_alignment_hook (abfd, section, scnhdr)
1643 bfd * abfd ATTRIBUTE_UNUSED;
1644 asection * section;
1645 PTR scnhdr;
1647 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1649 ALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6)
1650 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5)
1651 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_16BYTES, 4)
1652 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_8BYTES, 3)
1653 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_4BYTES, 2)
1654 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_2BYTES, 1)
1655 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_1BYTES, 0)
1657 /* In a PE image file, the s_paddr field holds the virtual size of a
1658 section, while the s_size field holds the raw size. We also keep
1659 the original section flag value, since not every bit can be
1660 mapped onto a generic BFD section bit. */
1661 if (coff_section_data (abfd, section) == NULL)
1663 section->used_by_bfd =
1664 (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
1665 if (section->used_by_bfd == NULL)
1667 /* FIXME: Return error. */
1668 abort ();
1671 if (pei_section_data (abfd, section) == NULL)
1673 coff_section_data (abfd, section)->tdata =
1674 (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
1675 if (coff_section_data (abfd, section)->tdata == NULL)
1677 /* FIXME: Return error. */
1678 abort ();
1681 pei_section_data (abfd, section)->virt_size = hdr->s_paddr;
1682 pei_section_data (abfd, section)->pe_flags = hdr->s_flags;
1684 section->lma = hdr->s_vaddr;
1686 /* check for extended relocs */
1687 if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL)
1689 struct external_reloc dst;
1690 struct internal_reloc n;
1691 int oldpos = bfd_tell (abfd);
1692 bfd_seek (abfd, hdr->s_relptr, 0);
1693 if (bfd_read ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
1694 != bfd_coff_relsz (abfd))
1695 return;
1697 coff_swap_reloc_in (abfd, &dst, &n);
1698 bfd_seek (abfd, oldpos, 0);
1699 section->reloc_count =
1700 hdr->s_nreloc = n.r_vaddr;
1703 #undef ALIGN_SET
1704 #undef ELIFALIGN_SET
1706 #else /* ! COFF_WITH_PE */
1707 #ifdef RS6000COFF_C
1709 /* We grossly abuse this function to handle XCOFF overflow headers.
1710 When we see one, we correct the reloc and line number counts in the
1711 real header, and remove the section we just created. */
1713 static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1715 static void
1716 coff_set_alignment_hook (abfd, section, scnhdr)
1717 bfd *abfd;
1718 asection *section;
1719 PTR scnhdr;
1721 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1722 asection *real_sec;
1723 asection **ps;
1725 if ((hdr->s_flags & STYP_OVRFLO) == 0)
1726 return;
1728 real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
1729 if (real_sec == NULL)
1730 return;
1732 real_sec->reloc_count = hdr->s_paddr;
1733 real_sec->lineno_count = hdr->s_vaddr;
1735 for (ps = &abfd->sections; *ps != NULL; ps = &(*ps)->next)
1737 if (*ps == section)
1739 *ps = (*ps)->next;
1740 --abfd->section_count;
1741 break;
1746 #else /* ! RS6000COFF_C */
1748 #define coff_set_alignment_hook \
1749 ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
1751 #endif /* ! RS6000COFF_C */
1752 #endif /* ! COFF_WITH_PE */
1753 #endif /* ! COFF_ALIGN_IN_SECTION_HEADER */
1755 #ifndef coff_mkobject
1757 static boolean coff_mkobject PARAMS ((bfd *));
1759 static boolean
1760 coff_mkobject (abfd)
1761 bfd * abfd;
1763 coff_data_type *coff;
1765 abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
1766 if (abfd->tdata.coff_obj_data == 0)
1767 return false;
1768 coff = coff_data (abfd);
1769 coff->symbols = (coff_symbol_type *) NULL;
1770 coff->conversion_table = (unsigned int *) NULL;
1771 coff->raw_syments = (struct coff_ptr_struct *) NULL;
1772 coff->relocbase = 0;
1773 coff->local_toc_sym_map = 0;
1775 /* make_abs_section(abfd);*/
1777 return true;
1779 #endif
1781 /* Create the COFF backend specific information. */
1782 #ifndef coff_mkobject_hook
1783 static PTR
1784 coff_mkobject_hook (abfd, filehdr, aouthdr)
1785 bfd * abfd;
1786 PTR filehdr;
1787 PTR aouthdr ATTRIBUTE_UNUSED;
1789 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1790 coff_data_type *coff;
1792 if (coff_mkobject (abfd) == false)
1793 return NULL;
1795 coff = coff_data (abfd);
1797 coff->sym_filepos = internal_f->f_symptr;
1799 /* These members communicate important constants about the symbol
1800 table to GDB's symbol-reading code. These `constants'
1801 unfortunately vary among coff implementations... */
1802 coff->local_n_btmask = N_BTMASK;
1803 coff->local_n_btshft = N_BTSHFT;
1804 coff->local_n_tmask = N_TMASK;
1805 coff->local_n_tshift = N_TSHIFT;
1806 coff->local_symesz = bfd_coff_symesz (abfd);
1807 coff->local_auxesz = bfd_coff_auxesz (abfd);
1808 coff->local_linesz = bfd_coff_linesz (abfd);
1810 coff->timestamp = internal_f->f_timdat;
1812 obj_raw_syment_count (abfd) =
1813 obj_conv_table_size (abfd) =
1814 internal_f->f_nsyms;
1816 #ifdef RS6000COFF_C
1817 if ((internal_f->f_flags & F_SHROBJ) != 0)
1818 abfd->flags |= DYNAMIC;
1819 if (aouthdr != NULL && internal_f->f_opthdr >= bfd_coff_aoutsz (abfd))
1821 struct internal_aouthdr *internal_a =
1822 (struct internal_aouthdr *) aouthdr;
1823 struct xcoff_tdata *xcoff;
1825 xcoff = xcoff_data (abfd);
1826 # ifdef U803XTOCMAGIC
1827 xcoff->xcoff64 = internal_f->f_magic == U803XTOCMAGIC;
1828 # else
1829 xcoff->xcoff64 = 0;
1830 # endif
1831 xcoff->full_aouthdr = true;
1832 xcoff->toc = internal_a->o_toc;
1833 xcoff->sntoc = internal_a->o_sntoc;
1834 xcoff->snentry = internal_a->o_snentry;
1835 xcoff->text_align_power = internal_a->o_algntext;
1836 xcoff->data_align_power = internal_a->o_algndata;
1837 xcoff->modtype = internal_a->o_modtype;
1838 xcoff->cputype = internal_a->o_cputype;
1839 xcoff->maxdata = internal_a->o_maxdata;
1840 xcoff->maxstack = internal_a->o_maxstack;
1842 #endif
1844 #ifdef ARM
1845 /* Set the flags field from the COFF header read in */
1846 if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
1847 coff->flags = 0;
1848 #endif
1850 #ifdef COFF_WITH_PE
1851 /* FIXME: I'm not sure this is ever executed, since peicode.h
1852 defines coff_mkobject_hook. */
1853 if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
1854 abfd->flags |= HAS_DEBUG;
1855 #endif
1857 return (PTR) coff;
1859 #endif
1861 /* Determine the machine architecture and type. FIXME: This is target
1862 dependent because the magic numbers are defined in the target
1863 dependent header files. But there is no particular need for this.
1864 If the magic numbers were moved to a separate file, this function
1865 would be target independent and would also be much more successful
1866 at linking together COFF files for different architectures. */
1868 static boolean
1869 coff_set_arch_mach_hook (abfd, filehdr)
1870 bfd *abfd;
1871 PTR filehdr;
1873 long machine;
1874 enum bfd_architecture arch;
1875 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1877 machine = 0;
1878 switch (internal_f->f_magic)
1880 #ifdef PPCMAGIC
1881 case PPCMAGIC:
1882 arch = bfd_arch_powerpc;
1883 machine = 0; /* what does this mean? (krk) */
1884 break;
1885 #endif
1886 #ifdef I386MAGIC
1887 case I386MAGIC:
1888 case I386PTXMAGIC:
1889 case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
1890 case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1891 arch = bfd_arch_i386;
1892 machine = 0;
1893 break;
1894 #endif
1895 #ifdef IA64MAGIC
1896 case IA64MAGIC:
1897 arch = bfd_arch_ia64;
1898 machine = 0;
1899 break;
1900 #endif
1901 #ifdef A29K_MAGIC_BIG
1902 case A29K_MAGIC_BIG:
1903 case A29K_MAGIC_LITTLE:
1904 arch = bfd_arch_a29k;
1905 machine = 0;
1906 break;
1907 #endif
1908 #ifdef ARMMAGIC
1909 case ARMMAGIC:
1910 case ARMPEMAGIC:
1911 case THUMBPEMAGIC:
1912 arch = bfd_arch_arm;
1913 switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1915 case F_ARM_2: machine = bfd_mach_arm_2; break;
1916 case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1917 case F_ARM_3: machine = bfd_mach_arm_3; break;
1918 default:
1919 case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1920 case F_ARM_4: machine = bfd_mach_arm_4; break;
1921 case F_ARM_4T: machine = bfd_mach_arm_4T; break;
1922 case F_ARM_5: machine = bfd_mach_arm_5; break;
1924 break;
1925 #endif
1926 #ifdef MC68MAGIC
1927 case MC68MAGIC:
1928 case M68MAGIC:
1929 #ifdef MC68KBCSMAGIC
1930 case MC68KBCSMAGIC:
1931 #endif
1932 #ifdef APOLLOM68KMAGIC
1933 case APOLLOM68KMAGIC:
1934 #endif
1935 #ifdef LYNXCOFFMAGIC
1936 case LYNXCOFFMAGIC:
1937 #endif
1938 arch = bfd_arch_m68k;
1939 machine = bfd_mach_m68020;
1940 break;
1941 #endif
1942 #ifdef MC88MAGIC
1943 case MC88MAGIC:
1944 case MC88DMAGIC:
1945 case MC88OMAGIC:
1946 arch = bfd_arch_m88k;
1947 machine = 88100;
1948 break;
1949 #endif
1950 #ifdef Z8KMAGIC
1951 case Z8KMAGIC:
1952 arch = bfd_arch_z8k;
1953 switch (internal_f->f_flags & F_MACHMASK)
1955 case F_Z8001:
1956 machine = bfd_mach_z8001;
1957 break;
1958 case F_Z8002:
1959 machine = bfd_mach_z8002;
1960 break;
1961 default:
1962 return false;
1964 break;
1965 #endif
1966 #ifdef I860
1967 case I860MAGIC:
1968 arch = bfd_arch_i860;
1969 break;
1970 #endif
1971 #ifdef I960
1972 #ifdef I960ROMAGIC
1973 case I960ROMAGIC:
1974 case I960RWMAGIC:
1975 arch = bfd_arch_i960;
1976 switch (F_I960TYPE & internal_f->f_flags)
1978 default:
1979 case F_I960CORE:
1980 machine = bfd_mach_i960_core;
1981 break;
1982 case F_I960KB:
1983 machine = bfd_mach_i960_kb_sb;
1984 break;
1985 case F_I960MC:
1986 machine = bfd_mach_i960_mc;
1987 break;
1988 case F_I960XA:
1989 machine = bfd_mach_i960_xa;
1990 break;
1991 case F_I960CA:
1992 machine = bfd_mach_i960_ca;
1993 break;
1994 case F_I960KA:
1995 machine = bfd_mach_i960_ka_sa;
1996 break;
1997 case F_I960JX:
1998 machine = bfd_mach_i960_jx;
1999 break;
2000 case F_I960HX:
2001 machine = bfd_mach_i960_hx;
2002 break;
2004 break;
2005 #endif
2006 #endif
2008 #ifdef RS6000COFF_C
2009 #ifdef XCOFF64
2010 case U803XTOCMAGIC:
2011 #else
2012 case U802ROMAGIC:
2013 case U802WRMAGIC:
2014 case U802TOCMAGIC:
2015 #endif
2017 int cputype;
2019 if (xcoff_data (abfd)->cputype != -1)
2020 cputype = xcoff_data (abfd)->cputype & 0xff;
2021 else
2023 /* We did not get a value from the a.out header. If the
2024 file has not been stripped, we may be able to get the
2025 architecture information from the first symbol, if it
2026 is a .file symbol. */
2027 if (obj_raw_syment_count (abfd) == 0)
2028 cputype = 0;
2029 else
2031 bfd_byte *buf;
2032 struct internal_syment sym;
2034 buf = (bfd_byte *) bfd_malloc (bfd_coff_symesz (abfd));
2035 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
2036 || (bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd)
2037 != bfd_coff_symesz (abfd)))
2039 free (buf);
2040 return false;
2042 bfd_coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
2043 if (sym.n_sclass == C_FILE)
2044 cputype = sym.n_type & 0xff;
2045 else
2046 cputype = 0;
2047 free (buf);
2051 /* FIXME: We don't handle all cases here. */
2052 switch (cputype)
2054 default:
2055 case 0:
2056 arch = bfd_xcoff_architecture (abfd);
2057 machine = bfd_xcoff_machine (abfd);
2058 break;
2060 case 1:
2061 arch = bfd_arch_powerpc;
2062 machine = bfd_mach_ppc_601;
2063 break;
2064 case 2: /* 64 bit PowerPC */
2065 arch = bfd_arch_powerpc;
2066 machine = bfd_mach_ppc_620;
2067 break;
2068 case 3:
2069 arch = bfd_arch_powerpc;
2070 machine = bfd_mach_ppc;
2071 break;
2072 case 4:
2073 arch = bfd_arch_rs6000;
2074 machine = bfd_mach_rs6k;
2075 break;
2078 break;
2079 #endif
2081 #ifdef WE32KMAGIC
2082 case WE32KMAGIC:
2083 arch = bfd_arch_we32k;
2084 machine = 0;
2085 break;
2086 #endif
2088 #ifdef H8300MAGIC
2089 case H8300MAGIC:
2090 arch = bfd_arch_h8300;
2091 machine = bfd_mach_h8300;
2092 /* !! FIXME this probably isn't the right place for this */
2093 abfd->flags |= BFD_IS_RELAXABLE;
2094 break;
2095 #endif
2097 #ifdef H8300HMAGIC
2098 case H8300HMAGIC:
2099 arch = bfd_arch_h8300;
2100 machine = bfd_mach_h8300h;
2101 /* !! FIXME this probably isn't the right place for this */
2102 abfd->flags |= BFD_IS_RELAXABLE;
2103 break;
2104 #endif
2106 #ifdef H8300SMAGIC
2107 case H8300SMAGIC:
2108 arch = bfd_arch_h8300;
2109 machine = bfd_mach_h8300s;
2110 /* !! FIXME this probably isn't the right place for this */
2111 abfd->flags |= BFD_IS_RELAXABLE;
2112 break;
2113 #endif
2115 #ifdef SH_ARCH_MAGIC_BIG
2116 case SH_ARCH_MAGIC_BIG:
2117 case SH_ARCH_MAGIC_LITTLE:
2118 #ifdef COFF_WITH_PE
2119 case SH_ARCH_MAGIC_WINCE:
2120 #endif
2121 arch = bfd_arch_sh;
2122 machine = 0;
2123 break;
2124 #endif
2126 #ifdef MIPS_ARCH_MAGIC_WINCE
2127 case MIPS_ARCH_MAGIC_WINCE:
2128 arch = bfd_arch_mips;
2129 machine = 0;
2130 break;
2131 #endif
2133 #ifdef H8500MAGIC
2134 case H8500MAGIC:
2135 arch = bfd_arch_h8500;
2136 machine = 0;
2137 break;
2138 #endif
2140 #ifdef SPARCMAGIC
2141 case SPARCMAGIC:
2142 #ifdef LYNXCOFFMAGIC
2143 case LYNXCOFFMAGIC:
2144 #endif
2145 arch = bfd_arch_sparc;
2146 machine = 0;
2147 break;
2148 #endif
2150 #ifdef TIC30MAGIC
2151 case TIC30MAGIC:
2152 arch = bfd_arch_tic30;
2153 break;
2154 #endif
2156 #ifdef TICOFF0MAGIC
2157 #ifdef TICOFF_TARGET_ARCH
2158 /* this TI COFF section should be used by all new TI COFF v0 targets */
2159 case TICOFF0MAGIC:
2160 arch = TICOFF_TARGET_ARCH;
2161 break;
2162 #endif
2163 #endif
2165 #ifdef TICOFF1MAGIC
2166 /* this TI COFF section should be used by all new TI COFF v1/2 targets */
2167 /* TI COFF1 and COFF2 use the target_id field to specify which arch */
2168 case TICOFF1MAGIC:
2169 case TICOFF2MAGIC:
2170 switch (internal_f->f_target_id)
2172 #ifdef TI_TARGET_ID
2173 case TI_TARGET_ID:
2174 arch = TICOFF_TARGET_ARCH;
2175 break;
2176 #endif
2177 default:
2178 arch = bfd_arch_obscure;
2179 (*_bfd_error_handler)
2180 (_("Unrecognized TI COFF target id '0x%x'"),
2181 internal_f->f_target_id);
2182 break;
2184 break;
2185 #endif
2187 #ifdef TIC80_ARCH_MAGIC
2188 case TIC80_ARCH_MAGIC:
2189 arch = bfd_arch_tic80;
2190 break;
2191 #endif
2193 #ifdef MCOREMAGIC
2194 case MCOREMAGIC:
2195 arch = bfd_arch_mcore;
2196 break;
2197 #endif
2198 default: /* Unreadable input file type */
2199 arch = bfd_arch_obscure;
2200 break;
2203 bfd_default_set_arch_mach (abfd, arch, machine);
2204 return true;
2207 #ifdef SYMNAME_IN_DEBUG
2209 static boolean symname_in_debug_hook
2210 PARAMS ((bfd *, struct internal_syment *));
2212 static boolean
2213 symname_in_debug_hook (abfd, sym)
2214 bfd * abfd ATTRIBUTE_UNUSED;
2215 struct internal_syment *sym;
2217 return SYMNAME_IN_DEBUG (sym) ? true : false;
2220 #else
2222 #define symname_in_debug_hook \
2223 (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
2225 #endif
2227 #ifdef RS6000COFF_C
2229 #ifdef XCOFF64
2230 #define FORCE_SYMNAMES_IN_STRINGS
2231 #endif
2233 /* Handle the csect auxent of a C_EXT or C_HIDEXT symbol. */
2235 static boolean coff_pointerize_aux_hook
2236 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2237 unsigned int, combined_entry_type *));
2239 /*ARGSUSED*/
2240 static boolean
2241 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
2242 bfd *abfd ATTRIBUTE_UNUSED;
2243 combined_entry_type *table_base;
2244 combined_entry_type *symbol;
2245 unsigned int indaux;
2246 combined_entry_type *aux;
2248 int class = symbol->u.syment.n_sclass;
2250 if ((class == C_EXT || class == C_HIDEXT)
2251 && indaux + 1 == symbol->u.syment.n_numaux)
2253 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2255 aux->u.auxent.x_csect.x_scnlen.p =
2256 table_base + aux->u.auxent.x_csect.x_scnlen.l;
2257 aux->fix_scnlen = 1;
2260 /* Return true to indicate that the caller should not do any
2261 further work on this auxent. */
2262 return true;
2265 /* Return false to indicate that this auxent should be handled by
2266 the caller. */
2267 return false;
2270 #else
2271 #ifdef I960
2273 /* We don't want to pointerize bal entries. */
2275 static boolean coff_pointerize_aux_hook
2276 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2277 unsigned int, combined_entry_type *));
2279 /*ARGSUSED*/
2280 static boolean
2281 coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
2282 bfd *abfd ATTRIBUTE_UNUSED;
2283 combined_entry_type *table_base ATTRIBUTE_UNUSED;
2284 combined_entry_type *symbol;
2285 unsigned int indaux;
2286 combined_entry_type *aux ATTRIBUTE_UNUSED;
2288 /* Return true if we don't want to pointerize this aux entry, which
2289 is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */
2290 return (indaux == 1
2291 && (symbol->u.syment.n_sclass == C_LEAFPROC
2292 || symbol->u.syment.n_sclass == C_LEAFSTAT
2293 || symbol->u.syment.n_sclass == C_LEAFEXT));
2296 #else /* ! I960 */
2298 #define coff_pointerize_aux_hook 0
2300 #endif /* ! I960 */
2301 #endif /* ! RS6000COFF_C */
2303 /* Print an aux entry. This returns true if it has printed it. */
2305 static boolean coff_print_aux
2306 PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
2307 combined_entry_type *, unsigned int));
2309 static boolean
2310 coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
2311 bfd *abfd ATTRIBUTE_UNUSED;
2312 FILE *file ATTRIBUTE_UNUSED;
2313 combined_entry_type *table_base ATTRIBUTE_UNUSED;
2314 combined_entry_type *symbol ATTRIBUTE_UNUSED;
2315 combined_entry_type *aux ATTRIBUTE_UNUSED;
2316 unsigned int indaux ATTRIBUTE_UNUSED;
2318 #ifdef RS6000COFF_C
2319 if ((symbol->u.syment.n_sclass == C_EXT
2320 || symbol->u.syment.n_sclass == C_HIDEXT)
2321 && indaux + 1 == symbol->u.syment.n_numaux)
2323 /* This is a csect entry. */
2324 fprintf (file, "AUX ");
2325 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2327 BFD_ASSERT (! aux->fix_scnlen);
2328 #ifdef XCOFF64
2329 fprintf (file, "val %5lld", aux->u.auxent.x_csect.x_scnlen.l);
2330 #else
2331 fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2332 #endif
2334 else
2336 fprintf (file, "indx ");
2337 if (! aux->fix_scnlen)
2338 #ifdef XCOFF64
2339 fprintf (file, "%4lld", aux->u.auxent.x_csect.x_scnlen.l);
2340 #else
2341 fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2342 #endif
2343 else
2344 fprintf (file, "%4ld",
2345 (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2347 fprintf (file,
2348 " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2349 aux->u.auxent.x_csect.x_parmhash,
2350 (unsigned int) aux->u.auxent.x_csect.x_snhash,
2351 SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2352 SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2353 (unsigned int) aux->u.auxent.x_csect.x_smclas,
2354 aux->u.auxent.x_csect.x_stab,
2355 (unsigned int) aux->u.auxent.x_csect.x_snstab);
2356 return true;
2358 #endif
2360 /* Return false to indicate that no special action was taken. */
2361 return false;
2365 SUBSUBSECTION
2366 Writing relocations
2368 To write relocations, the back end steps though the
2369 canonical relocation table and create an
2370 @code{internal_reloc}. The symbol index to use is removed from
2371 the @code{offset} field in the symbol table supplied. The
2372 address comes directly from the sum of the section base
2373 address and the relocation offset; the type is dug directly
2374 from the howto field. Then the @code{internal_reloc} is
2375 swapped into the shape of an @code{external_reloc} and written
2376 out to disk.
2380 #ifdef TARG_AUX
2382 static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2384 /* AUX's ld wants relocations to be sorted */
2385 static int
2386 compare_arelent_ptr (x, y)
2387 const PTR x;
2388 const PTR y;
2390 const arelent **a = (const arelent **) x;
2391 const arelent **b = (const arelent **) y;
2392 bfd_size_type aadr = (*a)->address;
2393 bfd_size_type badr = (*b)->address;
2395 return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2398 #endif /* TARG_AUX */
2400 static boolean
2401 coff_write_relocs (abfd, first_undef)
2402 bfd * abfd;
2403 int first_undef;
2405 asection *s;
2407 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2409 unsigned int i;
2410 struct external_reloc dst;
2411 arelent **p;
2413 #ifndef TARG_AUX
2414 p = s->orelocation;
2415 #else
2416 /* sort relocations before we write them out */
2417 p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
2418 if (p == NULL && s->reloc_count > 0)
2419 return false;
2420 memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2421 qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2422 #endif
2424 if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2425 return false;
2427 #ifdef COFF_WITH_PE
2428 if (s->reloc_count > 0xffff)
2430 /* encode real count here as first reloc */
2431 struct internal_reloc n;
2432 memset ((PTR) & n, 0, sizeof (n));
2433 /* add one to count *this* reloc (grr) */
2434 n.r_vaddr = s->reloc_count + 1;
2435 coff_swap_reloc_out (abfd, &n, &dst);
2436 if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
2437 != bfd_coff_relsz (abfd))
2438 return false;
2440 #endif
2442 for (i = 0; i < s->reloc_count; i++)
2444 struct internal_reloc n;
2445 arelent *q = p[i];
2446 memset ((PTR) & n, 0, sizeof (n));
2448 /* Now we've renumbered the symbols we know where the
2449 undefined symbols live in the table. Check the reloc
2450 entries for symbols who's output bfd isn't the right one.
2451 This is because the symbol was undefined (which means
2452 that all the pointers are never made to point to the same
2453 place). This is a bad thing,'cause the symbols attached
2454 to the output bfd are indexed, so that the relocation
2455 entries know which symbol index they point to. So we
2456 have to look up the output symbol here. */
2458 if (q->sym_ptr_ptr[0]->the_bfd != abfd)
2460 int i;
2461 const char *sname = q->sym_ptr_ptr[0]->name;
2462 asymbol **outsyms = abfd->outsymbols;
2463 for (i = first_undef; outsyms[i]; i++)
2465 const char *intable = outsyms[i]->name;
2466 if (strcmp (intable, sname) == 0) {
2467 /* got a hit, so repoint the reloc */
2468 q->sym_ptr_ptr = outsyms + i;
2469 break;
2474 n.r_vaddr = q->address + s->vma;
2476 #ifdef R_IHCONST
2477 /* The 29k const/consth reloc pair is a real kludge. The consth
2478 part doesn't have a symbol; it has an offset. So rebuilt
2479 that here. */
2480 if (q->howto->type == R_IHCONST)
2481 n.r_symndx = q->addend;
2482 else
2483 #endif
2484 if (q->sym_ptr_ptr)
2486 #ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
2487 if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
2488 #else
2489 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
2490 #endif
2491 /* This is a relocation relative to the absolute symbol. */
2492 n.r_symndx = -1;
2493 else
2495 n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2496 /* Take notice if the symbol reloc points to a symbol
2497 we don't have in our symbol table. What should we
2498 do for this?? */
2499 if (n.r_symndx > obj_conv_table_size (abfd))
2500 abort ();
2504 #ifdef SWAP_OUT_RELOC_OFFSET
2505 n.r_offset = q->addend;
2506 #endif
2508 #ifdef SELECT_RELOC
2509 /* Work out reloc type from what is required */
2510 SELECT_RELOC (n, q->howto);
2511 #else
2512 n.r_type = q->howto->type;
2513 #endif
2514 coff_swap_reloc_out (abfd, &n, &dst);
2515 if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
2516 != bfd_coff_relsz (abfd))
2517 return false;
2520 #ifdef TARG_AUX
2521 if (p != NULL)
2522 free (p);
2523 #endif
2526 return true;
2529 /* Set flags and magic number of a coff file from architecture and machine
2530 type. Result is true if we can represent the arch&type, false if not. */
2532 static boolean
2533 coff_set_flags (abfd, magicp, flagsp)
2534 bfd * abfd;
2535 unsigned int *magicp ATTRIBUTE_UNUSED;
2536 unsigned short *flagsp ATTRIBUTE_UNUSED;
2538 switch (bfd_get_arch (abfd))
2540 #ifdef Z8KMAGIC
2541 case bfd_arch_z8k:
2542 *magicp = Z8KMAGIC;
2543 switch (bfd_get_mach (abfd))
2545 case bfd_mach_z8001:
2546 *flagsp = F_Z8001;
2547 break;
2548 case bfd_mach_z8002:
2549 *flagsp = F_Z8002;
2550 break;
2551 default:
2552 return false;
2554 return true;
2555 #endif
2556 #ifdef I960ROMAGIC
2558 case bfd_arch_i960:
2561 unsigned flags;
2562 *magicp = I960ROMAGIC;
2564 ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
2565 I960RWMAGIC); FIXME???
2567 switch (bfd_get_mach (abfd))
2569 case bfd_mach_i960_core:
2570 flags = F_I960CORE;
2571 break;
2572 case bfd_mach_i960_kb_sb:
2573 flags = F_I960KB;
2574 break;
2575 case bfd_mach_i960_mc:
2576 flags = F_I960MC;
2577 break;
2578 case bfd_mach_i960_xa:
2579 flags = F_I960XA;
2580 break;
2581 case bfd_mach_i960_ca:
2582 flags = F_I960CA;
2583 break;
2584 case bfd_mach_i960_ka_sa:
2585 flags = F_I960KA;
2586 break;
2587 case bfd_mach_i960_jx:
2588 flags = F_I960JX;
2589 break;
2590 case bfd_mach_i960_hx:
2591 flags = F_I960HX;
2592 break;
2593 default:
2594 return false;
2596 *flagsp = flags;
2597 return true;
2599 break;
2600 #endif
2602 #ifdef TIC30MAGIC
2603 case bfd_arch_tic30:
2604 *magicp = TIC30MAGIC;
2605 return true;
2606 #endif
2608 #ifdef TICOFF_DEFAULT_MAGIC
2609 case TICOFF_TARGET_ARCH:
2610 /* if there's no indication of which version we want, use the default */
2611 if (!abfd->xvec )
2612 *magicp = TICOFF_DEFAULT_MAGIC;
2613 else
2615 /* we may want to output in a different COFF version */
2616 switch (abfd->xvec->name[4])
2618 case '0':
2619 *magicp = TICOFF0MAGIC;
2620 break;
2621 case '1':
2622 *magicp = TICOFF1MAGIC;
2623 break;
2624 case '2':
2625 *magicp = TICOFF2MAGIC;
2626 break;
2627 default:
2628 return false;
2631 return true;
2632 #endif
2634 #ifdef TIC80_ARCH_MAGIC
2635 case bfd_arch_tic80:
2636 *magicp = TIC80_ARCH_MAGIC;
2637 return true;
2638 #endif
2639 #ifdef ARMMAGIC
2640 case bfd_arch_arm:
2641 #ifdef ARM_WINCE
2642 * magicp = ARMPEMAGIC;
2643 #else
2644 * magicp = ARMMAGIC;
2645 #endif
2646 * flagsp = 0;
2647 if (APCS_SET (abfd))
2649 if (APCS_26_FLAG (abfd))
2650 * flagsp |= F_APCS26;
2652 if (APCS_FLOAT_FLAG (abfd))
2653 * flagsp |= F_APCS_FLOAT;
2655 if (PIC_FLAG (abfd))
2656 * flagsp |= F_PIC;
2658 if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2659 * flagsp |= F_INTERWORK;
2660 switch (bfd_get_mach (abfd))
2662 case bfd_mach_arm_2: * flagsp |= F_ARM_2; break;
2663 case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2664 case bfd_mach_arm_3: * flagsp |= F_ARM_3; break;
2665 case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2666 case bfd_mach_arm_4: * flagsp |= F_ARM_4; break;
2667 case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
2668 case bfd_mach_arm_5: * flagsp |= F_ARM_5; break;
2669 /* FIXME: we do not have F_ARM vaues greater than F_ARM_5. */
2670 case bfd_mach_arm_5T: * flagsp |= F_ARM_5; break;
2671 case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
2672 case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
2674 return true;
2675 #endif
2676 #ifdef PPCMAGIC
2677 case bfd_arch_powerpc:
2678 *magicp = PPCMAGIC;
2679 return true;
2680 break;
2681 #endif
2682 #ifdef I386MAGIC
2683 case bfd_arch_i386:
2684 *magicp = I386MAGIC;
2685 #ifdef LYNXOS
2686 /* Just overwrite the usual value if we're doing Lynx. */
2687 *magicp = LYNXCOFFMAGIC;
2688 #endif
2689 return true;
2690 break;
2691 #endif
2692 #ifdef I860MAGIC
2693 case bfd_arch_i860:
2694 *magicp = I860MAGIC;
2695 return true;
2696 break;
2697 #endif
2698 #ifdef IA64MAGIC
2699 case bfd_arch_ia64:
2700 *magicp = IA64MAGIC;
2701 return true;
2702 break;
2703 #endif
2704 #ifdef MC68MAGIC
2705 case bfd_arch_m68k:
2706 #ifdef APOLLOM68KMAGIC
2707 *magicp = APOLLO_COFF_VERSION_NUMBER;
2708 #else
2709 /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c. */
2710 #ifdef NAMES_HAVE_UNDERSCORE
2711 *magicp = MC68KBCSMAGIC;
2712 #else
2713 *magicp = MC68MAGIC;
2714 #endif
2715 #endif
2716 #ifdef LYNXOS
2717 /* Just overwrite the usual value if we're doing Lynx. */
2718 *magicp = LYNXCOFFMAGIC;
2719 #endif
2720 return true;
2721 break;
2722 #endif
2724 #ifdef MC88MAGIC
2725 case bfd_arch_m88k:
2726 *magicp = MC88OMAGIC;
2727 return true;
2728 break;
2729 #endif
2730 #ifdef H8300MAGIC
2731 case bfd_arch_h8300:
2732 switch (bfd_get_mach (abfd))
2734 case bfd_mach_h8300:
2735 *magicp = H8300MAGIC;
2736 return true;
2737 case bfd_mach_h8300h:
2738 *magicp = H8300HMAGIC;
2739 return true;
2740 case bfd_mach_h8300s:
2741 *magicp = H8300SMAGIC;
2742 return true;
2744 break;
2745 #endif
2747 #ifdef SH_ARCH_MAGIC_BIG
2748 case bfd_arch_sh:
2749 #ifdef COFF_IMAGE_WITH_PE
2750 *magicp = SH_ARCH_MAGIC_WINCE;
2751 #else
2752 if (bfd_big_endian (abfd))
2753 *magicp = SH_ARCH_MAGIC_BIG;
2754 else
2755 *magicp = SH_ARCH_MAGIC_LITTLE;
2756 #endif
2757 return true;
2758 break;
2759 #endif
2761 #ifdef MIPS_ARCH_MAGIC_WINCE
2762 case bfd_arch_mips:
2763 *magicp = MIPS_ARCH_MAGIC_WINCE;
2764 return true;
2765 break;
2766 #endif
2768 #ifdef SPARCMAGIC
2769 case bfd_arch_sparc:
2770 *magicp = SPARCMAGIC;
2771 #ifdef LYNXOS
2772 /* Just overwrite the usual value if we're doing Lynx. */
2773 *magicp = LYNXCOFFMAGIC;
2774 #endif
2775 return true;
2776 break;
2777 #endif
2779 #ifdef H8500MAGIC
2780 case bfd_arch_h8500:
2781 *magicp = H8500MAGIC;
2782 return true;
2783 break;
2784 #endif
2785 #ifdef A29K_MAGIC_BIG
2786 case bfd_arch_a29k:
2787 if (bfd_big_endian (abfd))
2788 *magicp = A29K_MAGIC_BIG;
2789 else
2790 *magicp = A29K_MAGIC_LITTLE;
2791 return true;
2792 break;
2793 #endif
2795 #ifdef WE32KMAGIC
2796 case bfd_arch_we32k:
2797 *magicp = WE32KMAGIC;
2798 return true;
2799 break;
2800 #endif
2802 #ifdef RS6000COFF_C
2803 case bfd_arch_rs6000:
2804 #ifndef PPCMAGIC
2805 case bfd_arch_powerpc:
2806 #endif
2807 #ifdef XCOFF64
2808 if (bfd_get_mach (abfd) == bfd_mach_ppc_620
2809 && !strncmp (abfd->xvec->name,"aix", 3))
2810 *magicp = U803XTOCMAGIC;
2811 else
2812 #else
2813 *magicp = U802TOCMAGIC;
2814 #endif
2815 return true;
2816 break;
2817 #endif
2819 #ifdef MCOREMAGIC
2820 case bfd_arch_mcore:
2821 * magicp = MCOREMAGIC;
2822 return true;
2823 #endif
2825 #ifdef W65MAGIC
2826 case bfd_arch_w65:
2827 *magicp = W65MAGIC;
2828 return true;
2829 #endif
2831 default: /* Unknown architecture. */
2832 /* Fall through to "return false" below, to avoid
2833 "statement never reached" errors on the one below. */
2834 break;
2837 return false;
2840 static boolean
2841 coff_set_arch_mach (abfd, arch, machine)
2842 bfd * abfd;
2843 enum bfd_architecture arch;
2844 unsigned long machine;
2846 unsigned dummy1;
2847 unsigned short dummy2;
2849 if (! bfd_default_set_arch_mach (abfd, arch, machine))
2850 return false;
2852 if (arch != bfd_arch_unknown &&
2853 coff_set_flags (abfd, &dummy1, &dummy2) != true)
2854 return false; /* We can't represent this type */
2856 return true; /* We're easy ... */
2859 #ifdef COFF_IMAGE_WITH_PE
2861 /* This is used to sort sections by VMA, as required by PE image
2862 files. */
2864 static int sort_by_secaddr PARAMS ((const PTR, const PTR));
2866 static int
2867 sort_by_secaddr (arg1, arg2)
2868 const PTR arg1;
2869 const PTR arg2;
2871 const asection *a = *(const asection **) arg1;
2872 const asection *b = *(const asection **) arg2;
2874 if (a->vma < b->vma)
2875 return -1;
2876 else if (a->vma > b->vma)
2877 return 1;
2878 else
2879 return 0;
2882 #endif /* COFF_IMAGE_WITH_PE */
2884 /* Calculate the file position for each section. */
2886 #ifndef I960
2887 #define ALIGN_SECTIONS_IN_FILE
2888 #endif
2889 #if defined(TIC80COFF) || defined(TICOFF)
2890 #undef ALIGN_SECTIONS_IN_FILE
2891 #endif
2893 static boolean
2894 coff_compute_section_file_positions (abfd)
2895 bfd * abfd;
2897 asection *current;
2898 asection *previous = (asection *) NULL;
2899 file_ptr sofar = bfd_coff_filhsz (abfd);
2900 boolean align_adjust;
2901 #ifdef ALIGN_SECTIONS_IN_FILE
2902 file_ptr old_sofar;
2903 #endif
2905 #ifdef RS6000COFF_C
2906 /* On XCOFF, if we have symbols, set up the .debug section. */
2907 if (bfd_get_symcount (abfd) > 0)
2909 bfd_size_type sz;
2910 bfd_size_type i, symcount;
2911 asymbol **symp;
2913 sz = 0;
2914 symcount = bfd_get_symcount (abfd);
2915 for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2917 coff_symbol_type *cf;
2919 cf = coff_symbol_from (abfd, *symp);
2920 if (cf != NULL
2921 && cf->native != NULL
2922 && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2924 size_t len;
2926 len = strlen (bfd_asymbol_name (*symp));
2927 if (len > SYMNMLEN || bfd_coff_force_symnames_in_strings (abfd))
2928 sz += len + 1 + bfd_coff_debug_string_prefix_length (abfd);
2931 if (sz > 0)
2933 asection *dsec;
2935 dsec = bfd_make_section_old_way (abfd, ".debug");
2936 if (dsec == NULL)
2937 abort ();
2938 dsec->_raw_size = sz;
2939 dsec->flags |= SEC_HAS_CONTENTS;
2942 #endif
2944 #ifdef COFF_IMAGE_WITH_PE
2945 int page_size;
2946 if (coff_data (abfd)->link_info)
2948 page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2950 else
2951 page_size = PE_DEF_FILE_ALIGNMENT;
2952 #else
2953 #ifdef COFF_PAGE_SIZE
2954 int page_size = COFF_PAGE_SIZE;
2955 #endif
2956 #endif
2958 if (bfd_get_start_address (abfd))
2960 /* A start address may have been added to the original file. In this
2961 case it will need an optional header to record it. */
2962 abfd->flags |= EXEC_P;
2965 if (abfd->flags & EXEC_P)
2966 sofar += bfd_coff_aoutsz (abfd);
2967 #ifdef RS6000COFF_C
2968 else if (xcoff_data (abfd)->full_aouthdr)
2969 sofar += bfd_coff_aoutsz (abfd);
2970 else
2971 sofar += SMALL_AOUTSZ;
2972 #endif
2974 sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
2976 #ifdef RS6000COFF_C
2977 /* XCOFF handles overflows in the reloc and line number count fields
2978 by allocating a new section header to hold the correct counts. */
2979 for (current = abfd->sections; current != NULL; current = current->next)
2980 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2981 sofar += bfd_coff_scnhsz (abfd);
2982 #endif
2984 #ifdef COFF_IMAGE_WITH_PE
2986 /* PE requires the sections to be in memory order when listed in
2987 the section headers. It also does not like empty loadable
2988 sections. The sections apparently do not have to be in the
2989 right order in the image file itself, but we do need to get the
2990 target_index values right. */
2992 int count;
2993 asection **section_list;
2994 int i;
2995 int target_index;
2997 count = 0;
2998 for (current = abfd->sections; current != NULL; current = current->next)
2999 ++count;
3001 /* We allocate an extra cell to simplify the final loop. */
3002 section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
3003 if (section_list == NULL)
3004 return false;
3006 i = 0;
3007 for (current = abfd->sections; current != NULL; current = current->next)
3009 section_list[i] = current;
3010 ++i;
3012 section_list[i] = NULL;
3014 qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
3016 /* Rethread the linked list into sorted order; at the same time,
3017 assign target_index values. */
3018 target_index = 1;
3019 abfd->sections = section_list[0];
3020 for (i = 0; i < count; i++)
3022 current = section_list[i];
3023 current->next = section_list[i + 1];
3025 /* Later, if the section has zero size, we'll be throwing it
3026 away, so we don't want to number it now. Note that having
3027 a zero size and having real contents are different
3028 concepts: .bss has no contents, but (usually) non-zero
3029 size. */
3030 if (current->_raw_size == 0)
3032 /* Discard. However, it still might have (valid) symbols
3033 in it, so arbitrarily set it to section 1 (indexing is
3034 1-based here; usually .text). __end__ and other
3035 contents of .endsection really have this happen.
3036 FIXME: This seems somewhat dubious. */
3037 current->target_index = 1;
3039 else
3040 current->target_index = target_index++;
3043 free (section_list);
3045 #else /* ! COFF_IMAGE_WITH_PE */
3047 /* Set the target_index field. */
3048 int target_index;
3050 target_index = 1;
3051 for (current = abfd->sections; current != NULL; current = current->next)
3052 current->target_index = target_index++;
3054 #endif /* ! COFF_IMAGE_WITH_PE */
3056 align_adjust = false;
3057 for (current = abfd->sections;
3058 current != (asection *) NULL;
3059 current = current->next)
3061 #ifdef COFF_IMAGE_WITH_PE
3062 /* With PE we have to pad each section to be a multiple of its
3063 page size too, and remember both sizes. */
3064 if (coff_section_data (abfd, current) == NULL)
3066 current->used_by_bfd =
3067 (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
3068 if (current->used_by_bfd == NULL)
3069 return false;
3071 if (pei_section_data (abfd, current) == NULL)
3073 coff_section_data (abfd, current)->tdata =
3074 (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
3075 if (coff_section_data (abfd, current)->tdata == NULL)
3076 return false;
3078 if (pei_section_data (abfd, current)->virt_size == 0)
3079 pei_section_data (abfd, current)->virt_size = current->_raw_size;
3080 #endif
3082 /* Only deal with sections which have contents. */
3083 if (!(current->flags & SEC_HAS_CONTENTS))
3084 continue;
3086 #ifdef COFF_IMAGE_WITH_PE
3087 /* Make sure we skip empty sections in a PE image. */
3088 if (current->_raw_size == 0)
3089 continue;
3090 #endif
3092 /* Align the sections in the file to the same boundary on
3093 which they are aligned in virtual memory. I960 doesn't
3094 do this (FIXME) so we can stay in sync with Intel. 960
3095 doesn't yet page from files... */
3096 #ifdef ALIGN_SECTIONS_IN_FILE
3097 if ((abfd->flags & EXEC_P) != 0)
3099 /* make sure this section is aligned on the right boundary - by
3100 padding the previous section up if necessary */
3102 old_sofar = sofar;
3103 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3104 if (previous != (asection *) NULL)
3106 previous->_raw_size += sofar - old_sofar;
3110 #endif
3112 /* In demand paged files the low order bits of the file offset
3113 must match the low order bits of the virtual address. */
3114 #ifdef COFF_PAGE_SIZE
3115 if ((abfd->flags & D_PAGED) != 0
3116 && (current->flags & SEC_ALLOC) != 0)
3117 sofar += (current->vma - sofar) % page_size;
3118 #endif
3119 current->filepos = sofar;
3121 #ifdef COFF_IMAGE_WITH_PE
3122 /* Set the padded size. */
3123 current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
3124 #endif
3126 sofar += current->_raw_size;
3128 #ifdef ALIGN_SECTIONS_IN_FILE
3129 /* make sure that this section is of the right size too */
3130 if ((abfd->flags & EXEC_P) == 0)
3132 bfd_size_type old_size;
3134 old_size = current->_raw_size;
3135 current->_raw_size = BFD_ALIGN (current->_raw_size,
3136 1 << current->alignment_power);
3137 align_adjust = current->_raw_size != old_size;
3138 sofar += current->_raw_size - old_size;
3140 else
3142 old_sofar = sofar;
3143 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3144 align_adjust = sofar != old_sofar;
3145 current->_raw_size += sofar - old_sofar;
3147 #endif
3149 #ifdef COFF_IMAGE_WITH_PE
3150 /* For PE we need to make sure we pad out to the aligned
3151 _raw_size, in case the caller only writes out data to the
3152 unaligned _raw_size. */
3153 if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
3154 align_adjust = true;
3155 #endif
3157 #ifdef _LIB
3158 /* Force .lib sections to start at zero. The vma is then
3159 incremented in coff_set_section_contents. This is right for
3160 SVR3.2. */
3161 if (strcmp (current->name, _LIB) == 0)
3162 bfd_set_section_vma (abfd, current, 0);
3163 #endif
3165 previous = current;
3168 /* It is now safe to write to the output file. If we needed an
3169 alignment adjustment for the last section, then make sure that
3170 there is a byte at offset sofar. If there are no symbols and no
3171 relocs, then nothing follows the last section. If we don't force
3172 the last byte out, then the file may appear to be truncated. */
3173 if (align_adjust)
3175 bfd_byte b;
3177 b = 0;
3178 if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
3179 || bfd_write (&b, 1, 1, abfd) != 1)
3180 return false;
3183 /* Make sure the relocations are aligned. We don't need to make
3184 sure that this byte exists, because it will only matter if there
3185 really are relocs. */
3186 sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
3188 obj_relocbase (abfd) = sofar;
3189 abfd->output_has_begun = true;
3191 return true;
3194 #if 0
3196 /* This can never work, because it is called too late--after the
3197 section positions have been set. I can't figure out what it is
3198 for, so I am going to disable it--Ian Taylor 20 March 1996. */
3200 /* If .file, .text, .data, .bss symbols are missing, add them. */
3201 /* @@ Should we only be adding missing symbols, or overriding the aux
3202 values for existing section symbols? */
3203 static boolean
3204 coff_add_missing_symbols (abfd)
3205 bfd *abfd;
3207 unsigned int nsyms = bfd_get_symcount (abfd);
3208 asymbol **sympp = abfd->outsymbols;
3209 asymbol **sympp2;
3210 unsigned int i;
3211 int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
3213 for (i = 0; i < nsyms; i++)
3215 coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
3216 CONST char *name;
3217 if (csym)
3219 /* only do this if there is a coff representation of the input
3220 symbol */
3221 if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
3223 need_file = 0;
3224 continue;
3226 name = csym->symbol.name;
3227 if (!name)
3228 continue;
3229 if (!strcmp (name, _TEXT))
3230 need_text = 0;
3231 #ifdef APOLLO_M68
3232 else if (!strcmp (name, ".wtext"))
3233 need_text = 0;
3234 #endif
3235 else if (!strcmp (name, _DATA))
3236 need_data = 0;
3237 else if (!strcmp (name, _BSS))
3238 need_bss = 0;
3241 /* Now i == bfd_get_symcount (abfd). */
3242 /* @@ For now, don't deal with .file symbol. */
3243 need_file = 0;
3245 if (!need_text && !need_data && !need_bss && !need_file)
3246 return true;
3247 nsyms += need_text + need_data + need_bss + need_file;
3248 sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
3249 if (!sympp2)
3250 return false;
3251 memcpy (sympp2, sympp, i * sizeof (asymbol *));
3252 if (need_file)
3254 /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */
3255 abort ();
3257 if (need_text)
3258 sympp2[i++] = coff_section_symbol (abfd, _TEXT);
3259 if (need_data)
3260 sympp2[i++] = coff_section_symbol (abfd, _DATA);
3261 if (need_bss)
3262 sympp2[i++] = coff_section_symbol (abfd, _BSS);
3263 BFD_ASSERT (i == nsyms);
3264 bfd_set_symtab (abfd, sympp2, nsyms);
3265 return true;
3268 #endif /* 0 */
3270 /* SUPPRESS 558 */
3271 /* SUPPRESS 529 */
3272 static boolean
3273 coff_write_object_contents (abfd)
3274 bfd * abfd;
3276 asection *current;
3277 boolean hasrelocs = false;
3278 boolean haslinno = false;
3279 boolean hasdebug = false;
3280 file_ptr scn_base;
3281 file_ptr reloc_base;
3282 file_ptr lineno_base;
3283 file_ptr sym_base;
3284 unsigned long reloc_size = 0, reloc_count = 0;
3285 unsigned long lnno_size = 0;
3286 boolean long_section_names;
3287 asection *text_sec = NULL;
3288 asection *data_sec = NULL;
3289 asection *bss_sec = NULL;
3290 struct internal_filehdr internal_f;
3291 struct internal_aouthdr internal_a;
3292 #ifdef COFF_LONG_SECTION_NAMES
3293 size_t string_size = STRING_SIZE_SIZE;
3294 #endif
3296 bfd_set_error (bfd_error_system_call);
3298 /* Make a pass through the symbol table to count line number entries and
3299 put them into the correct asections */
3301 lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
3303 if (abfd->output_has_begun == false)
3305 if (! coff_compute_section_file_positions (abfd))
3306 return false;
3309 reloc_base = obj_relocbase (abfd);
3311 /* Work out the size of the reloc and linno areas */
3313 for (current = abfd->sections; current != NULL; current =
3314 current->next)
3316 #ifdef COFF_WITH_PE
3317 /* we store the actual reloc count in the first reloc's addr */
3318 if (current->reloc_count > 0xffff)
3319 reloc_count ++;
3320 #endif
3321 reloc_count += current->reloc_count;
3324 reloc_size = reloc_count * bfd_coff_relsz (abfd);
3326 lineno_base = reloc_base + reloc_size;
3327 sym_base = lineno_base + lnno_size;
3329 /* Indicate in each section->line_filepos its actual file address */
3330 for (current = abfd->sections; current != NULL; current =
3331 current->next)
3333 if (current->lineno_count)
3335 current->line_filepos = lineno_base;
3336 current->moving_line_filepos = lineno_base;
3337 lineno_base += current->lineno_count * bfd_coff_linesz (abfd);
3339 else
3341 current->line_filepos = 0;
3343 if (current->reloc_count)
3345 current->rel_filepos = reloc_base;
3346 reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
3347 #ifdef COFF_WITH_PE
3348 /* extra reloc to hold real count */
3349 if (current->reloc_count > 0xffff)
3350 reloc_base += bfd_coff_relsz (abfd);
3351 #endif
3353 else
3355 current->rel_filepos = 0;
3359 /* Write section headers to the file. */
3360 internal_f.f_nscns = 0;
3362 if ((abfd->flags & EXEC_P) != 0)
3363 scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
3364 else
3366 scn_base = bfd_coff_filhsz (abfd);
3367 #ifdef RS6000COFF_C
3368 #ifndef XCOFF64
3369 if (xcoff_data (abfd)->full_aouthdr)
3370 scn_base += bfd_coff_aoutsz (abfd);
3371 else
3372 scn_base += SMALL_AOUTSZ;
3373 #endif
3374 #endif
3377 if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
3378 return false;
3380 long_section_names = false;
3381 for (current = abfd->sections;
3382 current != NULL;
3383 current = current->next)
3385 struct internal_scnhdr section;
3386 boolean is_reloc_section = false;
3388 #ifdef COFF_IMAGE_WITH_PE
3389 if (strcmp (current->name, ".reloc") == 0)
3391 is_reloc_section = true;
3392 hasrelocs = true;
3393 pe_data (abfd)->has_reloc_section = 1;
3395 #endif
3397 internal_f.f_nscns++;
3399 strncpy (section.s_name, current->name, SCNNMLEN);
3401 #ifdef COFF_LONG_SECTION_NAMES
3402 /* Handle long section names as in PE. This must be compatible
3403 with the code in coff_write_symbols and _bfd_coff_final_link. */
3405 size_t len;
3407 len = strlen (current->name);
3408 if (len > SCNNMLEN)
3410 memset (section.s_name, 0, SCNNMLEN);
3411 sprintf (section.s_name, "/%lu", (unsigned long) string_size);
3412 string_size += len + 1;
3413 long_section_names = true;
3416 #endif
3418 #ifdef _LIB
3419 /* Always set s_vaddr of .lib to 0. This is right for SVR3.2
3420 Ian Taylor <ian@cygnus.com>. */
3421 if (strcmp (current->name, _LIB) == 0)
3422 section.s_vaddr = 0;
3423 else
3424 #endif
3425 section.s_vaddr = current->vma;
3426 section.s_paddr = current->lma;
3427 section.s_size = current->_raw_size;
3428 #ifdef coff_get_section_load_page
3429 section.s_page = coff_get_section_load_page (current);
3430 #endif
3432 #ifdef COFF_WITH_PE
3433 section.s_paddr = 0;
3434 #endif
3435 #ifdef COFF_IMAGE_WITH_PE
3436 /* Reminder: s_paddr holds the virtual size of the section. */
3437 if (coff_section_data (abfd, current) != NULL
3438 && pei_section_data (abfd, current) != NULL)
3439 section.s_paddr = pei_section_data (abfd, current)->virt_size;
3440 else
3441 section.s_paddr = 0;
3442 #endif
3445 If this section has no size or is unloadable then the scnptr
3446 will be 0 too
3448 if (current->_raw_size == 0 ||
3449 (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3451 section.s_scnptr = 0;
3453 else
3455 section.s_scnptr = current->filepos;
3457 section.s_relptr = current->rel_filepos;
3458 section.s_lnnoptr = current->line_filepos;
3459 section.s_nreloc = current->reloc_count;
3460 section.s_nlnno = current->lineno_count;
3461 #ifndef COFF_IMAGE_WITH_PE
3462 /* In PEI, relocs come in the .reloc section. */
3463 if (current->reloc_count != 0)
3464 hasrelocs = true;
3465 #endif
3466 if (current->lineno_count != 0)
3467 haslinno = true;
3468 if ((current->flags & SEC_DEBUGGING) != 0
3469 && ! is_reloc_section)
3470 hasdebug = true;
3472 #ifdef RS6000COFF_C
3473 #ifndef XCOFF64
3474 /* Indicate the use of an XCOFF overflow section header. */
3475 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3477 section.s_nreloc = 0xffff;
3478 section.s_nlnno = 0xffff;
3480 #endif
3481 #endif
3483 section.s_flags = sec_to_styp_flags (current->name, current->flags);
3485 if (!strcmp (current->name, _TEXT))
3487 text_sec = current;
3489 else if (!strcmp (current->name, _DATA))
3491 data_sec = current;
3493 else if (!strcmp (current->name, _BSS))
3495 bss_sec = current;
3498 #ifdef I960
3499 section.s_align = (current->alignment_power
3500 ? 1 << current->alignment_power
3501 : 0);
3502 #endif
3503 #ifdef TIC80COFF
3504 /* TI COFF puts the alignment power in bits 8-11 of the flags */
3505 section.s_flags |= (current->alignment_power & 0xF) << 8;
3506 #endif
3507 #ifdef COFF_ENCODE_ALIGNMENT
3508 COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
3509 #endif
3511 #ifdef COFF_IMAGE_WITH_PE
3512 /* Suppress output of the sections if they are null. ld
3513 includes the bss and data sections even if there is no size
3514 assigned to them. NT loader doesn't like it if these section
3515 headers are included if the sections themselves are not
3516 needed. See also coff_compute_section_file_positions. */
3517 if (section.s_size == 0)
3518 internal_f.f_nscns--;
3519 else
3520 #endif
3522 SCNHDR buff;
3523 if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3524 || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
3525 != bfd_coff_scnhsz (abfd))
3526 return false;
3529 #ifdef COFF_WITH_PE
3530 /* PE stores COMDAT section information in the symbol table. If
3531 this section is supposed to have some COMDAT info, track down
3532 the symbol in the symbol table and modify it. */
3533 if ((current->flags & SEC_LINK_ONCE) != 0)
3535 unsigned int i, count;
3536 asymbol **psym;
3537 coff_symbol_type *csym = NULL;
3538 asymbol **psymsec;
3540 psymsec = NULL;
3541 count = bfd_get_symcount (abfd);
3542 for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3544 if ((*psym)->section != current)
3545 continue;
3547 /* Remember the location of the first symbol in this
3548 section. */
3549 if (psymsec == NULL)
3550 psymsec = psym;
3552 /* See if this is the section symbol. */
3553 if (strcmp ((*psym)->name, current->name) == 0)
3555 csym = coff_symbol_from (abfd, *psym);
3556 if (csym == NULL
3557 || csym->native == NULL
3558 || csym->native->u.syment.n_numaux < 1
3559 || csym->native->u.syment.n_sclass != C_STAT
3560 || csym->native->u.syment.n_type != T_NULL)
3561 continue;
3563 /* Here *PSYM is the section symbol for CURRENT. */
3565 break;
3569 /* Did we find it?
3570 Note that we might not if we're converting the file from
3571 some other object file format. */
3572 if (i < count)
3574 combined_entry_type *aux;
3576 /* We don't touch the x_checksum field. The
3577 x_associated field is not currently supported. */
3579 aux = csym->native + 1;
3580 switch (current->flags & SEC_LINK_DUPLICATES)
3582 case SEC_LINK_DUPLICATES_DISCARD:
3583 aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3584 break;
3586 case SEC_LINK_DUPLICATES_ONE_ONLY:
3587 aux->u.auxent.x_scn.x_comdat =
3588 IMAGE_COMDAT_SELECT_NODUPLICATES;
3589 break;
3591 case SEC_LINK_DUPLICATES_SAME_SIZE:
3592 aux->u.auxent.x_scn.x_comdat =
3593 IMAGE_COMDAT_SELECT_SAME_SIZE;
3594 break;
3596 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3597 aux->u.auxent.x_scn.x_comdat =
3598 IMAGE_COMDAT_SELECT_EXACT_MATCH;
3599 break;
3602 /* The COMDAT symbol must be the first symbol from this
3603 section in the symbol table. In order to make this
3604 work, we move the COMDAT symbol before the first
3605 symbol we found in the search above. It's OK to
3606 rearrange the symbol table at this point, because
3607 coff_renumber_symbols is going to rearrange it
3608 further and fix up all the aux entries. */
3609 if (psym != psymsec)
3611 asymbol *hold;
3612 asymbol **pcopy;
3614 hold = *psym;
3615 for (pcopy = psym; pcopy > psymsec; pcopy--)
3616 pcopy[0] = pcopy[-1];
3617 *psymsec = hold;
3621 #endif /* COFF_WITH_PE */
3624 #ifdef RS6000COFF_C
3625 #ifndef XCOFF64
3626 /* XCOFF handles overflows in the reloc and line number count fields
3627 by creating a new section header to hold the correct values. */
3628 for (current = abfd->sections; current != NULL; current = current->next)
3630 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3632 struct internal_scnhdr scnhdr;
3633 SCNHDR buff;
3635 internal_f.f_nscns++;
3636 strncpy (&(scnhdr.s_name[0]), current->name, 8);
3637 scnhdr.s_paddr = current->reloc_count;
3638 scnhdr.s_vaddr = current->lineno_count;
3639 scnhdr.s_size = 0;
3640 scnhdr.s_scnptr = 0;
3641 scnhdr.s_relptr = current->rel_filepos;
3642 scnhdr.s_lnnoptr = current->line_filepos;
3643 scnhdr.s_nreloc = current->target_index;
3644 scnhdr.s_nlnno = current->target_index;
3645 scnhdr.s_flags = STYP_OVRFLO;
3646 if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3647 || bfd_write ((PTR) &buff, 1, bfd_coff_scnhsz (abfd), abfd)
3648 != bfd_coff_scnhsz (abfd))
3649 return false;
3652 #endif
3653 #endif
3655 /* OK, now set up the filehdr... */
3657 /* Don't include the internal abs section in the section count */
3660 We will NOT put a fucking timestamp in the header here. Every time you
3661 put it back, I will come in and take it out again. I'm sorry. This
3662 field does not belong here. We fill it with a 0 so it compares the
3663 same but is not a reasonable time. -- gnu@cygnus.com
3665 internal_f.f_timdat = 0;
3667 internal_f.f_flags = 0;
3669 if (abfd->flags & EXEC_P)
3670 internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3671 else
3673 internal_f.f_opthdr = 0;
3674 #ifdef RS6000COFF_C
3675 #ifndef XCOFF64
3676 if (xcoff_data (abfd)->full_aouthdr)
3677 internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3678 else
3679 internal_f.f_opthdr = SMALL_AOUTSZ;
3680 #endif
3681 #endif
3684 if (!hasrelocs)
3685 internal_f.f_flags |= F_RELFLG;
3686 if (!haslinno)
3687 internal_f.f_flags |= F_LNNO;
3688 if (abfd->flags & EXEC_P)
3689 internal_f.f_flags |= F_EXEC;
3690 #ifdef COFF_IMAGE_WITH_PE
3691 if (! hasdebug)
3692 internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3693 #endif
3695 #ifndef COFF_WITH_PE
3696 if (bfd_little_endian (abfd))
3697 internal_f.f_flags |= F_AR32WR;
3698 else
3699 internal_f.f_flags |= F_AR32W;
3700 #endif
3702 #ifdef TI_TARGET_ID
3703 /* target id is used in TI COFF v1 and later; COFF0 won't use this field,
3704 but it doesn't hurt to set it internally */
3705 internal_f.f_target_id = TI_TARGET_ID;
3706 #endif
3707 #ifdef TIC80_TARGET_ID
3708 internal_f.f_target_id = TIC80_TARGET_ID;
3709 #endif
3712 FIXME, should do something about the other byte orders and
3713 architectures.
3716 #ifdef RS6000COFF_C
3717 if ((abfd->flags & DYNAMIC) != 0)
3718 internal_f.f_flags |= F_SHROBJ;
3719 if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3720 internal_f.f_flags |= F_DYNLOAD;
3721 #endif
3723 memset (&internal_a, 0, sizeof internal_a);
3725 /* Set up architecture-dependent stuff */
3728 unsigned int magic = 0;
3729 unsigned short flags = 0;
3730 coff_set_flags (abfd, &magic, &flags);
3731 internal_f.f_magic = magic;
3732 internal_f.f_flags |= flags;
3733 /* ...and the "opt"hdr... */
3735 #ifdef A29K
3736 #ifdef ULTRA3 /* NYU's machine */
3737 /* FIXME: This is a bogus check. I really want to see if there
3738 * is a .shbss or a .shdata section, if so then set the magic
3739 * number to indicate a shared data executable.
3741 if (internal_f.f_nscns >= 7)
3742 internal_a.magic = SHMAGIC; /* Shared magic */
3743 else
3744 #endif /* ULTRA3 */
3745 internal_a.magic = NMAGIC; /* Assume separate i/d */
3746 #define __A_MAGIC_SET__
3747 #endif /* A29K */
3748 #ifdef TICOFF_AOUT_MAGIC
3749 internal_a.magic = TICOFF_AOUT_MAGIC;
3750 #define __A_MAGIC_SET__
3751 #endif
3752 #ifdef TIC80COFF
3753 internal_a.magic = TIC80_ARCH_MAGIC;
3754 #define __A_MAGIC_SET__
3755 #endif /* TIC80 */
3756 #ifdef I860
3757 /* FIXME: What are the a.out magic numbers for the i860? */
3758 internal_a.magic = 0;
3759 #define __A_MAGIC_SET__
3760 #endif /* I860 */
3761 #ifdef I960
3762 internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3763 #define __A_MAGIC_SET__
3764 #endif /* I960 */
3765 #if M88
3766 #define __A_MAGIC_SET__
3767 internal_a.magic = PAGEMAGICBCS;
3768 #endif /* M88 */
3770 #if APOLLO_M68
3771 #define __A_MAGIC_SET__
3772 internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3773 #endif
3775 #if defined(M68) || defined(WE32K) || defined(M68K)
3776 #define __A_MAGIC_SET__
3777 #if defined(LYNXOS)
3778 internal_a.magic = LYNXCOFFMAGIC;
3779 #else
3780 #if defined(TARG_AUX)
3781 internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3782 abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3783 PAGEMAGICEXECSWAPPED);
3784 #else
3785 #if defined (PAGEMAGICPEXECPAGED)
3786 internal_a.magic = PAGEMAGICPEXECPAGED;
3787 #endif
3788 #endif /* TARG_AUX */
3789 #endif /* LYNXOS */
3790 #endif /* M68 || WE32K || M68K */
3792 #if defined(ARM)
3793 #define __A_MAGIC_SET__
3794 internal_a.magic = ZMAGIC;
3795 #endif
3797 #if defined(PPC_PE)
3798 #define __A_MAGIC_SET__
3799 internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3800 #endif
3802 #if defined MCORE_PE
3803 #define __A_MAGIC_SET__
3804 internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3805 #endif
3807 #if defined(I386)
3808 #define __A_MAGIC_SET__
3809 #if defined(LYNXOS)
3810 internal_a.magic = LYNXCOFFMAGIC;
3811 #else /* LYNXOS */
3812 internal_a.magic = ZMAGIC;
3813 #endif /* LYNXOS */
3814 #endif /* I386 */
3816 #if defined(IA64)
3817 #define __A_MAGIC_SET__
3818 internal_a.magic = ZMAGIC;
3819 #endif /* IA64 */
3821 #if defined(SPARC)
3822 #define __A_MAGIC_SET__
3823 #if defined(LYNXOS)
3824 internal_a.magic = LYNXCOFFMAGIC;
3825 #endif /* LYNXOS */
3826 #endif /* SPARC */
3828 #ifdef RS6000COFF_C
3829 #define __A_MAGIC_SET__
3830 internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
3831 (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
3832 RS6K_AOUTHDR_OMAGIC;
3833 #endif
3835 #if defined(SH) && defined(COFF_WITH_PE)
3836 #define __A_MAGIC_SET__
3837 internal_a.magic = SH_PE_MAGIC;
3838 #endif
3840 #if defined(MIPS) && defined(COFF_WITH_PE)
3841 #define __A_MAGIC_SET__
3842 internal_a.magic = MIPS_PE_MAGIC;
3843 #endif
3845 #ifndef __A_MAGIC_SET__
3846 #include "Your aouthdr magic number is not being set!"
3847 #else
3848 #undef __A_MAGIC_SET__
3849 #endif
3852 /* FIXME: Does anybody ever set this to another value? */
3853 internal_a.vstamp = 0;
3855 /* Now should write relocs, strings, syms */
3856 obj_sym_filepos (abfd) = sym_base;
3858 if (bfd_get_symcount (abfd) != 0)
3860 int firstundef;
3861 #if 0
3862 if (!coff_add_missing_symbols (abfd))
3863 return false;
3864 #endif
3865 if (!coff_renumber_symbols (abfd, &firstundef))
3866 return false;
3867 coff_mangle_symbols (abfd);
3868 if (! coff_write_symbols (abfd))
3869 return false;
3870 if (! coff_write_linenumbers (abfd))
3871 return false;
3872 if (! coff_write_relocs (abfd, firstundef))
3873 return false;
3875 #ifdef COFF_LONG_SECTION_NAMES
3876 else if (long_section_names && ! obj_coff_strings_written (abfd))
3878 /* If we have long section names we have to write out the string
3879 table even if there are no symbols. */
3880 if (! coff_write_symbols (abfd))
3881 return false;
3883 #endif
3884 #ifdef COFF_IMAGE_WITH_PE
3885 #ifdef PPC_PE
3886 else if ((abfd->flags & EXEC_P) != 0)
3888 bfd_byte b;
3890 /* PowerPC PE appears to require that all executable files be
3891 rounded up to the page size. */
3892 b = 0;
3893 if (bfd_seek (abfd,
3894 BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3895 SEEK_SET) != 0
3896 || bfd_write (&b, 1, 1, abfd) != 1)
3897 return false;
3899 #endif
3900 #endif
3902 /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
3903 backend linker, and obj_raw_syment_count is not valid until after
3904 coff_write_symbols is called. */
3905 if (obj_raw_syment_count (abfd) != 0)
3907 internal_f.f_symptr = sym_base;
3908 #ifdef RS6000COFF_C
3909 /* AIX appears to require that F_RELFLG not be set if there are
3910 local symbols but no relocations. */
3911 internal_f.f_flags &=~ F_RELFLG;
3912 #endif
3914 else
3916 if (long_section_names)
3917 internal_f.f_symptr = sym_base;
3918 else
3919 internal_f.f_symptr = 0;
3920 internal_f.f_flags |= F_LSYMS;
3923 if (text_sec)
3925 internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3926 internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3928 if (data_sec)
3930 internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3931 internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
3933 if (bss_sec)
3935 internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
3936 if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
3937 internal_a.data_start = bss_sec->vma;
3940 internal_a.entry = bfd_get_start_address (abfd);
3941 internal_f.f_nsyms = obj_raw_syment_count (abfd);
3943 #ifdef RS6000COFF_C
3944 if (xcoff_data (abfd)->full_aouthdr)
3946 bfd_vma toc;
3947 asection *loader_sec;
3949 internal_a.vstamp = 1;
3951 internal_a.o_snentry = xcoff_data (abfd)->snentry;
3952 if (internal_a.o_snentry == 0)
3953 internal_a.entry = (bfd_vma) -1;
3955 if (text_sec != NULL)
3957 internal_a.o_sntext = text_sec->target_index;
3958 internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
3960 else
3962 internal_a.o_sntext = 0;
3963 internal_a.o_algntext = 0;
3965 if (data_sec != NULL)
3967 internal_a.o_sndata = data_sec->target_index;
3968 internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
3970 else
3972 internal_a.o_sndata = 0;
3973 internal_a.o_algndata = 0;
3975 loader_sec = bfd_get_section_by_name (abfd, ".loader");
3976 if (loader_sec != NULL)
3977 internal_a.o_snloader = loader_sec->target_index;
3978 else
3979 internal_a.o_snloader = 0;
3980 if (bss_sec != NULL)
3981 internal_a.o_snbss = bss_sec->target_index;
3982 else
3983 internal_a.o_snbss = 0;
3985 toc = xcoff_data (abfd)->toc;
3986 internal_a.o_toc = toc;
3987 internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
3989 internal_a.o_modtype = xcoff_data (abfd)->modtype;
3990 if (xcoff_data (abfd)->cputype != -1)
3991 internal_a.o_cputype = xcoff_data (abfd)->cputype;
3992 else
3994 switch (bfd_get_arch (abfd))
3996 case bfd_arch_rs6000:
3997 internal_a.o_cputype = 4;
3998 break;
3999 case bfd_arch_powerpc:
4000 if (bfd_get_mach (abfd) == 0)
4001 internal_a.o_cputype = 3;
4002 else
4003 internal_a.o_cputype = 1;
4004 break;
4005 default:
4006 abort ();
4009 internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
4010 internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
4012 #endif
4014 /* now write them */
4015 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
4016 return false;
4019 char * buff;
4020 bfd_size_type amount;
4022 buff = bfd_malloc (bfd_coff_filhsz (abfd));
4023 if (buff == NULL)
4024 return false;
4026 bfd_coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
4027 amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
4029 free (buff);
4031 if (amount != bfd_coff_filhsz (abfd))
4032 return false;
4035 if (abfd->flags & EXEC_P)
4037 /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
4038 include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)) */
4039 char * buff;
4040 bfd_size_type amount;
4042 buff = bfd_malloc (bfd_coff_aoutsz (abfd));
4043 if (buff == NULL)
4044 return false;
4046 coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
4047 amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
4049 free (buff);
4051 if (amount != bfd_coff_aoutsz (abfd))
4052 return false;
4054 #ifdef RS6000COFF_C
4055 else
4057 AOUTHDR buff;
4058 size_t size;
4060 /* XCOFF seems to always write at least a small a.out header. */
4061 coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
4062 if (xcoff_data (abfd)->full_aouthdr)
4063 size = bfd_coff_aoutsz (abfd);
4064 else
4065 size = SMALL_AOUTSZ;
4066 if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
4067 return false;
4069 #endif
4071 return true;
4074 static boolean
4075 coff_set_section_contents (abfd, section, location, offset, count)
4076 bfd * abfd;
4077 sec_ptr section;
4078 PTR location;
4079 file_ptr offset;
4080 bfd_size_type count;
4082 if (abfd->output_has_begun == false) /* set by bfd.c handler */
4084 if (! coff_compute_section_file_positions (abfd))
4085 return false;
4088 #if defined(_LIB) && !defined(TARG_AUX)
4090 /* The physical address field of a .lib section is used to hold the
4091 number of shared libraries in the section. This code counts the
4092 number of sections being written, and increments the lma field
4093 with the number.
4095 I have found no documentation on the contents of this section.
4096 Experimentation indicates that the section contains zero or more
4097 records, each of which has the following structure:
4099 - a (four byte) word holding the length of this record, in words,
4100 - a word that always seems to be set to "2",
4101 - the path to a shared library, null-terminated and then padded
4102 to a whole word boundary.
4104 bfd_assert calls have been added to alert if an attempt is made
4105 to write a section which doesn't follow these assumptions. The
4106 code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
4107 <robertl@arnet.com> (Thanks!).
4109 Gvran Uddeborg <gvran@uddeborg.pp.se> */
4111 if (strcmp (section->name, _LIB) == 0)
4113 bfd_byte *rec, *recend;
4115 rec = (bfd_byte *) location;
4116 recend = rec + count;
4117 while (rec < recend)
4119 ++section->lma;
4120 rec += bfd_get_32 (abfd, rec) * 4;
4123 BFD_ASSERT (rec == recend);
4126 #endif
4128 /* Don't write out bss sections - one way to do this is to
4129 see if the filepos has not been set. */
4130 if (section->filepos == 0)
4131 return true;
4133 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
4134 return false;
4136 if (count != 0)
4138 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
4140 return true;
4142 #if 0
4143 static boolean
4144 coff_close_and_cleanup (abfd)
4145 bfd *abfd;
4147 if (!bfd_read_p (abfd))
4148 switch (abfd->format)
4150 case bfd_archive:
4151 if (!_bfd_write_archive_contents (abfd))
4152 return false;
4153 break;
4154 case bfd_object:
4155 if (!coff_write_object_contents (abfd))
4156 return false;
4157 break;
4158 default:
4159 bfd_set_error (bfd_error_invalid_operation);
4160 return false;
4163 /* We depend on bfd_close to free all the memory on the objalloc. */
4164 return true;
4167 #endif
4169 static PTR
4170 buy_and_read (abfd, where, seek_direction, size)
4171 bfd *abfd;
4172 file_ptr where;
4173 int seek_direction;
4174 size_t size;
4176 PTR area = (PTR) bfd_alloc (abfd, size);
4177 if (!area)
4178 return (NULL);
4179 if (bfd_seek (abfd, where, seek_direction) != 0
4180 || bfd_read (area, 1, size, abfd) != size)
4181 return (NULL);
4182 return (area);
4183 } /* buy_and_read() */
4186 SUBSUBSECTION
4187 Reading linenumbers
4189 Creating the linenumber table is done by reading in the entire
4190 coff linenumber table, and creating another table for internal use.
4192 A coff linenumber table is structured so that each function
4193 is marked as having a line number of 0. Each line within the
4194 function is an offset from the first line in the function. The
4195 base of the line number information for the table is stored in
4196 the symbol associated with the function.
4198 Note: The PE format uses line number 0 for a flag indicating a
4199 new source file.
4201 The information is copied from the external to the internal
4202 table, and each symbol which marks a function is marked by
4203 pointing its...
4205 How does this work ?
4209 static boolean
4210 coff_slurp_line_table (abfd, asect)
4211 bfd *abfd;
4212 asection *asect;
4214 LINENO *native_lineno;
4215 alent *lineno_cache;
4217 BFD_ASSERT (asect->lineno == (alent *) NULL);
4219 native_lineno = (LINENO *) buy_and_read (abfd,
4220 asect->line_filepos,
4221 SEEK_SET,
4222 (size_t) (bfd_coff_linesz (abfd) *
4223 asect->lineno_count));
4224 lineno_cache =
4225 (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
4226 if (lineno_cache == NULL)
4227 return false;
4228 else
4230 unsigned int counter = 0;
4231 alent *cache_ptr = lineno_cache;
4232 LINENO *src = native_lineno;
4234 while (counter < asect->lineno_count)
4236 struct internal_lineno dst;
4237 bfd_coff_swap_lineno_in (abfd, src, &dst);
4238 cache_ptr->line_number = dst.l_lnno;
4240 if (cache_ptr->line_number == 0)
4242 boolean warned;
4243 bfd_signed_vma symndx;
4244 coff_symbol_type *sym;
4246 warned = false;
4247 symndx = dst.l_addr.l_symndx;
4248 if (symndx < 0
4249 || (bfd_vma) symndx >= obj_raw_syment_count (abfd))
4251 (*_bfd_error_handler)
4252 (_("%s: warning: illegal symbol index %ld in line numbers"),
4253 bfd_get_filename (abfd), dst.l_addr.l_symndx);
4254 symndx = 0;
4255 warned = true;
4257 /* FIXME: We should not be casting between ints and
4258 pointers like this. */
4259 sym = ((coff_symbol_type *)
4260 ((symndx + obj_raw_syments (abfd))
4261 ->u.syment._n._n_n._n_zeroes));
4262 cache_ptr->u.sym = (asymbol *) sym;
4263 if (sym->lineno != NULL && ! warned)
4265 (*_bfd_error_handler)
4266 (_("%s: warning: duplicate line number information for `%s'"),
4267 bfd_get_filename (abfd),
4268 bfd_asymbol_name (&sym->symbol));
4270 sym->lineno = cache_ptr;
4272 else
4274 cache_ptr->u.offset = dst.l_addr.l_paddr
4275 - bfd_section_vma (abfd, asect);
4276 } /* If no linenumber expect a symbol index */
4278 cache_ptr++;
4279 src++;
4280 counter++;
4282 cache_ptr->line_number = 0;
4285 asect->lineno = lineno_cache;
4286 /* FIXME, free native_lineno here, or use alloca or something. */
4287 return true;
4290 /* Slurp in the symbol table, converting it to generic form. Note
4291 that if coff_relocate_section is defined, the linker will read
4292 symbols via coff_link_add_symbols, rather than via this routine. */
4294 static boolean
4295 coff_slurp_symbol_table (abfd)
4296 bfd * abfd;
4298 combined_entry_type *native_symbols;
4299 coff_symbol_type *cached_area;
4300 unsigned int *table_ptr;
4302 unsigned int number_of_symbols = 0;
4304 if (obj_symbols (abfd))
4305 return true;
4307 /* Read in the symbol table */
4308 if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
4310 return (false);
4311 } /* on error */
4313 /* Allocate enough room for all the symbols in cached form */
4314 cached_area = ((coff_symbol_type *)
4315 bfd_alloc (abfd,
4316 (obj_raw_syment_count (abfd)
4317 * sizeof (coff_symbol_type))));
4319 if (cached_area == NULL)
4320 return false;
4321 table_ptr = ((unsigned int *)
4322 bfd_alloc (abfd,
4323 (obj_raw_syment_count (abfd)
4324 * sizeof (unsigned int))));
4326 if (table_ptr == NULL)
4327 return false;
4328 else
4330 coff_symbol_type *dst = cached_area;
4331 unsigned int last_native_index = obj_raw_syment_count (abfd);
4332 unsigned int this_index = 0;
4333 while (this_index < last_native_index)
4335 combined_entry_type *src = native_symbols + this_index;
4336 table_ptr[this_index] = number_of_symbols;
4337 dst->symbol.the_bfd = abfd;
4339 dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
4340 /* We use the native name field to point to the cached field. */
4341 src->u.syment._n._n_n._n_zeroes = (long) dst;
4342 dst->symbol.section = coff_section_from_bfd_index (abfd,
4343 src->u.syment.n_scnum);
4344 dst->symbol.flags = 0;
4345 dst->done_lineno = false;
4347 switch (src->u.syment.n_sclass)
4349 #ifdef I960
4350 case C_LEAFEXT:
4351 #if 0
4352 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
4353 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4354 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4355 #endif
4356 /* Fall through to next case */
4358 #endif
4360 case C_EXT:
4361 case C_WEAKEXT:
4362 #if defined ARM
4363 case C_THUMBEXT:
4364 case C_THUMBEXTFUNC:
4365 #endif
4366 #ifdef RS6000COFF_C
4367 case C_HIDEXT:
4368 #endif
4369 #ifdef C_SYSTEM
4370 case C_SYSTEM: /* System Wide variable */
4371 #endif
4372 #ifdef COFF_WITH_PE
4373 /* In PE, 0x68 (104) denotes a section symbol */
4374 case C_SECTION:
4375 /* In PE, 0x69 (105) denotes a weak external symbol. */
4376 case C_NT_WEAK:
4377 #endif
4378 switch (coff_classify_symbol (abfd, &src->u.syment))
4380 case COFF_SYMBOL_GLOBAL:
4381 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
4382 #if defined COFF_WITH_PE
4383 /* PE sets the symbol to a value relative to the
4384 start of the section. */
4385 dst->symbol.value = src->u.syment.n_value;
4386 #else
4387 dst->symbol.value = (src->u.syment.n_value
4388 - dst->symbol.section->vma);
4389 #endif
4390 if (ISFCN ((src->u.syment.n_type)))
4392 /* A function ext does not go at the end of a
4393 file. */
4394 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4396 break;
4398 case COFF_SYMBOL_COMMON:
4399 dst->symbol.section = bfd_com_section_ptr;
4400 dst->symbol.value = src->u.syment.n_value;
4401 break;
4403 case COFF_SYMBOL_UNDEFINED:
4404 dst->symbol.section = bfd_und_section_ptr;
4405 dst->symbol.value = 0;
4406 break;
4408 case COFF_SYMBOL_PE_SECTION:
4409 dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
4410 dst->symbol.value = 0;
4411 break;
4413 case COFF_SYMBOL_LOCAL:
4414 dst->symbol.flags = BSF_LOCAL;
4415 #if defined COFF_WITH_PE
4416 /* PE sets the symbol to a value relative to the
4417 start of the section. */
4418 dst->symbol.value = src->u.syment.n_value;
4419 #else
4420 dst->symbol.value = (src->u.syment.n_value
4421 - dst->symbol.section->vma);
4422 #endif
4423 if (ISFCN ((src->u.syment.n_type)))
4424 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4425 break;
4428 #ifdef RS6000COFF_C
4429 /* A symbol with a csect entry should not go at the end. */
4430 if (src->u.syment.n_numaux > 0)
4431 dst->symbol.flags |= BSF_NOT_AT_END;
4432 #endif
4434 #ifdef COFF_WITH_PE
4435 if (src->u.syment.n_sclass == C_NT_WEAK)
4436 dst->symbol.flags = BSF_WEAK;
4437 if (src->u.syment.n_sclass == C_SECTION
4438 && src->u.syment.n_scnum > 0)
4440 dst->symbol.flags = BSF_LOCAL;
4442 #endif
4444 if (src->u.syment.n_sclass == C_WEAKEXT)
4445 dst->symbol.flags = BSF_WEAK;
4447 break;
4449 case C_STAT: /* static */
4450 #ifdef I960
4451 case C_LEAFSTAT: /* static leaf procedure */
4452 #endif
4453 #if defined ARM
4454 case C_THUMBSTAT: /* Thumb static */
4455 case C_THUMBLABEL: /* Thumb label */
4456 case C_THUMBSTATFUNC:/* Thumb static function */
4457 #endif
4458 case C_LABEL: /* label */
4459 if (src->u.syment.n_scnum == N_DEBUG)
4460 dst->symbol.flags = BSF_DEBUGGING;
4461 else
4462 dst->symbol.flags = BSF_LOCAL;
4464 /* Base the value as an index from the base of the
4465 section, if there is one. */
4466 if (dst->symbol.section)
4468 #if defined COFF_WITH_PE
4469 /* PE sets the symbol to a value relative to the
4470 start of the section. */
4471 dst->symbol.value = src->u.syment.n_value;
4472 #else
4473 dst->symbol.value = (src->u.syment.n_value
4474 - dst->symbol.section->vma);
4475 #endif
4477 else
4478 dst->symbol.value = src->u.syment.n_value;
4479 break;
4481 case C_MOS: /* member of structure */
4482 case C_EOS: /* end of structure */
4483 #ifdef NOTDEF /* C_AUTOARG has the same value */
4484 #ifdef C_GLBLREG
4485 case C_GLBLREG: /* A29k-specific storage class */
4486 #endif
4487 #endif
4488 case C_REGPARM: /* register parameter */
4489 case C_REG: /* register variable */
4490 /* C_AUTOARG conflictes with TI COFF C_UEXT */
4491 #if !defined (TIC80COFF) && !defined (TICOFF)
4492 #ifdef C_AUTOARG
4493 case C_AUTOARG: /* 960-specific storage class */
4494 #endif
4495 #endif
4496 case C_TPDEF: /* type definition */
4497 case C_ARG:
4498 case C_AUTO: /* automatic variable */
4499 case C_FIELD: /* bit field */
4500 case C_ENTAG: /* enumeration tag */
4501 case C_MOE: /* member of enumeration */
4502 case C_MOU: /* member of union */
4503 case C_UNTAG: /* union tag */
4504 dst->symbol.flags = BSF_DEBUGGING;
4505 dst->symbol.value = (src->u.syment.n_value);
4506 break;
4508 case C_FILE: /* file name */
4509 case C_STRTAG: /* structure tag */
4510 #ifdef RS6000COFF_C
4511 case C_GSYM:
4512 case C_LSYM:
4513 case C_PSYM:
4514 case C_RSYM:
4515 case C_RPSYM:
4516 case C_STSYM:
4517 case C_BCOMM:
4518 case C_ECOMM:
4519 case C_DECL:
4520 case C_ENTRY:
4521 case C_FUN:
4522 case C_ESTAT:
4523 #endif
4524 dst->symbol.flags = BSF_DEBUGGING;
4525 dst->symbol.value = (src->u.syment.n_value);
4526 break;
4528 #ifdef RS6000COFF_C
4529 case C_BINCL: /* beginning of include file */
4530 case C_EINCL: /* ending of include file */
4531 /* The value is actually a pointer into the line numbers
4532 of the file. We locate the line number entry, and
4533 set the section to the section which contains it, and
4534 the value to the index in that section. */
4536 asection *sec;
4538 dst->symbol.flags = BSF_DEBUGGING;
4539 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4540 if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4541 && ((file_ptr) (sec->line_filepos
4542 + sec->lineno_count * bfd_coff_linesz (abfd))
4543 > (file_ptr) src->u.syment.n_value))
4544 break;
4545 if (sec == NULL)
4546 dst->symbol.value = 0;
4547 else
4549 dst->symbol.section = sec;
4550 dst->symbol.value = ((src->u.syment.n_value
4551 - sec->line_filepos)
4552 / bfd_coff_linesz (abfd));
4553 src->fix_line = 1;
4556 break;
4558 case C_BSTAT:
4559 dst->symbol.flags = BSF_DEBUGGING;
4561 /* The value is actually a symbol index. Save a pointer
4562 to the symbol instead of the index. FIXME: This
4563 should use a union. */
4564 src->u.syment.n_value =
4565 (long) (native_symbols + src->u.syment.n_value);
4566 dst->symbol.value = src->u.syment.n_value;
4567 src->fix_value = 1;
4568 break;
4569 #endif
4571 case C_BLOCK: /* ".bb" or ".eb" */
4572 case C_FCN: /* ".bf" or ".ef" (or PE ".lf") */
4573 case C_EFCN: /* physical end of function */
4574 #if defined COFF_WITH_PE
4575 /* PE sets the symbol to a value relative to the start
4576 of the section. */
4577 dst->symbol.value = src->u.syment.n_value;
4578 if (strcmp (dst->symbol.name, ".bf") != 0)
4580 /* PE uses funny values for .ef and .lf; don't
4581 relocate them. */
4582 dst->symbol.flags = BSF_DEBUGGING;
4584 else
4585 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
4586 #else
4587 /* Base the value as an index from the base of the
4588 section. */
4589 dst->symbol.flags = BSF_LOCAL;
4590 dst->symbol.value = (src->u.syment.n_value
4591 - dst->symbol.section->vma);
4592 #endif
4593 break;
4595 case C_STATLAB: /* Static load time label */
4596 dst->symbol.value = src->u.syment.n_value;
4597 dst->symbol.flags = BSF_GLOBAL;
4598 break;
4600 case C_NULL:
4601 /* PE DLLs sometimes have zeroed out symbols for some
4602 reason. Just ignore them without a warning. */
4603 if (src->u.syment.n_type == 0
4604 && src->u.syment.n_value == 0
4605 && src->u.syment.n_scnum == 0)
4606 break;
4607 /* Fall through. */
4608 case C_EXTDEF: /* external definition */
4609 case C_ULABEL: /* undefined label */
4610 case C_USTATIC: /* undefined static */
4611 #ifndef COFF_WITH_PE
4612 /* C_LINE in regular coff is 0x68. NT has taken over this storage
4613 class to represent a section symbol */
4614 case C_LINE: /* line # reformatted as symbol table entry */
4615 /* NT uses 0x67 for a weak symbol, not C_ALIAS. */
4616 case C_ALIAS: /* duplicate tag */
4617 #endif
4618 /* New storage classes for TI COFF */
4619 #if defined(TIC80COFF) || defined(TICOFF)
4620 case C_UEXT: /* Tentative external definition */
4621 #endif
4622 case C_EXTLAB: /* External load time label */
4623 case C_HIDDEN: /* ext symbol in dmert public lib */
4624 default:
4625 (*_bfd_error_handler)
4626 (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
4627 bfd_get_filename (abfd), src->u.syment.n_sclass,
4628 dst->symbol.section->name, dst->symbol.name);
4629 dst->symbol.flags = BSF_DEBUGGING;
4630 dst->symbol.value = (src->u.syment.n_value);
4631 break;
4634 /* BFD_ASSERT(dst->symbol.flags != 0);*/
4636 dst->native = src;
4638 dst->symbol.udata.i = 0;
4639 dst->lineno = (alent *) NULL;
4640 this_index += (src->u.syment.n_numaux) + 1;
4641 dst++;
4642 number_of_symbols++;
4643 } /* walk the native symtab */
4644 } /* bfdize the native symtab */
4646 obj_symbols (abfd) = cached_area;
4647 obj_raw_syments (abfd) = native_symbols;
4649 bfd_get_symcount (abfd) = number_of_symbols;
4650 obj_convert (abfd) = table_ptr;
4651 /* Slurp the line tables for each section too */
4653 asection *p;
4654 p = abfd->sections;
4655 while (p)
4657 coff_slurp_line_table (abfd, p);
4658 p = p->next;
4661 return true;
4662 } /* coff_slurp_symbol_table() */
4664 /* Classify a COFF symbol. A couple of targets have globally visible
4665 symbols which are not class C_EXT, and this handles those. It also
4666 recognizes some special PE cases. */
4668 static enum coff_symbol_classification
4669 coff_classify_symbol (abfd, syment)
4670 bfd *abfd;
4671 struct internal_syment *syment;
4673 /* FIXME: This partially duplicates the switch in
4674 coff_slurp_symbol_table. */
4675 switch (syment->n_sclass)
4677 case C_EXT:
4678 case C_WEAKEXT:
4679 #ifdef I960
4680 case C_LEAFEXT:
4681 #endif
4682 #ifdef ARM
4683 case C_THUMBEXT:
4684 case C_THUMBEXTFUNC:
4685 #endif
4686 #ifdef C_SYSTEM
4687 case C_SYSTEM:
4688 #endif
4689 #ifdef COFF_WITH_PE
4690 case C_NT_WEAK:
4691 #endif
4692 if (syment->n_scnum == 0)
4694 if (syment->n_value == 0)
4695 return COFF_SYMBOL_UNDEFINED;
4696 else
4697 return COFF_SYMBOL_COMMON;
4699 return COFF_SYMBOL_GLOBAL;
4701 default:
4702 break;
4705 #ifdef COFF_WITH_PE
4706 if (syment->n_sclass == C_STAT)
4708 if (syment->n_scnum == 0)
4710 /* The Microsoft compiler sometimes generates these if a
4711 small static function is inlined every time it is used.
4712 The function is discarded, but the symbol table entry
4713 remains. */
4714 return COFF_SYMBOL_LOCAL;
4717 #ifdef STRICT_PE_FORMAT
4718 /* This is correct for Microsoft generated objects, but it
4719 breaks gas generated objects. */
4721 if (syment->n_value == 0)
4723 asection *sec;
4724 char buf[SYMNMLEN + 1];
4726 sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4727 if (sec != NULL
4728 && (strcmp (bfd_get_section_name (abfd, sec),
4729 _bfd_coff_internal_syment_name (abfd, syment, buf))
4730 == 0))
4731 return COFF_SYMBOL_PE_SECTION;
4733 #endif
4735 return COFF_SYMBOL_LOCAL;
4738 if (syment->n_sclass == C_SECTION)
4740 /* In some cases in a DLL generated by the Microsoft linker, the
4741 n_value field will contain garbage. FIXME: This should
4742 probably be handled by the swapping function instead. */
4743 syment->n_value = 0;
4744 if (syment->n_scnum == 0)
4745 return COFF_SYMBOL_UNDEFINED;
4746 return COFF_SYMBOL_PE_SECTION;
4748 #endif /* COFF_WITH_PE */
4750 /* If it is not a global symbol, we presume it is a local symbol. */
4752 if (syment->n_scnum == 0)
4754 char buf[SYMNMLEN + 1];
4756 (*_bfd_error_handler)
4757 (_("warning: %s: local symbol `%s' has no section"),
4758 bfd_get_filename (abfd),
4759 _bfd_coff_internal_syment_name (abfd, syment, buf));
4762 return COFF_SYMBOL_LOCAL;
4766 SUBSUBSECTION
4767 Reading relocations
4769 Coff relocations are easily transformed into the internal BFD form
4770 (@code{arelent}).
4772 Reading a coff relocation table is done in the following stages:
4774 o Read the entire coff relocation table into memory.
4776 o Process each relocation in turn; first swap it from the
4777 external to the internal form.
4779 o Turn the symbol referenced in the relocation's symbol index
4780 into a pointer into the canonical symbol table.
4781 This table is the same as the one returned by a call to
4782 @code{bfd_canonicalize_symtab}. The back end will call that
4783 routine and save the result if a canonicalization hasn't been done.
4785 o The reloc index is turned into a pointer to a howto
4786 structure, in a back end specific way. For instance, the 386
4787 and 960 use the @code{r_type} to directly produce an index
4788 into a howto table vector; the 88k subtracts a number from the
4789 @code{r_type} field and creates an addend field.
4793 #ifndef CALC_ADDEND
4794 #define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
4796 coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
4797 if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
4798 coffsym = (obj_symbols (abfd) \
4799 + (cache_ptr->sym_ptr_ptr - symbols)); \
4800 else if (ptr) \
4801 coffsym = coff_symbol_from (abfd, ptr); \
4802 if (coffsym != (coff_symbol_type *) NULL \
4803 && coffsym->native->u.syment.n_scnum == 0) \
4804 cache_ptr->addend = 0; \
4805 else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
4806 && ptr->section != (asection *) NULL) \
4807 cache_ptr->addend = - (ptr->section->vma + ptr->value); \
4808 else \
4809 cache_ptr->addend = 0; \
4811 #endif
4813 static boolean
4814 coff_slurp_reloc_table (abfd, asect, symbols)
4815 bfd * abfd;
4816 sec_ptr asect;
4817 asymbol ** symbols;
4819 RELOC *native_relocs;
4820 arelent *reloc_cache;
4821 arelent *cache_ptr;
4823 unsigned int idx;
4825 if (asect->relocation)
4826 return true;
4827 if (asect->reloc_count == 0)
4828 return true;
4829 if (asect->flags & SEC_CONSTRUCTOR)
4830 return true;
4831 if (!coff_slurp_symbol_table (abfd))
4832 return false;
4833 native_relocs =
4834 (RELOC *) buy_and_read (abfd,
4835 asect->rel_filepos,
4836 SEEK_SET,
4837 (size_t) (bfd_coff_relsz (abfd) *
4838 asect->reloc_count));
4839 reloc_cache = (arelent *)
4840 bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
4842 if (reloc_cache == NULL)
4843 return false;
4845 for (idx = 0; idx < asect->reloc_count; idx++)
4847 struct internal_reloc dst;
4848 struct external_reloc *src;
4849 #ifndef RELOC_PROCESSING
4850 asymbol *ptr;
4851 #endif
4853 cache_ptr = reloc_cache + idx;
4854 src = native_relocs + idx;
4856 coff_swap_reloc_in (abfd, src, &dst);
4858 #ifdef RELOC_PROCESSING
4859 RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
4860 #else
4861 cache_ptr->address = dst.r_vaddr;
4863 if (dst.r_symndx != -1)
4865 if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
4867 (*_bfd_error_handler)
4868 (_("%s: warning: illegal symbol index %ld in relocs"),
4869 bfd_get_filename (abfd), dst.r_symndx);
4870 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4871 ptr = NULL;
4873 else
4875 cache_ptr->sym_ptr_ptr = (symbols
4876 + obj_convert (abfd)[dst.r_symndx]);
4877 ptr = *(cache_ptr->sym_ptr_ptr);
4880 else
4882 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4883 ptr = NULL;
4886 /* The symbols definitions that we have read in have been
4887 relocated as if their sections started at 0. But the offsets
4888 refering to the symbols in the raw data have not been
4889 modified, so we have to have a negative addend to compensate.
4891 Note that symbols which used to be common must be left alone */
4893 /* Calculate any reloc addend by looking at the symbol */
4894 CALC_ADDEND (abfd, ptr, dst, cache_ptr);
4896 cache_ptr->address -= asect->vma;
4897 /* !! cache_ptr->section = (asection *) NULL;*/
4899 /* Fill in the cache_ptr->howto field from dst.r_type */
4900 RTYPE2HOWTO (cache_ptr, &dst);
4901 #endif /* RELOC_PROCESSING */
4903 if (cache_ptr->howto == NULL)
4905 (*_bfd_error_handler)
4906 (_("%s: illegal relocation type %d at address 0x%lx"),
4907 bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
4908 bfd_set_error (bfd_error_bad_value);
4909 return false;
4913 asect->relocation = reloc_cache;
4914 return true;
4917 #ifndef coff_rtype_to_howto
4918 #ifdef RTYPE2HOWTO
4920 /* Get the howto structure for a reloc. This is only used if the file
4921 including this one defines coff_relocate_section to be
4922 _bfd_coff_generic_relocate_section, so it is OK if it does not
4923 always work. It is the responsibility of the including file to
4924 make sure it is reasonable if it is needed. */
4926 static reloc_howto_type *coff_rtype_to_howto
4927 PARAMS ((bfd *, asection *, struct internal_reloc *,
4928 struct coff_link_hash_entry *, struct internal_syment *,
4929 bfd_vma *));
4931 /*ARGSUSED*/
4932 static reloc_howto_type *
4933 coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
4934 bfd *abfd ATTRIBUTE_UNUSED;
4935 asection *sec ATTRIBUTE_UNUSED;
4936 struct internal_reloc *rel;
4937 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
4938 struct internal_syment *sym ATTRIBUTE_UNUSED;
4939 bfd_vma *addendp ATTRIBUTE_UNUSED;
4941 arelent genrel;
4943 RTYPE2HOWTO (&genrel, rel);
4944 return genrel.howto;
4947 #else /* ! defined (RTYPE2HOWTO) */
4949 #define coff_rtype_to_howto NULL
4951 #endif /* ! defined (RTYPE2HOWTO) */
4952 #endif /* ! defined (coff_rtype_to_howto) */
4954 /* This is stupid. This function should be a boolean predicate. */
4955 static long
4956 coff_canonicalize_reloc (abfd, section, relptr, symbols)
4957 bfd * abfd;
4958 sec_ptr section;
4959 arelent ** relptr;
4960 asymbol ** symbols;
4962 arelent *tblptr = section->relocation;
4963 unsigned int count = 0;
4965 if (section->flags & SEC_CONSTRUCTOR)
4967 /* this section has relocs made up by us, they are not in the
4968 file, so take them out of their chain and place them into
4969 the data area provided */
4970 arelent_chain *chain = section->constructor_chain;
4971 for (count = 0; count < section->reloc_count; count++)
4973 *relptr++ = &chain->relent;
4974 chain = chain->next;
4978 else
4980 if (! coff_slurp_reloc_table (abfd, section, symbols))
4981 return -1;
4983 tblptr = section->relocation;
4985 for (; count++ < section->reloc_count;)
4986 *relptr++ = tblptr++;
4988 *relptr = 0;
4989 return section->reloc_count;
4992 #ifdef GNU960
4993 file_ptr
4994 coff_sym_filepos (abfd)
4995 bfd *abfd;
4997 return obj_sym_filepos (abfd);
4999 #endif
5001 #ifndef coff_reloc16_estimate
5002 #define coff_reloc16_estimate dummy_reloc16_estimate
5004 static int dummy_reloc16_estimate
5005 PARAMS ((bfd *, asection *, arelent *, unsigned int,
5006 struct bfd_link_info *));
5008 static int
5009 dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
5010 bfd *abfd ATTRIBUTE_UNUSED;
5011 asection *input_section ATTRIBUTE_UNUSED;
5012 arelent *reloc ATTRIBUTE_UNUSED;
5013 unsigned int shrink ATTRIBUTE_UNUSED;
5014 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
5016 abort ();
5017 return 0;
5020 #endif
5022 #ifndef coff_reloc16_extra_cases
5024 #define coff_reloc16_extra_cases dummy_reloc16_extra_cases
5026 /* This works even if abort is not declared in any header file. */
5028 static void dummy_reloc16_extra_cases
5029 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
5030 bfd_byte *, unsigned int *, unsigned int *));
5032 static void
5033 dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
5034 dst_ptr)
5035 bfd *abfd ATTRIBUTE_UNUSED;
5036 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
5037 struct bfd_link_order *link_order ATTRIBUTE_UNUSED;
5038 arelent *reloc ATTRIBUTE_UNUSED;
5039 bfd_byte *data ATTRIBUTE_UNUSED;
5040 unsigned int *src_ptr ATTRIBUTE_UNUSED;
5041 unsigned int *dst_ptr ATTRIBUTE_UNUSED;
5043 abort ();
5045 #endif
5047 /* If coff_relocate_section is defined, we can use the optimized COFF
5048 backend linker. Otherwise we must continue to use the old linker. */
5049 #ifdef coff_relocate_section
5050 #ifndef coff_bfd_link_hash_table_create
5051 #define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
5052 #endif
5053 #ifndef coff_bfd_link_add_symbols
5054 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
5055 #endif
5056 #ifndef coff_bfd_final_link
5057 #define coff_bfd_final_link _bfd_coff_final_link
5058 #endif
5059 #else /* ! defined (coff_relocate_section) */
5060 #define coff_relocate_section NULL
5061 #ifndef coff_bfd_link_hash_table_create
5062 #define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
5063 #endif
5064 #ifndef coff_bfd_link_add_symbols
5065 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
5066 #endif
5067 #define coff_bfd_final_link _bfd_generic_final_link
5068 #endif /* ! defined (coff_relocate_section) */
5070 #define coff_bfd_link_split_section _bfd_generic_link_split_section
5072 #ifndef coff_start_final_link
5073 #define coff_start_final_link NULL
5074 #endif
5076 #ifndef coff_adjust_symndx
5077 #define coff_adjust_symndx NULL
5078 #endif
5080 #ifndef coff_link_add_one_symbol
5081 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
5082 #endif
5084 #ifndef coff_link_output_has_begun
5086 static boolean coff_link_output_has_begun
5087 PARAMS ((bfd *, struct coff_final_link_info *));
5089 static boolean
5090 coff_link_output_has_begun (abfd, info)
5091 bfd * abfd;
5092 struct coff_final_link_info * info ATTRIBUTE_UNUSED;
5094 return abfd->output_has_begun;
5096 #endif
5098 #ifndef coff_final_link_postscript
5100 static boolean coff_final_link_postscript
5101 PARAMS ((bfd *, struct coff_final_link_info *));
5103 static boolean
5104 coff_final_link_postscript (abfd, pfinfo)
5105 bfd * abfd ATTRIBUTE_UNUSED;
5106 struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
5108 return true;
5110 #endif
5112 #ifndef coff_SWAP_aux_in
5113 #define coff_SWAP_aux_in coff_swap_aux_in
5114 #endif
5115 #ifndef coff_SWAP_sym_in
5116 #define coff_SWAP_sym_in coff_swap_sym_in
5117 #endif
5118 #ifndef coff_SWAP_lineno_in
5119 #define coff_SWAP_lineno_in coff_swap_lineno_in
5120 #endif
5121 #ifndef coff_SWAP_aux_out
5122 #define coff_SWAP_aux_out coff_swap_aux_out
5123 #endif
5124 #ifndef coff_SWAP_sym_out
5125 #define coff_SWAP_sym_out coff_swap_sym_out
5126 #endif
5127 #ifndef coff_SWAP_lineno_out
5128 #define coff_SWAP_lineno_out coff_swap_lineno_out
5129 #endif
5130 #ifndef coff_SWAP_reloc_out
5131 #define coff_SWAP_reloc_out coff_swap_reloc_out
5132 #endif
5133 #ifndef coff_SWAP_filehdr_out
5134 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
5135 #endif
5136 #ifndef coff_SWAP_aouthdr_out
5137 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
5138 #endif
5139 #ifndef coff_SWAP_scnhdr_out
5140 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
5141 #endif
5142 #ifndef coff_SWAP_reloc_in
5143 #define coff_SWAP_reloc_in coff_swap_reloc_in
5144 #endif
5145 #ifndef coff_SWAP_filehdr_in
5146 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
5147 #endif
5148 #ifndef coff_SWAP_aouthdr_in
5149 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
5150 #endif
5151 #ifndef coff_SWAP_scnhdr_in
5152 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
5153 #endif
5155 static const bfd_coff_backend_data bfd_coff_std_swap_table =
5157 coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
5158 coff_SWAP_aux_out, coff_SWAP_sym_out,
5159 coff_SWAP_lineno_out, coff_SWAP_reloc_out,
5160 coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
5161 coff_SWAP_scnhdr_out,
5162 FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
5163 #ifdef COFF_LONG_FILENAMES
5164 true,
5165 #else
5166 false,
5167 #endif
5168 #ifdef COFF_LONG_SECTION_NAMES
5169 true,
5170 #else
5171 false,
5172 #endif
5173 COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5174 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5175 true,
5176 #else
5177 false,
5178 #endif
5179 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
5181 #else
5183 #endif
5184 coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
5185 coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
5186 coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
5187 coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
5188 coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5189 coff_classify_symbol, coff_compute_section_file_positions,
5190 coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
5191 coff_adjust_symndx, coff_link_add_one_symbol,
5192 coff_link_output_has_begun, coff_final_link_postscript
5195 #ifndef coff_close_and_cleanup
5196 #define coff_close_and_cleanup _bfd_generic_close_and_cleanup
5197 #endif
5199 #ifndef coff_bfd_free_cached_info
5200 #define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
5201 #endif
5203 #ifndef coff_get_section_contents
5204 #define coff_get_section_contents _bfd_generic_get_section_contents
5205 #endif
5207 #ifndef coff_bfd_copy_private_symbol_data
5208 #define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
5209 #endif
5211 #ifndef coff_bfd_copy_private_section_data
5212 #define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
5213 #endif
5215 #ifndef coff_bfd_copy_private_bfd_data
5216 #define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
5217 #endif
5219 #ifndef coff_bfd_merge_private_bfd_data
5220 #define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
5221 #endif
5223 #ifndef coff_bfd_set_private_flags
5224 #define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
5225 #endif
5227 #ifndef coff_bfd_print_private_bfd_data
5228 #define coff_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
5229 #endif
5231 #ifndef coff_bfd_is_local_label_name
5232 #define coff_bfd_is_local_label_name _bfd_coff_is_local_label_name
5233 #endif
5235 #ifndef coff_read_minisymbols
5236 #define coff_read_minisymbols _bfd_generic_read_minisymbols
5237 #endif
5239 #ifndef coff_minisymbol_to_symbol
5240 #define coff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
5241 #endif
5243 /* The reloc lookup routine must be supplied by each individual COFF
5244 backend. */
5245 #ifndef coff_bfd_reloc_type_lookup
5246 #define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
5247 #endif
5249 #ifndef coff_bfd_get_relocated_section_contents
5250 #define coff_bfd_get_relocated_section_contents \
5251 bfd_generic_get_relocated_section_contents
5252 #endif
5254 #ifndef coff_bfd_relax_section
5255 #define coff_bfd_relax_section bfd_generic_relax_section
5256 #endif
5258 #ifndef coff_bfd_gc_sections
5259 #define coff_bfd_gc_sections bfd_generic_gc_sections
5260 #endif
5262 #ifndef coff_bfd_merge_sections
5263 #define coff_bfd_merge_sections bfd_generic_merge_sections
5264 #endif
5266 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
5267 const bfd_target VAR = \
5269 NAME , \
5270 bfd_target_coff_flavour, \
5271 BFD_ENDIAN_BIG, /* data byte order is big */ \
5272 BFD_ENDIAN_BIG, /* header byte order is big */ \
5273 /* object flags */ \
5274 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
5275 HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
5276 /* section flags */ \
5277 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5278 UNDER, /* leading symbol underscore */ \
5279 '/', /* ar_pad_char */ \
5280 15, /* ar_max_namelen */ \
5282 /* Data conversion functions. */ \
5283 bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
5284 bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
5285 bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
5287 /* Header conversion functions. */ \
5288 bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
5289 bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
5290 bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
5292 /* bfd_check_format */ \
5293 { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, \
5294 _bfd_dummy_target }, \
5295 /* bfd_set_format */ \
5296 { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false }, \
5297 /* bfd_write_contents */ \
5298 { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5299 bfd_false }, \
5301 BFD_JUMP_TABLE_GENERIC (coff), \
5302 BFD_JUMP_TABLE_COPY (coff), \
5303 BFD_JUMP_TABLE_CORE (_bfd_nocore), \
5304 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \
5305 BFD_JUMP_TABLE_SYMBOLS (coff), \
5306 BFD_JUMP_TABLE_RELOCS (coff), \
5307 BFD_JUMP_TABLE_WRITE (coff), \
5308 BFD_JUMP_TABLE_LINK (coff), \
5309 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
5311 ALTERNATIVE, \
5313 COFF_SWAP_TABLE \
5316 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
5317 const bfd_target VAR = \
5319 NAME , \
5320 bfd_target_coff_flavour, \
5321 BFD_ENDIAN_LITTLE, /* data byte order is little */ \
5322 BFD_ENDIAN_LITTLE, /* header byte order is little */ \
5323 /* object flags */ \
5324 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
5325 HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
5326 /* section flags */ \
5327 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5328 UNDER, /* leading symbol underscore */ \
5329 '/', /* ar_pad_char */ \
5330 15, /* ar_max_namelen */ \
5332 /* Data conversion functions. */ \
5333 bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
5334 bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
5335 bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
5336 /* Header conversion functions. */ \
5337 bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
5338 bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
5339 bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
5340 /* bfd_check_format */ \
5341 { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, \
5342 _bfd_dummy_target }, \
5343 /* bfd_set_format */ \
5344 { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false }, \
5345 /* bfd_write_contents */ \
5346 { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5347 bfd_false }, \
5349 BFD_JUMP_TABLE_GENERIC (coff), \
5350 BFD_JUMP_TABLE_COPY (coff), \
5351 BFD_JUMP_TABLE_CORE (_bfd_nocore), \
5352 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \
5353 BFD_JUMP_TABLE_SYMBOLS (coff), \
5354 BFD_JUMP_TABLE_RELOCS (coff), \
5355 BFD_JUMP_TABLE_WRITE (coff), \
5356 BFD_JUMP_TABLE_LINK (coff), \
5357 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
5359 ALTERNATIVE, \
5361 COFF_SWAP_TABLE \