Fix typo
[deliverable/binutils-gdb.git] / bfd / coffcode.h
CommitLineData
252b5132 1/* Support for the generic parts of most COFF variants, for BFD.
7898deda
NC
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001
252b5132
RH
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}
00692651 135 and @code{coff_swap_lineno_in}. @code{GDB} reads the symbol
252b5132
RH
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
252b5132
RH
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
252b5132
RH
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));
7c8ca0e4
NC
315static boolean styp_to_sec_flags
316 PARAMS ((bfd *, PTR, const char *, asection *, flagword *));
252b5132 317static boolean coff_bad_format_hook PARAMS ((bfd *, PTR));
5dccc1dd
ILT
318static void coff_set_custom_section_alignment
319 PARAMS ((bfd *, asection *, const struct coff_section_alignment_entry *,
8a1ad8e7 320 const unsigned int));
252b5132
RH
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 *));
cea4409c 329static boolean coff_write_object_contents PARAMS ((bfd *)) ATTRIBUTE_UNUSED;
252b5132
RH
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 *));
5d54c628
ILT
335static enum coff_symbol_classification coff_classify_symbol
336 PARAMS ((bfd *, struct internal_syment *));
252b5132
RH
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
1276aefa
NC
343#ifdef COFF_WITH_PE
344static flagword handle_COMDAT PARAMS ((bfd *, flagword, PTR, const char *, asection *));
345#endif
252b5132
RH
346\f
347/* void warning(); */
348
41733515
ILT
349/* Return a word with STYP_* (scnhdr.s_flags) flags set to represent
350 the incoming SEC_* flags. The inverse of this function is
351 styp_to_sec_flags(). NOTE: If you add to/change this routine, you
352 should probably mirror the changes in styp_to_sec_flags(). */
353
354#ifndef COFF_WITH_PE
355
51db3708
NC
356/* Macros for setting debugging flags. */
357#ifdef STYP_DEBUG
358#define STYP_XCOFF_DEBUG STYP_DEBUG
359#else
360#define STYP_XCOFF_DEBUG STYP_INFO
361#endif
362
363#ifdef COFF_ALIGN_IN_S_FLAGS
364#define STYP_DEBUG_INFO STYP_DSECT
365#else
366#define STYP_DEBUG_INFO STYP_INFO
367#endif
368
252b5132
RH
369static long
370sec_to_styp_flags (sec_name, sec_flags)
371 CONST char *sec_name;
372 flagword sec_flags;
373{
374 long styp_flags = 0;
375
376 if (!strcmp (sec_name, _TEXT))
377 {
378 styp_flags = STYP_TEXT;
379 }
380 else if (!strcmp (sec_name, _DATA))
381 {
382 styp_flags = STYP_DATA;
383 }
384 else if (!strcmp (sec_name, _BSS))
385 {
386 styp_flags = STYP_BSS;
387#ifdef _COMMENT
388 }
389 else if (!strcmp (sec_name, _COMMENT))
390 {
391 styp_flags = STYP_INFO;
392#endif /* _COMMENT */
393#ifdef _LIB
394 }
395 else if (!strcmp (sec_name, _LIB))
396 {
397 styp_flags = STYP_LIB;
398#endif /* _LIB */
399#ifdef _LIT
400 }
401 else if (!strcmp (sec_name, _LIT))
402 {
403 styp_flags = STYP_LIT;
404#endif /* _LIT */
405 }
51db3708 406 else if (!strncmp (sec_name, ".debug", 6))
252b5132 407 {
51db3708
NC
408 /* Handle the XCOFF debug section and DWARF2 debug sections. */
409 if (!sec_name[6])
410 styp_flags = STYP_XCOFF_DEBUG;
411 else
412 styp_flags = STYP_DEBUG_INFO;
252b5132
RH
413 }
414 else if (!strncmp (sec_name, ".stab", 5))
415 {
51db3708
NC
416 styp_flags = STYP_DEBUG_INFO;
417 }
418#ifdef COFF_LONG_SECTION_NAMES
419 else if (!strncmp (sec_name, ".gnu.linkonce.wi.", 17))
420 {
421 styp_flags = STYP_DEBUG_INFO;
252b5132 422 }
51db3708 423#endif
252b5132
RH
424#ifdef RS6000COFF_C
425 else if (!strcmp (sec_name, _PAD))
426 {
427 styp_flags = STYP_PAD;
428 }
429 else if (!strcmp (sec_name, _LOADER))
430 {
431 styp_flags = STYP_LOADER;
432 }
433#endif
434 /* Try and figure out what it should be */
435 else if (sec_flags & SEC_CODE)
436 {
437 styp_flags = STYP_TEXT;
438 }
439 else if (sec_flags & SEC_DATA)
440 {
441 styp_flags = STYP_DATA;
442 }
443 else if (sec_flags & SEC_READONLY)
444 {
445#ifdef STYP_LIT /* 29k readonly text/data section */
446 styp_flags = STYP_LIT;
447#else
448 styp_flags = STYP_TEXT;
449#endif /* STYP_LIT */
450 }
451 else if (sec_flags & SEC_LOAD)
452 {
453 styp_flags = STYP_TEXT;
454 }
455 else if (sec_flags & SEC_ALLOC)
456 {
457 styp_flags = STYP_BSS;
458 }
459
34cbe64e
TW
460#ifdef STYP_CLINK
461 if (sec_flags & SEC_CLINK)
462 styp_flags |= STYP_CLINK;
463#endif
464
465#ifdef STYP_BLOCK
466 if (sec_flags & SEC_BLOCK)
467 styp_flags |= STYP_BLOCK;
468#endif
469
252b5132
RH
470#ifdef STYP_NOLOAD
471 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
472 styp_flags |= STYP_NOLOAD;
473#endif
474
41733515
ILT
475 return styp_flags;
476}
477
478#else /* COFF_WITH_PE */
479
480/* The PE version; see above for the general comments. The non-PE
481 case seems to be more guessing, and breaks PE format; specifically,
482 .rdata is readonly, but it sure ain't text. Really, all this
483 should be set up properly in gas (or whatever assembler is in use),
484 and honor whatever objcopy/strip, etc. sent us as input. */
485
486static long
487sec_to_styp_flags (sec_name, sec_flags)
488 const char *sec_name ATTRIBUTE_UNUSED;
489 flagword sec_flags;
490{
491 long styp_flags = 0;
492
493 /* caution: there are at least three groups of symbols that have
494 very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
495 SEC_* are the BFD internal flags, used for generic BFD
496 information. STYP_* are the COFF section flags which appear in
497 COFF files. IMAGE_SCN_* are the PE section flags which appear in
498 PE files. The STYP_* flags and the IMAGE_SCN_* flags overlap,
499 but there are more IMAGE_SCN_* flags. */
500
501 /* skip LOAD */
502 /* READONLY later */
503 /* skip RELOC */
504 if ((sec_flags & SEC_CODE) != 0)
505 styp_flags |= IMAGE_SCN_CNT_CODE;
506 if ((sec_flags & SEC_DATA) != 0)
507 styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
508 if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
509 styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */
510 /* skip ROM */
511 /* skip CONSTRUCTOR */
512 /* skip CONTENTS */
513#ifdef STYP_NOLOAD
514 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
515 styp_flags |= STYP_NOLOAD;
516#endif
517 if ((sec_flags & SEC_IS_COMMON) != 0)
252b5132 518 styp_flags |= IMAGE_SCN_LNK_COMDAT;
41733515
ILT
519 if ((sec_flags & SEC_DEBUGGING) != 0)
520 styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
521 if ((sec_flags & SEC_EXCLUDE) != 0)
522 styp_flags |= IMAGE_SCN_LNK_REMOVE;
523 if ((sec_flags & SEC_NEVER_LOAD) != 0)
524 styp_flags |= IMAGE_SCN_LNK_REMOVE;
525 /* skip IN_MEMORY */
526 /* skip SORT */
e60b52c6
KH
527 if (sec_flags & SEC_LINK_ONCE)
528 styp_flags |= IMAGE_SCN_LNK_COMDAT;
41733515
ILT
529 /* skip LINK_DUPLICATES */
530 /* skip LINKER_CREATED */
531
532 /* For now, the read/write bits are mapped onto SEC_READONLY, even
533 though the semantics don't quite match. The bits from the input
534 are retained in pei_section_data(abfd, section)->pe_flags */
535
e60b52c6 536 styp_flags |= IMAGE_SCN_MEM_READ; /* always readable. */
41733515
ILT
537 if ((sec_flags & SEC_READONLY) == 0)
538 styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write */
539 if (sec_flags & SEC_CODE)
540 styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE */
bd826630 541 if (sec_flags & SEC_SHARED)
41733515 542 styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful */
252b5132 543
e60b52c6 544 return styp_flags;
252b5132 545}
41733515
ILT
546
547#endif /* COFF_WITH_PE */
548
549/* Return a word with SEC_* flags set to represent the incoming STYP_*
550 flags (from scnhdr.s_flags). The inverse of this function is
551 sec_to_styp_flags(). NOTE: If you add to/change this routine, you
552 should probably mirror the changes in sec_to_styp_flags(). */
553
554#ifndef COFF_WITH_PE
555
7c8ca0e4
NC
556static boolean
557styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
5f771d47 558 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
559 PTR hdr;
560 const char *name;
41733515 561 asection *section ATTRIBUTE_UNUSED;
7c8ca0e4 562 flagword *flags_ptr;
252b5132
RH
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
34cbe64e
TW
568#ifdef STYP_BLOCK
569 if (styp_flags & STYP_BLOCK)
7c8ca0e4 570 sec_flags |= SEC_BLOCK;
e60b52c6 571#endif
34cbe64e
TW
572
573#ifdef STYP_CLINK
574 if (styp_flags & STYP_CLINK)
7c8ca0e4 575 sec_flags |= SEC_CLINK;
e60b52c6 576#endif
34cbe64e 577
252b5132
RH
578#ifdef STYP_NOLOAD
579 if (styp_flags & STYP_NOLOAD)
7c8ca0e4 580 sec_flags |= SEC_NEVER_LOAD;
252b5132
RH
581#endif /* STYP_NOLOAD */
582
583 /* For 386 COFF, at least, an unloadable text or data section is
584 actually a shared library section. */
585 if (styp_flags & STYP_TEXT)
586 {
587 if (sec_flags & SEC_NEVER_LOAD)
588 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
589 else
590 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
591 }
592 else if (styp_flags & STYP_DATA)
593 {
594 if (sec_flags & SEC_NEVER_LOAD)
595 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
596 else
597 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
598 }
599 else if (styp_flags & STYP_BSS)
600 {
601#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
602 if (sec_flags & SEC_NEVER_LOAD)
603 sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
604 else
605#endif
606 sec_flags |= SEC_ALLOC;
607 }
608 else if (styp_flags & STYP_INFO)
609 {
610 /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
611 defined. coff_compute_section_file_positions uses
612 COFF_PAGE_SIZE to ensure that the low order bits of the
613 section VMA and the file offset match. If we don't know
614 COFF_PAGE_SIZE, we can't ensure the correct correspondence,
615 and demand page loading of the file will fail. */
616#if defined (COFF_PAGE_SIZE) && !defined (COFF_ALIGN_IN_S_FLAGS)
617 sec_flags |= SEC_DEBUGGING;
618#endif
619 }
620 else if (styp_flags & STYP_PAD)
7c8ca0e4 621 sec_flags = 0;
252b5132
RH
622 else if (strcmp (name, _TEXT) == 0)
623 {
624 if (sec_flags & SEC_NEVER_LOAD)
625 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
626 else
627 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
628 }
629 else if (strcmp (name, _DATA) == 0)
630 {
631 if (sec_flags & SEC_NEVER_LOAD)
632 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
633 else
634 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
635 }
636 else if (strcmp (name, _BSS) == 0)
637 {
638#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
639 if (sec_flags & SEC_NEVER_LOAD)
640 sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
641 else
642#endif
643 sec_flags |= SEC_ALLOC;
644 }
51db3708 645 else if (strncmp (name, ".debug", 6) == 0
252b5132
RH
646#ifdef _COMMENT
647 || strcmp (name, _COMMENT) == 0
51db3708
NC
648#endif
649#ifdef COFF_LONG_SECTION_NAMES
650 || strncmp (name, ".gnu.linkonce.wi.", 17) == 0
252b5132
RH
651#endif
652 || strncmp (name, ".stab", 5) == 0)
653 {
654#ifdef COFF_PAGE_SIZE
655 sec_flags |= SEC_DEBUGGING;
656#endif
657 }
658#ifdef _LIB
659 else if (strcmp (name, _LIB) == 0)
660 ;
661#endif
662#ifdef _LIT
663 else if (strcmp (name, _LIT) == 0)
7c8ca0e4 664 sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
252b5132
RH
665#endif
666 else
7c8ca0e4 667 sec_flags |= SEC_ALLOC | SEC_LOAD;
252b5132
RH
668
669#ifdef STYP_LIT /* A29k readonly text/data section type */
670 if ((styp_flags & STYP_LIT) == STYP_LIT)
7c8ca0e4 671 sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
252b5132 672#endif /* STYP_LIT */
7c8ca0e4 673
252b5132
RH
674#ifdef STYP_OTHER_LOAD /* Other loaded sections */
675 if (styp_flags & STYP_OTHER_LOAD)
7c8ca0e4 676 sec_flags = (SEC_LOAD | SEC_ALLOC);
252b5132
RH
677#endif /* STYP_SDATA */
678
41733515
ILT
679#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
680 /* As a GNU extension, if the name begins with .gnu.linkonce, we
681 only link a single copy of the section. This is used to support
682 g++. g++ will emit each template expansion in its own section.
683 The symbols will be defined as weak, so that multiple definitions
684 are permitted. The GNU linker extension is to actually discard
685 all but one of the sections. */
686 if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
687 sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
688#endif
689
7c8ca0e4
NC
690 if (flags_ptr == NULL)
691 return false;
692
693 * flags_ptr = sec_flags;
694 return true;
41733515
ILT
695}
696
697#else /* COFF_WITH_PE */
698
41733515 699static flagword
1276aefa
NC
700handle_COMDAT (abfd, sec_flags, hdr, name, section)
701 bfd * abfd;
702 flagword sec_flags;
41733515
ILT
703 PTR hdr;
704 const char *name;
705 asection *section;
706{
707 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
1276aefa
NC
708 bfd_byte *esymstart, *esym, *esymend;
709 int seen_state = 0;
710 char *target_name = NULL;
711
712 sec_flags |= SEC_LINK_ONCE;
713
714 /* Unfortunately, the PE format stores essential information in
715 the symbol table, of all places. We need to extract that
716 information now, so that objdump and the linker will know how
717 to handle the section without worrying about the symbols. We
718 can't call slurp_symtab, because the linker doesn't want the
719 swapped symbols. */
720
721 /* COMDAT sections are special. The first symbol is the section
722 symbol, which tells what kind of COMDAT section it is. The
723 second symbol is the "comdat symbol" - the one with the
724 unique name. GNU uses the section symbol for the unique
725 name; MS uses ".text" for every comdat section. Sigh. - DJ */
726
727 /* This is not mirrored in sec_to_styp_flags(), but there
728 doesn't seem to be a need to, either, and it would at best be
729 rather messy. */
730
731 if (! _bfd_coff_get_external_symbols (abfd))
732 return sec_flags;
733
734 esymstart = esym = (bfd_byte *) obj_coff_external_syms (abfd);
735 esymend = esym + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd);
736
737 while (esym < esymend)
41733515 738 {
1276aefa
NC
739 struct internal_syment isym;
740 char buf[SYMNMLEN + 1];
741 const char *symname;
252b5132 742
1276aefa 743 bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym);
252b5132 744
1276aefa
NC
745 if (sizeof (internal_s->s_name) > SYMNMLEN)
746 {
747 /* This case implies that the matching
748 symbol name will be in the string table. */
749 abort ();
750 }
751
752 if (isym.n_scnum == section->target_index)
753 {
754 /* According to the MSVC documentation, the first
755 TWO entries with the section # are both of
756 interest to us. The first one is the "section
757 symbol" (section name). The second is the comdat
758 symbol name. Here, we've found the first
759 qualifying entry; we distinguish it from the
760 second with a state flag.
761
762 In the case of gas-generated (at least until that
763 is fixed) .o files, it isn't necessarily the
764 second one. It may be some other later symbol.
765
766 Since gas also doesn't follow MS conventions and
767 emits the section similar to .text$<name>, where
768 <something> is the name we're looking for, we
769 distinguish the two as follows:
770
771 If the section name is simply a section name (no
772 $) we presume it's MS-generated, and look at
773 precisely the second symbol for the comdat name.
774 If the section name has a $, we assume it's
775 gas-generated, and look for <something> (whatever
776 follows the $) as the comdat symbol. */
777
778 /* All 3 branches use this */
779 symname = _bfd_coff_internal_syment_name (abfd, &isym, buf);
780
781 if (symname == NULL)
782 abort ();
783
784 switch (seen_state)
252b5132 785 {
1276aefa
NC
786 case 0:
787 {
788 /* The first time we've seen the symbol. */
789 union internal_auxent aux;
790
791 seen_state = 1;
792
793 /* If it isn't the stuff we're expecting, die;
794 The MS documentation is vague, but it
795 appears that the second entry serves BOTH
796 as the comdat symbol and the defining
797 symbol record (either C_STAT or C_EXT,
798 possibly with an aux entry with debug
799 information if it's a function.) It
800 appears the only way to find the second one
801 is to count. (On Intel, they appear to be
802 adjacent, but on Alpha, they have been
803 found separated.)
804
805 Here, we think we've found the first one,
806 but there's some checking we can do to be
807 sure. */
808
809 if (! (isym.n_sclass == C_STAT
810 && isym.n_type == T_NULL
811 && isym.n_value == 0))
812 abort ();
252b5132 813
1276aefa
NC
814 /* FIXME LATER: MSVC generates section names
815 like .text for comdats. Gas generates
816 names like .text$foo__Fv (in the case of a
817 function). See comment above for more. */
252b5132 818
1276aefa 819 if (strcmp (name, symname) != 0)
252b5132 820 abort ();
252b5132 821
1276aefa
NC
822 /* This is the section symbol. */
823 bfd_coff_swap_aux_in (abfd, (PTR) (esym + bfd_coff_symesz (abfd)),
824 isym.n_type, isym.n_sclass,
825 0, isym.n_numaux, (PTR) &aux);
826
827 target_name = strchr (name, '$');
828 if (target_name != NULL)
829 {
830 /* Gas mode. */
831 seen_state = 2;
832 /* Skip the `$'. */
833 target_name += 1;
834 }
835
836 /* FIXME: Microsoft uses NODUPLICATES and
837 ASSOCIATIVE, but gnu uses ANY and
838 SAME_SIZE. Unfortunately, gnu doesn't do
839 the comdat symbols right. So, until we can
840 fix it to do the right thing, we are
841 temporarily disabling comdats for the MS
842 types (they're used in DLLs and C++, but we
843 don't support *their* C++ libraries anyway
844 - DJ. */
845
846 /* Cygwin does not follow the MS style, and
847 uses ANY and SAME_SIZE where NODUPLICATES
848 and ASSOCIATIVE should be used. For
849 Interix, we just do the right thing up
850 front. */
851
852 switch (aux.x_scn.x_comdat)
853 {
854 case IMAGE_COMDAT_SELECT_NODUPLICATES:
e60b52c6 855#ifdef STRICT_PE_FORMAT
1276aefa 856 sec_flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
ec0ef80e 857#else
1276aefa 858 sec_flags &= ~SEC_LINK_ONCE;
ec0ef80e 859#endif
1276aefa 860 break;
252b5132 861
1276aefa
NC
862 case IMAGE_COMDAT_SELECT_ANY:
863 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
864 break;
252b5132 865
1276aefa
NC
866 case IMAGE_COMDAT_SELECT_SAME_SIZE:
867 sec_flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
868 break;
252b5132 869
1276aefa
NC
870 case IMAGE_COMDAT_SELECT_EXACT_MATCH:
871 /* Not yet fully implemented ??? */
872 sec_flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
873 break;
252b5132 874
1276aefa
NC
875 /* debug$S gets this case; other
876 implications ??? */
e5db213d 877
1276aefa
NC
878 /* There may be no symbol... we'll search
879 the whole table... Is this the right
880 place to play this game? Or should we do
881 it when reading it in. */
882 case IMAGE_COMDAT_SELECT_ASSOCIATIVE:
0717ebb7 883#ifdef STRICT_PE_FORMAT
1276aefa
NC
884 /* FIXME: This is not currently implemented. */
885 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
ec0ef80e 886#else
1276aefa 887 sec_flags &= ~SEC_LINK_ONCE;
ec0ef80e 888#endif
1276aefa 889 break;
e5db213d 890
1276aefa
NC
891 default: /* 0 means "no symbol" */
892 /* debug$F gets this case; other
893 implications ??? */
894 sec_flags |= SEC_LINK_DUPLICATES_DISCARD;
895 break;
896 }
897 }
898 break;
41733515 899
1276aefa
NC
900 case 2:
901 /* Gas mode: the first matching on partial name. */
252b5132 902
e5db213d
ILT
903#ifndef TARGET_UNDERSCORE
904#define TARGET_UNDERSCORE 0
905#endif
1276aefa
NC
906 /* Is this the name we're looking for? */
907 if (strcmp (target_name,
908 symname + (TARGET_UNDERSCORE ? 1 : 0)) != 0)
909 {
910 /* Not the name we're looking for */
911 esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
912 continue;
252b5132 913 }
1276aefa
NC
914 /* Fall through. */
915 case 1:
916 /* MSVC mode: the lexically second symbol (or
917 drop through from the above). */
918 {
919 char *newname;
920
921 /* This must the the second symbol with the
922 section #. It is the actual symbol name.
923 Intel puts the two adjacent, but Alpha (at
924 least) spreads them out. */
925
926 section->comdat =
927 bfd_alloc (abfd, sizeof (struct bfd_comdat_info));
928 if (section->comdat == NULL)
929 abort ();
930
931 section->comdat->symbol =
932 (esym - esymstart) / bfd_coff_symesz (abfd);
933
934 newname = bfd_alloc (abfd, strlen (symname) + 1);
935 if (newname == NULL)
936 abort ();
937
938 strcpy (newname, symname);
939 section->comdat->name = newname;
940 }
252b5132 941
1276aefa 942 goto breakloop;
252b5132
RH
943 }
944 }
1276aefa
NC
945
946 esym += (isym.n_numaux + 1) * bfd_coff_symesz (abfd);
947 }
948
949 breakloop:
950 return sec_flags;
951}
952
953
954/* The PE version; see above for the general comments.
955
956 Since to set the SEC_LINK_ONCE and associated flags, we have to
957 look at the symbol table anyway, we return the symbol table index
958 of the symbol being used as the COMDAT symbol. This is admittedly
959 ugly, but there's really nowhere else that we have access to the
960 required information. FIXME: Is the COMDAT symbol index used for
961 any purpose other than objdump? */
962
7c8ca0e4
NC
963static boolean
964styp_to_sec_flags (abfd, hdr, name, section, flags_ptr)
1276aefa
NC
965 bfd *abfd;
966 PTR hdr;
967 const char *name;
968 asection *section;
7c8ca0e4 969 flagword *flags_ptr;
1276aefa
NC
970{
971 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
972 long styp_flags = internal_s->s_flags;
973 flagword sec_flags;
7c8ca0e4 974 boolean result = true;
1276aefa
NC
975
976 /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */
977 sec_flags = SEC_READONLY;
978
979 /* Process each flag bit in styp_flags in turn. */
980 while (styp_flags)
981 {
982 long flag = styp_flags & - styp_flags;
983 char * unhandled = NULL;
984
985 styp_flags &= ~ flag;
986
987 /* We infer from the distinct read/write/execute bits the settings
988 of some of the bfd flags; the actual values, should we need them,
989 are also in pei_section_data (abfd, section)->pe_flags. */
990
991 switch (flag)
992 {
993 case STYP_DSECT:
994 unhandled = "STYP_DSECT";
995 break;
996 case STYP_GROUP:
997 unhandled = "STYP_GROUP";
998 break;
999 case STYP_COPY:
1000 unhandled = "STYP_COPY";
1001 break;
1002 case STYP_OVER:
1003 unhandled = "STYP_OVER";
1004 break;
1005#ifdef SEC_NEVER_LOAD
1006 case STYP_NOLOAD:
1007 sec_flags |= SEC_NEVER_LOAD;
1008 break;
1009#endif
1010 case IMAGE_SCN_MEM_READ:
1011 /* Ignored, assume it always to be true. */
1012 break;
1013 case IMAGE_SCN_TYPE_NO_PAD:
1014 /* Skip. */
1015 break;
1016 case IMAGE_SCN_LNK_OTHER:
1017 unhandled = "IMAGE_SCN_LNK_OTHER";
1018 break;
1019 case IMAGE_SCN_MEM_NOT_CACHED:
1020 unhandled = "IMAGE_SCN_MEM_NOT_CACHED";
1021 break;
1022 case IMAGE_SCN_MEM_NOT_PAGED:
1023 unhandled = "IMAGE_SCN_MEM_NOT_PAGED";
1024 break;
1025 case IMAGE_SCN_MEM_EXECUTE:
1026 sec_flags |= SEC_CODE;
1027 break;
1028 case IMAGE_SCN_MEM_WRITE:
1029 sec_flags &= ~ SEC_READONLY;
1030 break;
1031 case IMAGE_SCN_MEM_DISCARDABLE:
1032 sec_flags |= SEC_DEBUGGING;
1033 break;
1034 case IMAGE_SCN_MEM_SHARED:
1035 sec_flags |= SEC_SHARED;
1036 break;
1037 case IMAGE_SCN_LNK_REMOVE:
1038 sec_flags |= SEC_EXCLUDE;
1039 break;
1040 case IMAGE_SCN_CNT_CODE:
1041 sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
1042 break;
1043 case IMAGE_SCN_CNT_INITIALIZED_DATA:
1044 sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
1045 break;
1046 case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
1047 sec_flags |= SEC_ALLOC;
1048 break;
1049 case IMAGE_SCN_LNK_INFO:
1050 /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
1051 defined. coff_compute_section_file_positions uses
1052 COFF_PAGE_SIZE to ensure that the low order bits of the
1053 section VMA and the file offset match. If we don't know
1054 COFF_PAGE_SIZE, we can't ensure the correct correspondence,
1055 and demand page loading of the file will fail. */
1056#ifdef COFF_PAGE_SIZE
1057 sec_flags |= SEC_DEBUGGING;
1058#endif
1059 break;
1060 case IMAGE_SCN_LNK_COMDAT:
1061 /* COMDAT gets very special treatment. */
1062 sec_flags = handle_COMDAT (abfd, sec_flags, hdr, name, section);
1063 break;
1064 default:
1065 /* Silently ignore for now. */
1066 break;
1067 }
1068
7c8ca0e4 1069 /* If the section flag was not handled, report it here. */
1276aefa 1070 if (unhandled != NULL)
7c8ca0e4
NC
1071 {
1072 (*_bfd_error_handler)
1073 (_("%s (%s): Section flag %s (0x%x) ignored"),
1074 bfd_get_filename (abfd), name, unhandled, flag);
1075 result = false;
1076 }
252b5132 1077 }
252b5132 1078
242eabea
ILT
1079#if defined (COFF_LONG_SECTION_NAMES) && defined (COFF_SUPPORT_GNU_LINKONCE)
1080 /* As a GNU extension, if the name begins with .gnu.linkonce, we
1081 only link a single copy of the section. This is used to support
1082 g++. g++ will emit each template expansion in its own section.
1083 The symbols will be defined as weak, so that multiple definitions
1084 are permitted. The GNU linker extension is to actually discard
1085 all but one of the sections. */
1086 if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
1087 sec_flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
1088#endif
1089
7c8ca0e4
NC
1090 if (flags_ptr)
1091 * flags_ptr = sec_flags;
1092
1093 return result;
252b5132
RH
1094}
1095
41733515
ILT
1096#endif /* COFF_WITH_PE */
1097
252b5132
RH
1098#define get_index(symbol) ((symbol)->udata.i)
1099
1100/*
1101INTERNAL_DEFINITION
1102 bfd_coff_backend_data
1103
1104CODE_FRAGMENT
1105
5d54c628
ILT
1106.{* COFF symbol classifications. *}
1107.
1108.enum coff_symbol_classification
1109.{
1110. {* Global symbol. *}
1111. COFF_SYMBOL_GLOBAL,
1112. {* Common symbol. *}
1113. COFF_SYMBOL_COMMON,
1114. {* Undefined symbol. *}
1115. COFF_SYMBOL_UNDEFINED,
1116. {* Local symbol. *}
1117. COFF_SYMBOL_LOCAL,
1118. {* PE section symbol. *}
1119. COFF_SYMBOL_PE_SECTION
1120.};
1121.
252b5132
RH
1122Special entry points for gdb to swap in coff symbol table parts:
1123.typedef struct
1124.{
1125. void (*_bfd_coff_swap_aux_in) PARAMS ((
1126. bfd *abfd,
1127. PTR ext,
1128. int type,
1129. int class,
1130. int indaux,
1131. int numaux,
1132. PTR in));
1133.
1134. void (*_bfd_coff_swap_sym_in) PARAMS ((
1135. bfd *abfd ,
1136. PTR ext,
1137. PTR in));
1138.
1139. void (*_bfd_coff_swap_lineno_in) PARAMS ((
1140. bfd *abfd,
1141. PTR ext,
1142. PTR in));
1143.
1144
1145Special entry points for gas to swap out coff parts:
1146
1147. unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
1148. bfd *abfd,
1149. PTR in,
1150. int type,
1151. int class,
1152. int indaux,
1153. int numaux,
1154. PTR ext));
1155.
1156. unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
1157. bfd *abfd,
1158. PTR in,
1159. PTR ext));
1160.
1161. unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
1162. bfd *abfd,
1163. PTR in,
1164. PTR ext));
1165.
1166. unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
1167. bfd *abfd,
1168. PTR src,
1169. PTR dst));
1170.
1171. unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
1172. bfd *abfd,
1173. PTR in,
1174. PTR out));
1175.
1176. unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
1177. bfd *abfd,
1178. PTR in,
1179. PTR out));
1180.
1181. unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
1182. bfd *abfd,
1183. PTR in,
1184. PTR out));
1185.
1186
1187Special entry points for generic COFF routines to call target
1188dependent COFF routines:
1189
1190. unsigned int _bfd_filhsz;
1191. unsigned int _bfd_aoutsz;
1192. unsigned int _bfd_scnhsz;
1193. unsigned int _bfd_symesz;
1194. unsigned int _bfd_auxesz;
1195. unsigned int _bfd_relsz;
1196. unsigned int _bfd_linesz;
692b7d62 1197. unsigned int _bfd_filnmlen;
252b5132
RH
1198. boolean _bfd_coff_long_filenames;
1199. boolean _bfd_coff_long_section_names;
1200. unsigned int _bfd_coff_default_section_alignment_power;
2243c419
CP
1201. boolean _bfd_coff_force_symnames_in_strings;
1202. unsigned int _bfd_coff_debug_string_prefix_length;
252b5132
RH
1203. void (*_bfd_coff_swap_filehdr_in) PARAMS ((
1204. bfd *abfd,
1205. PTR ext,
1206. PTR in));
1207. void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
1208. bfd *abfd,
1209. PTR ext,
1210. PTR in));
1211. void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
1212. bfd *abfd,
1213. PTR ext,
1214. PTR in));
1215. void (*_bfd_coff_swap_reloc_in) PARAMS ((
1216. bfd *abfd,
1217. PTR ext,
1218. PTR in));
1219. boolean (*_bfd_coff_bad_format_hook) PARAMS ((
1220. bfd *abfd,
1221. PTR internal_filehdr));
1222. boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
1223. bfd *abfd,
1224. PTR internal_filehdr));
1225. PTR (*_bfd_coff_mkobject_hook) PARAMS ((
1226. bfd *abfd,
1227. PTR internal_filehdr,
1228. PTR internal_aouthdr));
7c8ca0e4 1229. boolean (*_bfd_styp_to_sec_flags_hook) PARAMS ((
252b5132
RH
1230. bfd *abfd,
1231. PTR internal_scnhdr,
41733515 1232. const char *name,
7c8ca0e4
NC
1233. asection *section,
1234. flagword *flags_ptr));
252b5132
RH
1235. void (*_bfd_set_alignment_hook) PARAMS ((
1236. bfd *abfd,
1237. asection *sec,
1238. PTR internal_scnhdr));
1239. boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
1240. bfd *abfd));
1241. boolean (*_bfd_coff_symname_in_debug) PARAMS ((
1242. bfd *abfd,
1243. struct internal_syment *sym));
1244. boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
1245. bfd *abfd,
1246. combined_entry_type *table_base,
1247. combined_entry_type *symbol,
1248. unsigned int indaux,
1249. combined_entry_type *aux));
1250. boolean (*_bfd_coff_print_aux) PARAMS ((
1251. bfd *abfd,
1252. FILE *file,
1253. combined_entry_type *table_base,
1254. combined_entry_type *symbol,
1255. combined_entry_type *aux,
1256. unsigned int indaux));
1257. void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
1258. bfd *abfd,
1259. struct bfd_link_info *link_info,
1260. struct bfd_link_order *link_order,
1261. arelent *reloc,
1262. bfd_byte *data,
1263. unsigned int *src_ptr,
1264. unsigned int *dst_ptr));
1265. int (*_bfd_coff_reloc16_estimate) PARAMS ((
1266. bfd *abfd,
1267. asection *input_section,
1268. arelent *r,
1269. unsigned int shrink,
1270. struct bfd_link_info *link_info));
5d54c628 1271. enum coff_symbol_classification (*_bfd_coff_classify_symbol) PARAMS ((
252b5132
RH
1272. bfd *abfd,
1273. struct internal_syment *));
1274. boolean (*_bfd_coff_compute_section_file_positions) PARAMS ((
1275. bfd *abfd));
1276. boolean (*_bfd_coff_start_final_link) PARAMS ((
1277. bfd *output_bfd,
1278. struct bfd_link_info *info));
1279. boolean (*_bfd_coff_relocate_section) PARAMS ((
1280. bfd *output_bfd,
1281. struct bfd_link_info *info,
1282. bfd *input_bfd,
1283. asection *input_section,
1284. bfd_byte *contents,
1285. struct internal_reloc *relocs,
1286. struct internal_syment *syms,
1287. asection **sections));
1288. reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
1289. bfd *abfd,
1290. asection *sec,
1291. struct internal_reloc *rel,
1292. struct coff_link_hash_entry *h,
1293. struct internal_syment *sym,
1294. bfd_vma *addendp));
1295. boolean (*_bfd_coff_adjust_symndx) PARAMS ((
1296. bfd *obfd,
1297. struct bfd_link_info *info,
1298. bfd *ibfd,
1299. asection *sec,
1300. struct internal_reloc *reloc,
1301. boolean *adjustedp));
1302. boolean (*_bfd_coff_link_add_one_symbol) PARAMS ((
1303. struct bfd_link_info *info,
1304. bfd *abfd,
1305. const char *name,
e60b52c6 1306. flagword flags,
252b5132
RH
1307. asection *section,
1308. bfd_vma value,
1309. const char *string,
1310. boolean copy,
e60b52c6 1311. boolean collect,
252b5132
RH
1312. struct bfd_link_hash_entry **hashp));
1313.
1314. boolean (*_bfd_coff_link_output_has_begun) PARAMS ((
1315. bfd * abfd,
1316. struct coff_final_link_info * pfinfo));
1317. boolean (*_bfd_coff_final_link_postscript) PARAMS ((
1318. bfd * abfd,
1319. struct coff_final_link_info * pfinfo));
1320.
1321.} bfd_coff_backend_data;
1322.
1323.#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
1324.
1325.#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
1326. ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
1327.
1328.#define bfd_coff_swap_sym_in(a,e,i) \
1329. ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
1330.
1331.#define bfd_coff_swap_lineno_in(a,e,i) \
1332. ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
1333.
1334.#define bfd_coff_swap_reloc_out(abfd, i, o) \
1335. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
1336.
1337.#define bfd_coff_swap_lineno_out(abfd, i, o) \
1338. ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
1339.
1340.#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
1341. ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
1342.
1343.#define bfd_coff_swap_sym_out(abfd, i,o) \
1344. ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
1345.
1346.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
1347. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
1348.
1349.#define bfd_coff_swap_filehdr_out(abfd, i,o) \
1350. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
1351.
1352.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
1353. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
1354.
1355.#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
1356.#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
1357.#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
1358.#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
1359.#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
1360.#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
1361.#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
692b7d62 1362.#define bfd_coff_filnmlen(abfd) (coff_backend_info (abfd)->_bfd_filnmlen)
252b5132
RH
1363.#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
1364.#define bfd_coff_long_section_names(abfd) \
1365. (coff_backend_info (abfd)->_bfd_coff_long_section_names)
1366.#define bfd_coff_default_section_alignment_power(abfd) \
1367. (coff_backend_info (abfd)->_bfd_coff_default_section_alignment_power)
1368.#define bfd_coff_swap_filehdr_in(abfd, i,o) \
1369. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
1370.
1371.#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
1372. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
1373.
1374.#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
1375. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
1376.
1377.#define bfd_coff_swap_reloc_in(abfd, i, o) \
1378. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
1379.
1380.#define bfd_coff_bad_format_hook(abfd, filehdr) \
1381. ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
1382.
1383.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
1384. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
1385.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
1386. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
1387.
7c8ca0e4 1388.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name, section, flags_ptr)\
41733515 1389. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook)\
7c8ca0e4 1390. (abfd, scnhdr, name, section, flags_ptr))
252b5132
RH
1391.
1392.#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
1393. ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
1394.
1395.#define bfd_coff_slurp_symbol_table(abfd)\
1396. ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
1397.
1398.#define bfd_coff_symname_in_debug(abfd, sym)\
1399. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
1400.
2243c419
CP
1401.#define bfd_coff_force_symnames_in_strings(abfd)\
1402. (coff_backend_info (abfd)->_bfd_coff_force_symnames_in_strings)
1403.
1404.#define bfd_coff_debug_string_prefix_length(abfd)\
1405. (coff_backend_info (abfd)->_bfd_coff_debug_string_prefix_length)
1406.
252b5132
RH
1407.#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\
1408. ((coff_backend_info (abfd)->_bfd_coff_print_aux)\
1409. (abfd, file, base, symbol, aux, indaux))
1410.
1411.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
1412. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
1413. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
1414.
1415.#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
1416. ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
1417. (abfd, section, reloc, shrink, link_info))
1418.
5d54c628
ILT
1419.#define bfd_coff_classify_symbol(abfd, sym)\
1420. ((coff_backend_info (abfd)->_bfd_coff_classify_symbol)\
252b5132
RH
1421. (abfd, sym))
1422.
1423.#define bfd_coff_compute_section_file_positions(abfd)\
1424. ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
1425. (abfd))
1426.
1427.#define bfd_coff_start_final_link(obfd, info)\
1428. ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
1429. (obfd, info))
1430.#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
1431. ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
1432. (obfd, info, ibfd, o, con, rel, isyms, secs))
1433.#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
1434. ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
1435. (abfd, sec, rel, h, sym, addendp))
1436.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
1437. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
1438. (obfd, info, ibfd, sec, rel, adjustedp))
1439.#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\
1440. ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\
1441. (info, abfd, name, flags, section, value, string, cp, coll, hashp))
1442.
1443.#define bfd_coff_link_output_has_begun(a,p) \
1444. ((coff_backend_info (a)->_bfd_coff_link_output_has_begun) (a,p))
1445.#define bfd_coff_final_link_postscript(a,p) \
1446. ((coff_backend_info (a)->_bfd_coff_final_link_postscript) (a,p))
1447.
1448*/
1449
1450/* See whether the magic number matches. */
1451
1452static boolean
1453coff_bad_format_hook (abfd, filehdr)
5f771d47 1454 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
1455 PTR filehdr;
1456{
1457 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1458
1459 if (BADMAG (*internal_f))
1460 return false;
1461
1462 /* if the optional header is NULL or not the correct size then
1463 quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
1464 and Intel 960 readwrite headers (I960WRMAGIC) is that the
1465 optional header is of a different size.
1466
1467 But the mips keeps extra stuff in it's opthdr, so dont check
1468 when doing that
1469 */
1470
1471#if defined(M88) || defined(I960)
6b3b007b 1472 if (internal_f->f_opthdr != 0 && bfd_coff_aoutsz (abfd) != internal_f->f_opthdr)
252b5132
RH
1473 return false;
1474#endif
1475
1476 return true;
1477}
1478
5dccc1dd
ILT
1479/* Check whether this section uses an alignment other than the
1480 default. */
1481
1482static void
1483coff_set_custom_section_alignment (abfd, section, alignment_table, table_size)
1484 bfd *abfd ATTRIBUTE_UNUSED;
1485 asection *section;
1486 const struct coff_section_alignment_entry *alignment_table;
1487 const unsigned int table_size;
1488{
1489 const unsigned int default_alignment = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1490 unsigned int i;
1491
1492 for (i = 0; i < table_size; ++i)
1493 {
1494 const char *secname = bfd_get_section_name (abfd, section);
1495 if (alignment_table[i].comparison_length == (unsigned int) -1
1496 ? strcmp (alignment_table[i].name, secname) == 0
1497 : strncmp (alignment_table[i].name, secname,
1498 alignment_table[i].comparison_length) == 0)
1499 break;
1500 }
1501 if (i >= table_size)
1502 return;
1503
1504 if (alignment_table[i].default_alignment_min != COFF_ALIGNMENT_FIELD_EMPTY
1505 && default_alignment < alignment_table[i].default_alignment_min)
1506 return;
1507
1508 if (alignment_table[i].default_alignment_max != COFF_ALIGNMENT_FIELD_EMPTY
1509 && default_alignment > alignment_table[i].default_alignment_max)
1510 return;
1511
1512 section->alignment_power = alignment_table[i].alignment_power;
1513}
1514
1515/* Custom section alignment records. */
1516
1517static const struct coff_section_alignment_entry
1518coff_section_alignment_table[] =
1519{
1520#ifdef COFF_SECTION_ALIGNMENT_ENTRIES
1521 COFF_SECTION_ALIGNMENT_ENTRIES,
1522#endif
1523 /* There must not be any gaps between .stabstr sections. */
1524 { COFF_SECTION_NAME_PARTIAL_MATCH (".stabstr"),
1525 1, COFF_ALIGNMENT_FIELD_EMPTY, 0 },
1526 /* The .stab section must be aligned to 2**2 at most, to avoid gaps. */
1527 { COFF_SECTION_NAME_PARTIAL_MATCH (".stab"),
1528 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1529 /* Similarly for the .ctors and .dtors sections. */
1530 { COFF_SECTION_NAME_EXACT_MATCH (".ctors"),
1531 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 },
1532 { COFF_SECTION_NAME_EXACT_MATCH (".dtors"),
1533 3, COFF_ALIGNMENT_FIELD_EMPTY, 2 }
1534};
1535
1536static const unsigned int coff_section_alignment_table_size =
1537 sizeof coff_section_alignment_table / sizeof coff_section_alignment_table[0];
1538
1539/* Initialize a section structure with information peculiar to this
1540 particular implementation of COFF. */
252b5132
RH
1541
1542static boolean
1543coff_new_section_hook (abfd, section)
60bcf0fa
NC
1544 bfd * abfd;
1545 asection * section;
252b5132
RH
1546{
1547 combined_entry_type *native;
1548
1549 section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
1550
1551#ifdef RS6000COFF_C
1552 if (xcoff_data (abfd)->text_align_power != 0
1553 && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
1554 section->alignment_power = xcoff_data (abfd)->text_align_power;
1555 if (xcoff_data (abfd)->data_align_power != 0
1556 && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
1557 section->alignment_power = xcoff_data (abfd)->data_align_power;
1558#endif
1559
1560 /* Allocate aux records for section symbols, to store size and
1561 related info.
1562
1563 @@ The 10 is a guess at a plausible maximum number of aux entries
1564 (but shouldn't be a constant). */
1565 native = ((combined_entry_type *)
1566 bfd_zalloc (abfd, sizeof (combined_entry_type) * 10));
1567 if (native == NULL)
1568 return false;
1569
1570 /* We don't need to set up n_name, n_value, or n_scnum in the native
1571 symbol information, since they'll be overriden by the BFD symbol
1572 anyhow. However, we do need to set the type and storage class,
1573 in case this symbol winds up getting written out. The value 0
1574 for n_numaux is already correct. */
1575
1576 native->u.syment.n_type = T_NULL;
1577 native->u.syment.n_sclass = C_STAT;
1578
1579 coffsymbol (section->symbol)->native = native;
1580
5dccc1dd
ILT
1581 coff_set_custom_section_alignment (abfd, section,
1582 coff_section_alignment_table,
1583 coff_section_alignment_table_size);
252b5132
RH
1584
1585 return true;
1586}
1587
1588#ifdef COFF_ALIGN_IN_SECTION_HEADER
1589
1590/* Set the alignment of a BFD section. */
1591
1592static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1593
1594static void
1595coff_set_alignment_hook (abfd, section, scnhdr)
5f771d47 1596 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
1597 asection * section;
1598 PTR scnhdr;
1599{
1600 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1601 unsigned int i;
1602
1603#ifdef I960
1604 /* Extract ALIGN from 2**ALIGN stored in section header */
1605 for (i = 0; i < 32; i++)
1606 if ((1 << i) >= hdr->s_align)
1607 break;
1608#endif
1609#ifdef TIC80COFF
81635ce4 1610 /* TI tools puts the alignment power in bits 8-11 */
252b5132 1611 i = (hdr->s_flags >> 8) & 0xF ;
81635ce4
TW
1612#endif
1613#ifdef COFF_DECODE_ALIGNMENT
1614 i = COFF_DECODE_ALIGNMENT(hdr->s_flags);
252b5132
RH
1615#endif
1616 section->alignment_power = i;
b9af77f5
TW
1617
1618#ifdef coff_set_section_load_page
1619 coff_set_section_load_page (section, hdr->s_page);
1620#endif
252b5132
RH
1621}
1622
1623#else /* ! COFF_ALIGN_IN_SECTION_HEADER */
1624#ifdef COFF_WITH_PE
1625
1626/* a couple of macros to help setting the alignment power field */
1627#define ALIGN_SET(field,x,y) \
1628 if (((field) & IMAGE_SCN_ALIGN_64BYTES) == x )\
1629 {\
1630 section->alignment_power = y;\
1631 }
1632
1633#define ELIFALIGN_SET(field,x,y) \
1634 else if (( (field) & IMAGE_SCN_ALIGN_64BYTES) == x ) \
1635 {\
1636 section->alignment_power = y;\
1637 }
1638
1639static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1640
1641static void
1642coff_set_alignment_hook (abfd, section, scnhdr)
5f771d47 1643 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
1644 asection * section;
1645 PTR scnhdr;
1646{
1647 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1648
1649 ALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6)
1650 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5)
1651 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_16BYTES, 4)
1652 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_8BYTES, 3)
1653 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_4BYTES, 2)
1654 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_2BYTES, 1)
1655 ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_1BYTES, 0)
1656
252b5132 1657 /* In a PE image file, the s_paddr field holds the virtual size of a
8d3ad4e1
ILT
1658 section, while the s_size field holds the raw size. We also keep
1659 the original section flag value, since not every bit can be
1660 mapped onto a generic BFD section bit. */
1661 if (coff_section_data (abfd, section) == NULL)
252b5132 1662 {
8d3ad4e1
ILT
1663 section->used_by_bfd =
1664 (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
1665 if (section->used_by_bfd == NULL)
252b5132 1666 {
8d3ad4e1
ILT
1667 /* FIXME: Return error. */
1668 abort ();
252b5132 1669 }
8d3ad4e1
ILT
1670 }
1671 if (pei_section_data (abfd, section) == NULL)
1672 {
1673 coff_section_data (abfd, section)->tdata =
1674 (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
1675 if (coff_section_data (abfd, section)->tdata == NULL)
252b5132 1676 {
8d3ad4e1
ILT
1677 /* FIXME: Return error. */
1678 abort ();
252b5132 1679 }
252b5132 1680 }
8d3ad4e1
ILT
1681 pei_section_data (abfd, section)->virt_size = hdr->s_paddr;
1682 pei_section_data (abfd, section)->pe_flags = hdr->s_flags;
252b5132 1683
9d8cefa9 1684 section->lma = hdr->s_vaddr;
3e4554a2
DD
1685
1686 /* check for extended relocs */
1687 if (hdr->s_flags & IMAGE_SCN_LNK_NRELOC_OVFL)
1688 {
1689 struct external_reloc dst;
1690 struct internal_reloc n;
1691 int oldpos = bfd_tell (abfd);
1692 bfd_seek (abfd, hdr->s_relptr, 0);
1693 if (bfd_read ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
1694 != bfd_coff_relsz (abfd))
1695 return;
e60b52c6 1696
3e4554a2
DD
1697 coff_swap_reloc_in (abfd, &dst, &n);
1698 bfd_seek (abfd, oldpos, 0);
1699 section->reloc_count =
1700 hdr->s_nreloc = n.r_vaddr;
1701 }
252b5132
RH
1702}
1703#undef ALIGN_SET
1704#undef ELIFALIGN_SET
1705
1706#else /* ! COFF_WITH_PE */
1707#ifdef RS6000COFF_C
1708
1709/* We grossly abuse this function to handle XCOFF overflow headers.
1710 When we see one, we correct the reloc and line number counts in the
1711 real header, and remove the section we just created. */
1712
1713static void coff_set_alignment_hook PARAMS ((bfd *, asection *, PTR));
1714
1715static void
1716coff_set_alignment_hook (abfd, section, scnhdr)
1717 bfd *abfd;
1718 asection *section;
1719 PTR scnhdr;
1720{
1721 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
1722 asection *real_sec;
1723 asection **ps;
1724
1725 if ((hdr->s_flags & STYP_OVRFLO) == 0)
1726 return;
1727
1728 real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc);
1729 if (real_sec == NULL)
1730 return;
1731
1732 real_sec->reloc_count = hdr->s_paddr;
1733 real_sec->lineno_count = hdr->s_vaddr;
1734
1735 for (ps = &abfd->sections; *ps != NULL; ps = &(*ps)->next)
1736 {
1737 if (*ps == section)
1738 {
1739 *ps = (*ps)->next;
1740 --abfd->section_count;
1741 break;
1742 }
1743 }
1744}
1745
1746#else /* ! RS6000COFF_C */
1747
1748#define coff_set_alignment_hook \
1749 ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
1750
1751#endif /* ! RS6000COFF_C */
1752#endif /* ! COFF_WITH_PE */
1753#endif /* ! COFF_ALIGN_IN_SECTION_HEADER */
1754
1755#ifndef coff_mkobject
1756
1757static boolean coff_mkobject PARAMS ((bfd *));
1758
1759static boolean
1760coff_mkobject (abfd)
1761 bfd * abfd;
1762{
1763 coff_data_type *coff;
1764
1765 abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
1766 if (abfd->tdata.coff_obj_data == 0)
1767 return false;
1768 coff = coff_data (abfd);
1769 coff->symbols = (coff_symbol_type *) NULL;
1770 coff->conversion_table = (unsigned int *) NULL;
1771 coff->raw_syments = (struct coff_ptr_struct *) NULL;
1772 coff->relocbase = 0;
1773 coff->local_toc_sym_map = 0;
1774
1775/* make_abs_section(abfd);*/
1776
1777 return true;
1778}
1779#endif
1780
1781/* Create the COFF backend specific information. */
1782#ifndef coff_mkobject_hook
1783static PTR
1784coff_mkobject_hook (abfd, filehdr, aouthdr)
1785 bfd * abfd;
1786 PTR filehdr;
5f771d47 1787 PTR aouthdr ATTRIBUTE_UNUSED;
252b5132
RH
1788{
1789 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1790 coff_data_type *coff;
1791
1792 if (coff_mkobject (abfd) == false)
1793 return NULL;
1794
1795 coff = coff_data (abfd);
1796
1797 coff->sym_filepos = internal_f->f_symptr;
1798
1799 /* These members communicate important constants about the symbol
1800 table to GDB's symbol-reading code. These `constants'
1801 unfortunately vary among coff implementations... */
1802 coff->local_n_btmask = N_BTMASK;
1803 coff->local_n_btshft = N_BTSHFT;
1804 coff->local_n_tmask = N_TMASK;
1805 coff->local_n_tshift = N_TSHIFT;
6b3b007b
NC
1806 coff->local_symesz = bfd_coff_symesz (abfd);
1807 coff->local_auxesz = bfd_coff_auxesz (abfd);
1808 coff->local_linesz = bfd_coff_linesz (abfd);
252b5132 1809
1135238b
ILT
1810 coff->timestamp = internal_f->f_timdat;
1811
252b5132
RH
1812 obj_raw_syment_count (abfd) =
1813 obj_conv_table_size (abfd) =
1814 internal_f->f_nsyms;
1815
1816#ifdef RS6000COFF_C
1817 if ((internal_f->f_flags & F_SHROBJ) != 0)
1818 abfd->flags |= DYNAMIC;
6b3b007b 1819 if (aouthdr != NULL && internal_f->f_opthdr >= bfd_coff_aoutsz (abfd))
252b5132
RH
1820 {
1821 struct internal_aouthdr *internal_a =
1822 (struct internal_aouthdr *) aouthdr;
1823 struct xcoff_tdata *xcoff;
1824
1825 xcoff = xcoff_data (abfd);
a2fdf270
ND
1826# ifdef U803XTOCMAGIC
1827 xcoff->xcoff64 = internal_f->f_magic == U803XTOCMAGIC;
1828# else
1829 xcoff->xcoff64 = 0;
1830# endif
252b5132
RH
1831 xcoff->full_aouthdr = true;
1832 xcoff->toc = internal_a->o_toc;
1833 xcoff->sntoc = internal_a->o_sntoc;
1834 xcoff->snentry = internal_a->o_snentry;
1835 xcoff->text_align_power = internal_a->o_algntext;
1836 xcoff->data_align_power = internal_a->o_algndata;
1837 xcoff->modtype = internal_a->o_modtype;
1838 xcoff->cputype = internal_a->o_cputype;
1839 xcoff->maxdata = internal_a->o_maxdata;
1840 xcoff->maxstack = internal_a->o_maxstack;
1841 }
1842#endif
1843
e60b52c6 1844#ifdef ARM
252b5132
RH
1845 /* Set the flags field from the COFF header read in */
1846 if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
1847 coff->flags = 0;
1848#endif
e60b52c6 1849
4cfec37b
ILT
1850#ifdef COFF_WITH_PE
1851 /* FIXME: I'm not sure this is ever executed, since peicode.h
1852 defines coff_mkobject_hook. */
1853 if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
1854 abfd->flags |= HAS_DEBUG;
1855#endif
1856
252b5132
RH
1857 return (PTR) coff;
1858}
1859#endif
1860
1861/* Determine the machine architecture and type. FIXME: This is target
1862 dependent because the magic numbers are defined in the target
1863 dependent header files. But there is no particular need for this.
1864 If the magic numbers were moved to a separate file, this function
1865 would be target independent and would also be much more successful
1866 at linking together COFF files for different architectures. */
1867
1868static boolean
1869coff_set_arch_mach_hook (abfd, filehdr)
1870 bfd *abfd;
1871 PTR filehdr;
1872{
1873 long machine;
1874 enum bfd_architecture arch;
1875 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1876
1877 machine = 0;
1878 switch (internal_f->f_magic)
1879 {
1880#ifdef PPCMAGIC
1881 case PPCMAGIC:
1882 arch = bfd_arch_powerpc;
1883 machine = 0; /* what does this mean? (krk) */
e60b52c6 1884 break;
252b5132
RH
1885#endif
1886#ifdef I386MAGIC
1887 case I386MAGIC:
1888 case I386PTXMAGIC:
1889 case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
1890 case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1891 arch = bfd_arch_i386;
1892 machine = 0;
1893 break;
1894#endif
fac41780
JW
1895#ifdef IA64MAGIC
1896 case IA64MAGIC:
1897 arch = bfd_arch_ia64;
1898 machine = 0;
1899 break;
1900#endif
252b5132
RH
1901#ifdef A29K_MAGIC_BIG
1902 case A29K_MAGIC_BIG:
1903 case A29K_MAGIC_LITTLE:
1904 arch = bfd_arch_a29k;
1905 machine = 0;
1906 break;
1907#endif
1908#ifdef ARMMAGIC
1909 case ARMMAGIC:
17505c5c
NC
1910 case ARMPEMAGIC:
1911 case THUMBPEMAGIC:
252b5132
RH
1912 arch = bfd_arch_arm;
1913 switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1914 {
948221a8
NC
1915 case F_ARM_2: machine = bfd_mach_arm_2; break;
1916 case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1917 case F_ARM_3: machine = bfd_mach_arm_3; break;
1918 default:
1919 case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1920 case F_ARM_4: machine = bfd_mach_arm_4; break;
1921 case F_ARM_4T: machine = bfd_mach_arm_4T; break;
478d07d6 1922 case F_ARM_5: machine = bfd_mach_arm_5; break;
252b5132
RH
1923 }
1924 break;
1925#endif
1926#ifdef MC68MAGIC
1927 case MC68MAGIC:
1928 case M68MAGIC:
1929#ifdef MC68KBCSMAGIC
1930 case MC68KBCSMAGIC:
1931#endif
1932#ifdef APOLLOM68KMAGIC
1933 case APOLLOM68KMAGIC:
1934#endif
1935#ifdef LYNXCOFFMAGIC
1936 case LYNXCOFFMAGIC:
1937#endif
1938 arch = bfd_arch_m68k;
1939 machine = bfd_mach_m68020;
1940 break;
1941#endif
1942#ifdef MC88MAGIC
1943 case MC88MAGIC:
1944 case MC88DMAGIC:
1945 case MC88OMAGIC:
1946 arch = bfd_arch_m88k;
1947 machine = 88100;
1948 break;
1949#endif
1950#ifdef Z8KMAGIC
1951 case Z8KMAGIC:
1952 arch = bfd_arch_z8k;
1953 switch (internal_f->f_flags & F_MACHMASK)
1954 {
1955 case F_Z8001:
1956 machine = bfd_mach_z8001;
1957 break;
1958 case F_Z8002:
1959 machine = bfd_mach_z8002;
1960 break;
1961 default:
1962 return false;
1963 }
1964 break;
1965#endif
1966#ifdef I860
1967 case I860MAGIC:
1968 arch = bfd_arch_i860;
1969 break;
1970#endif
1971#ifdef I960
1972#ifdef I960ROMAGIC
1973 case I960ROMAGIC:
1974 case I960RWMAGIC:
1975 arch = bfd_arch_i960;
1976 switch (F_I960TYPE & internal_f->f_flags)
1977 {
1978 default:
1979 case F_I960CORE:
1980 machine = bfd_mach_i960_core;
1981 break;
1982 case F_I960KB:
1983 machine = bfd_mach_i960_kb_sb;
1984 break;
1985 case F_I960MC:
1986 machine = bfd_mach_i960_mc;
1987 break;
1988 case F_I960XA:
1989 machine = bfd_mach_i960_xa;
1990 break;
1991 case F_I960CA:
1992 machine = bfd_mach_i960_ca;
1993 break;
1994 case F_I960KA:
1995 machine = bfd_mach_i960_ka_sa;
1996 break;
1997 case F_I960JX:
1998 machine = bfd_mach_i960_jx;
1999 break;
2000 case F_I960HX:
2001 machine = bfd_mach_i960_hx;
2002 break;
2003 }
2004 break;
2005#endif
2006#endif
2007
2008#ifdef RS6000COFF_C
7f6d05e8 2009#ifdef XCOFF64
c6664dfb 2010 case U803XTOCMAGIC:
7f6d05e8 2011#else
252b5132
RH
2012 case U802ROMAGIC:
2013 case U802WRMAGIC:
2014 case U802TOCMAGIC:
7f6d05e8 2015#endif
252b5132
RH
2016 {
2017 int cputype;
2018
2019 if (xcoff_data (abfd)->cputype != -1)
2020 cputype = xcoff_data (abfd)->cputype & 0xff;
2021 else
2022 {
2023 /* We did not get a value from the a.out header. If the
2024 file has not been stripped, we may be able to get the
2025 architecture information from the first symbol, if it
2026 is a .file symbol. */
2027 if (obj_raw_syment_count (abfd) == 0)
2028 cputype = 0;
2029 else
2030 {
5ea1af0d 2031 bfd_byte *buf;
252b5132
RH
2032 struct internal_syment sym;
2033
5ea1af0d 2034 buf = (bfd_byte *) bfd_malloc (bfd_coff_symesz (abfd));
252b5132 2035 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
e60b52c6 2036 || (bfd_read (buf, 1, bfd_coff_symesz (abfd), abfd)
5ea1af0d
GK
2037 != bfd_coff_symesz (abfd)))
2038 {
2fca4467 2039 free (buf);
5ea1af0d
GK
2040 return false;
2041 }
7f6d05e8 2042 bfd_coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
252b5132
RH
2043 if (sym.n_sclass == C_FILE)
2044 cputype = sym.n_type & 0xff;
2045 else
2046 cputype = 0;
2fca4467 2047 free (buf);
252b5132
RH
2048 }
2049 }
2050
2051 /* FIXME: We don't handle all cases here. */
2052 switch (cputype)
2053 {
2054 default:
2055 case 0:
beb1bf64
TR
2056 arch = bfd_xcoff_architecture (abfd);
2057 machine = bfd_xcoff_machine (abfd);
252b5132
RH
2058 break;
2059
2060 case 1:
2061 arch = bfd_arch_powerpc;
87f33987 2062 machine = bfd_mach_ppc_601;
252b5132
RH
2063 break;
2064 case 2: /* 64 bit PowerPC */
2065 arch = bfd_arch_powerpc;
87f33987 2066 machine = bfd_mach_ppc_620;
252b5132
RH
2067 break;
2068 case 3:
2069 arch = bfd_arch_powerpc;
87f33987 2070 machine = bfd_mach_ppc;
252b5132
RH
2071 break;
2072 case 4:
2073 arch = bfd_arch_rs6000;
87f33987 2074 machine = bfd_mach_rs6k;
252b5132
RH
2075 break;
2076 }
2077 }
2078 break;
2079#endif
2080
2081#ifdef WE32KMAGIC
2082 case WE32KMAGIC:
2083 arch = bfd_arch_we32k;
2084 machine = 0;
2085 break;
2086#endif
2087
2088#ifdef H8300MAGIC
2089 case H8300MAGIC:
2090 arch = bfd_arch_h8300;
2091 machine = bfd_mach_h8300;
2092 /* !! FIXME this probably isn't the right place for this */
2093 abfd->flags |= BFD_IS_RELAXABLE;
2094 break;
2095#endif
2096
2097#ifdef H8300HMAGIC
2098 case H8300HMAGIC:
2099 arch = bfd_arch_h8300;
2100 machine = bfd_mach_h8300h;
2101 /* !! FIXME this probably isn't the right place for this */
2102 abfd->flags |= BFD_IS_RELAXABLE;
2103 break;
2104#endif
2105
2106#ifdef H8300SMAGIC
2107 case H8300SMAGIC:
2108 arch = bfd_arch_h8300;
2109 machine = bfd_mach_h8300s;
2110 /* !! FIXME this probably isn't the right place for this */
2111 abfd->flags |= BFD_IS_RELAXABLE;
2112 break;
2113#endif
2114
2115#ifdef SH_ARCH_MAGIC_BIG
2116 case SH_ARCH_MAGIC_BIG:
2117 case SH_ARCH_MAGIC_LITTLE:
17505c5c
NC
2118#ifdef COFF_WITH_PE
2119 case SH_ARCH_MAGIC_WINCE:
2120#endif
252b5132
RH
2121 arch = bfd_arch_sh;
2122 machine = 0;
2123 break;
2124#endif
2125
17505c5c
NC
2126#ifdef MIPS_ARCH_MAGIC_WINCE
2127 case MIPS_ARCH_MAGIC_WINCE:
2128 arch = bfd_arch_mips;
2129 machine = 0;
2130 break;
2131#endif
2132
252b5132
RH
2133#ifdef H8500MAGIC
2134 case H8500MAGIC:
2135 arch = bfd_arch_h8500;
2136 machine = 0;
2137 break;
2138#endif
2139
2140#ifdef SPARCMAGIC
2141 case SPARCMAGIC:
2142#ifdef LYNXCOFFMAGIC
2143 case LYNXCOFFMAGIC:
2144#endif
2145 arch = bfd_arch_sparc;
2146 machine = 0;
2147 break;
2148#endif
2149
2150#ifdef TIC30MAGIC
2151 case TIC30MAGIC:
2152 arch = bfd_arch_tic30;
2153 break;
2154#endif
2155
81635ce4
TW
2156#ifdef TICOFF0MAGIC
2157#ifdef TICOFF_TARGET_ARCH
2158 /* this TI COFF section should be used by all new TI COFF v0 targets */
2159 case TICOFF0MAGIC:
2160 arch = TICOFF_TARGET_ARCH;
2161 break;
2162#endif
2163#endif
2164
2165#ifdef TICOFF1MAGIC
2166 /* this TI COFF section should be used by all new TI COFF v1/2 targets */
2167 /* TI COFF1 and COFF2 use the target_id field to specify which arch */
2168 case TICOFF1MAGIC:
2169 case TICOFF2MAGIC:
2170 switch (internal_f->f_target_id)
2171 {
2172#ifdef TI_TARGET_ID
2173 case TI_TARGET_ID:
2174 arch = TICOFF_TARGET_ARCH;
2175 break;
2176#endif
2177 default:
4af1d5f6 2178 arch = bfd_arch_obscure;
81635ce4 2179 (*_bfd_error_handler)
e60b52c6 2180 (_("Unrecognized TI COFF target id '0x%x'"),
81635ce4
TW
2181 internal_f->f_target_id);
2182 break;
2183 }
2184 break;
2185#endif
2186
252b5132
RH
2187#ifdef TIC80_ARCH_MAGIC
2188 case TIC80_ARCH_MAGIC:
2189 arch = bfd_arch_tic80;
2190 break;
2191#endif
2192
2193#ifdef MCOREMAGIC
2194 case MCOREMAGIC:
2195 arch = bfd_arch_mcore;
2196 break;
2197#endif
2198 default: /* Unreadable input file type */
2199 arch = bfd_arch_obscure;
2200 break;
2201 }
2202
2203 bfd_default_set_arch_mach (abfd, arch, machine);
2204 return true;
2205}
2206
2207#ifdef SYMNAME_IN_DEBUG
2208
2209static boolean symname_in_debug_hook
2210 PARAMS ((bfd *, struct internal_syment *));
2211
2212static boolean
2213symname_in_debug_hook (abfd, sym)
5f771d47 2214 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
2215 struct internal_syment *sym;
2216{
2217 return SYMNAME_IN_DEBUG (sym) ? true : false;
2218}
2219
2220#else
2221
2222#define symname_in_debug_hook \
2223 (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
2224
2225#endif
2226
2227#ifdef RS6000COFF_C
2228
7f6d05e8
CP
2229#ifdef XCOFF64
2230#define FORCE_SYMNAMES_IN_STRINGS
2231#endif
a022216b 2232
252b5132
RH
2233/* Handle the csect auxent of a C_EXT or C_HIDEXT symbol. */
2234
2235static boolean coff_pointerize_aux_hook
2236 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2237 unsigned int, combined_entry_type *));
2238
2239/*ARGSUSED*/
2240static boolean
2241coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
5f771d47 2242 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
2243 combined_entry_type *table_base;
2244 combined_entry_type *symbol;
2245 unsigned int indaux;
2246 combined_entry_type *aux;
2247{
2248 int class = symbol->u.syment.n_sclass;
2249
2250 if ((class == C_EXT || class == C_HIDEXT)
2251 && indaux + 1 == symbol->u.syment.n_numaux)
2252 {
2253 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2254 {
2255 aux->u.auxent.x_csect.x_scnlen.p =
2256 table_base + aux->u.auxent.x_csect.x_scnlen.l;
2257 aux->fix_scnlen = 1;
2258 }
2259
2260 /* Return true to indicate that the caller should not do any
2261 further work on this auxent. */
2262 return true;
2263 }
2264
2265 /* Return false to indicate that this auxent should be handled by
2266 the caller. */
2267 return false;
2268}
2269
2270#else
2271#ifdef I960
2272
2273/* We don't want to pointerize bal entries. */
2274
2275static boolean coff_pointerize_aux_hook
2276 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2277 unsigned int, combined_entry_type *));
2278
2279/*ARGSUSED*/
2280static boolean
2281coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
5f771d47
ILT
2282 bfd *abfd ATTRIBUTE_UNUSED;
2283 combined_entry_type *table_base ATTRIBUTE_UNUSED;
252b5132
RH
2284 combined_entry_type *symbol;
2285 unsigned int indaux;
5f771d47 2286 combined_entry_type *aux ATTRIBUTE_UNUSED;
252b5132
RH
2287{
2288 /* Return true if we don't want to pointerize this aux entry, which
2289 is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */
2290 return (indaux == 1
2291 && (symbol->u.syment.n_sclass == C_LEAFPROC
2292 || symbol->u.syment.n_sclass == C_LEAFSTAT
2293 || symbol->u.syment.n_sclass == C_LEAFEXT));
2294}
2295
2296#else /* ! I960 */
2297
2298#define coff_pointerize_aux_hook 0
2299
2300#endif /* ! I960 */
2301#endif /* ! RS6000COFF_C */
2302
2303/* Print an aux entry. This returns true if it has printed it. */
2304
2305static boolean coff_print_aux
2306 PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
2307 combined_entry_type *, unsigned int));
2308
2309static boolean
2310coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
5f771d47
ILT
2311 bfd *abfd ATTRIBUTE_UNUSED;
2312 FILE *file ATTRIBUTE_UNUSED;
2313 combined_entry_type *table_base ATTRIBUTE_UNUSED;
2314 combined_entry_type *symbol ATTRIBUTE_UNUSED;
2315 combined_entry_type *aux ATTRIBUTE_UNUSED;
2316 unsigned int indaux ATTRIBUTE_UNUSED;
252b5132
RH
2317{
2318#ifdef RS6000COFF_C
2319 if ((symbol->u.syment.n_sclass == C_EXT
2320 || symbol->u.syment.n_sclass == C_HIDEXT)
2321 && indaux + 1 == symbol->u.syment.n_numaux)
2322 {
2323 /* This is a csect entry. */
2324 fprintf (file, "AUX ");
2325 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2326 {
2327 BFD_ASSERT (! aux->fix_scnlen);
beb1bf64
TR
2328#ifdef XCOFF64
2329 fprintf (file, "val %5lld", aux->u.auxent.x_csect.x_scnlen.l);
2330#else
2331 fprintf (file, "val %5ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2332#endif
252b5132
RH
2333 }
2334 else
2335 {
2336 fprintf (file, "indx ");
2337 if (! aux->fix_scnlen)
beb1bf64
TR
2338#ifdef XCOFF64
2339 fprintf (file, "%4lld", aux->u.auxent.x_csect.x_scnlen.l);
2340#else
2341 fprintf (file, "%4ld", (long) aux->u.auxent.x_csect.x_scnlen.l);
2342#endif
252b5132
RH
2343 else
2344 fprintf (file, "%4ld",
2345 (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2346 }
2347 fprintf (file,
2348 " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2349 aux->u.auxent.x_csect.x_parmhash,
2350 (unsigned int) aux->u.auxent.x_csect.x_snhash,
2351 SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2352 SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2353 (unsigned int) aux->u.auxent.x_csect.x_smclas,
2354 aux->u.auxent.x_csect.x_stab,
2355 (unsigned int) aux->u.auxent.x_csect.x_snstab);
2356 return true;
2357 }
2358#endif
2359
2360 /* Return false to indicate that no special action was taken. */
2361 return false;
2362}
2363
2364/*
2365SUBSUBSECTION
2366 Writing relocations
2367
2368 To write relocations, the back end steps though the
2369 canonical relocation table and create an
2370 @code{internal_reloc}. The symbol index to use is removed from
2371 the @code{offset} field in the symbol table supplied. The
2372 address comes directly from the sum of the section base
2373 address and the relocation offset; the type is dug directly
2374 from the howto field. Then the @code{internal_reloc} is
2375 swapped into the shape of an @code{external_reloc} and written
2376 out to disk.
2377
2378*/
2379
2380#ifdef TARG_AUX
2381
2382static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2383
2384/* AUX's ld wants relocations to be sorted */
2385static int
2386compare_arelent_ptr (x, y)
2387 const PTR x;
2388 const PTR y;
2389{
2390 const arelent **a = (const arelent **) x;
2391 const arelent **b = (const arelent **) y;
2392 bfd_size_type aadr = (*a)->address;
2393 bfd_size_type badr = (*b)->address;
2394
2395 return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2396}
2397
2398#endif /* TARG_AUX */
2399
2400static boolean
2401coff_write_relocs (abfd, first_undef)
2402 bfd * abfd;
2403 int first_undef;
2404{
2405 asection *s;
2406
2407 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2408 {
2409 unsigned int i;
2410 struct external_reloc dst;
2411 arelent **p;
2412
2413#ifndef TARG_AUX
2414 p = s->orelocation;
2415#else
2416 /* sort relocations before we write them out */
2417 p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
2418 if (p == NULL && s->reloc_count > 0)
2419 return false;
2420 memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2421 qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2422#endif
2423
2424 if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2425 return false;
3e4554a2
DD
2426
2427#ifdef COFF_WITH_PE
2428 if (s->reloc_count > 0xffff)
2429 {
2430 /* encode real count here as first reloc */
2431 struct internal_reloc n;
2432 memset ((PTR) & n, 0, sizeof (n));
2433 /* add one to count *this* reloc (grr) */
2434 n.r_vaddr = s->reloc_count + 1;
2435 coff_swap_reloc_out (abfd, &n, &dst);
2436 if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
2437 != bfd_coff_relsz (abfd))
2438 return false;
2439 }
2440#endif
2441
252b5132
RH
2442 for (i = 0; i < s->reloc_count; i++)
2443 {
2444 struct internal_reloc n;
2445 arelent *q = p[i];
2446 memset ((PTR) & n, 0, sizeof (n));
2447
2448 /* Now we've renumbered the symbols we know where the
2449 undefined symbols live in the table. Check the reloc
2450 entries for symbols who's output bfd isn't the right one.
2451 This is because the symbol was undefined (which means
2452 that all the pointers are never made to point to the same
2453 place). This is a bad thing,'cause the symbols attached
2454 to the output bfd are indexed, so that the relocation
2455 entries know which symbol index they point to. So we
e60b52c6 2456 have to look up the output symbol here. */
252b5132
RH
2457
2458 if (q->sym_ptr_ptr[0]->the_bfd != abfd)
2459 {
2460 int i;
2461 const char *sname = q->sym_ptr_ptr[0]->name;
2462 asymbol **outsyms = abfd->outsymbols;
2463 for (i = first_undef; outsyms[i]; i++)
2464 {
2465 const char *intable = outsyms[i]->name;
2466 if (strcmp (intable, sname) == 0) {
2467 /* got a hit, so repoint the reloc */
2468 q->sym_ptr_ptr = outsyms + i;
2469 break;
2470 }
2471 }
2472 }
2473
2474 n.r_vaddr = q->address + s->vma;
2475
2476#ifdef R_IHCONST
2477 /* The 29k const/consth reloc pair is a real kludge. The consth
2478 part doesn't have a symbol; it has an offset. So rebuilt
2479 that here. */
2480 if (q->howto->type == R_IHCONST)
2481 n.r_symndx = q->addend;
2482 else
2483#endif
2484 if (q->sym_ptr_ptr)
2485 {
6c784c9a
TW
2486#ifdef SECTION_RELATIVE_ABSOLUTE_SYMBOL_P
2487 if (SECTION_RELATIVE_ABSOLUTE_SYMBOL_P (q,s))
2488#else
252b5132 2489 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
6c784c9a 2490#endif
252b5132
RH
2491 /* This is a relocation relative to the absolute symbol. */
2492 n.r_symndx = -1;
2493 else
2494 {
2495 n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2496 /* Take notice if the symbol reloc points to a symbol
2497 we don't have in our symbol table. What should we
2498 do for this?? */
2499 if (n.r_symndx > obj_conv_table_size (abfd))
2500 abort ();
2501 }
2502 }
2503
2504#ifdef SWAP_OUT_RELOC_OFFSET
2505 n.r_offset = q->addend;
2506#endif
2507
2508#ifdef SELECT_RELOC
2509 /* Work out reloc type from what is required */
2510 SELECT_RELOC (n, q->howto);
2511#else
2512 n.r_type = q->howto->type;
2513#endif
2514 coff_swap_reloc_out (abfd, &n, &dst);
6b3b007b
NC
2515 if (bfd_write ((PTR) & dst, 1, bfd_coff_relsz (abfd), abfd)
2516 != bfd_coff_relsz (abfd))
252b5132
RH
2517 return false;
2518 }
2519
2520#ifdef TARG_AUX
2521 if (p != NULL)
2522 free (p);
2523#endif
2524 }
2525
2526 return true;
2527}
2528
2529/* Set flags and magic number of a coff file from architecture and machine
2530 type. Result is true if we can represent the arch&type, false if not. */
2531
2532static boolean
2533coff_set_flags (abfd, magicp, flagsp)
2534 bfd * abfd;
5f771d47
ILT
2535 unsigned int *magicp ATTRIBUTE_UNUSED;
2536 unsigned short *flagsp ATTRIBUTE_UNUSED;
252b5132
RH
2537{
2538 switch (bfd_get_arch (abfd))
2539 {
2540#ifdef Z8KMAGIC
2541 case bfd_arch_z8k:
2542 *magicp = Z8KMAGIC;
2543 switch (bfd_get_mach (abfd))
2544 {
2545 case bfd_mach_z8001:
2546 *flagsp = F_Z8001;
2547 break;
2548 case bfd_mach_z8002:
2549 *flagsp = F_Z8002;
2550 break;
2551 default:
2552 return false;
2553 }
2554 return true;
2555#endif
2556#ifdef I960ROMAGIC
2557
2558 case bfd_arch_i960:
2559
2560 {
2561 unsigned flags;
2562 *magicp = I960ROMAGIC;
2563 /*
2564 ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
2565 I960RWMAGIC); FIXME???
2566 */
2567 switch (bfd_get_mach (abfd))
2568 {
2569 case bfd_mach_i960_core:
2570 flags = F_I960CORE;
2571 break;
2572 case bfd_mach_i960_kb_sb:
2573 flags = F_I960KB;
2574 break;
2575 case bfd_mach_i960_mc:
2576 flags = F_I960MC;
2577 break;
2578 case bfd_mach_i960_xa:
2579 flags = F_I960XA;
2580 break;
2581 case bfd_mach_i960_ca:
2582 flags = F_I960CA;
2583 break;
2584 case bfd_mach_i960_ka_sa:
2585 flags = F_I960KA;
2586 break;
2587 case bfd_mach_i960_jx:
2588 flags = F_I960JX;
2589 break;
2590 case bfd_mach_i960_hx:
2591 flags = F_I960HX;
2592 break;
2593 default:
2594 return false;
2595 }
2596 *flagsp = flags;
2597 return true;
2598 }
2599 break;
2600#endif
2601
2602#ifdef TIC30MAGIC
2603 case bfd_arch_tic30:
2604 *magicp = TIC30MAGIC;
2605 return true;
2606#endif
81635ce4
TW
2607
2608#ifdef TICOFF_DEFAULT_MAGIC
2609 case TICOFF_TARGET_ARCH:
2610 /* if there's no indication of which version we want, use the default */
2611 if (!abfd->xvec )
2612 *magicp = TICOFF_DEFAULT_MAGIC;
2613 else
2614 {
2615 /* we may want to output in a different COFF version */
2616 switch (abfd->xvec->name[4])
2617 {
2618 case '0':
2619 *magicp = TICOFF0MAGIC;
2620 break;
2621 case '1':
2622 *magicp = TICOFF1MAGIC;
2623 break;
2624 case '2':
2625 *magicp = TICOFF2MAGIC;
2626 break;
2627 default:
2628 return false;
2629 }
2630 }
2631 return true;
2632#endif
2633
252b5132
RH
2634#ifdef TIC80_ARCH_MAGIC
2635 case bfd_arch_tic80:
2636 *magicp = TIC80_ARCH_MAGIC;
2637 return true;
2638#endif
2639#ifdef ARMMAGIC
2640 case bfd_arch_arm:
17505c5c
NC
2641#ifdef ARM_WINCE
2642 * magicp = ARMPEMAGIC;
2643#else
252b5132 2644 * magicp = ARMMAGIC;
17505c5c 2645#endif
252b5132
RH
2646 * flagsp = 0;
2647 if (APCS_SET (abfd))
2648 {
2649 if (APCS_26_FLAG (abfd))
2650 * flagsp |= F_APCS26;
e60b52c6 2651
252b5132
RH
2652 if (APCS_FLOAT_FLAG (abfd))
2653 * flagsp |= F_APCS_FLOAT;
e60b52c6 2654
252b5132 2655 if (PIC_FLAG (abfd))
948221a8 2656 * flagsp |= F_PIC;
252b5132
RH
2657 }
2658 if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2659 * flagsp |= F_INTERWORK;
2660 switch (bfd_get_mach (abfd))
2661 {
2662 case bfd_mach_arm_2: * flagsp |= F_ARM_2; break;
2663 case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2664 case bfd_mach_arm_3: * flagsp |= F_ARM_3; break;
2665 case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2666 case bfd_mach_arm_4: * flagsp |= F_ARM_4; break;
2667 case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
478d07d6 2668 case bfd_mach_arm_5: * flagsp |= F_ARM_5; break;
077b8428
NC
2669 /* FIXME: we do not have F_ARM vaues greater than F_ARM_5. */
2670 case bfd_mach_arm_5T: * flagsp |= F_ARM_5; break;
2671 case bfd_mach_arm_5TE: * flagsp |= F_ARM_5; break;
2672 case bfd_mach_arm_XScale: * flagsp |= F_ARM_5; break;
252b5132
RH
2673 }
2674 return true;
2675#endif
2676#ifdef PPCMAGIC
2677 case bfd_arch_powerpc:
2678 *magicp = PPCMAGIC;
2679 return true;
2680 break;
2681#endif
2682#ifdef I386MAGIC
2683 case bfd_arch_i386:
2684 *magicp = I386MAGIC;
2685#ifdef LYNXOS
e60b52c6 2686 /* Just overwrite the usual value if we're doing Lynx. */
252b5132
RH
2687 *magicp = LYNXCOFFMAGIC;
2688#endif
2689 return true;
2690 break;
2691#endif
2692#ifdef I860MAGIC
2693 case bfd_arch_i860:
2694 *magicp = I860MAGIC;
2695 return true;
2696 break;
2697#endif
fac41780
JW
2698#ifdef IA64MAGIC
2699 case bfd_arch_ia64:
2700 *magicp = IA64MAGIC;
2701 return true;
2702 break;
2703#endif
252b5132
RH
2704#ifdef MC68MAGIC
2705 case bfd_arch_m68k:
2706#ifdef APOLLOM68KMAGIC
2707 *magicp = APOLLO_COFF_VERSION_NUMBER;
2708#else
2709 /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c. */
2710#ifdef NAMES_HAVE_UNDERSCORE
2711 *magicp = MC68KBCSMAGIC;
2712#else
2713 *magicp = MC68MAGIC;
2714#endif
2715#endif
2716#ifdef LYNXOS
e60b52c6 2717 /* Just overwrite the usual value if we're doing Lynx. */
252b5132
RH
2718 *magicp = LYNXCOFFMAGIC;
2719#endif
2720 return true;
2721 break;
2722#endif
2723
2724#ifdef MC88MAGIC
2725 case bfd_arch_m88k:
2726 *magicp = MC88OMAGIC;
2727 return true;
2728 break;
2729#endif
2730#ifdef H8300MAGIC
2731 case bfd_arch_h8300:
2732 switch (bfd_get_mach (abfd))
2733 {
2734 case bfd_mach_h8300:
2735 *magicp = H8300MAGIC;
2736 return true;
2737 case bfd_mach_h8300h:
2738 *magicp = H8300HMAGIC;
2739 return true;
2740 case bfd_mach_h8300s:
2741 *magicp = H8300SMAGIC;
2742 return true;
2743 }
2744 break;
2745#endif
2746
2747#ifdef SH_ARCH_MAGIC_BIG
2748 case bfd_arch_sh:
17505c5c
NC
2749#ifdef COFF_IMAGE_WITH_PE
2750 *magicp = SH_ARCH_MAGIC_WINCE;
2751#else
252b5132
RH
2752 if (bfd_big_endian (abfd))
2753 *magicp = SH_ARCH_MAGIC_BIG;
2754 else
2755 *magicp = SH_ARCH_MAGIC_LITTLE;
17505c5c
NC
2756#endif
2757 return true;
2758 break;
2759#endif
2760
2761#ifdef MIPS_ARCH_MAGIC_WINCE
2762 case bfd_arch_mips:
2763 *magicp = MIPS_ARCH_MAGIC_WINCE;
252b5132
RH
2764 return true;
2765 break;
2766#endif
2767
2768#ifdef SPARCMAGIC
2769 case bfd_arch_sparc:
2770 *magicp = SPARCMAGIC;
2771#ifdef LYNXOS
e60b52c6 2772 /* Just overwrite the usual value if we're doing Lynx. */
252b5132
RH
2773 *magicp = LYNXCOFFMAGIC;
2774#endif
2775 return true;
2776 break;
2777#endif
2778
2779#ifdef H8500MAGIC
2780 case bfd_arch_h8500:
2781 *magicp = H8500MAGIC;
2782 return true;
2783 break;
2784#endif
2785#ifdef A29K_MAGIC_BIG
2786 case bfd_arch_a29k:
2787 if (bfd_big_endian (abfd))
2788 *magicp = A29K_MAGIC_BIG;
2789 else
2790 *magicp = A29K_MAGIC_LITTLE;
2791 return true;
2792 break;
2793#endif
2794
2795#ifdef WE32KMAGIC
2796 case bfd_arch_we32k:
2797 *magicp = WE32KMAGIC;
2798 return true;
2799 break;
2800#endif
2801
7f6d05e8 2802#ifdef RS6000COFF_C
252b5132
RH
2803 case bfd_arch_rs6000:
2804#ifndef PPCMAGIC
2805 case bfd_arch_powerpc:
2806#endif
7f6d05e8 2807#ifdef XCOFF64
87f33987
ND
2808 if (bfd_get_mach (abfd) == bfd_mach_ppc_620
2809 && !strncmp (abfd->xvec->name,"aix", 3))
e60b52c6 2810 *magicp = U803XTOCMAGIC;
7f6d05e8
CP
2811 else
2812#else
e60b52c6 2813 *magicp = U802TOCMAGIC;
7f6d05e8 2814#endif
252b5132
RH
2815 return true;
2816 break;
2817#endif
2818
2819#ifdef MCOREMAGIC
2820 case bfd_arch_mcore:
2821 * magicp = MCOREMAGIC;
2822 return true;
2823#endif
e60b52c6 2824
371e71b8
NC
2825#ifdef W65MAGIC
2826 case bfd_arch_w65:
2827 *magicp = W65MAGIC;
2828 return true;
2829#endif
2830
2831 default: /* Unknown architecture. */
2832 /* Fall through to "return false" below, to avoid
2833 "statement never reached" errors on the one below. */
252b5132
RH
2834 break;
2835 }
2836
2837 return false;
2838}
2839
252b5132
RH
2840static boolean
2841coff_set_arch_mach (abfd, arch, machine)
2842 bfd * abfd;
2843 enum bfd_architecture arch;
2844 unsigned long machine;
2845{
2846 unsigned dummy1;
2847 unsigned short dummy2;
2848
2849 if (! bfd_default_set_arch_mach (abfd, arch, machine))
2850 return false;
2851
2852 if (arch != bfd_arch_unknown &&
2853 coff_set_flags (abfd, &dummy1, &dummy2) != true)
2854 return false; /* We can't represent this type */
2855
e60b52c6 2856 return true; /* We're easy ... */
252b5132
RH
2857}
2858
75cc7189
ILT
2859#ifdef COFF_IMAGE_WITH_PE
2860
2861/* This is used to sort sections by VMA, as required by PE image
2862 files. */
2863
2864static int sort_by_secaddr PARAMS ((const PTR, const PTR));
2865
2866static int
2867sort_by_secaddr (arg1, arg2)
2868 const PTR arg1;
2869 const PTR arg2;
2870{
2871 const asection *a = *(const asection **) arg1;
2872 const asection *b = *(const asection **) arg2;
2873
2874 if (a->vma < b->vma)
2875 return -1;
2876 else if (a->vma > b->vma)
2877 return 1;
2878 else
2879 return 0;
2880}
2881
2882#endif /* COFF_IMAGE_WITH_PE */
252b5132 2883
e60b52c6 2884/* Calculate the file position for each section. */
252b5132
RH
2885
2886#ifndef I960
2887#define ALIGN_SECTIONS_IN_FILE
2888#endif
81635ce4 2889#if defined(TIC80COFF) || defined(TICOFF)
252b5132
RH
2890#undef ALIGN_SECTIONS_IN_FILE
2891#endif
2892
2893static boolean
2894coff_compute_section_file_positions (abfd)
2895 bfd * abfd;
2896{
2897 asection *current;
2898 asection *previous = (asection *) NULL;
6b3b007b 2899 file_ptr sofar = bfd_coff_filhsz (abfd);
252b5132 2900 boolean align_adjust;
252b5132
RH
2901#ifdef ALIGN_SECTIONS_IN_FILE
2902 file_ptr old_sofar;
2903#endif
2904
2905#ifdef RS6000COFF_C
2906 /* On XCOFF, if we have symbols, set up the .debug section. */
2907 if (bfd_get_symcount (abfd) > 0)
2908 {
2909 bfd_size_type sz;
2910 bfd_size_type i, symcount;
2911 asymbol **symp;
2912
2913 sz = 0;
2914 symcount = bfd_get_symcount (abfd);
2915 for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2916 {
2917 coff_symbol_type *cf;
2918
2919 cf = coff_symbol_from (abfd, *symp);
2920 if (cf != NULL
2921 && cf->native != NULL
2922 && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2923 {
2924 size_t len;
2925
2926 len = strlen (bfd_asymbol_name (*symp));
7f6d05e8
CP
2927 if (len > SYMNMLEN || bfd_coff_force_symnames_in_strings (abfd))
2928 sz += len + 1 + bfd_coff_debug_string_prefix_length (abfd);
252b5132
RH
2929 }
2930 }
2931 if (sz > 0)
2932 {
2933 asection *dsec;
2934
2935 dsec = bfd_make_section_old_way (abfd, ".debug");
2936 if (dsec == NULL)
2937 abort ();
2938 dsec->_raw_size = sz;
2939 dsec->flags |= SEC_HAS_CONTENTS;
2940 }
2941 }
2942#endif
2943
2944#ifdef COFF_IMAGE_WITH_PE
2945 int page_size;
e60b52c6 2946 if (coff_data (abfd)->link_info)
252b5132
RH
2947 {
2948 page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2949 }
2950 else
2951 page_size = PE_DEF_FILE_ALIGNMENT;
2952#else
2953#ifdef COFF_PAGE_SIZE
2954 int page_size = COFF_PAGE_SIZE;
2955#endif
2956#endif
2957
2958 if (bfd_get_start_address (abfd))
2959 {
2960 /* A start address may have been added to the original file. In this
2961 case it will need an optional header to record it. */
2962 abfd->flags |= EXEC_P;
2963 }
2964
2965 if (abfd->flags & EXEC_P)
6b3b007b 2966 sofar += bfd_coff_aoutsz (abfd);
252b5132
RH
2967#ifdef RS6000COFF_C
2968 else if (xcoff_data (abfd)->full_aouthdr)
6b3b007b 2969 sofar += bfd_coff_aoutsz (abfd);
252b5132
RH
2970 else
2971 sofar += SMALL_AOUTSZ;
2972#endif
2973
6b3b007b 2974 sofar += abfd->section_count * bfd_coff_scnhsz (abfd);
252b5132
RH
2975
2976#ifdef RS6000COFF_C
2977 /* XCOFF handles overflows in the reloc and line number count fields
2978 by allocating a new section header to hold the correct counts. */
2979 for (current = abfd->sections; current != NULL; current = current->next)
2980 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
6b3b007b 2981 sofar += bfd_coff_scnhsz (abfd);
252b5132
RH
2982#endif
2983
75cc7189
ILT
2984#ifdef COFF_IMAGE_WITH_PE
2985 {
2986 /* PE requires the sections to be in memory order when listed in
2987 the section headers. It also does not like empty loadable
2988 sections. The sections apparently do not have to be in the
2989 right order in the image file itself, but we do need to get the
2990 target_index values right. */
2991
2992 int count;
2993 asection **section_list;
2994 int i;
2995 int target_index;
2996
2997 count = 0;
2998 for (current = abfd->sections; current != NULL; current = current->next)
2999 ++count;
3000
3001 /* We allocate an extra cell to simplify the final loop. */
3002 section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
3003 if (section_list == NULL)
3004 return false;
3005
3006 i = 0;
3007 for (current = abfd->sections; current != NULL; current = current->next)
3008 {
3009 section_list[i] = current;
3010 ++i;
3011 }
3012 section_list[i] = NULL;
3013
3014 qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
3015
3016 /* Rethread the linked list into sorted order; at the same time,
3017 assign target_index values. */
3018 target_index = 1;
3019 abfd->sections = section_list[0];
3020 for (i = 0; i < count; i++)
3021 {
3022 current = section_list[i];
3023 current->next = section_list[i + 1];
3024
3025 /* Later, if the section has zero size, we'll be throwing it
3026 away, so we don't want to number it now. Note that having
3027 a zero size and having real contents are different
3028 concepts: .bss has no contents, but (usually) non-zero
3029 size. */
3030 if (current->_raw_size == 0)
3031 {
3032 /* Discard. However, it still might have (valid) symbols
3033 in it, so arbitrarily set it to section 1 (indexing is
3034 1-based here; usually .text). __end__ and other
3035 contents of .endsection really have this happen.
3036 FIXME: This seems somewhat dubious. */
3037 current->target_index = 1;
3038 }
3039 else
3040 current->target_index = target_index++;
3041 }
3042
2fca4467 3043 free (section_list);
75cc7189
ILT
3044 }
3045#else /* ! COFF_IMAGE_WITH_PE */
3046 {
3047 /* Set the target_index field. */
3048 int target_index;
3049
3050 target_index = 1;
3051 for (current = abfd->sections; current != NULL; current = current->next)
3052 current->target_index = target_index++;
3053 }
3054#endif /* ! COFF_IMAGE_WITH_PE */
3055
252b5132 3056 align_adjust = false;
75cc7189 3057 for (current = abfd->sections;
252b5132 3058 current != (asection *) NULL;
75cc7189 3059 current = current->next)
252b5132
RH
3060 {
3061#ifdef COFF_IMAGE_WITH_PE
75cc7189
ILT
3062 /* With PE we have to pad each section to be a multiple of its
3063 page size too, and remember both sizes. */
3064 if (coff_section_data (abfd, current) == NULL)
252b5132 3065 {
75cc7189
ILT
3066 current->used_by_bfd =
3067 (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
3068 if (current->used_by_bfd == NULL)
3069 return false;
252b5132 3070 }
75cc7189
ILT
3071 if (pei_section_data (abfd, current) == NULL)
3072 {
3073 coff_section_data (abfd, current)->tdata =
3074 (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
3075 if (coff_section_data (abfd, current)->tdata == NULL)
3076 return false;
3077 }
3078 if (pei_section_data (abfd, current)->virt_size == 0)
3079 pei_section_data (abfd, current)->virt_size = current->_raw_size;
252b5132
RH
3080#endif
3081
75cc7189 3082 /* Only deal with sections which have contents. */
252b5132
RH
3083 if (!(current->flags & SEC_HAS_CONTENTS))
3084 continue;
3085
75cc7189
ILT
3086#ifdef COFF_IMAGE_WITH_PE
3087 /* Make sure we skip empty sections in a PE image. */
3088 if (current->_raw_size == 0)
3089 continue;
3090#endif
3091
252b5132
RH
3092 /* Align the sections in the file to the same boundary on
3093 which they are aligned in virtual memory. I960 doesn't
3094 do this (FIXME) so we can stay in sync with Intel. 960
e60b52c6 3095 doesn't yet page from files... */
252b5132
RH
3096#ifdef ALIGN_SECTIONS_IN_FILE
3097 if ((abfd->flags & EXEC_P) != 0)
3098 {
3099 /* make sure this section is aligned on the right boundary - by
3100 padding the previous section up if necessary */
3101
3102 old_sofar = sofar;
3103 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3104 if (previous != (asection *) NULL)
3105 {
3106 previous->_raw_size += sofar - old_sofar;
3107 }
3108 }
3109
3110#endif
3111
3112 /* In demand paged files the low order bits of the file offset
3113 must match the low order bits of the virtual address. */
3114#ifdef COFF_PAGE_SIZE
3115 if ((abfd->flags & D_PAGED) != 0
3116 && (current->flags & SEC_ALLOC) != 0)
3117 sofar += (current->vma - sofar) % page_size;
3118#endif
3119 current->filepos = sofar;
3120
3121#ifdef COFF_IMAGE_WITH_PE
75cc7189 3122 /* Set the padded size. */
252b5132
RH
3123 current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
3124#endif
3125
3126 sofar += current->_raw_size;
3127
3128#ifdef ALIGN_SECTIONS_IN_FILE
3129 /* make sure that this section is of the right size too */
3130 if ((abfd->flags & EXEC_P) == 0)
3131 {
3132 bfd_size_type old_size;
3133
3134 old_size = current->_raw_size;
3135 current->_raw_size = BFD_ALIGN (current->_raw_size,
3136 1 << current->alignment_power);
3137 align_adjust = current->_raw_size != old_size;
3138 sofar += current->_raw_size - old_size;
3139 }
3140 else
3141 {
3142 old_sofar = sofar;
3143 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
3144 align_adjust = sofar != old_sofar;
3145 current->_raw_size += sofar - old_sofar;
3146 }
3147#endif
3148
3149#ifdef COFF_IMAGE_WITH_PE
3150 /* For PE we need to make sure we pad out to the aligned
3151 _raw_size, in case the caller only writes out data to the
3152 unaligned _raw_size. */
3153 if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
3154 align_adjust = true;
3155#endif
3156
3157#ifdef _LIB
3158 /* Force .lib sections to start at zero. The vma is then
3159 incremented in coff_set_section_contents. This is right for
3160 SVR3.2. */
3161 if (strcmp (current->name, _LIB) == 0)
3162 bfd_set_section_vma (abfd, current, 0);
3163#endif
3164
3165 previous = current;
3166 }
3167
3168 /* It is now safe to write to the output file. If we needed an
3169 alignment adjustment for the last section, then make sure that
3170 there is a byte at offset sofar. If there are no symbols and no
3171 relocs, then nothing follows the last section. If we don't force
3172 the last byte out, then the file may appear to be truncated. */
3173 if (align_adjust)
3174 {
3175 bfd_byte b;
3176
3177 b = 0;
3178 if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
3179 || bfd_write (&b, 1, 1, abfd) != 1)
3180 return false;
3181 }
3182
3183 /* Make sure the relocations are aligned. We don't need to make
3184 sure that this byte exists, because it will only matter if there
3185 really are relocs. */
3186 sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
3187
3188 obj_relocbase (abfd) = sofar;
3189 abfd->output_has_begun = true;
3190
3191 return true;
3192}
3193
3194#if 0
3195
3196/* This can never work, because it is called too late--after the
3197 section positions have been set. I can't figure out what it is
3198 for, so I am going to disable it--Ian Taylor 20 March 1996. */
3199
3200/* If .file, .text, .data, .bss symbols are missing, add them. */
3201/* @@ Should we only be adding missing symbols, or overriding the aux
3202 values for existing section symbols? */
3203static boolean
3204coff_add_missing_symbols (abfd)
3205 bfd *abfd;
3206{
3207 unsigned int nsyms = bfd_get_symcount (abfd);
3208 asymbol **sympp = abfd->outsymbols;
3209 asymbol **sympp2;
3210 unsigned int i;
3211 int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
3212
3213 for (i = 0; i < nsyms; i++)
3214 {
3215 coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
3216 CONST char *name;
3217 if (csym)
3218 {
3219 /* only do this if there is a coff representation of the input
3220 symbol */
3221 if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
3222 {
3223 need_file = 0;
3224 continue;
3225 }
3226 name = csym->symbol.name;
3227 if (!name)
3228 continue;
3229 if (!strcmp (name, _TEXT))
3230 need_text = 0;
3231#ifdef APOLLO_M68
3232 else if (!strcmp (name, ".wtext"))
3233 need_text = 0;
3234#endif
3235 else if (!strcmp (name, _DATA))
3236 need_data = 0;
3237 else if (!strcmp (name, _BSS))
3238 need_bss = 0;
3239 }
3240 }
3241 /* Now i == bfd_get_symcount (abfd). */
3242 /* @@ For now, don't deal with .file symbol. */
3243 need_file = 0;
3244
3245 if (!need_text && !need_data && !need_bss && !need_file)
3246 return true;
3247 nsyms += need_text + need_data + need_bss + need_file;
3248 sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
3249 if (!sympp2)
3250 return false;
3251 memcpy (sympp2, sympp, i * sizeof (asymbol *));
3252 if (need_file)
3253 {
3254 /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */
3255 abort ();
3256 }
3257 if (need_text)
3258 sympp2[i++] = coff_section_symbol (abfd, _TEXT);
3259 if (need_data)
3260 sympp2[i++] = coff_section_symbol (abfd, _DATA);
3261 if (need_bss)
3262 sympp2[i++] = coff_section_symbol (abfd, _BSS);
3263 BFD_ASSERT (i == nsyms);
3264 bfd_set_symtab (abfd, sympp2, nsyms);
3265 return true;
3266}
3267
3268#endif /* 0 */
3269
3270/* SUPPRESS 558 */
3271/* SUPPRESS 529 */
3272static boolean
3273coff_write_object_contents (abfd)
3274 bfd * abfd;
3275{
3276 asection *current;
3277 boolean hasrelocs = false;
3278 boolean haslinno = false;
4cfec37b 3279 boolean hasdebug = false;
252b5132
RH
3280 file_ptr scn_base;
3281 file_ptr reloc_base;
3282 file_ptr lineno_base;
3283 file_ptr sym_base;
3e4554a2 3284 unsigned long reloc_size = 0, reloc_count = 0;
252b5132
RH
3285 unsigned long lnno_size = 0;
3286 boolean long_section_names;
3287 asection *text_sec = NULL;
3288 asection *data_sec = NULL;
3289 asection *bss_sec = NULL;
3290 struct internal_filehdr internal_f;
3291 struct internal_aouthdr internal_a;
3292#ifdef COFF_LONG_SECTION_NAMES
3293 size_t string_size = STRING_SIZE_SIZE;
3294#endif
3295
3296 bfd_set_error (bfd_error_system_call);
3297
3298 /* Make a pass through the symbol table to count line number entries and
3299 put them into the correct asections */
3300
6b3b007b 3301 lnno_size = coff_count_linenumbers (abfd) * bfd_coff_linesz (abfd);
252b5132
RH
3302
3303 if (abfd->output_has_begun == false)
3304 {
3305 if (! coff_compute_section_file_positions (abfd))
3306 return false;
3307 }
3308
3309 reloc_base = obj_relocbase (abfd);
3310
3311 /* Work out the size of the reloc and linno areas */
3312
3313 for (current = abfd->sections; current != NULL; current =
3314 current->next)
3e4554a2
DD
3315 {
3316#ifdef COFF_WITH_PE
3317 /* we store the actual reloc count in the first reloc's addr */
3318 if (current->reloc_count > 0xffff)
3319 reloc_count ++;
3320#endif
3321 reloc_count += current->reloc_count;
3322 }
3323
3324 reloc_size = reloc_count * bfd_coff_relsz (abfd);
252b5132
RH
3325
3326 lineno_base = reloc_base + reloc_size;
3327 sym_base = lineno_base + lnno_size;
3328
3329 /* Indicate in each section->line_filepos its actual file address */
3330 for (current = abfd->sections; current != NULL; current =
3331 current->next)
3332 {
3333 if (current->lineno_count)
3334 {
3335 current->line_filepos = lineno_base;
3336 current->moving_line_filepos = lineno_base;
6b3b007b 3337 lineno_base += current->lineno_count * bfd_coff_linesz (abfd);
252b5132
RH
3338 }
3339 else
3340 {
3341 current->line_filepos = 0;
3342 }
3343 if (current->reloc_count)
3344 {
3345 current->rel_filepos = reloc_base;
6b3b007b 3346 reloc_base += current->reloc_count * bfd_coff_relsz (abfd);
3e4554a2
DD
3347#ifdef COFF_WITH_PE
3348 /* extra reloc to hold real count */
3349 if (current->reloc_count > 0xffff)
3350 reloc_base += bfd_coff_relsz (abfd);
3351#endif
252b5132
RH
3352 }
3353 else
3354 {
3355 current->rel_filepos = 0;
3356 }
3357 }
3358
3359 /* Write section headers to the file. */
3360 internal_f.f_nscns = 0;
3361
3362 if ((abfd->flags & EXEC_P) != 0)
6b3b007b 3363 scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
252b5132
RH
3364 else
3365 {
6b3b007b 3366 scn_base = bfd_coff_filhsz (abfd);
252b5132 3367#ifdef RS6000COFF_C
beb1bf64 3368#ifndef XCOFF64
252b5132 3369 if (xcoff_data (abfd)->full_aouthdr)
6b3b007b 3370 scn_base += bfd_coff_aoutsz (abfd);
252b5132
RH
3371 else
3372 scn_base += SMALL_AOUTSZ;
beb1bf64 3373#endif
252b5132
RH
3374#endif
3375 }
3376
3377 if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
3378 return false;
3379
3380 long_section_names = false;
3381 for (current = abfd->sections;
3382 current != NULL;
3383 current = current->next)
3384 {
3385 struct internal_scnhdr section;
4cfec37b 3386 boolean is_reloc_section = false;
252b5132
RH
3387
3388#ifdef COFF_IMAGE_WITH_PE
3389 if (strcmp (current->name, ".reloc") == 0)
3390 {
4cfec37b
ILT
3391 is_reloc_section = true;
3392 hasrelocs = true;
252b5132
RH
3393 pe_data (abfd)->has_reloc_section = 1;
3394 }
3395#endif
3396
252b5132
RH
3397 internal_f.f_nscns++;
3398
3399 strncpy (section.s_name, current->name, SCNNMLEN);
3400
3401#ifdef COFF_LONG_SECTION_NAMES
3402 /* Handle long section names as in PE. This must be compatible
00692651 3403 with the code in coff_write_symbols and _bfd_coff_final_link. */
252b5132
RH
3404 {
3405 size_t len;
3406
3407 len = strlen (current->name);
3408 if (len > SCNNMLEN)
3409 {
3410 memset (section.s_name, 0, SCNNMLEN);
3411 sprintf (section.s_name, "/%lu", (unsigned long) string_size);
3412 string_size += len + 1;
3413 long_section_names = true;
3414 }
3415 }
3416#endif
3417
3418#ifdef _LIB
3419 /* Always set s_vaddr of .lib to 0. This is right for SVR3.2
3420 Ian Taylor <ian@cygnus.com>. */
3421 if (strcmp (current->name, _LIB) == 0)
3422 section.s_vaddr = 0;
3423 else
3424#endif
3425 section.s_vaddr = current->vma;
3426 section.s_paddr = current->lma;
3427 section.s_size = current->_raw_size;
b9af77f5 3428#ifdef coff_get_section_load_page
e60b52c6 3429 section.s_page = coff_get_section_load_page (current);
b9af77f5 3430#endif
252b5132
RH
3431
3432#ifdef COFF_WITH_PE
3433 section.s_paddr = 0;
3434#endif
3435#ifdef COFF_IMAGE_WITH_PE
3436 /* Reminder: s_paddr holds the virtual size of the section. */
3437 if (coff_section_data (abfd, current) != NULL
3438 && pei_section_data (abfd, current) != NULL)
3439 section.s_paddr = pei_section_data (abfd, current)->virt_size;
3440 else
3441 section.s_paddr = 0;
3442#endif
3443
3444 /*
3445 If this section has no size or is unloadable then the scnptr
3446 will be 0 too
3447 */
3448 if (current->_raw_size == 0 ||
3449 (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3450 {
3451 section.s_scnptr = 0;
3452 }
3453 else
3454 {
3455 section.s_scnptr = current->filepos;
3456 }
3457 section.s_relptr = current->rel_filepos;
3458 section.s_lnnoptr = current->line_filepos;
3459 section.s_nreloc = current->reloc_count;
3460 section.s_nlnno = current->lineno_count;
79207490
ILT
3461#ifndef COFF_IMAGE_WITH_PE
3462 /* In PEI, relocs come in the .reloc section. */
252b5132
RH
3463 if (current->reloc_count != 0)
3464 hasrelocs = true;
79207490 3465#endif
252b5132
RH
3466 if (current->lineno_count != 0)
3467 haslinno = true;
4cfec37b
ILT
3468 if ((current->flags & SEC_DEBUGGING) != 0
3469 && ! is_reloc_section)
3470 hasdebug = true;
252b5132 3471
60bcf0fa 3472#ifdef RS6000COFF_C
7f6d05e8 3473#ifndef XCOFF64
252b5132
RH
3474 /* Indicate the use of an XCOFF overflow section header. */
3475 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3476 {
3477 section.s_nreloc = 0xffff;
3478 section.s_nlnno = 0xffff;
3479 }
7f6d05e8 3480#endif
252b5132
RH
3481#endif
3482
3483 section.s_flags = sec_to_styp_flags (current->name, current->flags);
3484
3485 if (!strcmp (current->name, _TEXT))
3486 {
3487 text_sec = current;
3488 }
3489 else if (!strcmp (current->name, _DATA))
3490 {
3491 data_sec = current;
3492 }
3493 else if (!strcmp (current->name, _BSS))
3494 {
3495 bss_sec = current;
3496 }
3497
3498#ifdef I960
3499 section.s_align = (current->alignment_power
3500 ? 1 << current->alignment_power
3501 : 0);
81635ce4 3502#endif
e60b52c6 3503#ifdef TIC80COFF
81635ce4 3504 /* TI COFF puts the alignment power in bits 8-11 of the flags */
252b5132
RH
3505 section.s_flags |= (current->alignment_power & 0xF) << 8;
3506#endif
81635ce4
TW
3507#ifdef COFF_ENCODE_ALIGNMENT
3508 COFF_ENCODE_ALIGNMENT(section, current->alignment_power);
252b5132
RH
3509#endif
3510
3511#ifdef COFF_IMAGE_WITH_PE
00692651
ILT
3512 /* Suppress output of the sections if they are null. ld
3513 includes the bss and data sections even if there is no size
3514 assigned to them. NT loader doesn't like it if these section
3515 headers are included if the sections themselves are not
3516 needed. See also coff_compute_section_file_positions. */
252b5132
RH
3517 if (section.s_size == 0)
3518 internal_f.f_nscns--;
3519 else
3520#endif
3521 {
3522 SCNHDR buff;
3523 if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
6b3b007b 3524 || bfd_write ((PTR) (&buff), 1, bfd_coff_scnhsz (abfd), abfd)
60bcf0fa 3525 != bfd_coff_scnhsz (abfd))
252b5132
RH
3526 return false;
3527 }
3528
3529#ifdef COFF_WITH_PE
3530 /* PE stores COMDAT section information in the symbol table. If
3531 this section is supposed to have some COMDAT info, track down
3532 the symbol in the symbol table and modify it. */
3533 if ((current->flags & SEC_LINK_ONCE) != 0)
3534 {
3535 unsigned int i, count;
3536 asymbol **psym;
3537 coff_symbol_type *csym = NULL;
3538 asymbol **psymsec;
3539
3540 psymsec = NULL;
3541 count = bfd_get_symcount (abfd);
3542 for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3543 {
3544 if ((*psym)->section != current)
3545 continue;
3546
3547 /* Remember the location of the first symbol in this
3548 section. */
3549 if (psymsec == NULL)
3550 psymsec = psym;
3551
3552 /* See if this is the section symbol. */
3553 if (strcmp ((*psym)->name, current->name) == 0)
3554 {
3555 csym = coff_symbol_from (abfd, *psym);
3556 if (csym == NULL
3557 || csym->native == NULL
3558 || csym->native->u.syment.n_numaux < 1
3559 || csym->native->u.syment.n_sclass != C_STAT
3560 || csym->native->u.syment.n_type != T_NULL)
3561 continue;
3562
3563 /* Here *PSYM is the section symbol for CURRENT. */
3564
3565 break;
3566 }
3567 }
3568
3569 /* Did we find it?
3570 Note that we might not if we're converting the file from
3571 some other object file format. */
3572 if (i < count)
3573 {
3574 combined_entry_type *aux;
3575
3576 /* We don't touch the x_checksum field. The
3577 x_associated field is not currently supported. */
3578
3579 aux = csym->native + 1;
3580 switch (current->flags & SEC_LINK_DUPLICATES)
3581 {
3582 case SEC_LINK_DUPLICATES_DISCARD:
3583 aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3584 break;
3585
3586 case SEC_LINK_DUPLICATES_ONE_ONLY:
3587 aux->u.auxent.x_scn.x_comdat =
3588 IMAGE_COMDAT_SELECT_NODUPLICATES;
3589 break;
3590
3591 case SEC_LINK_DUPLICATES_SAME_SIZE:
3592 aux->u.auxent.x_scn.x_comdat =
3593 IMAGE_COMDAT_SELECT_SAME_SIZE;
3594 break;
3595
3596 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3597 aux->u.auxent.x_scn.x_comdat =
3598 IMAGE_COMDAT_SELECT_EXACT_MATCH;
3599 break;
3600 }
3601
3602 /* The COMDAT symbol must be the first symbol from this
3603 section in the symbol table. In order to make this
3604 work, we move the COMDAT symbol before the first
3605 symbol we found in the search above. It's OK to
3606 rearrange the symbol table at this point, because
3607 coff_renumber_symbols is going to rearrange it
3608 further and fix up all the aux entries. */
3609 if (psym != psymsec)
3610 {
3611 asymbol *hold;
3612 asymbol **pcopy;
3613
3614 hold = *psym;
3615 for (pcopy = psym; pcopy > psymsec; pcopy--)
3616 pcopy[0] = pcopy[-1];
3617 *psymsec = hold;
3618 }
3619 }
3620 }
3621#endif /* COFF_WITH_PE */
3622 }
3623
3624#ifdef RS6000COFF_C
beb1bf64 3625#ifndef XCOFF64
252b5132
RH
3626 /* XCOFF handles overflows in the reloc and line number count fields
3627 by creating a new section header to hold the correct values. */
3628 for (current = abfd->sections; current != NULL; current = current->next)
3629 {
3630 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3631 {
3632 struct internal_scnhdr scnhdr;
3633 SCNHDR buff;
3634
3635 internal_f.f_nscns++;
3636 strncpy (&(scnhdr.s_name[0]), current->name, 8);
3637 scnhdr.s_paddr = current->reloc_count;
3638 scnhdr.s_vaddr = current->lineno_count;
3639 scnhdr.s_size = 0;
3640 scnhdr.s_scnptr = 0;
3641 scnhdr.s_relptr = current->rel_filepos;
3642 scnhdr.s_lnnoptr = current->line_filepos;
3643 scnhdr.s_nreloc = current->target_index;
3644 scnhdr.s_nlnno = current->target_index;
3645 scnhdr.s_flags = STYP_OVRFLO;
3646 if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
6b3b007b 3647 || bfd_write ((PTR) &buff, 1, bfd_coff_scnhsz (abfd), abfd)
60bcf0fa 3648 != bfd_coff_scnhsz (abfd))
252b5132
RH
3649 return false;
3650 }
3651 }
beb1bf64 3652#endif
252b5132
RH
3653#endif
3654
e60b52c6 3655 /* OK, now set up the filehdr... */
252b5132
RH
3656
3657 /* Don't include the internal abs section in the section count */
3658
3659 /*
3660 We will NOT put a fucking timestamp in the header here. Every time you
3661 put it back, I will come in and take it out again. I'm sorry. This
3662 field does not belong here. We fill it with a 0 so it compares the
3663 same but is not a reasonable time. -- gnu@cygnus.com
3664 */
3665 internal_f.f_timdat = 0;
3666
3667 internal_f.f_flags = 0;
3668
3669 if (abfd->flags & EXEC_P)
6b3b007b 3670 internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
252b5132
RH
3671 else
3672 {
3673 internal_f.f_opthdr = 0;
3674#ifdef RS6000COFF_C
beb1bf64 3675#ifndef XCOFF64
252b5132 3676 if (xcoff_data (abfd)->full_aouthdr)
6b3b007b 3677 internal_f.f_opthdr = bfd_coff_aoutsz (abfd);
252b5132
RH
3678 else
3679 internal_f.f_opthdr = SMALL_AOUTSZ;
beb1bf64 3680#endif
252b5132
RH
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;
4cfec37b
ILT
3690#ifdef COFF_IMAGE_WITH_PE
3691 if (! hasdebug)
3692 internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3693#endif
252b5132 3694
8a1ad8e7 3695#ifndef COFF_WITH_PE
252b5132
RH
3696 if (bfd_little_endian (abfd))
3697 internal_f.f_flags |= F_AR32WR;
3698 else
3699 internal_f.f_flags |= F_AR32W;
8a1ad8e7 3700#endif
252b5132 3701
81635ce4
TW
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
252b5132
RH
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;
e60b52c6 3733 /* ...and the "opt"hdr... */
252b5132
RH
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 */
81635ce4
TW
3748#ifdef TICOFF_AOUT_MAGIC
3749 internal_a.magic = TICOFF_AOUT_MAGIC;
3750#define __A_MAGIC_SET__
3751#endif
252b5132
RH
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;
e60b52c6 3795#endif
252b5132
RH
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;
e60b52c6 3805#endif
252b5132
RH
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
fac41780
JW
3816#if defined(IA64)
3817#define __A_MAGIC_SET__
3818 internal_a.magic = ZMAGIC;
3819#endif /* IA64 */
3820
252b5132
RH
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
17505c5c
NC
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
252b5132
RH
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
d71f672e 3876 else if (long_section_names && ! obj_coff_strings_written (abfd))
252b5132
RH
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;
e60b52c6 4017
252b5132 4018 {
b5f303f0
NC
4019 char * buff;
4020 bfd_size_type amount;
e60b52c6 4021
b5f303f0 4022 buff = bfd_malloc (bfd_coff_filhsz (abfd));
e60b52c6 4023 if (buff == NULL)
b5f303f0 4024 return false;
e60b52c6 4025
3ed30d29 4026 bfd_coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
b5f303f0 4027 amount = bfd_write ((PTR) buff, 1, bfd_coff_filhsz (abfd), abfd);
e60b52c6 4028
2fca4467 4029 free (buff);
e60b52c6 4030
b5f303f0 4031 if (amount != bfd_coff_filhsz (abfd))
252b5132
RH
4032 return false;
4033 }
e60b52c6 4034
252b5132
RH
4035 if (abfd->flags & EXEC_P)
4036 {
e60b52c6
KH
4037 /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
4038 include/coff/pe.h sets AOUTSZ == sizeof (PEAOUTHDR)) */
b5f303f0
NC
4039 char * buff;
4040 bfd_size_type amount;
4041
4042 buff = bfd_malloc (bfd_coff_aoutsz (abfd));
e60b52c6 4043 if (buff == NULL)
b5f303f0 4044 return false;
e60b52c6 4045
252b5132 4046 coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
b5f303f0 4047 amount = bfd_write ((PTR) buff, 1, bfd_coff_aoutsz (abfd), abfd);
e60b52c6 4048
2fca4467 4049 free (buff);
e60b52c6 4050
b5f303f0 4051 if (amount != bfd_coff_aoutsz (abfd))
252b5132
RH
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)
6b3b007b 4063 size = bfd_coff_aoutsz (abfd);
252b5132
RH
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!).
e60b52c6 4108
252b5132
RH
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
e60b52c6 4129 see if the filepos has not been set. */
252b5132
RH
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
00692651
ILT
4198 Note: The PE format uses line number 0 for a flag indicating a
4199 new source file.
4200
252b5132
RH
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,
6b3b007b 4222 (size_t) (bfd_coff_linesz (abfd) *
252b5132
RH
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;
7f6d05e8 4237 bfd_coff_swap_lineno_in (abfd, src, &dst);
252b5132
RH
4238 cache_ptr->line_number = dst.l_lnno;
4239
4240 if (cache_ptr->line_number == 0)
4241 {
4242 boolean warned;
beb1bf64 4243 bfd_signed_vma symndx;
252b5132
RH
4244 coff_symbol_type *sym;
4245
4246 warned = false;
4247 symndx = dst.l_addr.l_symndx;
4248 if (symndx < 0
beb1bf64 4249 || (bfd_vma) symndx >= obj_raw_syment_count (abfd))
252b5132
RH
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;
e60b52c6 4286 /* FIXME, free native_lineno here, or use alloca or something. */
252b5132
RH
4287 return true;
4288}
4289
00692651
ILT
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
252b5132
RH
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
5d54c628 4373 /* In PE, 0x68 (104) denotes a section symbol */
252b5132 4374 case C_SECTION:
5d54c628 4375 /* In PE, 0x69 (105) denotes a weak external symbol. */
252b5132
RH
4376 case C_NT_WEAK:
4377#endif
5d54c628 4378 switch (coff_classify_symbol (abfd, &src->u.syment))
252b5132 4379 {
5d54c628 4380 case COFF_SYMBOL_GLOBAL:
252b5132 4381 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
252b5132
RH
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
252b5132
RH
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 }
5d54c628
ILT
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;
e60b52c6 4406 break;
5d54c628
ILT
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;
252b5132
RH
4426 }
4427
4428#ifdef RS6000COFF_C
252b5132
RH
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;
ec0ef80e
DD
4437 if (src->u.syment.n_sclass == C_SECTION
4438 && src->u.syment.n_scnum > 0)
4439 {
4440 dst->symbol.flags = BSF_LOCAL;
4441 }
252b5132
RH
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
e60b52c6 4453#if defined ARM
252b5132
RH
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 */
00692651 4459 if (src->u.syment.n_scnum == N_DEBUG)
252b5132
RH
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 */
81635ce4
TW
4490 /* C_AUTOARG conflictes with TI COFF C_UEXT */
4491#if !defined (TIC80COFF) && !defined (TICOFF)
252b5132
RH
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
6b3b007b 4542 + sec->lineno_count * bfd_coff_linesz (abfd))
252b5132
RH
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)
6b3b007b 4552 / bfd_coff_linesz (abfd));
252b5132
RH
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" */
60bcf0fa 4572 case C_FCN: /* ".bf" or ".ef" (or PE ".lf") */
252b5132 4573 case C_EFCN: /* physical end of function */
252b5132
RH
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;
d510f9a6
ILT
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;
252b5132
RH
4586#else
4587 /* Base the value as an index from the base of the
4588 section. */
d510f9a6 4589 dst->symbol.flags = BSF_LOCAL;
252b5132
RH
4590 dst->symbol.value = (src->u.syment.n_value
4591 - dst->symbol.section->vma);
4592#endif
4593 break;
4594
34cbe64e
TW
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
252b5132 4600 case C_NULL:
00692651
ILT
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. */
252b5132
RH
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
e60b52c6 4618 /* New storage classes for TI COFF */
81635ce4 4619#if defined(TIC80COFF) || defined(TICOFF)
252b5132
RH
4620 case C_UEXT: /* Tentative external definition */
4621#endif
252b5132
RH
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
5d54c628
ILT
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. */
252b5132 4667
5d54c628
ILT
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:
252b5132 4679#ifdef I960
5d54c628 4680 case C_LEAFEXT:
252b5132 4681#endif
5d54c628
ILT
4682#ifdef ARM
4683 case C_THUMBEXT:
4684 case C_THUMBEXTFUNC:
252b5132 4685#endif
5d54c628
ILT
4686#ifdef C_SYSTEM
4687 case C_SYSTEM:
252b5132 4688#endif
5d54c628
ILT
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 }
252b5132 4704
5d54c628
ILT
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 }
252b5132 4716
0717ebb7 4717#ifdef STRICT_PE_FORMAT
bd826630
ILT
4718 /* This is correct for Microsoft generated objects, but it
4719 breaks gas generated objects. */
4720
5d54c628
ILT
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 }
bd826630 4733#endif
252b5132 4734
5d54c628
ILT
4735 return COFF_SYMBOL_LOCAL;
4736 }
252b5132 4737
5d54c628
ILT
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 */
252b5132 4749
5d54c628 4750 /* If it is not a global symbol, we presume it is a local symbol. */
252b5132 4751
5d54c628
ILT
4752 if (syment->n_scnum == 0)
4753 {
4754 char buf[SYMNMLEN + 1];
252b5132 4755
5d54c628
ILT
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 }
252b5132 4761
5d54c628
ILT
4762 return COFF_SYMBOL_LOCAL;
4763}
252b5132
RH
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
252b5132
RH
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,
6b3b007b 4837 (size_t) (bfd_coff_relsz (abfd) *
252b5132
RH
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
252b5132
RH
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)
5f771d47
ILT
4934 bfd *abfd ATTRIBUTE_UNUSED;
4935 asection *sec ATTRIBUTE_UNUSED;
252b5132 4936 struct internal_reloc *rel;
5f771d47
ILT
4937 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
4938 struct internal_syment *sym ATTRIBUTE_UNUSED;
4939 bfd_vma *addendp ATTRIBUTE_UNUSED;
252b5132
RH
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
252b5132
RH
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++;
252b5132
RH
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)
5f771d47
ILT
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;
252b5132
RH
5015{
5016 abort ();
00692651 5017 return 0;
252b5132
RH
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)
5f771d47
ILT
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;
252b5132
RH
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;
5f771d47 5092 struct coff_final_link_info * info ATTRIBUTE_UNUSED;
252b5132
RH
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)
5f771d47
ILT
5105 bfd * abfd ATTRIBUTE_UNUSED;
5106 struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
252b5132
RH
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
692b7d62 5155static const bfd_coff_backend_data bfd_coff_std_swap_table =
252b5132
RH
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,
692b7d62 5162 FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
252b5132
RH
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
a022216b 5173 COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
7f6d05e8
CP
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
252b5132
RH
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,
5d54c628 5189 coff_classify_symbol, coff_compute_section_file_positions,
252b5132
RH
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
e60b52c6 5215#ifndef coff_bfd_copy_private_bfd_data
252b5132
RH
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
e60b52c6 5227#ifndef coff_bfd_print_private_bfd_data
252b5132
RH
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
c3c89269 5261
8550eb6e
JJ
5262#ifndef coff_bfd_merge_sections
5263#define coff_bfd_merge_sections bfd_generic_merge_sections
5264#endif
5265
c3c89269 5266#define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4c117b10
ILT
5267const bfd_target VAR = \
5268{ \
5269 NAME , \
5270 bfd_target_coff_flavour, \
5271 BFD_ENDIAN_BIG, /* data byte order is big */ \
5272 BFD_ENDIAN_BIG, /* header byte order is big */ \
5273 /* object flags */ \
5274 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
5275 HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
5276 /* section flags */ \
5277 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5278 UNDER, /* leading symbol underscore */ \
5279 '/', /* ar_pad_char */ \
5280 15, /* ar_max_namelen */ \
5281 \
5282 /* Data conversion functions. */ \
5283 bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
5284 bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
5285 bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
5286 \
5287 /* Header conversion functions. */ \
5288 bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
5289 bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
5290 bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
5291 \
5292 /* bfd_check_format */ \
5293 { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, \
5294 _bfd_dummy_target }, \
5295 /* bfd_set_format */ \
5296 { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false }, \
5297 /* bfd_write_contents */ \
5298 { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5299 bfd_false }, \
5300 \
5301 BFD_JUMP_TABLE_GENERIC (coff), \
5302 BFD_JUMP_TABLE_COPY (coff), \
5303 BFD_JUMP_TABLE_CORE (_bfd_nocore), \
5304 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \
5305 BFD_JUMP_TABLE_SYMBOLS (coff), \
5306 BFD_JUMP_TABLE_RELOCS (coff), \
5307 BFD_JUMP_TABLE_WRITE (coff), \
5308 BFD_JUMP_TABLE_LINK (coff), \
5309 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
5310 \
5311 ALTERNATIVE, \
5312 \
5313 COFF_SWAP_TABLE \
c3c89269
NC
5314};
5315
5316#define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4c117b10
ILT
5317const bfd_target VAR = \
5318{ \
5319 NAME , \
5320 bfd_target_coff_flavour, \
5321 BFD_ENDIAN_LITTLE, /* data byte order is little */ \
5322 BFD_ENDIAN_LITTLE, /* header byte order is little */ \
5323 /* object flags */ \
5324 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
5325 HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
5326 /* section flags */ \
5327 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
5328 UNDER, /* leading symbol underscore */ \
5329 '/', /* ar_pad_char */ \
5330 15, /* ar_max_namelen */ \
5331 \
5332 /* Data conversion functions. */ \
5333 bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
5334 bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
5335 bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
5336 /* Header conversion functions. */ \
5337 bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
5338 bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
5339 bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
5340 /* bfd_check_format */ \
5341 { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, \
5342 _bfd_dummy_target }, \
5343 /* bfd_set_format */ \
5344 { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false }, \
5345 /* bfd_write_contents */ \
5346 { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
5347 bfd_false }, \
5348 \
5349 BFD_JUMP_TABLE_GENERIC (coff), \
5350 BFD_JUMP_TABLE_COPY (coff), \
5351 BFD_JUMP_TABLE_CORE (_bfd_nocore), \
5352 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \
5353 BFD_JUMP_TABLE_SYMBOLS (coff), \
5354 BFD_JUMP_TABLE_RELOCS (coff), \
5355 BFD_JUMP_TABLE_WRITE (coff), \
5356 BFD_JUMP_TABLE_LINK (coff), \
5357 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
5358 \
5359 ALTERNATIVE, \
5360 \
5361 COFF_SWAP_TABLE \
c3c89269 5362};
This page took 0.351433 seconds and 4 git commands to generate.