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