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