source: trunk/src/binutils/bfd/coffcode.h@ 524

Last change on this file since 524 was 10, checked in by bird, 22 years ago

Initial revision

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