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