1 /* Support for the generic parts of most COFF variants, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
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,
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
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
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}.
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.
78 How the coff backend works
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
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.
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
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.
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.
244 The hidden information for an <<asymbol>> is described in a
245 <<combined_entry_type>>:
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
281 . union internal_auxent auxent;
282 . struct internal_syment syment;
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 *}
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;
309 #include "coffswap.h"
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 *));
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));
344 static flagword handle_COMDAT PARAMS ((bfd *, flagword, PTR, const char *, asection *));
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(). */
356 /* Macros for setting debugging flags. */
358 #define STYP_XCOFF_DEBUG STYP_DEBUG
360 #define STYP_XCOFF_DEBUG STYP_INFO
363 #ifdef COFF_ALIGN_IN_S_FLAGS
364 #define STYP_DEBUG_INFO STYP_DSECT
366 #define STYP_DEBUG_INFO STYP_INFO
370 sec_to_styp_flags (sec_name, sec_flags)
371 CONST char *sec_name;
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;
389 else if (!strcmp (sec_name, _COMMENT))
391 styp_flags = STYP_INFO;
392 #endif /* _COMMENT */
395 else if (!strcmp (sec_name, _LIB))
397 styp_flags = STYP_LIB;
401 else if (!strcmp (sec_name, _LIT))
403 styp_flags = STYP_LIT;
406 else if (!strncmp (sec_name, ".debug", 6))
408 /* Handle the XCOFF debug section and DWARF2 debug sections. */
410 styp_flags = STYP_XCOFF_DEBUG;
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;
425 else if (!strcmp (sec_name, _PAD))
427 styp_flags = STYP_PAD;
429 else if (!strcmp (sec_name, _LOADER))
431 styp_flags = STYP_LOADER;
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;
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;
461 if (sec_flags & SEC_CLINK)
462 styp_flags |= STYP_CLINK;
466 if (sec_flags & SEC_BLOCK)
467 styp_flags |= STYP_BLOCK;
471 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
472 styp_flags |= STYP_NOLOAD;
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. */
487 sec_to_styp_flags (sec_name, sec_flags)
488 const char *sec_name ATTRIBUTE_UNUSED;
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. */
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 */
511 /* skip CONSTRUCTOR */
514 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
515 styp_flags |= STYP_NOLOAD;
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;
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 */
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(). */
557 styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
558 bfd *abfd ATTRIBUTE_UNUSED;
561 asection *section ATTRIBUTE_UNUSED;
564 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
565 long styp_flags = internal_s->s_flags;
566 flagword sec_flags = 0;
569 if (styp_flags & STYP_BLOCK)
570 sec_flags |= SEC_BLOCK;
574 if (styp_flags & STYP_CLINK)
575 sec_flags |= SEC_CLINK;
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;
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;
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;
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;
620 else if (styp_flags & STYP_PAD)
622 else if (strcmp (name, _TEXT) == 0)
624 if (sec_flags & SEC_NEVER_LOAD)
625 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
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;
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;
643 sec_flags |= SEC_ALLOC;
645 else if (strncmp (name, ".debug", 6) == 0
647 || strcmp (name, _COMMENT) == 0
649 #ifdef COFF_LONG_SECTION_NAMES
650 || strncmp (name, ".gnu.linkonce.wi.", 17) == 0
652 || strncmp (name, ".stab", 5) == 0)
654 #ifdef COFF_PAGE_SIZE
655 sec_flags |= SEC_DEBUGGING;
659 else if (strcmp (name, _LIB) == 0)
663 else if (strcmp (name, _LIT) == 0)
664 sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
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;
690 if (flags_ptr == NULL)
693 * flags_ptr = sec_flags;
697 #else /* COFF_WITH_PE */
700 handle_COMDAT (abfd, sec_flags, hdr, name, section)
707 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
708 bfd_byte *esymstart, *esym, *esymend;
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
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
731 if (! _bfd_coff_get_external_symbols (abfd))
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];
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. */
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);
788 /* The first time we've seen the symbol. */
789 union internal_auxent aux;
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
805 Here, we think we've found the first one,
806 but there's some checking we can do to be
809 if (! (isym.n_sclass == C_STAT
810 && isym.n_type == T_NULL
811 && isym.n_value == 0))
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)
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)
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
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
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;
858 sec_flags &= ~SEC_LINK_ONCE;
862 case IMAGE_COMDAT_SELECT_ANY:
863 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
866 case IMAGE_COMDAT_SELECT_SAME_SIZE:
867 sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
870 case IMAGE_COMDAT_SELECT_EXACT_MATCH:
871 /* Not yet fully implemented ??? */
872 sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
875 /* debug$S gets this case; other
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;
887 sec_flags &= ~SEC_LINK_ONCE;
891 default: /* 0 means "no symbol" */
892 /* debug$F gets this case; other
894 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
901 /* Gas mode: the first matching on partial name. */
903 #ifndef TARGET_UNDERSCORE
904 #define TARGET_UNDERSCORE 0
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);
916 /* MSVC mode: the lexically second symbol (or
917 drop through from the above). */
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. */
927 bfd_alloc (abfd, sizeof (struct bfd_comdat_info));
928 if (section->comdat == NULL)
931 section->comdat->symbol =
932 (esym - esymstart) / bfd_coff_symesz (abfd);
934 newname = bfd_alloc (abfd, strlen (symname) + 1);
938 strcpy (newname, symname);
939 section->comdat->name = newname;
946 esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
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? */
964 styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
971 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
972 long styp_flags = internal_s->s_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. */
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. */
994 unhandled = "STYP_DSECT";
997 unhandled = "STYP_GROUP";
1000 unhandled = "STYP_COPY";
1003 unhandled = "STYP_OVER";
1005 #ifdef SEC_NEVER_LOAD
1007 sec_flags |= SEC_NEVER_LOAD;
1010 case IMAGE_SCN_MEM_READ:
1011 /* Ignored, assume it always to be true. */
1013 case IMAGE_SCN_TYPE_NO_PAD:
1016 case IMAGE_SCN_LNK_OTHER:
1017 unhandled = "IMAGE_SCN_LNK_OTHER";
1019 case IMAGE_SCN_MEM_NOT_CACHED:
1020 unhandled = "IMAGE_SCN_MEM_NOT_CACHED";
1022 case IMAGE_SCN_MEM_NOT_PAGED:
1023 unhandled = "IMAGE_SCN_MEM_NOT_PAGED";
1025 case IMAGE_SCN_MEM_EXECUTE:
1026 sec_flags |= SEC_CODE;
1028 case IMAGE_SCN_MEM_WRITE:
1029 sec_flags &= ~ SEC_READONLY;
1031 case IMAGE_SCN_MEM_DISCARDABLE:
1032 sec_flags |= SEC_DEBUGGING;
1034 case IMAGE_SCN_MEM_SHARED:
1035 sec_flags |= SEC_SHARED;
1037 case IMAGE_SCN_LNK_REMOVE:
1038 sec_flags |= SEC_EXCLUDE;
1040 case IMAGE_SCN_CNT_CODE:
1041 sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
1043 case IMAGE_SCN_CNT_INITIALIZED_DATA:
1044 sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
1046 case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
1047 sec_flags |= SEC_ALLOC;
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;
1060 case IMAGE_SCN_LNK_COMDAT:
1061 /* COMDAT gets very special treatment. */
1062 sec_flags = handle_COMDAT (abfd, sec_flags, hdr, name, section);
1065 /* Silently ignore for now. */
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);
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;
1091 * flags_ptr = sec_flags;
1096 #endif /* COFF_WITH_PE */
1098 #define get_index(symbol) ((symbol)->udata.i)
1102 bfd_coff_backend_data
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:
1125 . void (*_bfd_coff_swap_aux_in) PARAMS ((
1134 . void (*_bfd_coff_swap_sym_in) PARAMS ((
1139 . void (*_bfd_coff_swap_lineno_in) PARAMS ((
1145 Special entry points for gas to swap out coff parts:
1147 . unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
1156 . unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
1161 . unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
1166 . unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
1171 . unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
1176 . unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
1181 . unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
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 ((
1207 . void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
1211 . void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
1215 . void (*_bfd_coff_swap_reloc_in) PARAMS ((
1219 . boolean (*_bfd_coff_bad_format_hook) PARAMS ((
1221 . PTR internal_filehdr));
1222 . boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
1224 . PTR internal_filehdr));
1225 . PTR (*_bfd_coff_mkobject_hook) PARAMS ((
1227 . PTR internal_filehdr,
1228 . PTR internal_aouthdr));
1229 . boolean (*_bfd_styp_to_sec_flags_hook) PARAMS ((
1231 . PTR internal_scnhdr,
1233 . asection *section,
1234 . flagword *flags_ptr));
1235 . void (*_bfd_set_alignment_hook) PARAMS ((
1238 . PTR internal_scnhdr));
1239 . boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
1241 . boolean (*_bfd_coff_symname_in_debug) PARAMS ((
1243 . struct internal_syment *sym));
1244 . boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
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 ((
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 ((
1259 . struct bfd_link_info *link_info,
1260 . struct bfd_link_order *link_order,
1263 . unsigned int *src_ptr,
1264 . unsigned int *dst_ptr));
1265 . int (*_bfd_coff_reloc16_estimate) PARAMS ((
1267 . asection *input_section,
1269 . unsigned int shrink,
1270 . struct bfd_link_info *link_info));
1271 . enum coff_symbol_classification (*_bfd_coff_classify_symbol) PARAMS ((
1273 . struct internal_syment *));
1274 . boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
1276 . boolean (*_bfd_coff_start_final_link) PARAMS ((
1278 . struct bfd_link_info *info));
1279 . boolean (*_bfd_coff_relocate_section) PARAMS ((
1281 . struct bfd_link_info *info,
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 ((
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 ((
1297 . struct bfd_link_info *info,
1300 . struct internal_reloc *reloc,
1301 . boolean *adjustedp));
1302 . boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
1303 . struct bfd_link_info *info,
1307 . asection *section,
1309 . const char *string,
1312 . struct bfd_link_hash_entry **hashp));
1314 . boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
1316 . struct coff_final_link_info * pfinfo));
1317 . boolean (*_bfd_coff_final_link_postscript) PARAMS ((
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)\
1423 .#define bfd_coff_compute_section_file_positions(abfd)\
1424 . ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
1427 .#define bfd_coff_start_final_link(obfd, info)\
1428 . ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
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. */
1453 coff_bad_format_hook (abfd, filehdr)
1454 bfd * abfd ATTRIBUTE_UNUSED;
1457 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1459 if (BADMAG (*internal_f))
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
1471 #if defined(M88) || defined(I960)
1472 if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr)
1479 /* Check whether this section uses an alignment other than the
1483 coff_set_custom_section_alignment (abfd, section, alignment_table, table_size)
1484 bfd *abfd ATTRIBUTE_UNUSED;
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;
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)
1501 if (i >= table_size)
1504 if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY
1505 && default_alignment < alignment_table[i].default_alignment_min)
1508 if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
1509 && default_alignment > alignment_table[i].default_alignment_max)
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,
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. */
1543 coff_new_section_hook (abfd, section)
1547 combined_entry_type *native;
1549 section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
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;
1560 /* Allocate aux records for section symbols, to store size and
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));
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);
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));
1595 coff_set_alignment_hook (abfd, section, scnhdr)
1596 bfd * abfd ATTRIBUTE_UNUSED;
1600 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1604 /* Extract ALIGN from 2**ALIGN stored in section header */
1605 for (i = 0; i < 32; i++)
1606 if ((1 << i) >= hdr->s_align)
1610 /* TI tools puts the alignment power in bits 8-11 */
1611 i = (hdr->s_flags >> 8) & 0xF ;
1613 #ifdef COFF_DECODE_ALIGNMENT
1614 i = COFF_DECODE_ALIGNMENT(hdr->s_flags);
1616 section->alignment_power = i;
1618 #ifdef coff_set_section_load_page
1619 coff_set_section_load_page (section, hdr->s_page);
1623 #else /* ! COFF_ALIGN_IN_SECTION_HEADER */
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));
1642 coff_set_alignment_hook (abfd, section, scnhdr)
1643 bfd * abfd ATTRIBUTE_UNUSED;
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. */
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. */
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))
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;
1704 #undef ELIFALIGN_SET
1706 #else /* ! COFF_WITH_PE */
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));
1716 coff_set_alignment_hook (abfd, section, scnhdr)
1721 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1725 if ((hdr->s_flags & STYP_OVRFLO) == 0)
1728 real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
1729 if (real_sec == NULL)
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)
1740 --abfd->section_count;
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 *));
1760 coff_mkobject (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)
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);*/
1781 /* Create the COFF backend specific information. */
1782 #ifndef coff_mkobject_hook
1784 coff_mkobject_hook (abfd, filehdr, aouthdr)
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)
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;
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;
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;
1845 /* Set the flags field from the COFF header read in */
1846 if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
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;
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. */
1869 coff_set_arch_mach_hook (abfd, filehdr)
1874 enum bfd_architecture arch;
1875 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1878 switch (internal_f->f_magic)
1882 arch = bfd_arch_powerpc;
1883 machine = 0; /* what does this mean? (krk) */
1889 case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
1890 case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1891 arch = bfd_arch_i386;
1897 arch = bfd_arch_ia64;
1901 #ifdef A29K_MAGIC_BIG
1902 case A29K_MAGIC_BIG:
1903 case A29K_MAGIC_LITTLE:
1904 arch = bfd_arch_a29k;
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;
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;
1929 #ifdef MC68KBCSMAGIC
1932 #ifdef APOLLOM68KMAGIC
1933 case APOLLOM68KMAGIC:
1935 #ifdef LYNXCOFFMAGIC
1938 arch = bfd_arch_m68k;
1939 machine = bfd_mach_m68020;
1946 arch = bfd_arch_m88k;
1952 arch = bfd_arch_z8k;
1953 switch (internal_f->f_flags & F_MACHMASK)
1956 machine = bfd_mach_z8001;
1959 machine = bfd_mach_z8002;
1968 arch = bfd_arch_i860;
1975 arch = bfd_arch_i960;
1976 switch (F_I960TYPE & internal_f->f_flags)
1980 machine = bfd_mach_i960_core;
1983 machine = bfd_mach_i960_kb_sb;
1986 machine = bfd_mach_i960_mc;
1989 machine = bfd_mach_i960_xa;
1992 machine = bfd_mach_i960_ca;
1995 machine = bfd_mach_i960_ka_sa;
1998 machine = bfd_mach_i960_jx;
2001 machine = bfd_mach_i960_hx;
2019 if (xcoff_data (abfd)->cputype != -1)
2020 cputype = xcoff_data (abfd)->cputype & 0xff;
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)
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)))
2042 bfd_coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
2043 if (sym.n_sclass == C_FILE)
2044 cputype = sym.n_type & 0xff;
2051 /* FIXME: We don't handle all cases here. */
2056 arch = bfd_xcoff_architecture (abfd);
2057 machine = bfd_xcoff_machine (abfd);
2061 arch = bfd_arch_powerpc;
2062 machine = bfd_mach_ppc_601;
2064 case 2: /* 64 bit PowerPC */
2065 arch = bfd_arch_powerpc;
2066 machine = bfd_mach_ppc_620;
2069 arch = bfd_arch_powerpc;
2070 machine = bfd_mach_ppc;
2073 arch = bfd_arch_rs6000;
2074 machine = bfd_mach_rs6k;
2083 arch = bfd_arch_we32k;
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;
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;
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;
2115 #ifdef SH_ARCH_MAGIC_BIG
2116 case SH_ARCH_MAGIC_BIG:
2117 case SH_ARCH_MAGIC_LITTLE:
2119 case SH_ARCH_MAGIC_WINCE:
2126 #ifdef MIPS_ARCH_MAGIC_WINCE
2127 case MIPS_ARCH_MAGIC_WINCE:
2128 arch = bfd_arch_mips;
2135 arch = bfd_arch_h8500;
2142 #ifdef LYNXCOFFMAGIC
2145 arch = bfd_arch_sparc;
2152 arch = bfd_arch_tic30;
2157 #ifdef TICOFF_TARGET_ARCH
2158 /* this TI COFF section should be used by all new TI COFF v0 targets */
2160 arch = TICOFF_TARGET_ARCH;
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 */
2170 switch (internal_f->f_target_id)
2174 arch = TICOFF_TARGET_ARCH;
2178 arch = bfd_arch_obscure;
2179 (*_bfd_error_handler)
2180 (_("Unrecognized TI COFF target id '0x%x'"),
2181 internal_f->f_target_id);
2187 #ifdef TIC80_ARCH_MAGIC
2188 case TIC80_ARCH_MAGIC:
2189 arch = bfd_arch_tic80;
2195 arch = bfd_arch_mcore;
2198 default: /* Unreadable input file type */
2199 arch = bfd_arch_obscure;
2203 bfd_default_set_arch_mach (abfd, arch, machine);
2207 #ifdef SYMNAME_IN_DEBUG
2209 static boolean symname_in_debug_hook
2210 PARAMS ((bfd *, struct internal_syment *));
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;
2222 #define symname_in_debug_hook \
2223 (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
2230 #define FORCE_SYMNAMES_IN_STRINGS
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 *));
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. */
2265 /* Return false to indicate that this auxent should be handled by
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 *));
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. */
2291 && (symbol->u.syment.n_sclass == C_LEAFPROC
2292 || symbol->u.syment.n_sclass == C_LEAFSTAT
2293 || symbol->u.syment.n_sclass == C_LEAFEXT));
2298 #define coff_pointerize_aux_hook 0
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));
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;
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);
2329 fprintf (file, "val %5lld", aux->u.auxent.x_csect.x_scnlen.l);
2331 fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2336 fprintf (file, "indx ");
2337 if (! aux->fix_scnlen)
2339 fprintf (file, "%4lld", aux->u.auxent.x_csect.x_scnlen.l);
2341 fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2344 fprintf (file, "%4ld",
2345 (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
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);
2360 /* Return false to indicate that no special action was taken. */
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
2382 static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2384 /* AUX's ld wants relocations to be sorted */
2386 compare_arelent_ptr (x, 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 */
2401 coff_write_relocs (abfd, first_undef)
2407 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2410 struct external_reloc dst;
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)
2420 memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2421 qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2424 if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
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))
2442 for (i = 0; i < s->reloc_count; i++)
2444 struct internal_reloc n;
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)
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;
2474 n.r_vaddr = q->address + s->vma;
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
2480 if (q->howto->type == R_IHCONST)
2481 n.r_symndx = q->addend;
2486 #ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
2487 if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
2489 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
2491 /* This is a relocation relative to the absolute symbol. */
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
2499 if (n.r_symndx > obj_conv_table_size (abfd))
2504 #ifdef SWAP_OUT_RELOC_OFFSET
2505 n.r_offset = q->addend;
2509 /* Work out reloc type from what is required */
2510 SELECT_RELOC (n, q->howto);
2512 n.r_type = q->howto->type;
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))
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. */
2533 coff_set_flags (abfd, magicp, flagsp)
2535 unsigned int *magicp ATTRIBUTE_UNUSED;
2536 unsigned short *flagsp ATTRIBUTE_UNUSED;
2538 switch (bfd_get_arch (abfd))
2543 switch (bfd_get_mach (abfd))
2545 case bfd_mach_z8001:
2548 case bfd_mach_z8002:
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:
2572 case bfd_mach_i960_kb_sb:
2575 case bfd_mach_i960_mc:
2578 case bfd_mach_i960_xa:
2581 case bfd_mach_i960_ca:
2584 case bfd_mach_i960_ka_sa:
2587 case bfd_mach_i960_jx:
2590 case bfd_mach_i960_hx:
2603 case bfd_arch_tic30:
2604 *magicp = TIC30MAGIC;
2608 #ifdef TICOFF_DEFAULT_MAGIC
2609 case TICOFF_TARGET_ARCH:
2610 /* if there's no indication of which version we want, use the default */
2612 *magicp = TICOFF_DEFAULT_MAGIC;
2615 /* we may want to output in a different COFF version */
2616 switch (abfd->xvec->name[4])
2619 *magicp = TICOFF0MAGIC;
2622 *magicp = TICOFF1MAGIC;
2625 *magicp = TICOFF2MAGIC;
2634 #ifdef TIC80_ARCH_MAGIC
2635 case bfd_arch_tic80:
2636 *magicp = TIC80_ARCH_MAGIC;
2642 * magicp = ARMPEMAGIC;
2644 * magicp = ARMMAGIC;
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))
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;
2677 case bfd_arch_powerpc:
2684 *magicp = I386MAGIC;
2686 /* Just overwrite the usual value if we're doing Lynx. */
2687 *magicp = LYNXCOFFMAGIC;
2694 *magicp = I860MAGIC;
2700 *magicp = IA64MAGIC;
2706 #ifdef APOLLOM68KMAGIC
2707 *magicp = APOLLO_COFF_VERSION_NUMBER;
2709 /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c. */
2710 #ifdef NAMES_HAVE_UNDERSCORE
2711 *magicp = MC68KBCSMAGIC;
2713 *magicp = MC68MAGIC;
2717 /* Just overwrite the usual value if we're doing Lynx. */
2718 *magicp = LYNXCOFFMAGIC;
2726 *magicp = MC88OMAGIC;
2731 case bfd_arch_h8300:
2732 switch (bfd_get_mach (abfd))
2734 case bfd_mach_h8300:
2735 *magicp = H8300MAGIC;
2737 case bfd_mach_h8300h:
2738 *magicp = H8300HMAGIC;
2740 case bfd_mach_h8300s:
2741 *magicp = H8300SMAGIC;
2747 #ifdef SH_ARCH_MAGIC_BIG
2749 #ifdef COFF_IMAGE_WITH_PE
2750 *magicp = SH_ARCH_MAGIC_WINCE;
2752 if (bfd_big_endian (abfd))
2753 *magicp = SH_ARCH_MAGIC_BIG;
2755 *magicp = SH_ARCH_MAGIC_LITTLE;
2761 #ifdef MIPS_ARCH_MAGIC_WINCE
2763 *magicp = MIPS_ARCH_MAGIC_WINCE;
2769 case bfd_arch_sparc:
2770 *magicp = SPARCMAGIC;
2772 /* Just overwrite the usual value if we're doing Lynx. */
2773 *magicp = LYNXCOFFMAGIC;
2780 case bfd_arch_h8500:
2781 *magicp = H8500MAGIC;
2785 #ifdef A29K_MAGIC_BIG
2787 if (bfd_big_endian (abfd))
2788 *magicp = A29K_MAGIC_BIG;
2790 *magicp = A29K_MAGIC_LITTLE;
2796 case bfd_arch_we32k:
2797 *magicp = WE32KMAGIC;
2803 case bfd_arch_rs6000:
2805 case bfd_arch_powerpc:
2808 if (bfd_get_mach (abfd) == bfd_mach_ppc_620
2809 && !strncmp (abfd->xvec->name,"aix", 3))
2810 *magicp = U803XTOCMAGIC;
2813 *magicp = U802TOCMAGIC;
2820 case bfd_arch_mcore:
2821 * magicp = MCOREMAGIC;
2831 default: /* Unknown architecture. */
2832 /* Fall through to "return false" below, to avoid
2833 "statement never reached" errors on the one below. */
2841 coff_set_arch_mach (abfd, arch, machine)
2843 enum bfd_architecture arch;
2844 unsigned long machine;
2847 unsigned short dummy2;
2849 if (! bfd_default_set_arch_mach (abfd, arch, machine))
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
2864 static int sort_by_secaddr PARAMS ((const PTR, const PTR));
2867 sort_by_secaddr (arg1, arg2)
2871 const asection *a = *(const asection **) arg1;
2872 const asection *b = *(const asection **) arg2;
2874 if (a->vma < b->vma)
2876 else if (a->vma > b->vma)
2882 #endif /* COFF_IMAGE_WITH_PE */
2884 /* Calculate the file position for each section. */
2887 #define ALIGN_SECTIONS_IN_FILE
2889 #if defined(TIC80COFF) || defined(TICOFF)
2890 #undef ALIGN_SECTIONS_IN_FILE
2894 coff_compute_section_file_positions (abfd)
2898 asection *previous = (asection *) NULL;
2899 file_ptr sofar = bfd_coff_filhsz (abfd);
2900 boolean align_adjust;
2901 #ifdef ALIGN_SECTIONS_IN_FILE
2906 /* On XCOFF, if we have symbols, set up the .debug section. */
2907 if (bfd_get_symcount (abfd) > 0)
2910 bfd_size_type i, symcount;
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);
2921 && cf->native != NULL
2922 && SYMNAME_IN_DEBUG (&cf->native->u.syment))
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);
2935 dsec = bfd_make_section_old_way (abfd, ".debug");
2938 dsec->_raw_size = sz;
2939 dsec->flags |= SEC_HAS_CONTENTS;
2944 #ifdef COFF_IMAGE_WITH_PE
2946 if (coff_data (abfd)->link_info)
2948 page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2951 page_size = PE_DEF_FILE_ALIGNMENT;
2953 #ifdef COFF_PAGE_SIZE
2954 int page_size = COFF_PAGE_SIZE;
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);
2968 else if (xcoff_data (abfd)->full_aouthdr)
2969 sofar += bfd_coff_aoutsz (abfd);
2971 sofar += SMALL_AOUTSZ;
2974 sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
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);
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. */
2993 asection **section_list;
2998 for (current = abfd->sections; current != NULL; current = current->next)
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)
3007 for (current = abfd->sections; current != NULL; current = current->next)
3009 section_list[i] = current;
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. */
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
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;
3040 current->target_index = target_index++;
3043 free (section_list);
3045 #else /* ! COFF_IMAGE_WITH_PE */
3047 /* Set the target_index field. */
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)
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)
3078 if (pei_section_data (abfd, current)->virt_size == 0)
3079 pei_section_data (abfd, current)->virt_size = current->_raw_size;
3082 /* Only deal with sections which have contents. */
3083 if (!(current->flags & SEC_HAS_CONTENTS))
3086 #ifdef COFF_IMAGE_WITH_PE
3087 /* Make sure we skip empty sections in a PE image. */
3088 if (current->_raw_size == 0)
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 */
3103 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3104 if (previous != (asection *) NULL)
3106 previous->_raw_size += sofar - old_sofar;
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;
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;
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;
3143 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3144 align_adjust = sofar != old_sofar;
3145 current->_raw_size += sofar - old_sofar;
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;
3158 /* Force .lib sections to start at zero. The vma is then
3159 incremented in coff_set_section_contents. This is right for
3161 if (strcmp (current->name, _LIB) == 0)
3162 bfd_set_section_vma (abfd, current, 0);
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. */
3178 if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
3179 || bfd_write (&b, 1, 1, abfd) != 1)
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;
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? */
3204 coff_add_missing_symbols (abfd)
3207 unsigned int nsyms = bfd_get_symcount (abfd);
3208 asymbol **sympp = abfd->outsymbols;
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]);
3219 /* only do this if there is a coff representation of the input
3221 if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
3226 name = csym->symbol.name;
3229 if (!strcmp (name, _TEXT))
3232 else if (!strcmp (name, ".wtext"))
3235 else if (!strcmp (name, _DATA))
3237 else if (!strcmp (name, _BSS))
3241 /* Now i == bfd_get_symcount (abfd). */
3242 /* @@ For now, don't deal with .file symbol. */
3245 if (!need_text && !need_data && !need_bss && !need_file)
3247 nsyms += need_text + need_data + need_bss + need_file;
3248 sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
3251 memcpy (sympp2, sympp, i * sizeof (asymbol *));
3254 /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */
3258 sympp2[i++] = coff_section_symbol (abfd, _TEXT);
3260 sympp2[i++] = coff_section_symbol (abfd, _DATA);
3262 sympp2[i++] = coff_section_symbol (abfd, _BSS);
3263 BFD_ASSERT (i == nsyms);
3264 bfd_set_symtab (abfd, sympp2, nsyms);
3273 coff_write_object_contents (abfd)
3277 boolean hasrelocs = false;
3278 boolean haslinno = false;
3279 boolean hasdebug = false;
3281 file_ptr reloc_base;
3282 file_ptr lineno_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;
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))
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 =
3317 /* we store the actual reloc count in the first reloc's addr */
3318 if (current->reloc_count > 0xffff)
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 =
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);
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);
3348 /* extra reloc to hold real count */
3349 if (current->reloc_count > 0xffff)
3350 reloc_base += bfd_coff_relsz (abfd);
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);
3366 scn_base = bfd_coff_filhsz (abfd);
3369 if (xcoff_data (abfd)->full_aouthdr)
3370 scn_base += bfd_coff_aoutsz (abfd);
3372 scn_base += SMALL_AOUTSZ;
3377 if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
3380 long_section_names = false;
3381 for (current = abfd->sections;
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;
3393 pe_data (abfd)->has_reloc_section = 1;
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. */
3407 len = strlen (current->name);
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;
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;
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);
3433 section.s_paddr = 0;
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;
3441 section.s_paddr = 0;
3445 If this section has no size or is unloadable then the scnptr
3448 if (current->_raw_size == 0 ||
3449 (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3451 section.s_scnptr = 0;
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)
3466 if (current->lineno_count != 0)
3468 if ((current->flags & SEC_DEBUGGING) != 0
3469 && ! is_reloc_section)
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;
3483 section.s_flags = sec_to_styp_flags (current->name, current->flags);
3485 if (!strcmp (current->name, _TEXT))
3489 else if (!strcmp (current->name, _DATA))
3493 else if (!strcmp (current->name, _BSS))
3499 section.s_align = (current->alignment_power
3500 ? 1 << current->alignment_power
3504 /* TI COFF puts the alignment power in bits 8-11 of the flags */
3505 section.s_flags |= (current->alignment_power & 0xF) << 8;
3507 #ifdef COFF_ENCODE_ALIGNMENT
3508 COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
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--;
3523 if (coff_swap_scnhdr_out (abfd, §ion, &buff) == 0
3524 || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
3525 != bfd_coff_scnhsz (abfd))
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;
3537 coff_symbol_type *csym = NULL;
3541 count = bfd_get_symcount (abfd);
3542 for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3544 if ((*psym)->section != current)
3547 /* Remember the location of the first symbol in this
3549 if (psymsec == NULL)
3552 /* See if this is the section symbol. */
3553 if (strcmp ((*psym)->name, current->name) == 0)
3555 csym = coff_symbol_from (abfd, *psym);
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)
3563 /* Here *PSYM is the section symbol for CURRENT. */
3570 Note that we might not if we're converting the file from
3571 some other object file format. */
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;
3586 case SEC_LINK_DUPLICATES_ONE_ONLY:
3587 aux->u.auxent.x_scn.x_comdat =
3588 IMAGE_COMDAT_SELECT_NODUPLICATES;
3591 case SEC_LINK_DUPLICATES_SAME_SIZE:
3592 aux->u.auxent.x_scn.x_comdat =
3593 IMAGE_COMDAT_SELECT_SAME_SIZE;
3596 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3597 aux->u.auxent.x_scn.x_comdat =
3598 IMAGE_COMDAT_SELECT_EXACT_MATCH;
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)
3615 for (pcopy = psym; pcopy > psymsec; pcopy--)
3616 pcopy[0] = pcopy[-1];
3621 #endif /* COFF_WITH_PE */
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;
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;
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))
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);
3673 internal_f.f_opthdr = 0;
3676 if (xcoff_data (abfd)->full_aouthdr)
3677 internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
3679 internal_f.f_opthdr = SMALL_AOUTSZ;
3685 internal_f.f_flags |= F_RELFLG;
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
3692 internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3695 #ifndef COFF_WITH_PE
3696 if (bfd_little_endian (abfd))
3697 internal_f.f_flags |= F_AR32WR;
3699 internal_f.f_flags |= F_AR32W;
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;
3707 #ifdef TIC80_TARGET_ID
3708 internal_f.f_target_id = TIC80_TARGET_ID;
3712 FIXME, should do something about the other byte orders and
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;
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... */
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 */
3745 internal_a.magic = NMAGIC; /* Assume separate i/d */
3746 #define __A_MAGIC_SET__
3748 #ifdef TICOFF_AOUT_MAGIC
3749 internal_a.magic = TICOFF_AOUT_MAGIC;
3750 #define __A_MAGIC_SET__
3753 internal_a.magic = TIC80_ARCH_MAGIC;
3754 #define __A_MAGIC_SET__
3757 /* FIXME: What are the a.out magic numbers for the i860? */
3758 internal_a.magic = 0;
3759 #define __A_MAGIC_SET__
3762 internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3763 #define __A_MAGIC_SET__
3766 #define __A_MAGIC_SET__
3767 internal_a.magic = PAGEMAGICBCS;
3771 #define __A_MAGIC_SET__
3772 internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3775 #if defined(M68) || defined(WE32K) || defined(M68K)
3776 #define __A_MAGIC_SET__
3778 internal_a.magic = LYNXCOFFMAGIC;
3780 #if defined(TARG_AUX)
3781 internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3782 abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3783 PAGEMAGICEXECSWAPPED);
3785 #if defined (PAGEMAGICPEXECPAGED)
3786 internal_a.magic = PAGEMAGICPEXECPAGED;
3788 #endif /* TARG_AUX */
3790 #endif /* M68 || WE32K || M68K */
3793 #define __A_MAGIC_SET__
3794 internal_a.magic = ZMAGIC;
3798 #define __A_MAGIC_SET__
3799 internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3802 #if defined MCORE_PE
3803 #define __A_MAGIC_SET__
3804 internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3808 #define __A_MAGIC_SET__
3810 internal_a.magic = LYNXCOFFMAGIC;
3812 internal_a.magic = ZMAGIC;
3817 #define __A_MAGIC_SET__
3818 internal_a.magic = ZMAGIC;
3822 #define __A_MAGIC_SET__
3824 internal_a.magic = LYNXCOFFMAGIC;
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;
3835 #if defined(SH) && defined(COFF_WITH_PE)
3836 #define __A_MAGIC_SET__
3837 internal_a.magic = SH_PE_MAGIC;
3840 #if defined(MIPS) && defined(COFF_WITH_PE)
3841 #define __A_MAGIC_SET__
3842 internal_a.magic = MIPS_PE_MAGIC;
3845 #ifndef __A_MAGIC_SET__
3846 #include "Your aouthdr magic number is not being set!"
3848 #undef __A_MAGIC_SET__
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)
3862 if (!coff_add_missing_symbols (abfd))
3865 if (!coff_renumber_symbols (abfd, &firstundef))
3867 coff_mangle_symbols (abfd);
3868 if (! coff_write_symbols (abfd))
3870 if (! coff_write_linenumbers (abfd))
3872 if (! coff_write_relocs (abfd, firstundef))
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))
3884 #ifdef COFF_IMAGE_WITH_PE
3886 else if ((abfd->flags & EXEC_P) != 0)
3890 /* PowerPC PE appears to require that all executable files be
3891 rounded up to the page size. */
3894 BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3896 || bfd_write (&b, 1, 1, abfd) != 1)
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;
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;
3916 if (long_section_names)
3917 internal_f.f_symptr = sym_base;
3919 internal_f.f_symptr = 0;
3920 internal_f.f_flags |= F_LSYMS;
3925 internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3926 internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3930 internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3931 internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
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);
3944 if (xcoff_data (abfd)->full_aouthdr)
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);
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);
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;
3979 internal_a.o_snloader = 0;
3980 if (bss_sec != NULL)
3981 internal_a.o_snbss = bss_sec->target_index;
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;
3994 switch (bfd_get_arch (abfd))
3996 case bfd_arch_rs6000:
3997 internal_a.o_cputype = 4;
3999 case bfd_arch_powerpc:
4000 if (bfd_get_mach (abfd) == 0)
4001 internal_a.o_cputype = 3;
4003 internal_a.o_cputype = 1;
4009 internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
4010 internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
4014 /* now write them */
4015 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
4020 bfd_size_type amount;
4022 buff = bfd_malloc (bfd_coff_filhsz (abfd));
4026 bfd_coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
4027 amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
4031 if (amount != bfd_coff_filhsz (abfd))
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)) */
4040 bfd_size_type amount;
4042 buff = bfd_malloc (bfd_coff_aoutsz (abfd));
4046 coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
4047 amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
4051 if (amount != bfd_coff_aoutsz (abfd))
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);
4065 size = SMALL_AOUTSZ;
4066 if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
4075 coff_set_section_contents (abfd, section, location, offset, count)
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))
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
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)
4120 rec += bfd_get_32 (abfd, rec) * 4;
4123 BFD_ASSERT (rec == recend);
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)
4133 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
4138 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
4144 coff_close_and_cleanup (abfd)
4147 if (!bfd_read_p (abfd))
4148 switch (abfd->format)
4151 if (!_bfd_write_archive_contents (abfd))
4155 if (!coff_write_object_contents (abfd))
4159 bfd_set_error (bfd_error_invalid_operation);
4163 /* We depend on bfd_close to free all the memory on the objalloc. */
4170 buy_and_read (abfd, where, seek_direction, size)
4176 PTR area = (PTR) bfd_alloc (abfd, size);
4179 if (bfd_seek (abfd, where, seek_direction) != 0
4180 || bfd_read (area, 1, size, abfd) != size)
4183 } /* buy_and_read() */
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
4201 The information is copied from the external to the internal
4202 table, and each symbol which marks a function is marked by
4205 How does this work ?
4210 coff_slurp_line_table (abfd, 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,
4222 (size_t) (bfd_coff_linesz (abfd) *
4223 asect->lineno_count));
4225 (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
4226 if (lineno_cache == NULL)
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)
4243 bfd_signed_vma symndx;
4244 coff_symbol_type *sym;
4247 symndx = dst.l_addr.l_symndx;
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);
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;
4274 cache_ptr->u.offset = dst.l_addr.l_paddr
4275 - bfd_section_vma (abfd, asect);
4276 } /* If no linenumber expect a symbol index */
4282 cache_ptr->line_number = 0;
4285 asect->lineno = lineno_cache;
4286 /* FIXME, free native_lineno here, or use alloca or something. */
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. */
4295 coff_slurp_symbol_table (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))
4307 /* Read in the symbol table */
4308 if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
4313 /* Allocate enough room for all the symbols in cached form */
4314 cached_area = ((coff_symbol_type *)
4316 (obj_raw_syment_count (abfd)
4317 * sizeof (coff_symbol_type))));
4319 if (cached_area == NULL)
4321 table_ptr = ((unsigned int *)
4323 (obj_raw_syment_count (abfd)
4324 * sizeof (unsigned int))));
4326 if (table_ptr == NULL)
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)
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;
4356 /* Fall through to next case */
4364 case C_THUMBEXTFUNC:
4370 case C_SYSTEM: /* System Wide variable */
4373 /* In PE, 0x68 (104) denotes a section symbol */
4375 /* In PE, 0x69 (105) denotes a weak external symbol. */
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;
4387 dst->symbol.value = (src->u.syment.n_value
4388 - dst->symbol.section->vma);
4390 if (ISFCN ((src->u.syment.n_type)))
4392 /* A function ext does not go at the end of a
4394 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
4398 case COFF_SYMBOL_COMMON:
4399 dst->symbol.section = bfd_com_section_ptr;
4400 dst->symbol.value = src->u.syment.n_value;
4403 case COFF_SYMBOL_UNDEFINED:
4404 dst->symbol.section = bfd_und_section_ptr;
4405 dst->symbol.value = 0;
4408 case COFF_SYMBOL_PE_SECTION:
4409 dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
4410 dst->symbol.value = 0;
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;
4420 dst->symbol.value = (src->u.syment.n_value
4421 - dst->symbol.section->vma);
4423 if (ISFCN ((src->u.syment.n_type)))
4424 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
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;
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;
4444 if (src->u.syment.n_sclass == C_WEAKEXT)
4445 dst->symbol.flags = BSF_WEAK;
4449 case C_STAT: /* static */
4451 case C_LEAFSTAT: /* static leaf procedure */
4454 case C_THUMBSTAT: /* Thumb static */
4455 case C_THUMBLABEL: /* Thumb label */
4456 case C_THUMBSTATFUNC:/* Thumb static function */
4458 case C_LABEL: /* label */
4459 if (src->u.syment.n_scnum == N_DEBUG)
4460 dst->symbol.flags = BSF_DEBUGGING;
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;
4473 dst->symbol.value = (src->u.syment.n_value
4474 - dst->symbol.section->vma);
4478 dst->symbol.value = src->u.syment.n_value;
4481 case C_MOS: /* member of structure */
4482 case C_EOS: /* end of structure */
4483 #ifdef NOTDEF /* C_AUTOARG has the same value */
4485 case C_GLBLREG: /* A29k-specific storage class */
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)
4493 case C_AUTOARG: /* 960-specific storage class */
4496 case C_TPDEF: /* type definition */
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);
4508 case C_FILE: /* file name */
4509 case C_STRTAG: /* structure tag */
4524 dst->symbol.flags = BSF_DEBUGGING;
4525 dst->symbol.value = (src->u.syment.n_value);
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. */
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))
4546 dst->symbol.value = 0;
4549 dst->symbol.section = sec;
4550 dst->symbol.value = ((src->u.syment.n_value
4551 - sec->line_filepos)
4552 / bfd_coff_linesz (abfd));
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;
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
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
4582 dst->symbol.flags = BSF_DEBUGGING;
4585 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
4587 /* Base the value as an index from the base of the
4589 dst->symbol.flags = BSF_LOCAL;
4590 dst->symbol.value = (src->u.syment.n_value
4591 - dst->symbol.section->vma);
4595 case C_STATLAB: /* Static load time label */
4596 dst->symbol.value = src->u.syment.n_value;
4597 dst->symbol.flags = BSF_GLOBAL;
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)
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 */
4618 /* New storage classes for TI COFF */
4619 #if defined(TIC80COFF) || defined(TICOFF)
4620 case C_UEXT: /* Tentative external definition */
4622 case C_EXTLAB: /* External load time label */
4623 case C_HIDDEN: /* ext symbol in dmert public lib */
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);
4634 /* BFD_ASSERT(dst->symbol.flags != 0);*/
4638 dst->symbol.udata.i = 0;
4639 dst->lineno = (alent *) NULL;
4640 this_index += (src->u.syment.n_numaux) + 1;
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 */
4657 coff_slurp_line_table (abfd, p);
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)
4671 struct internal_syment *syment;
4673 /* FIXME: This partially duplicates the switch in
4674 coff_slurp_symbol_table. */
4675 switch (syment->n_sclass)
4684 case C_THUMBEXTFUNC:
4692 if (syment->n_scnum == 0)
4694 if (syment->n_value == 0)
4695 return COFF_SYMBOL_UNDEFINED;
4697 return COFF_SYMBOL_COMMON;
4699 return COFF_SYMBOL_GLOBAL;
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
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)
4724 char buf[SYMNMLEN + 1];
4726 sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4728 && (strcmp (bfd_get_section_name (abfd, sec),
4729 _bfd_coff_internal_syment_name (abfd, syment, buf))
4731 return COFF_SYMBOL_PE_SECTION;
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;
4769 Coff relocations are easily transformed into the internal BFD form
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.
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)); \
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); \
4809 cache_ptr->addend = 0; \
4814 coff_slurp_reloc_table (abfd, asect, symbols)
4819 RELOC *native_relocs;
4820 arelent *reloc_cache;
4825 if (asect->relocation)
4827 if (asect->reloc_count == 0)
4829 if (asect->flags & SEC_CONSTRUCTOR)
4831 if (!coff_slurp_symbol_table (abfd))
4834 (RELOC *) buy_and_read (abfd,
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)
4845 for (idx = 0; idx < asect->reloc_count; idx++)
4847 struct internal_reloc dst;
4848 struct external_reloc *src;
4849 #ifndef RELOC_PROCESSING
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);
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;
4875 cache_ptr->sym_ptr_ptr = (symbols
4876 + obj_convert (abfd)[dst.r_symndx]);
4877 ptr = *(cache_ptr->sym_ptr_ptr);
4882 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
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);
4913 asect->relocation = reloc_cache;
4917 #ifndef coff_rtype_to_howto
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 *,
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;
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. */
4956 coff_canonicalize_reloc (abfd, section, relptr, 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;
4980 if (! coff_slurp_reloc_table (abfd, section, symbols))
4983 tblptr = section->relocation;
4985 for (; count++ < section->reloc_count;)
4986 *relptr++ = tblptr++;
4989 return section->reloc_count;
4994 coff_sym_filepos (abfd)
4997 return obj_sym_filepos (abfd);
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 *));
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;
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 *));
5033 dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_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;
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
5053 #ifndef coff_bfd_link_add_symbols
5054 #define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
5056 #ifndef coff_bfd_final_link
5057 #define coff_bfd_final_link _bfd_coff_final_link
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
5064 #ifndef coff_bfd_link_add_symbols
5065 #define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
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
5076 #ifndef coff_adjust_symndx
5077 #define coff_adjust_symndx NULL
5080 #ifndef coff_link_add_one_symbol
5081 #define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
5084 #ifndef coff_link_output_has_begun
5086 static boolean coff_link_output_has_begun
5087 PARAMS ((bfd *, struct coff_final_link_info *));
5090 coff_link_output_has_begun (abfd, info)
5092 struct coff_final_link_info * info ATTRIBUTE_UNUSED;
5094 return abfd->output_has_begun;
5098 #ifndef coff_final_link_postscript
5100 static boolean coff_final_link_postscript
5101 PARAMS ((bfd *, struct coff_final_link_info *));
5104 coff_final_link_postscript (abfd, pfinfo)
5105 bfd * abfd ATTRIBUTE_UNUSED;
5106 struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
5112 #ifndef coff_SWAP_aux_in
5113 #define coff_SWAP_aux_in coff_swap_aux_in
5115 #ifndef coff_SWAP_sym_in
5116 #define coff_SWAP_sym_in coff_swap_sym_in
5118 #ifndef coff_SWAP_lineno_in
5119 #define coff_SWAP_lineno_in coff_swap_lineno_in
5121 #ifndef coff_SWAP_aux_out
5122 #define coff_SWAP_aux_out coff_swap_aux_out
5124 #ifndef coff_SWAP_sym_out
5125 #define coff_SWAP_sym_out coff_swap_sym_out
5127 #ifndef coff_SWAP_lineno_out
5128 #define coff_SWAP_lineno_out coff_swap_lineno_out
5130 #ifndef coff_SWAP_reloc_out
5131 #define coff_SWAP_reloc_out coff_swap_reloc_out
5133 #ifndef coff_SWAP_filehdr_out
5134 #define coff_SWAP_filehdr_out coff_swap_filehdr_out
5136 #ifndef coff_SWAP_aouthdr_out
5137 #define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
5139 #ifndef coff_SWAP_scnhdr_out
5140 #define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
5142 #ifndef coff_SWAP_reloc_in
5143 #define coff_SWAP_reloc_in coff_swap_reloc_in
5145 #ifndef coff_SWAP_filehdr_in
5146 #define coff_SWAP_filehdr_in coff_swap_filehdr_in
5148 #ifndef coff_SWAP_aouthdr_in
5149 #define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
5151 #ifndef coff_SWAP_scnhdr_in
5152 #define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
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
5168 #ifdef COFF_LONG_SECTION_NAMES
5173 COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
5174 #ifdef COFF_FORCE_SYMBOLS_IN_STRINGS
5179 #ifdef COFF_DEBUG_STRING_WIDE_PREFIX
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
5199 #ifndef coff_bfd_free_cached_info
5200 #define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
5203 #ifndef coff_get_section_contents
5204 #define coff_get_section_contents _bfd_generic_get_section_contents
5207 #ifndef coff_bfd_copy_private_symbol_data
5208 #define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
5211 #ifndef coff_bfd_copy_private_section_data
5212 #define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
5215 #ifndef coff_bfd_copy_private_bfd_data
5216 #define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
5219 #ifndef coff_bfd_merge_private_bfd_data
5220 #define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
5223 #ifndef coff_bfd_set_private_flags
5224 #define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
5227 #ifndef coff_bfd_print_private_bfd_data
5228 #define coff_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
5231 #ifndef coff_bfd_is_local_label_name
5232 #define coff_bfd_is_local_label_name _bfd_coff_is_local_label_name
5235 #ifndef coff_read_minisymbols
5236 #define coff_read_minisymbols _bfd_generic_read_minisymbols
5239 #ifndef coff_minisymbol_to_symbol
5240 #define coff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
5243 /* The reloc lookup routine must be supplied by each individual COFF
5245 #ifndef coff_bfd_reloc_type_lookup
5246 #define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
5249 #ifndef coff_bfd_get_relocated_section_contents
5250 #define coff_bfd_get_relocated_section_contents \
5251 bfd_generic_get_relocated_section_contents
5254 #ifndef coff_bfd_relax_section
5255 #define coff_bfd_relax_section bfd_generic_relax_section
5258 #ifndef coff_bfd_gc_sections
5259 #define coff_bfd_gc_sections bfd_generic_gc_sections
5262 #ifndef coff_bfd_merge_sections
5263 #define coff_bfd_merge_sections bfd_generic_merge_sections
5266 #define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
5267 const bfd_target VAR = \
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, \
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), \
5316 #define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
5317 const bfd_target VAR = \
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, \
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), \