]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/coffcode.h
add some comments about peigen.c
[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
1135238b
ILT
1597 coff->timestamp = internal_f->f_timdat;
1598
252b5132
RH
1599 obj_raw_syment_count (abfd) =
1600 obj_conv_table_size (abfd) =
1601 internal_f->f_nsyms;
1602
1603#ifdef RS6000COFF_C
1604 if ((internal_f->f_flags & F_SHROBJ) != 0)
1605 abfd->flags |= DYNAMIC;
1606 if (aouthdr != NULL && internal_f->f_opthdr >= AOUTSZ)
1607 {
1608 struct internal_aouthdr *internal_a =
1609 (struct internal_aouthdr *) aouthdr;
1610 struct xcoff_tdata *xcoff;
1611
1612 xcoff = xcoff_data (abfd);
1613 xcoff->full_aouthdr = true;
1614 xcoff->toc = internal_a->o_toc;
1615 xcoff->sntoc = internal_a->o_sntoc;
1616 xcoff->snentry = internal_a->o_snentry;
1617 xcoff->text_align_power = internal_a->o_algntext;
1618 xcoff->data_align_power = internal_a->o_algndata;
1619 xcoff->modtype = internal_a->o_modtype;
1620 xcoff->cputype = internal_a->o_cputype;
1621 xcoff->maxdata = internal_a->o_maxdata;
1622 xcoff->maxstack = internal_a->o_maxstack;
1623 }
1624#endif
1625
1626#ifdef ARM
1627 /* Set the flags field from the COFF header read in */
1628 if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
1629 coff->flags = 0;
1630#endif
1631
4cfec37b
ILT
1632#ifdef COFF_WITH_PE
1633 /* FIXME: I'm not sure this is ever executed, since peicode.h
1634 defines coff_mkobject_hook. */
1635 if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
1636 abfd->flags |= HAS_DEBUG;
1637#endif
1638
252b5132
RH
1639 return (PTR) coff;
1640}
1641#endif
1642
1643/* Determine the machine architecture and type. FIXME: This is target
1644 dependent because the magic numbers are defined in the target
1645 dependent header files. But there is no particular need for this.
1646 If the magic numbers were moved to a separate file, this function
1647 would be target independent and would also be much more successful
1648 at linking together COFF files for different architectures. */
1649
1650static boolean
1651coff_set_arch_mach_hook (abfd, filehdr)
1652 bfd *abfd;
1653 PTR filehdr;
1654{
1655 long machine;
1656 enum bfd_architecture arch;
1657 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1658
1659 machine = 0;
1660 switch (internal_f->f_magic)
1661 {
1662#ifdef PPCMAGIC
1663 case PPCMAGIC:
1664 arch = bfd_arch_powerpc;
1665 machine = 0; /* what does this mean? (krk) */
1666 break;
1667#endif
1668#ifdef I386MAGIC
1669 case I386MAGIC:
1670 case I386PTXMAGIC:
1671 case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
1672 case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
1673 arch = bfd_arch_i386;
1674 machine = 0;
1675 break;
1676#endif
1677#ifdef A29K_MAGIC_BIG
1678 case A29K_MAGIC_BIG:
1679 case A29K_MAGIC_LITTLE:
1680 arch = bfd_arch_a29k;
1681 machine = 0;
1682 break;
1683#endif
1684#ifdef ARMMAGIC
1685 case ARMMAGIC:
1686 arch = bfd_arch_arm;
1687 switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
1688 {
948221a8
NC
1689 case F_ARM_2: machine = bfd_mach_arm_2; break;
1690 case F_ARM_2a: machine = bfd_mach_arm_2a; break;
1691 case F_ARM_3: machine = bfd_mach_arm_3; break;
1692 default:
1693 case F_ARM_3M: machine = bfd_mach_arm_3M; break;
1694 case F_ARM_4: machine = bfd_mach_arm_4; break;
1695 case F_ARM_4T: machine = bfd_mach_arm_4T; break;
478d07d6 1696 case F_ARM_5: machine = bfd_mach_arm_5; break;
252b5132
RH
1697 }
1698 break;
1699#endif
1700#ifdef MC68MAGIC
1701 case MC68MAGIC:
1702 case M68MAGIC:
1703#ifdef MC68KBCSMAGIC
1704 case MC68KBCSMAGIC:
1705#endif
1706#ifdef APOLLOM68KMAGIC
1707 case APOLLOM68KMAGIC:
1708#endif
1709#ifdef LYNXCOFFMAGIC
1710 case LYNXCOFFMAGIC:
1711#endif
1712 arch = bfd_arch_m68k;
1713 machine = bfd_mach_m68020;
1714 break;
1715#endif
1716#ifdef MC88MAGIC
1717 case MC88MAGIC:
1718 case MC88DMAGIC:
1719 case MC88OMAGIC:
1720 arch = bfd_arch_m88k;
1721 machine = 88100;
1722 break;
1723#endif
1724#ifdef Z8KMAGIC
1725 case Z8KMAGIC:
1726 arch = bfd_arch_z8k;
1727 switch (internal_f->f_flags & F_MACHMASK)
1728 {
1729 case F_Z8001:
1730 machine = bfd_mach_z8001;
1731 break;
1732 case F_Z8002:
1733 machine = bfd_mach_z8002;
1734 break;
1735 default:
1736 return false;
1737 }
1738 break;
1739#endif
1740#ifdef I860
1741 case I860MAGIC:
1742 arch = bfd_arch_i860;
1743 break;
1744#endif
1745#ifdef I960
1746#ifdef I960ROMAGIC
1747 case I960ROMAGIC:
1748 case I960RWMAGIC:
1749 arch = bfd_arch_i960;
1750 switch (F_I960TYPE & internal_f->f_flags)
1751 {
1752 default:
1753 case F_I960CORE:
1754 machine = bfd_mach_i960_core;
1755 break;
1756 case F_I960KB:
1757 machine = bfd_mach_i960_kb_sb;
1758 break;
1759 case F_I960MC:
1760 machine = bfd_mach_i960_mc;
1761 break;
1762 case F_I960XA:
1763 machine = bfd_mach_i960_xa;
1764 break;
1765 case F_I960CA:
1766 machine = bfd_mach_i960_ca;
1767 break;
1768 case F_I960KA:
1769 machine = bfd_mach_i960_ka_sa;
1770 break;
1771 case F_I960JX:
1772 machine = bfd_mach_i960_jx;
1773 break;
1774 case F_I960HX:
1775 machine = bfd_mach_i960_hx;
1776 break;
1777 }
1778 break;
1779#endif
1780#endif
1781
1782#ifdef RS6000COFF_C
1783 case U802ROMAGIC:
1784 case U802WRMAGIC:
1785 case U802TOCMAGIC:
1786 {
1787 int cputype;
1788
1789 if (xcoff_data (abfd)->cputype != -1)
1790 cputype = xcoff_data (abfd)->cputype & 0xff;
1791 else
1792 {
1793 /* We did not get a value from the a.out header. If the
1794 file has not been stripped, we may be able to get the
1795 architecture information from the first symbol, if it
1796 is a .file symbol. */
1797 if (obj_raw_syment_count (abfd) == 0)
1798 cputype = 0;
1799 else
1800 {
1801 bfd_byte buf[SYMESZ];
1802 struct internal_syment sym;
1803
1804 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1805 || bfd_read (buf, 1, SYMESZ, abfd) != SYMESZ)
1806 return false;
1807 coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym);
1808 if (sym.n_sclass == C_FILE)
1809 cputype = sym.n_type & 0xff;
1810 else
1811 cputype = 0;
1812 }
1813 }
1814
1815 /* FIXME: We don't handle all cases here. */
1816 switch (cputype)
1817 {
1818 default:
1819 case 0:
1820#ifdef POWERMAC
1821 /* PowerPC Macs use the same magic numbers as RS/6000
1822 (because that's how they were bootstrapped originally),
1823 but they are always PowerPC architecture. */
1824 arch = bfd_arch_powerpc;
1825 machine = 0;
1826#else
1827 arch = bfd_arch_rs6000;
1828 machine = 6000;
1829#endif /* POWERMAC */
1830 break;
1831
1832 case 1:
1833 arch = bfd_arch_powerpc;
1834 machine = 601;
1835 break;
1836 case 2: /* 64 bit PowerPC */
1837 arch = bfd_arch_powerpc;
1838 machine = 620;
1839 break;
1840 case 3:
1841 arch = bfd_arch_powerpc;
1842 machine = 0;
1843 break;
1844 case 4:
1845 arch = bfd_arch_rs6000;
1846 machine = 6000;
1847 break;
1848 }
1849 }
1850 break;
1851#endif
1852
1853#ifdef WE32KMAGIC
1854 case WE32KMAGIC:
1855 arch = bfd_arch_we32k;
1856 machine = 0;
1857 break;
1858#endif
1859
1860#ifdef H8300MAGIC
1861 case H8300MAGIC:
1862 arch = bfd_arch_h8300;
1863 machine = bfd_mach_h8300;
1864 /* !! FIXME this probably isn't the right place for this */
1865 abfd->flags |= BFD_IS_RELAXABLE;
1866 break;
1867#endif
1868
1869#ifdef H8300HMAGIC
1870 case H8300HMAGIC:
1871 arch = bfd_arch_h8300;
1872 machine = bfd_mach_h8300h;
1873 /* !! FIXME this probably isn't the right place for this */
1874 abfd->flags |= BFD_IS_RELAXABLE;
1875 break;
1876#endif
1877
1878#ifdef H8300SMAGIC
1879 case H8300SMAGIC:
1880 arch = bfd_arch_h8300;
1881 machine = bfd_mach_h8300s;
1882 /* !! FIXME this probably isn't the right place for this */
1883 abfd->flags |= BFD_IS_RELAXABLE;
1884 break;
1885#endif
1886
1887#ifdef SH_ARCH_MAGIC_BIG
1888 case SH_ARCH_MAGIC_BIG:
1889 case SH_ARCH_MAGIC_LITTLE:
1890 arch = bfd_arch_sh;
1891 machine = 0;
1892 break;
1893#endif
1894
1895#ifdef H8500MAGIC
1896 case H8500MAGIC:
1897 arch = bfd_arch_h8500;
1898 machine = 0;
1899 break;
1900#endif
1901
1902#ifdef SPARCMAGIC
1903 case SPARCMAGIC:
1904#ifdef LYNXCOFFMAGIC
1905 case LYNXCOFFMAGIC:
1906#endif
1907 arch = bfd_arch_sparc;
1908 machine = 0;
1909 break;
1910#endif
1911
1912#ifdef TIC30MAGIC
1913 case TIC30MAGIC:
1914 arch = bfd_arch_tic30;
1915 break;
1916#endif
1917
1918#ifdef TIC80_ARCH_MAGIC
1919 case TIC80_ARCH_MAGIC:
1920 arch = bfd_arch_tic80;
1921 break;
1922#endif
1923
1924#ifdef MCOREMAGIC
1925 case MCOREMAGIC:
1926 arch = bfd_arch_mcore;
1927 break;
1928#endif
1929 default: /* Unreadable input file type */
1930 arch = bfd_arch_obscure;
1931 break;
1932 }
1933
1934 bfd_default_set_arch_mach (abfd, arch, machine);
1935 return true;
1936}
1937
1938#ifdef SYMNAME_IN_DEBUG
1939
1940static boolean symname_in_debug_hook
1941 PARAMS ((bfd *, struct internal_syment *));
1942
1943static boolean
1944symname_in_debug_hook (abfd, sym)
5f771d47 1945 bfd * abfd ATTRIBUTE_UNUSED;
252b5132
RH
1946 struct internal_syment *sym;
1947{
1948 return SYMNAME_IN_DEBUG (sym) ? true : false;
1949}
1950
1951#else
1952
1953#define symname_in_debug_hook \
1954 (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
1955
1956#endif
1957
1958#ifdef RS6000COFF_C
1959
1960/* Handle the csect auxent of a C_EXT or C_HIDEXT symbol. */
1961
1962static boolean coff_pointerize_aux_hook
1963 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1964 unsigned int, combined_entry_type *));
1965
1966/*ARGSUSED*/
1967static boolean
1968coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
5f771d47 1969 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
1970 combined_entry_type *table_base;
1971 combined_entry_type *symbol;
1972 unsigned int indaux;
1973 combined_entry_type *aux;
1974{
1975 int class = symbol->u.syment.n_sclass;
1976
1977 if ((class == C_EXT || class == C_HIDEXT)
1978 && indaux + 1 == symbol->u.syment.n_numaux)
1979 {
1980 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
1981 {
1982 aux->u.auxent.x_csect.x_scnlen.p =
1983 table_base + aux->u.auxent.x_csect.x_scnlen.l;
1984 aux->fix_scnlen = 1;
1985 }
1986
1987 /* Return true to indicate that the caller should not do any
1988 further work on this auxent. */
1989 return true;
1990 }
1991
1992 /* Return false to indicate that this auxent should be handled by
1993 the caller. */
1994 return false;
1995}
1996
1997#else
1998#ifdef I960
1999
2000/* We don't want to pointerize bal entries. */
2001
2002static boolean coff_pointerize_aux_hook
2003 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
2004 unsigned int, combined_entry_type *));
2005
2006/*ARGSUSED*/
2007static boolean
2008coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
5f771d47
ILT
2009 bfd *abfd ATTRIBUTE_UNUSED;
2010 combined_entry_type *table_base ATTRIBUTE_UNUSED;
252b5132
RH
2011 combined_entry_type *symbol;
2012 unsigned int indaux;
5f771d47 2013 combined_entry_type *aux ATTRIBUTE_UNUSED;
252b5132
RH
2014{
2015 /* Return true if we don't want to pointerize this aux entry, which
2016 is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */
2017 return (indaux == 1
2018 && (symbol->u.syment.n_sclass == C_LEAFPROC
2019 || symbol->u.syment.n_sclass == C_LEAFSTAT
2020 || symbol->u.syment.n_sclass == C_LEAFEXT));
2021}
2022
2023#else /* ! I960 */
2024
2025#define coff_pointerize_aux_hook 0
2026
2027#endif /* ! I960 */
2028#endif /* ! RS6000COFF_C */
2029
2030/* Print an aux entry. This returns true if it has printed it. */
2031
2032static boolean coff_print_aux
2033 PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *,
2034 combined_entry_type *, unsigned int));
2035
2036static boolean
2037coff_print_aux (abfd, file, table_base, symbol, aux, indaux)
5f771d47
ILT
2038 bfd *abfd ATTRIBUTE_UNUSED;
2039 FILE *file ATTRIBUTE_UNUSED;
2040 combined_entry_type *table_base ATTRIBUTE_UNUSED;
2041 combined_entry_type *symbol ATTRIBUTE_UNUSED;
2042 combined_entry_type *aux ATTRIBUTE_UNUSED;
2043 unsigned int indaux ATTRIBUTE_UNUSED;
252b5132
RH
2044{
2045#ifdef RS6000COFF_C
2046 if ((symbol->u.syment.n_sclass == C_EXT
2047 || symbol->u.syment.n_sclass == C_HIDEXT)
2048 && indaux + 1 == symbol->u.syment.n_numaux)
2049 {
2050 /* This is a csect entry. */
2051 fprintf (file, "AUX ");
2052 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD)
2053 {
2054 BFD_ASSERT (! aux->fix_scnlen);
2055 fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l);
2056 }
2057 else
2058 {
2059 fprintf (file, "indx ");
2060 if (! aux->fix_scnlen)
2061 fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l);
2062 else
2063 fprintf (file, "%4ld",
2064 (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base));
2065 }
2066 fprintf (file,
2067 " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u",
2068 aux->u.auxent.x_csect.x_parmhash,
2069 (unsigned int) aux->u.auxent.x_csect.x_snhash,
2070 SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp),
2071 SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp),
2072 (unsigned int) aux->u.auxent.x_csect.x_smclas,
2073 aux->u.auxent.x_csect.x_stab,
2074 (unsigned int) aux->u.auxent.x_csect.x_snstab);
2075 return true;
2076 }
2077#endif
2078
2079 /* Return false to indicate that no special action was taken. */
2080 return false;
2081}
2082
2083/*
2084SUBSUBSECTION
2085 Writing relocations
2086
2087 To write relocations, the back end steps though the
2088 canonical relocation table and create an
2089 @code{internal_reloc}. The symbol index to use is removed from
2090 the @code{offset} field in the symbol table supplied. The
2091 address comes directly from the sum of the section base
2092 address and the relocation offset; the type is dug directly
2093 from the howto field. Then the @code{internal_reloc} is
2094 swapped into the shape of an @code{external_reloc} and written
2095 out to disk.
2096
2097*/
2098
2099#ifdef TARG_AUX
2100
2101static int compare_arelent_ptr PARAMS ((const PTR, const PTR));
2102
2103/* AUX's ld wants relocations to be sorted */
2104static int
2105compare_arelent_ptr (x, y)
2106 const PTR x;
2107 const PTR y;
2108{
2109 const arelent **a = (const arelent **) x;
2110 const arelent **b = (const arelent **) y;
2111 bfd_size_type aadr = (*a)->address;
2112 bfd_size_type badr = (*b)->address;
2113
2114 return (aadr < badr ? -1 : badr < aadr ? 1 : 0);
2115}
2116
2117#endif /* TARG_AUX */
2118
2119static boolean
2120coff_write_relocs (abfd, first_undef)
2121 bfd * abfd;
2122 int first_undef;
2123{
2124 asection *s;
2125
2126 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2127 {
2128 unsigned int i;
2129 struct external_reloc dst;
2130 arelent **p;
2131
2132#ifndef TARG_AUX
2133 p = s->orelocation;
2134#else
2135 /* sort relocations before we write them out */
2136 p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *));
2137 if (p == NULL && s->reloc_count > 0)
2138 return false;
2139 memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *));
2140 qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
2141#endif
2142
2143 if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
2144 return false;
2145 for (i = 0; i < s->reloc_count; i++)
2146 {
2147 struct internal_reloc n;
2148 arelent *q = p[i];
2149 memset ((PTR) & n, 0, sizeof (n));
2150
2151 /* Now we've renumbered the symbols we know where the
2152 undefined symbols live in the table. Check the reloc
2153 entries for symbols who's output bfd isn't the right one.
2154 This is because the symbol was undefined (which means
2155 that all the pointers are never made to point to the same
2156 place). This is a bad thing,'cause the symbols attached
2157 to the output bfd are indexed, so that the relocation
2158 entries know which symbol index they point to. So we
2159 have to look up the output symbol here. */
2160
2161 if (q->sym_ptr_ptr[0]->the_bfd != abfd)
2162 {
2163 int i;
2164 const char *sname = q->sym_ptr_ptr[0]->name;
2165 asymbol **outsyms = abfd->outsymbols;
2166 for (i = first_undef; outsyms[i]; i++)
2167 {
2168 const char *intable = outsyms[i]->name;
2169 if (strcmp (intable, sname) == 0) {
2170 /* got a hit, so repoint the reloc */
2171 q->sym_ptr_ptr = outsyms + i;
2172 break;
2173 }
2174 }
2175 }
2176
2177 n.r_vaddr = q->address + s->vma;
2178
2179#ifdef R_IHCONST
2180 /* The 29k const/consth reloc pair is a real kludge. The consth
2181 part doesn't have a symbol; it has an offset. So rebuilt
2182 that here. */
2183 if (q->howto->type == R_IHCONST)
2184 n.r_symndx = q->addend;
2185 else
2186#endif
2187 if (q->sym_ptr_ptr)
2188 {
2189 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
2190 /* This is a relocation relative to the absolute symbol. */
2191 n.r_symndx = -1;
2192 else
2193 {
2194 n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
2195 /* Take notice if the symbol reloc points to a symbol
2196 we don't have in our symbol table. What should we
2197 do for this?? */
2198 if (n.r_symndx > obj_conv_table_size (abfd))
2199 abort ();
2200 }
2201 }
2202
2203#ifdef SWAP_OUT_RELOC_OFFSET
2204 n.r_offset = q->addend;
2205#endif
2206
2207#ifdef SELECT_RELOC
2208 /* Work out reloc type from what is required */
2209 SELECT_RELOC (n, q->howto);
2210#else
2211 n.r_type = q->howto->type;
2212#endif
2213 coff_swap_reloc_out (abfd, &n, &dst);
2214 if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
2215 return false;
2216 }
2217
2218#ifdef TARG_AUX
2219 if (p != NULL)
2220 free (p);
2221#endif
2222 }
2223
2224 return true;
2225}
2226
2227/* Set flags and magic number of a coff file from architecture and machine
2228 type. Result is true if we can represent the arch&type, false if not. */
2229
2230static boolean
2231coff_set_flags (abfd, magicp, flagsp)
2232 bfd * abfd;
5f771d47
ILT
2233 unsigned int *magicp ATTRIBUTE_UNUSED;
2234 unsigned short *flagsp ATTRIBUTE_UNUSED;
252b5132
RH
2235{
2236 switch (bfd_get_arch (abfd))
2237 {
2238#ifdef Z8KMAGIC
2239 case bfd_arch_z8k:
2240 *magicp = Z8KMAGIC;
2241 switch (bfd_get_mach (abfd))
2242 {
2243 case bfd_mach_z8001:
2244 *flagsp = F_Z8001;
2245 break;
2246 case bfd_mach_z8002:
2247 *flagsp = F_Z8002;
2248 break;
2249 default:
2250 return false;
2251 }
2252 return true;
2253#endif
2254#ifdef I960ROMAGIC
2255
2256 case bfd_arch_i960:
2257
2258 {
2259 unsigned flags;
2260 *magicp = I960ROMAGIC;
2261 /*
2262 ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
2263 I960RWMAGIC); FIXME???
2264 */
2265 switch (bfd_get_mach (abfd))
2266 {
2267 case bfd_mach_i960_core:
2268 flags = F_I960CORE;
2269 break;
2270 case bfd_mach_i960_kb_sb:
2271 flags = F_I960KB;
2272 break;
2273 case bfd_mach_i960_mc:
2274 flags = F_I960MC;
2275 break;
2276 case bfd_mach_i960_xa:
2277 flags = F_I960XA;
2278 break;
2279 case bfd_mach_i960_ca:
2280 flags = F_I960CA;
2281 break;
2282 case bfd_mach_i960_ka_sa:
2283 flags = F_I960KA;
2284 break;
2285 case bfd_mach_i960_jx:
2286 flags = F_I960JX;
2287 break;
2288 case bfd_mach_i960_hx:
2289 flags = F_I960HX;
2290 break;
2291 default:
2292 return false;
2293 }
2294 *flagsp = flags;
2295 return true;
2296 }
2297 break;
2298#endif
2299
2300#ifdef TIC30MAGIC
2301 case bfd_arch_tic30:
2302 *magicp = TIC30MAGIC;
2303 return true;
2304#endif
2305#ifdef TIC80_ARCH_MAGIC
2306 case bfd_arch_tic80:
2307 *magicp = TIC80_ARCH_MAGIC;
2308 return true;
2309#endif
2310#ifdef ARMMAGIC
2311 case bfd_arch_arm:
2312 * magicp = ARMMAGIC;
2313 * flagsp = 0;
2314 if (APCS_SET (abfd))
2315 {
2316 if (APCS_26_FLAG (abfd))
2317 * flagsp |= F_APCS26;
2318
2319 if (APCS_FLOAT_FLAG (abfd))
2320 * flagsp |= F_APCS_FLOAT;
2321
2322 if (PIC_FLAG (abfd))
948221a8 2323 * flagsp |= F_PIC;
252b5132
RH
2324 }
2325 if (INTERWORK_SET (abfd) && INTERWORK_FLAG (abfd))
2326 * flagsp |= F_INTERWORK;
2327 switch (bfd_get_mach (abfd))
2328 {
2329 case bfd_mach_arm_2: * flagsp |= F_ARM_2; break;
2330 case bfd_mach_arm_2a: * flagsp |= F_ARM_2a; break;
2331 case bfd_mach_arm_3: * flagsp |= F_ARM_3; break;
2332 case bfd_mach_arm_3M: * flagsp |= F_ARM_3M; break;
2333 case bfd_mach_arm_4: * flagsp |= F_ARM_4; break;
2334 case bfd_mach_arm_4T: * flagsp |= F_ARM_4T; break;
478d07d6
NC
2335 case bfd_mach_arm_5: * flagsp |= F_ARM_5; break;
2336 case bfd_mach_arm_5T: * flagsp |= F_ARM_5; break; /* XXX - we do not have an F_ARM_5T */
252b5132
RH
2337 }
2338 return true;
2339#endif
2340#ifdef PPCMAGIC
2341 case bfd_arch_powerpc:
2342 *magicp = PPCMAGIC;
2343 return true;
2344 break;
2345#endif
2346#ifdef I386MAGIC
2347 case bfd_arch_i386:
2348 *magicp = I386MAGIC;
2349#ifdef LYNXOS
2350 /* Just overwrite the usual value if we're doing Lynx. */
2351 *magicp = LYNXCOFFMAGIC;
2352#endif
2353 return true;
2354 break;
2355#endif
2356#ifdef I860MAGIC
2357 case bfd_arch_i860:
2358 *magicp = I860MAGIC;
2359 return true;
2360 break;
2361#endif
2362#ifdef MC68MAGIC
2363 case bfd_arch_m68k:
2364#ifdef APOLLOM68KMAGIC
2365 *magicp = APOLLO_COFF_VERSION_NUMBER;
2366#else
2367 /* NAMES_HAVE_UNDERSCORE may be defined by coff-u68k.c. */
2368#ifdef NAMES_HAVE_UNDERSCORE
2369 *magicp = MC68KBCSMAGIC;
2370#else
2371 *magicp = MC68MAGIC;
2372#endif
2373#endif
2374#ifdef LYNXOS
2375 /* Just overwrite the usual value if we're doing Lynx. */
2376 *magicp = LYNXCOFFMAGIC;
2377#endif
2378 return true;
2379 break;
2380#endif
2381
2382#ifdef MC88MAGIC
2383 case bfd_arch_m88k:
2384 *magicp = MC88OMAGIC;
2385 return true;
2386 break;
2387#endif
2388#ifdef H8300MAGIC
2389 case bfd_arch_h8300:
2390 switch (bfd_get_mach (abfd))
2391 {
2392 case bfd_mach_h8300:
2393 *magicp = H8300MAGIC;
2394 return true;
2395 case bfd_mach_h8300h:
2396 *magicp = H8300HMAGIC;
2397 return true;
2398 case bfd_mach_h8300s:
2399 *magicp = H8300SMAGIC;
2400 return true;
2401 }
2402 break;
2403#endif
2404
2405#ifdef SH_ARCH_MAGIC_BIG
2406 case bfd_arch_sh:
2407 if (bfd_big_endian (abfd))
2408 *magicp = SH_ARCH_MAGIC_BIG;
2409 else
2410 *magicp = SH_ARCH_MAGIC_LITTLE;
2411 return true;
2412 break;
2413#endif
2414
2415#ifdef SPARCMAGIC
2416 case bfd_arch_sparc:
2417 *magicp = SPARCMAGIC;
2418#ifdef LYNXOS
2419 /* Just overwrite the usual value if we're doing Lynx. */
2420 *magicp = LYNXCOFFMAGIC;
2421#endif
2422 return true;
2423 break;
2424#endif
2425
2426#ifdef H8500MAGIC
2427 case bfd_arch_h8500:
2428 *magicp = H8500MAGIC;
2429 return true;
2430 break;
2431#endif
2432#ifdef A29K_MAGIC_BIG
2433 case bfd_arch_a29k:
2434 if (bfd_big_endian (abfd))
2435 *magicp = A29K_MAGIC_BIG;
2436 else
2437 *magicp = A29K_MAGIC_LITTLE;
2438 return true;
2439 break;
2440#endif
2441
2442#ifdef WE32KMAGIC
2443 case bfd_arch_we32k:
2444 *magicp = WE32KMAGIC;
2445 return true;
2446 break;
2447#endif
2448
2449#ifdef U802TOCMAGIC
2450 case bfd_arch_rs6000:
2451#ifndef PPCMAGIC
2452 case bfd_arch_powerpc:
2453#endif
2454 *magicp = U802TOCMAGIC;
2455 return true;
2456 break;
2457#endif
2458
2459#ifdef MCOREMAGIC
2460 case bfd_arch_mcore:
2461 * magicp = MCOREMAGIC;
2462 return true;
2463#endif
2464
2465 default: /* Unknown architecture */
2466 /* return false; -- fall through to "return false" below, to avoid
2467 "statement never reached" errors on the one below. */
2468 break;
2469 }
2470
2471 return false;
2472}
2473
2474
2475static boolean
2476coff_set_arch_mach (abfd, arch, machine)
2477 bfd * abfd;
2478 enum bfd_architecture arch;
2479 unsigned long machine;
2480{
2481 unsigned dummy1;
2482 unsigned short dummy2;
2483
2484 if (! bfd_default_set_arch_mach (abfd, arch, machine))
2485 return false;
2486
2487 if (arch != bfd_arch_unknown &&
2488 coff_set_flags (abfd, &dummy1, &dummy2) != true)
2489 return false; /* We can't represent this type */
2490
2491 return true; /* We're easy ... */
2492}
2493
75cc7189
ILT
2494#ifdef COFF_IMAGE_WITH_PE
2495
2496/* This is used to sort sections by VMA, as required by PE image
2497 files. */
2498
2499static int sort_by_secaddr PARAMS ((const PTR, const PTR));
2500
2501static int
2502sort_by_secaddr (arg1, arg2)
2503 const PTR arg1;
2504 const PTR arg2;
2505{
2506 const asection *a = *(const asection **) arg1;
2507 const asection *b = *(const asection **) arg2;
2508
2509 if (a->vma < b->vma)
2510 return -1;
2511 else if (a->vma > b->vma)
2512 return 1;
2513 else
2514 return 0;
2515}
2516
2517#endif /* COFF_IMAGE_WITH_PE */
252b5132
RH
2518
2519/* Calculate the file position for each section. */
2520
2521#ifndef I960
2522#define ALIGN_SECTIONS_IN_FILE
2523#endif
2524#ifdef TIC80COFF
2525#undef ALIGN_SECTIONS_IN_FILE
2526#endif
2527
2528static boolean
2529coff_compute_section_file_positions (abfd)
2530 bfd * abfd;
2531{
2532 asection *current;
2533 asection *previous = (asection *) NULL;
2534 file_ptr sofar = FILHSZ;
2535 boolean align_adjust;
252b5132
RH
2536#ifdef ALIGN_SECTIONS_IN_FILE
2537 file_ptr old_sofar;
2538#endif
2539
2540#ifdef RS6000COFF_C
2541 /* On XCOFF, if we have symbols, set up the .debug section. */
2542 if (bfd_get_symcount (abfd) > 0)
2543 {
2544 bfd_size_type sz;
2545 bfd_size_type i, symcount;
2546 asymbol **symp;
2547
2548 sz = 0;
2549 symcount = bfd_get_symcount (abfd);
2550 for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++)
2551 {
2552 coff_symbol_type *cf;
2553
2554 cf = coff_symbol_from (abfd, *symp);
2555 if (cf != NULL
2556 && cf->native != NULL
2557 && SYMNAME_IN_DEBUG (&cf->native->u.syment))
2558 {
2559 size_t len;
2560
2561 len = strlen (bfd_asymbol_name (*symp));
2562 if (len > SYMNMLEN)
2563 sz += len + 3;
2564 }
2565 }
2566 if (sz > 0)
2567 {
2568 asection *dsec;
2569
2570 dsec = bfd_make_section_old_way (abfd, ".debug");
2571 if (dsec == NULL)
2572 abort ();
2573 dsec->_raw_size = sz;
2574 dsec->flags |= SEC_HAS_CONTENTS;
2575 }
2576 }
2577#endif
2578
2579#ifdef COFF_IMAGE_WITH_PE
2580 int page_size;
2581 if (coff_data (abfd)->link_info)
2582 {
2583 page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
2584 }
2585 else
2586 page_size = PE_DEF_FILE_ALIGNMENT;
2587#else
2588#ifdef COFF_PAGE_SIZE
2589 int page_size = COFF_PAGE_SIZE;
2590#endif
2591#endif
2592
2593 if (bfd_get_start_address (abfd))
2594 {
2595 /* A start address may have been added to the original file. In this
2596 case it will need an optional header to record it. */
2597 abfd->flags |= EXEC_P;
2598 }
2599
2600 if (abfd->flags & EXEC_P)
2601 sofar += AOUTSZ;
2602#ifdef RS6000COFF_C
2603 else if (xcoff_data (abfd)->full_aouthdr)
2604 sofar += AOUTSZ;
2605 else
2606 sofar += SMALL_AOUTSZ;
2607#endif
2608
2609 sofar += abfd->section_count * SCNHSZ;
2610
2611#ifdef RS6000COFF_C
2612 /* XCOFF handles overflows in the reloc and line number count fields
2613 by allocating a new section header to hold the correct counts. */
2614 for (current = abfd->sections; current != NULL; current = current->next)
2615 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
2616 sofar += SCNHSZ;
2617#endif
2618
75cc7189
ILT
2619#ifdef COFF_IMAGE_WITH_PE
2620 {
2621 /* PE requires the sections to be in memory order when listed in
2622 the section headers. It also does not like empty loadable
2623 sections. The sections apparently do not have to be in the
2624 right order in the image file itself, but we do need to get the
2625 target_index values right. */
2626
2627 int count;
2628 asection **section_list;
2629 int i;
2630 int target_index;
2631
2632 count = 0;
2633 for (current = abfd->sections; current != NULL; current = current->next)
2634 ++count;
2635
2636 /* We allocate an extra cell to simplify the final loop. */
2637 section_list = bfd_malloc (sizeof (struct asection *) * (count + 1));
2638 if (section_list == NULL)
2639 return false;
2640
2641 i = 0;
2642 for (current = abfd->sections; current != NULL; current = current->next)
2643 {
2644 section_list[i] = current;
2645 ++i;
2646 }
2647 section_list[i] = NULL;
2648
2649 qsort (section_list, count, sizeof (asection *), sort_by_secaddr);
2650
2651 /* Rethread the linked list into sorted order; at the same time,
2652 assign target_index values. */
2653 target_index = 1;
2654 abfd->sections = section_list[0];
2655 for (i = 0; i < count; i++)
2656 {
2657 current = section_list[i];
2658 current->next = section_list[i + 1];
2659
2660 /* Later, if the section has zero size, we'll be throwing it
2661 away, so we don't want to number it now. Note that having
2662 a zero size and having real contents are different
2663 concepts: .bss has no contents, but (usually) non-zero
2664 size. */
2665 if (current->_raw_size == 0)
2666 {
2667 /* Discard. However, it still might have (valid) symbols
2668 in it, so arbitrarily set it to section 1 (indexing is
2669 1-based here; usually .text). __end__ and other
2670 contents of .endsection really have this happen.
2671 FIXME: This seems somewhat dubious. */
2672 current->target_index = 1;
2673 }
2674 else
2675 current->target_index = target_index++;
2676 }
2677
2678 free (section_list);
2679 }
2680#else /* ! COFF_IMAGE_WITH_PE */
2681 {
2682 /* Set the target_index field. */
2683 int target_index;
2684
2685 target_index = 1;
2686 for (current = abfd->sections; current != NULL; current = current->next)
2687 current->target_index = target_index++;
2688 }
2689#endif /* ! COFF_IMAGE_WITH_PE */
2690
252b5132 2691 align_adjust = false;
75cc7189 2692 for (current = abfd->sections;
252b5132 2693 current != (asection *) NULL;
75cc7189 2694 current = current->next)
252b5132
RH
2695 {
2696#ifdef COFF_IMAGE_WITH_PE
75cc7189
ILT
2697 /* With PE we have to pad each section to be a multiple of its
2698 page size too, and remember both sizes. */
2699 if (coff_section_data (abfd, current) == NULL)
252b5132 2700 {
75cc7189
ILT
2701 current->used_by_bfd =
2702 (PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata));
2703 if (current->used_by_bfd == NULL)
2704 return false;
252b5132 2705 }
75cc7189
ILT
2706 if (pei_section_data (abfd, current) == NULL)
2707 {
2708 coff_section_data (abfd, current)->tdata =
2709 (PTR) bfd_zalloc (abfd, sizeof (struct pei_section_tdata));
2710 if (coff_section_data (abfd, current)->tdata == NULL)
2711 return false;
2712 }
2713 if (pei_section_data (abfd, current)->virt_size == 0)
2714 pei_section_data (abfd, current)->virt_size = current->_raw_size;
252b5132
RH
2715#endif
2716
75cc7189 2717 /* Only deal with sections which have contents. */
252b5132
RH
2718 if (!(current->flags & SEC_HAS_CONTENTS))
2719 continue;
2720
75cc7189
ILT
2721#ifdef COFF_IMAGE_WITH_PE
2722 /* Make sure we skip empty sections in a PE image. */
2723 if (current->_raw_size == 0)
2724 continue;
2725#endif
2726
252b5132
RH
2727 /* Align the sections in the file to the same boundary on
2728 which they are aligned in virtual memory. I960 doesn't
2729 do this (FIXME) so we can stay in sync with Intel. 960
2730 doesn't yet page from files... */
2731#ifdef ALIGN_SECTIONS_IN_FILE
2732 if ((abfd->flags & EXEC_P) != 0)
2733 {
2734 /* make sure this section is aligned on the right boundary - by
2735 padding the previous section up if necessary */
2736
2737 old_sofar = sofar;
2738 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2739 if (previous != (asection *) NULL)
2740 {
2741 previous->_raw_size += sofar - old_sofar;
2742 }
2743 }
2744
2745#endif
2746
2747 /* In demand paged files the low order bits of the file offset
2748 must match the low order bits of the virtual address. */
2749#ifdef COFF_PAGE_SIZE
2750 if ((abfd->flags & D_PAGED) != 0
2751 && (current->flags & SEC_ALLOC) != 0)
2752 sofar += (current->vma - sofar) % page_size;
2753#endif
2754 current->filepos = sofar;
2755
2756#ifdef COFF_IMAGE_WITH_PE
75cc7189 2757 /* Set the padded size. */
252b5132
RH
2758 current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
2759#endif
2760
2761 sofar += current->_raw_size;
2762
2763#ifdef ALIGN_SECTIONS_IN_FILE
2764 /* make sure that this section is of the right size too */
2765 if ((abfd->flags & EXEC_P) == 0)
2766 {
2767 bfd_size_type old_size;
2768
2769 old_size = current->_raw_size;
2770 current->_raw_size = BFD_ALIGN (current->_raw_size,
2771 1 << current->alignment_power);
2772 align_adjust = current->_raw_size != old_size;
2773 sofar += current->_raw_size - old_size;
2774 }
2775 else
2776 {
2777 old_sofar = sofar;
2778 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
2779 align_adjust = sofar != old_sofar;
2780 current->_raw_size += sofar - old_sofar;
2781 }
2782#endif
2783
2784#ifdef COFF_IMAGE_WITH_PE
2785 /* For PE we need to make sure we pad out to the aligned
2786 _raw_size, in case the caller only writes out data to the
2787 unaligned _raw_size. */
2788 if (pei_section_data (abfd, current)->virt_size < current->_raw_size)
2789 align_adjust = true;
2790#endif
2791
2792#ifdef _LIB
2793 /* Force .lib sections to start at zero. The vma is then
2794 incremented in coff_set_section_contents. This is right for
2795 SVR3.2. */
2796 if (strcmp (current->name, _LIB) == 0)
2797 bfd_set_section_vma (abfd, current, 0);
2798#endif
2799
2800 previous = current;
2801 }
2802
2803 /* It is now safe to write to the output file. If we needed an
2804 alignment adjustment for the last section, then make sure that
2805 there is a byte at offset sofar. If there are no symbols and no
2806 relocs, then nothing follows the last section. If we don't force
2807 the last byte out, then the file may appear to be truncated. */
2808 if (align_adjust)
2809 {
2810 bfd_byte b;
2811
2812 b = 0;
2813 if (bfd_seek (abfd, sofar - 1, SEEK_SET) != 0
2814 || bfd_write (&b, 1, 1, abfd) != 1)
2815 return false;
2816 }
2817
2818 /* Make sure the relocations are aligned. We don't need to make
2819 sure that this byte exists, because it will only matter if there
2820 really are relocs. */
2821 sofar = BFD_ALIGN (sofar, 1 << COFF_DEFAULT_SECTION_ALIGNMENT_POWER);
2822
2823 obj_relocbase (abfd) = sofar;
2824 abfd->output_has_begun = true;
2825
2826 return true;
2827}
2828
2829#if 0
2830
2831/* This can never work, because it is called too late--after the
2832 section positions have been set. I can't figure out what it is
2833 for, so I am going to disable it--Ian Taylor 20 March 1996. */
2834
2835/* If .file, .text, .data, .bss symbols are missing, add them. */
2836/* @@ Should we only be adding missing symbols, or overriding the aux
2837 values for existing section symbols? */
2838static boolean
2839coff_add_missing_symbols (abfd)
2840 bfd *abfd;
2841{
2842 unsigned int nsyms = bfd_get_symcount (abfd);
2843 asymbol **sympp = abfd->outsymbols;
2844 asymbol **sympp2;
2845 unsigned int i;
2846 int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
2847
2848 for (i = 0; i < nsyms; i++)
2849 {
2850 coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
2851 CONST char *name;
2852 if (csym)
2853 {
2854 /* only do this if there is a coff representation of the input
2855 symbol */
2856 if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
2857 {
2858 need_file = 0;
2859 continue;
2860 }
2861 name = csym->symbol.name;
2862 if (!name)
2863 continue;
2864 if (!strcmp (name, _TEXT))
2865 need_text = 0;
2866#ifdef APOLLO_M68
2867 else if (!strcmp (name, ".wtext"))
2868 need_text = 0;
2869#endif
2870 else if (!strcmp (name, _DATA))
2871 need_data = 0;
2872 else if (!strcmp (name, _BSS))
2873 need_bss = 0;
2874 }
2875 }
2876 /* Now i == bfd_get_symcount (abfd). */
2877 /* @@ For now, don't deal with .file symbol. */
2878 need_file = 0;
2879
2880 if (!need_text && !need_data && !need_bss && !need_file)
2881 return true;
2882 nsyms += need_text + need_data + need_bss + need_file;
2883 sympp2 = (asymbol **) bfd_alloc (abfd, nsyms * sizeof (asymbol *));
2884 if (!sympp2)
2885 return false;
2886 memcpy (sympp2, sympp, i * sizeof (asymbol *));
2887 if (need_file)
2888 {
2889 /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */
2890 abort ();
2891 }
2892 if (need_text)
2893 sympp2[i++] = coff_section_symbol (abfd, _TEXT);
2894 if (need_data)
2895 sympp2[i++] = coff_section_symbol (abfd, _DATA);
2896 if (need_bss)
2897 sympp2[i++] = coff_section_symbol (abfd, _BSS);
2898 BFD_ASSERT (i == nsyms);
2899 bfd_set_symtab (abfd, sympp2, nsyms);
2900 return true;
2901}
2902
2903#endif /* 0 */
2904
2905/* SUPPRESS 558 */
2906/* SUPPRESS 529 */
2907static boolean
2908coff_write_object_contents (abfd)
2909 bfd * abfd;
2910{
2911 asection *current;
2912 boolean hasrelocs = false;
2913 boolean haslinno = false;
4cfec37b 2914 boolean hasdebug = false;
252b5132
RH
2915 file_ptr scn_base;
2916 file_ptr reloc_base;
2917 file_ptr lineno_base;
2918 file_ptr sym_base;
2919 unsigned long reloc_size = 0;
2920 unsigned long lnno_size = 0;
2921 boolean long_section_names;
2922 asection *text_sec = NULL;
2923 asection *data_sec = NULL;
2924 asection *bss_sec = NULL;
2925 struct internal_filehdr internal_f;
2926 struct internal_aouthdr internal_a;
2927#ifdef COFF_LONG_SECTION_NAMES
2928 size_t string_size = STRING_SIZE_SIZE;
2929#endif
2930
2931 bfd_set_error (bfd_error_system_call);
2932
2933 /* Make a pass through the symbol table to count line number entries and
2934 put them into the correct asections */
2935
2936 lnno_size = coff_count_linenumbers (abfd) * LINESZ;
2937
2938 if (abfd->output_has_begun == false)
2939 {
2940 if (! coff_compute_section_file_positions (abfd))
2941 return false;
2942 }
2943
2944 reloc_base = obj_relocbase (abfd);
2945
2946 /* Work out the size of the reloc and linno areas */
2947
2948 for (current = abfd->sections; current != NULL; current =
2949 current->next)
2950 reloc_size += current->reloc_count * RELSZ;
2951
2952 lineno_base = reloc_base + reloc_size;
2953 sym_base = lineno_base + lnno_size;
2954
2955 /* Indicate in each section->line_filepos its actual file address */
2956 for (current = abfd->sections; current != NULL; current =
2957 current->next)
2958 {
2959 if (current->lineno_count)
2960 {
2961 current->line_filepos = lineno_base;
2962 current->moving_line_filepos = lineno_base;
2963 lineno_base += current->lineno_count * LINESZ;
2964 }
2965 else
2966 {
2967 current->line_filepos = 0;
2968 }
2969 if (current->reloc_count)
2970 {
2971 current->rel_filepos = reloc_base;
2972 reloc_base += current->reloc_count * RELSZ;
2973 }
2974 else
2975 {
2976 current->rel_filepos = 0;
2977 }
2978 }
2979
2980 /* Write section headers to the file. */
2981 internal_f.f_nscns = 0;
2982
2983 if ((abfd->flags & EXEC_P) != 0)
2984 scn_base = FILHSZ + AOUTSZ;
2985 else
2986 {
2987 scn_base = FILHSZ;
2988#ifdef RS6000COFF_C
2989 if (xcoff_data (abfd)->full_aouthdr)
2990 scn_base += AOUTSZ;
2991 else
2992 scn_base += SMALL_AOUTSZ;
2993#endif
2994 }
2995
2996 if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
2997 return false;
2998
2999 long_section_names = false;
3000 for (current = abfd->sections;
3001 current != NULL;
3002 current = current->next)
3003 {
3004 struct internal_scnhdr section;
4cfec37b 3005 boolean is_reloc_section = false;
252b5132
RH
3006
3007#ifdef COFF_IMAGE_WITH_PE
3008 if (strcmp (current->name, ".reloc") == 0)
3009 {
4cfec37b
ILT
3010 is_reloc_section = true;
3011 hasrelocs = true;
252b5132
RH
3012 pe_data (abfd)->has_reloc_section = 1;
3013 }
3014#endif
3015
252b5132
RH
3016 internal_f.f_nscns++;
3017
3018 strncpy (section.s_name, current->name, SCNNMLEN);
3019
3020#ifdef COFF_LONG_SECTION_NAMES
3021 /* Handle long section names as in PE. This must be compatible
00692651 3022 with the code in coff_write_symbols and _bfd_coff_final_link. */
252b5132
RH
3023 {
3024 size_t len;
3025
3026 len = strlen (current->name);
3027 if (len > SCNNMLEN)
3028 {
3029 memset (section.s_name, 0, SCNNMLEN);
3030 sprintf (section.s_name, "/%lu", (unsigned long) string_size);
3031 string_size += len + 1;
3032 long_section_names = true;
3033 }
3034 }
3035#endif
3036
3037#ifdef _LIB
3038 /* Always set s_vaddr of .lib to 0. This is right for SVR3.2
3039 Ian Taylor <ian@cygnus.com>. */
3040 if (strcmp (current->name, _LIB) == 0)
3041 section.s_vaddr = 0;
3042 else
3043#endif
3044 section.s_vaddr = current->vma;
3045 section.s_paddr = current->lma;
3046 section.s_size = current->_raw_size;
3047
3048#ifdef COFF_WITH_PE
3049 section.s_paddr = 0;
3050#endif
3051#ifdef COFF_IMAGE_WITH_PE
3052 /* Reminder: s_paddr holds the virtual size of the section. */
3053 if (coff_section_data (abfd, current) != NULL
3054 && pei_section_data (abfd, current) != NULL)
3055 section.s_paddr = pei_section_data (abfd, current)->virt_size;
3056 else
3057 section.s_paddr = 0;
3058#endif
3059
3060 /*
3061 If this section has no size or is unloadable then the scnptr
3062 will be 0 too
3063 */
3064 if (current->_raw_size == 0 ||
3065 (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
3066 {
3067 section.s_scnptr = 0;
3068 }
3069 else
3070 {
3071 section.s_scnptr = current->filepos;
3072 }
3073 section.s_relptr = current->rel_filepos;
3074 section.s_lnnoptr = current->line_filepos;
3075 section.s_nreloc = current->reloc_count;
3076 section.s_nlnno = current->lineno_count;
3077 if (current->reloc_count != 0)
3078 hasrelocs = true;
3079 if (current->lineno_count != 0)
3080 haslinno = true;
4cfec37b
ILT
3081 if ((current->flags & SEC_DEBUGGING) != 0
3082 && ! is_reloc_section)
3083 hasdebug = true;
252b5132
RH
3084
3085#ifdef RS6000COFF_C
3086 /* Indicate the use of an XCOFF overflow section header. */
3087 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3088 {
3089 section.s_nreloc = 0xffff;
3090 section.s_nlnno = 0xffff;
3091 }
3092#endif
3093
3094 section.s_flags = sec_to_styp_flags (current->name, current->flags);
3095
3096 if (!strcmp (current->name, _TEXT))
3097 {
3098 text_sec = current;
3099 }
3100 else if (!strcmp (current->name, _DATA))
3101 {
3102 data_sec = current;
3103 }
3104 else if (!strcmp (current->name, _BSS))
3105 {
3106 bss_sec = current;
3107 }
3108
3109#ifdef I960
3110 section.s_align = (current->alignment_power
3111 ? 1 << current->alignment_power
3112 : 0);
3113#else
3114#ifdef TIC80COFF
3115 section.s_flags |= (current->alignment_power & 0xF) << 8;
3116#endif
3117#endif
3118
3119#ifdef COFF_IMAGE_WITH_PE
00692651
ILT
3120 /* Suppress output of the sections if they are null. ld
3121 includes the bss and data sections even if there is no size
3122 assigned to them. NT loader doesn't like it if these section
3123 headers are included if the sections themselves are not
3124 needed. See also coff_compute_section_file_positions. */
252b5132
RH
3125 if (section.s_size == 0)
3126 internal_f.f_nscns--;
3127 else
3128#endif
3129 {
3130 SCNHDR buff;
3131 if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
3132 || bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
3133 return false;
3134 }
3135
3136#ifdef COFF_WITH_PE
3137 /* PE stores COMDAT section information in the symbol table. If
3138 this section is supposed to have some COMDAT info, track down
3139 the symbol in the symbol table and modify it. */
3140 if ((current->flags & SEC_LINK_ONCE) != 0)
3141 {
3142 unsigned int i, count;
3143 asymbol **psym;
3144 coff_symbol_type *csym = NULL;
3145 asymbol **psymsec;
3146
3147 psymsec = NULL;
3148 count = bfd_get_symcount (abfd);
3149 for (i = 0, psym = abfd->outsymbols; i < count; i++, psym++)
3150 {
3151 if ((*psym)->section != current)
3152 continue;
3153
3154 /* Remember the location of the first symbol in this
3155 section. */
3156 if (psymsec == NULL)
3157 psymsec = psym;
3158
3159 /* See if this is the section symbol. */
3160 if (strcmp ((*psym)->name, current->name) == 0)
3161 {
3162 csym = coff_symbol_from (abfd, *psym);
3163 if (csym == NULL
3164 || csym->native == NULL
3165 || csym->native->u.syment.n_numaux < 1
3166 || csym->native->u.syment.n_sclass != C_STAT
3167 || csym->native->u.syment.n_type != T_NULL)
3168 continue;
3169
3170 /* Here *PSYM is the section symbol for CURRENT. */
3171
3172 break;
3173 }
3174 }
3175
3176 /* Did we find it?
3177 Note that we might not if we're converting the file from
3178 some other object file format. */
3179 if (i < count)
3180 {
3181 combined_entry_type *aux;
3182
3183 /* We don't touch the x_checksum field. The
3184 x_associated field is not currently supported. */
3185
3186 aux = csym->native + 1;
3187 switch (current->flags & SEC_LINK_DUPLICATES)
3188 {
3189 case SEC_LINK_DUPLICATES_DISCARD:
3190 aux->u.auxent.x_scn.x_comdat = IMAGE_COMDAT_SELECT_ANY;
3191 break;
3192
3193 case SEC_LINK_DUPLICATES_ONE_ONLY:
3194 aux->u.auxent.x_scn.x_comdat =
3195 IMAGE_COMDAT_SELECT_NODUPLICATES;
3196 break;
3197
3198 case SEC_LINK_DUPLICATES_SAME_SIZE:
3199 aux->u.auxent.x_scn.x_comdat =
3200 IMAGE_COMDAT_SELECT_SAME_SIZE;
3201 break;
3202
3203 case SEC_LINK_DUPLICATES_SAME_CONTENTS:
3204 aux->u.auxent.x_scn.x_comdat =
3205 IMAGE_COMDAT_SELECT_EXACT_MATCH;
3206 break;
3207 }
3208
3209 /* The COMDAT symbol must be the first symbol from this
3210 section in the symbol table. In order to make this
3211 work, we move the COMDAT symbol before the first
3212 symbol we found in the search above. It's OK to
3213 rearrange the symbol table at this point, because
3214 coff_renumber_symbols is going to rearrange it
3215 further and fix up all the aux entries. */
3216 if (psym != psymsec)
3217 {
3218 asymbol *hold;
3219 asymbol **pcopy;
3220
3221 hold = *psym;
3222 for (pcopy = psym; pcopy > psymsec; pcopy--)
3223 pcopy[0] = pcopy[-1];
3224 *psymsec = hold;
3225 }
3226 }
3227 }
3228#endif /* COFF_WITH_PE */
3229 }
3230
3231#ifdef RS6000COFF_C
3232 /* XCOFF handles overflows in the reloc and line number count fields
3233 by creating a new section header to hold the correct values. */
3234 for (current = abfd->sections; current != NULL; current = current->next)
3235 {
3236 if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff)
3237 {
3238 struct internal_scnhdr scnhdr;
3239 SCNHDR buff;
3240
3241 internal_f.f_nscns++;
3242 strncpy (&(scnhdr.s_name[0]), current->name, 8);
3243 scnhdr.s_paddr = current->reloc_count;
3244 scnhdr.s_vaddr = current->lineno_count;
3245 scnhdr.s_size = 0;
3246 scnhdr.s_scnptr = 0;
3247 scnhdr.s_relptr = current->rel_filepos;
3248 scnhdr.s_lnnoptr = current->line_filepos;
3249 scnhdr.s_nreloc = current->target_index;
3250 scnhdr.s_nlnno = current->target_index;
3251 scnhdr.s_flags = STYP_OVRFLO;
3252 if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0
3253 || bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ)
3254 return false;
3255 }
3256 }
3257#endif
3258
3259 /* OK, now set up the filehdr... */
3260
3261 /* Don't include the internal abs section in the section count */
3262
3263 /*
3264 We will NOT put a fucking timestamp in the header here. Every time you
3265 put it back, I will come in and take it out again. I'm sorry. This
3266 field does not belong here. We fill it with a 0 so it compares the
3267 same but is not a reasonable time. -- gnu@cygnus.com
3268 */
3269 internal_f.f_timdat = 0;
3270
3271 internal_f.f_flags = 0;
3272
3273 if (abfd->flags & EXEC_P)
3274 internal_f.f_opthdr = AOUTSZ;
3275 else
3276 {
3277 internal_f.f_opthdr = 0;
3278#ifdef RS6000COFF_C
3279 if (xcoff_data (abfd)->full_aouthdr)
3280 internal_f.f_opthdr = AOUTSZ;
3281 else
3282 internal_f.f_opthdr = SMALL_AOUTSZ;
3283#endif
3284 }
3285
3286 if (!hasrelocs)
3287 internal_f.f_flags |= F_RELFLG;
3288 if (!haslinno)
3289 internal_f.f_flags |= F_LNNO;
3290 if (abfd->flags & EXEC_P)
3291 internal_f.f_flags |= F_EXEC;
4cfec37b
ILT
3292#ifdef COFF_IMAGE_WITH_PE
3293 if (! hasdebug)
3294 internal_f.f_flags |= IMAGE_FILE_DEBUG_STRIPPED;
3295#endif
252b5132 3296
8a1ad8e7 3297#ifndef COFF_WITH_PE
252b5132
RH
3298 if (bfd_little_endian (abfd))
3299 internal_f.f_flags |= F_AR32WR;
3300 else
3301 internal_f.f_flags |= F_AR32W;
8a1ad8e7 3302#endif
252b5132
RH
3303
3304#ifdef TIC80_TARGET_ID
3305 internal_f.f_target_id = TIC80_TARGET_ID;
3306#endif
3307
3308 /*
3309 FIXME, should do something about the other byte orders and
3310 architectures.
3311 */
3312
3313#ifdef RS6000COFF_C
3314 if ((abfd->flags & DYNAMIC) != 0)
3315 internal_f.f_flags |= F_SHROBJ;
3316 if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
3317 internal_f.f_flags |= F_DYNLOAD;
3318#endif
3319
3320 memset (&internal_a, 0, sizeof internal_a);
3321
3322 /* Set up architecture-dependent stuff */
3323
3324 {
3325 unsigned int magic = 0;
3326 unsigned short flags = 0;
3327 coff_set_flags (abfd, &magic, &flags);
3328 internal_f.f_magic = magic;
3329 internal_f.f_flags |= flags;
3330 /* ...and the "opt"hdr... */
3331
3332#ifdef A29K
3333#ifdef ULTRA3 /* NYU's machine */
3334 /* FIXME: This is a bogus check. I really want to see if there
3335 * is a .shbss or a .shdata section, if so then set the magic
3336 * number to indicate a shared data executable.
3337 */
3338 if (internal_f.f_nscns >= 7)
3339 internal_a.magic = SHMAGIC; /* Shared magic */
3340 else
3341#endif /* ULTRA3 */
3342 internal_a.magic = NMAGIC; /* Assume separate i/d */
3343#define __A_MAGIC_SET__
3344#endif /* A29K */
3345#ifdef TIC80COFF
3346 internal_a.magic = TIC80_ARCH_MAGIC;
3347#define __A_MAGIC_SET__
3348#endif /* TIC80 */
3349#ifdef I860
3350 /* FIXME: What are the a.out magic numbers for the i860? */
3351 internal_a.magic = 0;
3352#define __A_MAGIC_SET__
3353#endif /* I860 */
3354#ifdef I960
3355 internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
3356#define __A_MAGIC_SET__
3357#endif /* I960 */
3358#if M88
3359#define __A_MAGIC_SET__
3360 internal_a.magic = PAGEMAGICBCS;
3361#endif /* M88 */
3362
3363#if APOLLO_M68
3364#define __A_MAGIC_SET__
3365 internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
3366#endif
3367
3368#if defined(M68) || defined(WE32K) || defined(M68K)
3369#define __A_MAGIC_SET__
3370#if defined(LYNXOS)
3371 internal_a.magic = LYNXCOFFMAGIC;
3372#else
3373#if defined(TARG_AUX)
3374 internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED :
3375 abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED :
3376 PAGEMAGICEXECSWAPPED);
3377#else
3378#if defined (PAGEMAGICPEXECPAGED)
3379 internal_a.magic = PAGEMAGICPEXECPAGED;
3380#endif
3381#endif /* TARG_AUX */
3382#endif /* LYNXOS */
3383#endif /* M68 || WE32K || M68K */
3384
3385#if defined(ARM)
3386#define __A_MAGIC_SET__
3387 internal_a.magic = ZMAGIC;
3388#endif
3389
3390#if defined(PPC_PE)
3391#define __A_MAGIC_SET__
3392 internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3393#endif
3394
3395#if defined MCORE_PE
3396#define __A_MAGIC_SET__
3397 internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
3398#endif
3399
3400#if defined(I386)
3401#define __A_MAGIC_SET__
3402#if defined(LYNXOS)
3403 internal_a.magic = LYNXCOFFMAGIC;
3404#else /* LYNXOS */
3405 internal_a.magic = ZMAGIC;
3406#endif /* LYNXOS */
3407#endif /* I386 */
3408
3409#if defined(SPARC)
3410#define __A_MAGIC_SET__
3411#if defined(LYNXOS)
3412 internal_a.magic = LYNXCOFFMAGIC;
3413#endif /* LYNXOS */
3414#endif /* SPARC */
3415
3416#ifdef RS6000COFF_C
3417#define __A_MAGIC_SET__
3418 internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
3419 (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
3420 RS6K_AOUTHDR_OMAGIC;
3421#endif
3422
3423#ifndef __A_MAGIC_SET__
3424#include "Your aouthdr magic number is not being set!"
3425#else
3426#undef __A_MAGIC_SET__
3427#endif
3428 }
3429
3430 /* FIXME: Does anybody ever set this to another value? */
3431 internal_a.vstamp = 0;
3432
3433 /* Now should write relocs, strings, syms */
3434 obj_sym_filepos (abfd) = sym_base;
3435
3436 if (bfd_get_symcount (abfd) != 0)
3437 {
3438 int firstundef;
3439#if 0
3440 if (!coff_add_missing_symbols (abfd))
3441 return false;
3442#endif
3443 if (!coff_renumber_symbols (abfd, &firstundef))
3444 return false;
3445 coff_mangle_symbols (abfd);
3446 if (! coff_write_symbols (abfd))
3447 return false;
3448 if (! coff_write_linenumbers (abfd))
3449 return false;
3450 if (! coff_write_relocs (abfd, firstundef))
3451 return false;
3452 }
3453#ifdef COFF_LONG_SECTION_NAMES
3454 else if (long_section_names)
3455 {
3456 /* If we have long section names we have to write out the string
3457 table even if there are no symbols. */
3458 if (! coff_write_symbols (abfd))
3459 return false;
3460 }
3461#endif
3462#ifdef COFF_IMAGE_WITH_PE
3463#ifdef PPC_PE
3464 else if ((abfd->flags & EXEC_P) != 0)
3465 {
3466 bfd_byte b;
3467
3468 /* PowerPC PE appears to require that all executable files be
3469 rounded up to the page size. */
3470 b = 0;
3471 if (bfd_seek (abfd,
3472 BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1,
3473 SEEK_SET) != 0
3474 || bfd_write (&b, 1, 1, abfd) != 1)
3475 return false;
3476 }
3477#endif
3478#endif
3479
3480 /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
3481 backend linker, and obj_raw_syment_count is not valid until after
3482 coff_write_symbols is called. */
3483 if (obj_raw_syment_count (abfd) != 0)
3484 {
3485 internal_f.f_symptr = sym_base;
3486#ifdef RS6000COFF_C
3487 /* AIX appears to require that F_RELFLG not be set if there are
3488 local symbols but no relocations. */
3489 internal_f.f_flags &=~ F_RELFLG;
3490#endif
3491 }
3492 else
3493 {
3494 if (long_section_names)
3495 internal_f.f_symptr = sym_base;
3496 else
3497 internal_f.f_symptr = 0;
3498 internal_f.f_flags |= F_LSYMS;
3499 }
3500
3501 if (text_sec)
3502 {
3503 internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
3504 internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
3505 }
3506 if (data_sec)
3507 {
3508 internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
3509 internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
3510 }
3511 if (bss_sec)
3512 {
3513 internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
3514 if (internal_a.bsize && bss_sec->vma < internal_a.data_start)
3515 internal_a.data_start = bss_sec->vma;
3516 }
3517
3518 internal_a.entry = bfd_get_start_address (abfd);
3519 internal_f.f_nsyms = obj_raw_syment_count (abfd);
3520
3521#ifdef RS6000COFF_C
3522 if (xcoff_data (abfd)->full_aouthdr)
3523 {
3524 bfd_vma toc;
3525 asection *loader_sec;
3526
3527 internal_a.vstamp = 1;
3528
3529 internal_a.o_snentry = xcoff_data (abfd)->snentry;
3530 if (internal_a.o_snentry == 0)
3531 internal_a.entry = (bfd_vma) -1;
3532
3533 if (text_sec != NULL)
3534 {
3535 internal_a.o_sntext = text_sec->target_index;
3536 internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
3537 }
3538 else
3539 {
3540 internal_a.o_sntext = 0;
3541 internal_a.o_algntext = 0;
3542 }
3543 if (data_sec != NULL)
3544 {
3545 internal_a.o_sndata = data_sec->target_index;
3546 internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
3547 }
3548 else
3549 {
3550 internal_a.o_sndata = 0;
3551 internal_a.o_algndata = 0;
3552 }
3553 loader_sec = bfd_get_section_by_name (abfd, ".loader");
3554 if (loader_sec != NULL)
3555 internal_a.o_snloader = loader_sec->target_index;
3556 else
3557 internal_a.o_snloader = 0;
3558 if (bss_sec != NULL)
3559 internal_a.o_snbss = bss_sec->target_index;
3560 else
3561 internal_a.o_snbss = 0;
3562
3563 toc = xcoff_data (abfd)->toc;
3564 internal_a.o_toc = toc;
3565 internal_a.o_sntoc = xcoff_data (abfd)->sntoc;
3566
3567 internal_a.o_modtype = xcoff_data (abfd)->modtype;
3568 if (xcoff_data (abfd)->cputype != -1)
3569 internal_a.o_cputype = xcoff_data (abfd)->cputype;
3570 else
3571 {
3572 switch (bfd_get_arch (abfd))
3573 {
3574 case bfd_arch_rs6000:
3575 internal_a.o_cputype = 4;
3576 break;
3577 case bfd_arch_powerpc:
3578 if (bfd_get_mach (abfd) == 0)
3579 internal_a.o_cputype = 3;
3580 else
3581 internal_a.o_cputype = 1;
3582 break;
3583 default:
3584 abort ();
3585 }
3586 }
3587 internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
3588 internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
3589 }
3590#endif
3591
3592 /* now write them */
3593 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3594 return false;
3595 {
3596 char buff[FILHSZ];
3597 coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) buff);
3598 if (bfd_write ((PTR) buff, 1, FILHSZ, abfd) != FILHSZ)
3599 return false;
3600 }
3601 if (abfd->flags & EXEC_P)
3602 {
3603 /* Note that peicode.h fills in a PEAOUTHDR, not an AOUTHDR.
3604 include/coff/pe.h sets AOUTSZ == sizeof(PEAOUTHDR)) */
3605 char buff[AOUTSZ];
3606 coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) buff);
3607 if (bfd_write ((PTR) buff, 1, AOUTSZ, abfd) != AOUTSZ)
3608 return false;
3609 }
3610#ifdef RS6000COFF_C
3611 else
3612 {
3613 AOUTHDR buff;
3614 size_t size;
3615
3616 /* XCOFF seems to always write at least a small a.out header. */
3617 coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff);
3618 if (xcoff_data (abfd)->full_aouthdr)
3619 size = AOUTSZ;
3620 else
3621 size = SMALL_AOUTSZ;
3622 if (bfd_write ((PTR) &buff, 1, size, abfd) != size)
3623 return false;
3624 }
3625#endif
3626
3627 return true;
3628}
3629
3630static boolean
3631coff_set_section_contents (abfd, section, location, offset, count)
3632 bfd * abfd;
3633 sec_ptr section;
3634 PTR location;
3635 file_ptr offset;
3636 bfd_size_type count;
3637{
3638 if (abfd->output_has_begun == false) /* set by bfd.c handler */
3639 {
3640 if (! coff_compute_section_file_positions (abfd))
3641 return false;
3642 }
3643
3644#if defined(_LIB) && !defined(TARG_AUX)
3645
3646 /* The physical address field of a .lib section is used to hold the
3647 number of shared libraries in the section. This code counts the
3648 number of sections being written, and increments the lma field
3649 with the number.
3650
3651 I have found no documentation on the contents of this section.
3652 Experimentation indicates that the section contains zero or more
3653 records, each of which has the following structure:
3654
3655 - a (four byte) word holding the length of this record, in words,
3656 - a word that always seems to be set to "2",
3657 - the path to a shared library, null-terminated and then padded
3658 to a whole word boundary.
3659
3660 bfd_assert calls have been added to alert if an attempt is made
3661 to write a section which doesn't follow these assumptions. The
3662 code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe
3663 <robertl@arnet.com> (Thanks!).
3664
3665 Gvran Uddeborg <gvran@uddeborg.pp.se> */
3666
3667 if (strcmp (section->name, _LIB) == 0)
3668 {
3669 bfd_byte *rec, *recend;
3670
3671 rec = (bfd_byte *) location;
3672 recend = rec + count;
3673 while (rec < recend)
3674 {
3675 ++section->lma;
3676 rec += bfd_get_32 (abfd, rec) * 4;
3677 }
3678
3679 BFD_ASSERT (rec == recend);
3680 }
3681
3682#endif
3683
3684 /* Don't write out bss sections - one way to do this is to
3685 see if the filepos has not been set. */
3686 if (section->filepos == 0)
3687 return true;
3688
3689 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
3690 return false;
3691
3692 if (count != 0)
3693 {
3694 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
3695 }
3696 return true;
3697}
3698#if 0
3699static boolean
3700coff_close_and_cleanup (abfd)
3701 bfd *abfd;
3702{
3703 if (!bfd_read_p (abfd))
3704 switch (abfd->format)
3705 {
3706 case bfd_archive:
3707 if (!_bfd_write_archive_contents (abfd))
3708 return false;
3709 break;
3710 case bfd_object:
3711 if (!coff_write_object_contents (abfd))
3712 return false;
3713 break;
3714 default:
3715 bfd_set_error (bfd_error_invalid_operation);
3716 return false;
3717 }
3718
3719 /* We depend on bfd_close to free all the memory on the objalloc. */
3720 return true;
3721}
3722
3723#endif
3724
3725static PTR
3726buy_and_read (abfd, where, seek_direction, size)
3727 bfd *abfd;
3728 file_ptr where;
3729 int seek_direction;
3730 size_t size;
3731{
3732 PTR area = (PTR) bfd_alloc (abfd, size);
3733 if (!area)
3734 return (NULL);
3735 if (bfd_seek (abfd, where, seek_direction) != 0
3736 || bfd_read (area, 1, size, abfd) != size)
3737 return (NULL);
3738 return (area);
3739} /* buy_and_read() */
3740
3741/*
3742SUBSUBSECTION
3743 Reading linenumbers
3744
3745 Creating the linenumber table is done by reading in the entire
3746 coff linenumber table, and creating another table for internal use.
3747
3748 A coff linenumber table is structured so that each function
3749 is marked as having a line number of 0. Each line within the
3750 function is an offset from the first line in the function. The
3751 base of the line number information for the table is stored in
3752 the symbol associated with the function.
3753
00692651
ILT
3754 Note: The PE format uses line number 0 for a flag indicating a
3755 new source file.
3756
252b5132
RH
3757 The information is copied from the external to the internal
3758 table, and each symbol which marks a function is marked by
3759 pointing its...
3760
3761 How does this work ?
3762
3763*/
3764
3765static boolean
3766coff_slurp_line_table (abfd, asect)
3767 bfd *abfd;
3768 asection *asect;
3769{
3770 LINENO *native_lineno;
3771 alent *lineno_cache;
3772
3773 BFD_ASSERT (asect->lineno == (alent *) NULL);
3774
3775 native_lineno = (LINENO *) buy_and_read (abfd,
3776 asect->line_filepos,
3777 SEEK_SET,
3778 (size_t) (LINESZ *
3779 asect->lineno_count));
3780 lineno_cache =
3781 (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
3782 if (lineno_cache == NULL)
3783 return false;
3784 else
3785 {
3786 unsigned int counter = 0;
3787 alent *cache_ptr = lineno_cache;
3788 LINENO *src = native_lineno;
3789
3790 while (counter < asect->lineno_count)
3791 {
3792 struct internal_lineno dst;
3793 coff_swap_lineno_in (abfd, src, &dst);
3794 cache_ptr->line_number = dst.l_lnno;
3795
3796 if (cache_ptr->line_number == 0)
3797 {
3798 boolean warned;
3799 long symndx;
3800 coff_symbol_type *sym;
3801
3802 warned = false;
3803 symndx = dst.l_addr.l_symndx;
3804 if (symndx < 0
3805 || (unsigned long) symndx >= obj_raw_syment_count (abfd))
3806 {
3807 (*_bfd_error_handler)
3808 (_("%s: warning: illegal symbol index %ld in line numbers"),
3809 bfd_get_filename (abfd), dst.l_addr.l_symndx);
3810 symndx = 0;
3811 warned = true;
3812 }
3813 /* FIXME: We should not be casting between ints and
3814 pointers like this. */
3815 sym = ((coff_symbol_type *)
3816 ((symndx + obj_raw_syments (abfd))
3817 ->u.syment._n._n_n._n_zeroes));
3818 cache_ptr->u.sym = (asymbol *) sym;
3819 if (sym->lineno != NULL && ! warned)
3820 {
3821 (*_bfd_error_handler)
3822 (_("%s: warning: duplicate line number information for `%s'"),
3823 bfd_get_filename (abfd),
3824 bfd_asymbol_name (&sym->symbol));
3825 }
3826 sym->lineno = cache_ptr;
3827 }
3828 else
3829 {
3830 cache_ptr->u.offset = dst.l_addr.l_paddr
3831 - bfd_section_vma (abfd, asect);
3832 } /* If no linenumber expect a symbol index */
3833
3834 cache_ptr++;
3835 src++;
3836 counter++;
3837 }
3838 cache_ptr->line_number = 0;
3839
3840 }
3841 asect->lineno = lineno_cache;
3842 /* FIXME, free native_lineno here, or use alloca or something. */
3843 return true;
3844}
3845
00692651
ILT
3846/* Slurp in the symbol table, converting it to generic form. Note
3847 that if coff_relocate_section is defined, the linker will read
3848 symbols via coff_link_add_symbols, rather than via this routine. */
3849
252b5132
RH
3850static boolean
3851coff_slurp_symbol_table (abfd)
3852 bfd * abfd;
3853{
3854 combined_entry_type *native_symbols;
3855 coff_symbol_type *cached_area;
3856 unsigned int *table_ptr;
3857
3858 unsigned int number_of_symbols = 0;
3859
3860 if (obj_symbols (abfd))
3861 return true;
3862
3863 /* Read in the symbol table */
3864 if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
3865 {
3866 return (false);
3867 } /* on error */
3868
3869 /* Allocate enough room for all the symbols in cached form */
3870 cached_area = ((coff_symbol_type *)
3871 bfd_alloc (abfd,
3872 (obj_raw_syment_count (abfd)
3873 * sizeof (coff_symbol_type))));
3874
3875 if (cached_area == NULL)
3876 return false;
3877 table_ptr = ((unsigned int *)
3878 bfd_alloc (abfd,
3879 (obj_raw_syment_count (abfd)
3880 * sizeof (unsigned int))));
3881
3882 if (table_ptr == NULL)
3883 return false;
3884 else
3885 {
3886 coff_symbol_type *dst = cached_area;
3887 unsigned int last_native_index = obj_raw_syment_count (abfd);
3888 unsigned int this_index = 0;
3889 while (this_index < last_native_index)
3890 {
3891 combined_entry_type *src = native_symbols + this_index;
3892 table_ptr[this_index] = number_of_symbols;
3893 dst->symbol.the_bfd = abfd;
3894
3895 dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
3896 /* We use the native name field to point to the cached field. */
3897 src->u.syment._n._n_n._n_zeroes = (long) dst;
3898 dst->symbol.section = coff_section_from_bfd_index (abfd,
3899 src->u.syment.n_scnum);
3900 dst->symbol.flags = 0;
3901 dst->done_lineno = false;
3902
3903 switch (src->u.syment.n_sclass)
3904 {
3905#ifdef I960
3906 case C_LEAFEXT:
3907#if 0
3908 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
3909 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
3910 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3911#endif
3912 /* Fall through to next case */
3913
3914#endif
3915
3916 case C_EXT:
3917 case C_WEAKEXT:
3918#if defined ARM
3919 case C_THUMBEXT:
3920 case C_THUMBEXTFUNC:
3921#endif
3922#ifdef RS6000COFF_C
3923 case C_HIDEXT:
3924#endif
3925#ifdef C_SYSTEM
3926 case C_SYSTEM: /* System Wide variable */
3927#endif
3928#ifdef COFF_WITH_PE
5d54c628 3929 /* In PE, 0x68 (104) denotes a section symbol */
252b5132 3930 case C_SECTION:
5d54c628 3931 /* In PE, 0x69 (105) denotes a weak external symbol. */
252b5132
RH
3932 case C_NT_WEAK:
3933#endif
5d54c628 3934 switch (coff_classify_symbol (abfd, &src->u.syment))
252b5132 3935 {
5d54c628 3936 case COFF_SYMBOL_GLOBAL:
252b5132 3937 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
252b5132
RH
3938#if defined COFF_WITH_PE
3939 /* PE sets the symbol to a value relative to the
3940 start of the section. */
3941 dst->symbol.value = src->u.syment.n_value;
3942#else
3943 dst->symbol.value = (src->u.syment.n_value
3944 - dst->symbol.section->vma);
3945#endif
252b5132
RH
3946 if (ISFCN ((src->u.syment.n_type)))
3947 {
3948 /* A function ext does not go at the end of a
3949 file. */
3950 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3951 }
5d54c628
ILT
3952 break;
3953
3954 case COFF_SYMBOL_COMMON:
3955 dst->symbol.section = bfd_com_section_ptr;
3956 dst->symbol.value = src->u.syment.n_value;
3957 break;
3958
3959 case COFF_SYMBOL_UNDEFINED:
3960 dst->symbol.section = bfd_und_section_ptr;
3961 dst->symbol.value = 0;
3962 break;
3963
3964 case COFF_SYMBOL_PE_SECTION:
3965 dst->symbol.flags |= BSF_EXPORT | BSF_SECTION_SYM;
3966 dst->symbol.value = 0;
3967 break;
3968
3969 case COFF_SYMBOL_LOCAL:
3970 dst->symbol.flags = BSF_LOCAL;
3971#if defined COFF_WITH_PE
3972 /* PE sets the symbol to a value relative to the
3973 start of the section. */
3974 dst->symbol.value = src->u.syment.n_value;
3975#else
3976 dst->symbol.value = (src->u.syment.n_value
3977 - dst->symbol.section->vma);
3978#endif
3979 if (ISFCN ((src->u.syment.n_type)))
3980 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
3981 break;
252b5132
RH
3982 }
3983
3984#ifdef RS6000COFF_C
252b5132
RH
3985 /* A symbol with a csect entry should not go at the end. */
3986 if (src->u.syment.n_numaux > 0)
3987 dst->symbol.flags |= BSF_NOT_AT_END;
3988#endif
3989
3990#ifdef COFF_WITH_PE
3991 if (src->u.syment.n_sclass == C_NT_WEAK)
3992 dst->symbol.flags = BSF_WEAK;
ec0ef80e
DD
3993 if (src->u.syment.n_sclass == C_SECTION
3994 && src->u.syment.n_scnum > 0)
3995 {
3996 dst->symbol.flags = BSF_LOCAL;
3997 }
252b5132
RH
3998#endif
3999
4000 if (src->u.syment.n_sclass == C_WEAKEXT)
4001 dst->symbol.flags = BSF_WEAK;
4002
4003 break;
4004
4005 case C_STAT: /* static */
4006#ifdef I960
4007 case C_LEAFSTAT: /* static leaf procedure */
4008#endif
4009#if defined ARM
4010 case C_THUMBSTAT: /* Thumb static */
4011 case C_THUMBLABEL: /* Thumb label */
4012 case C_THUMBSTATFUNC:/* Thumb static function */
4013#endif
4014 case C_LABEL: /* label */
00692651 4015 if (src->u.syment.n_scnum == N_DEBUG)
252b5132
RH
4016 dst->symbol.flags = BSF_DEBUGGING;
4017 else
4018 dst->symbol.flags = BSF_LOCAL;
4019
4020 /* Base the value as an index from the base of the
4021 section, if there is one. */
4022 if (dst->symbol.section)
4023 {
4024#if defined COFF_WITH_PE
4025 /* PE sets the symbol to a value relative to the
4026 start of the section. */
4027 dst->symbol.value = src->u.syment.n_value;
4028#else
4029 dst->symbol.value = (src->u.syment.n_value
4030 - dst->symbol.section->vma);
4031#endif
4032 }
4033 else
4034 dst->symbol.value = src->u.syment.n_value;
4035 break;
4036
4037 case C_MOS: /* member of structure */
4038 case C_EOS: /* end of structure */
4039#ifdef NOTDEF /* C_AUTOARG has the same value */
4040#ifdef C_GLBLREG
4041 case C_GLBLREG: /* A29k-specific storage class */
4042#endif
4043#endif
4044 case C_REGPARM: /* register parameter */
4045 case C_REG: /* register variable */
4046#ifndef TIC80COFF
4047#ifdef C_AUTOARG
4048 case C_AUTOARG: /* 960-specific storage class */
4049#endif
4050#endif
4051 case C_TPDEF: /* type definition */
4052 case C_ARG:
4053 case C_AUTO: /* automatic variable */
4054 case C_FIELD: /* bit field */
4055 case C_ENTAG: /* enumeration tag */
4056 case C_MOE: /* member of enumeration */
4057 case C_MOU: /* member of union */
4058 case C_UNTAG: /* union tag */
4059 dst->symbol.flags = BSF_DEBUGGING;
4060 dst->symbol.value = (src->u.syment.n_value);
4061 break;
4062
4063 case C_FILE: /* file name */
4064 case C_STRTAG: /* structure tag */
4065#ifdef RS6000COFF_C
4066 case C_GSYM:
4067 case C_LSYM:
4068 case C_PSYM:
4069 case C_RSYM:
4070 case C_RPSYM:
4071 case C_STSYM:
4072 case C_BCOMM:
4073 case C_ECOMM:
4074 case C_DECL:
4075 case C_ENTRY:
4076 case C_FUN:
4077 case C_ESTAT:
4078#endif
4079 dst->symbol.flags = BSF_DEBUGGING;
4080 dst->symbol.value = (src->u.syment.n_value);
4081 break;
4082
4083#ifdef RS6000COFF_C
4084 case C_BINCL: /* beginning of include file */
4085 case C_EINCL: /* ending of include file */
4086 /* The value is actually a pointer into the line numbers
4087 of the file. We locate the line number entry, and
4088 set the section to the section which contains it, and
4089 the value to the index in that section. */
4090 {
4091 asection *sec;
4092
4093 dst->symbol.flags = BSF_DEBUGGING;
4094 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4095 if (sec->line_filepos <= (file_ptr) src->u.syment.n_value
4096 && ((file_ptr) (sec->line_filepos
4097 + sec->lineno_count * LINESZ)
4098 > (file_ptr) src->u.syment.n_value))
4099 break;
4100 if (sec == NULL)
4101 dst->symbol.value = 0;
4102 else
4103 {
4104 dst->symbol.section = sec;
4105 dst->symbol.value = ((src->u.syment.n_value
4106 - sec->line_filepos)
4107 / LINESZ);
4108 src->fix_line = 1;
4109 }
4110 }
4111 break;
4112
4113 case C_BSTAT:
4114 dst->symbol.flags = BSF_DEBUGGING;
4115
4116 /* The value is actually a symbol index. Save a pointer
4117 to the symbol instead of the index. FIXME: This
4118 should use a union. */
4119 src->u.syment.n_value =
4120 (long) (native_symbols + src->u.syment.n_value);
4121 dst->symbol.value = src->u.syment.n_value;
4122 src->fix_value = 1;
4123 break;
4124#endif
4125
4126 case C_BLOCK: /* ".bb" or ".eb" */
d510f9a6 4127 case C_FCN: /* ".bf" or ".ef" (or PE ".lf") */
252b5132 4128 case C_EFCN: /* physical end of function */
252b5132
RH
4129#if defined COFF_WITH_PE
4130 /* PE sets the symbol to a value relative to the start
4131 of the section. */
4132 dst->symbol.value = src->u.syment.n_value;
d510f9a6
ILT
4133 if (strcmp (dst->symbol.name, ".bf") != 0)
4134 {
4135 /* PE uses funny values for .ef and .lf; don't
4136 relocate them. */
4137 dst->symbol.flags = BSF_DEBUGGING;
4138 }
4139 else
4140 dst->symbol.flags = BSF_DEBUGGING | BSF_DEBUGGING_RELOC;
252b5132
RH
4141#else
4142 /* Base the value as an index from the base of the
4143 section. */
d510f9a6 4144 dst->symbol.flags = BSF_LOCAL;
252b5132
RH
4145 dst->symbol.value = (src->u.syment.n_value
4146 - dst->symbol.section->vma);
4147#endif
4148 break;
4149
4150 case C_NULL:
00692651
ILT
4151 /* PE DLLs sometimes have zeroed out symbols for some
4152 reason. Just ignore them without a warning. */
4153 if (src->u.syment.n_type == 0
4154 && src->u.syment.n_value == 0
4155 && src->u.syment.n_scnum == 0)
4156 break;
4157 /* Fall through. */
252b5132
RH
4158 case C_EXTDEF: /* external definition */
4159 case C_ULABEL: /* undefined label */
4160 case C_USTATIC: /* undefined static */
4161#ifndef COFF_WITH_PE
4162 /* C_LINE in regular coff is 0x68. NT has taken over this storage
4163 class to represent a section symbol */
4164 case C_LINE: /* line # reformatted as symbol table entry */
4165 /* NT uses 0x67 for a weak symbol, not C_ALIAS. */
4166 case C_ALIAS: /* duplicate tag */
4167#endif
4168 /* New storage classes for TIc80 */
4169#ifdef TIC80COFF
4170 case C_UEXT: /* Tentative external definition */
4171#endif
4172 case C_STATLAB: /* Static load time label */
4173 case C_EXTLAB: /* External load time label */
4174 case C_HIDDEN: /* ext symbol in dmert public lib */
4175 default:
4176 (*_bfd_error_handler)
4177 (_("%s: Unrecognized storage class %d for %s symbol `%s'"),
4178 bfd_get_filename (abfd), src->u.syment.n_sclass,
4179 dst->symbol.section->name, dst->symbol.name);
4180 dst->symbol.flags = BSF_DEBUGGING;
4181 dst->symbol.value = (src->u.syment.n_value);
4182 break;
4183 }
4184
4185/* BFD_ASSERT(dst->symbol.flags != 0);*/
4186
4187 dst->native = src;
4188
4189 dst->symbol.udata.i = 0;
4190 dst->lineno = (alent *) NULL;
4191 this_index += (src->u.syment.n_numaux) + 1;
4192 dst++;
4193 number_of_symbols++;
4194 } /* walk the native symtab */
4195 } /* bfdize the native symtab */
4196
4197 obj_symbols (abfd) = cached_area;
4198 obj_raw_syments (abfd) = native_symbols;
4199
4200 bfd_get_symcount (abfd) = number_of_symbols;
4201 obj_convert (abfd) = table_ptr;
4202 /* Slurp the line tables for each section too */
4203 {
4204 asection *p;
4205 p = abfd->sections;
4206 while (p)
4207 {
4208 coff_slurp_line_table (abfd, p);
4209 p = p->next;
4210 }
4211 }
4212 return true;
4213} /* coff_slurp_symbol_table() */
4214
5d54c628
ILT
4215/* Classify a COFF symbol. A couple of targets have globally visible
4216 symbols which are not class C_EXT, and this handles those. It also
4217 recognizes some special PE cases. */
252b5132 4218
5d54c628
ILT
4219static enum coff_symbol_classification
4220coff_classify_symbol (abfd, syment)
4221 bfd *abfd;
4222 struct internal_syment *syment;
4223{
4224 /* FIXME: This partially duplicates the switch in
4225 coff_slurp_symbol_table. */
4226 switch (syment->n_sclass)
4227 {
4228 case C_EXT:
4229 case C_WEAKEXT:
252b5132 4230#ifdef I960
5d54c628 4231 case C_LEAFEXT:
252b5132 4232#endif
5d54c628
ILT
4233#ifdef ARM
4234 case C_THUMBEXT:
4235 case C_THUMBEXTFUNC:
252b5132 4236#endif
5d54c628
ILT
4237#ifdef C_SYSTEM
4238 case C_SYSTEM:
252b5132 4239#endif
5d54c628
ILT
4240#ifdef COFF_WITH_PE
4241 case C_NT_WEAK:
4242#endif
4243 if (syment->n_scnum == 0)
4244 {
4245 if (syment->n_value == 0)
4246 return COFF_SYMBOL_UNDEFINED;
4247 else
4248 return COFF_SYMBOL_COMMON;
4249 }
4250 return COFF_SYMBOL_GLOBAL;
4251
4252 default:
4253 break;
4254 }
252b5132 4255
5d54c628
ILT
4256#ifdef COFF_WITH_PE
4257 if (syment->n_sclass == C_STAT)
4258 {
4259 if (syment->n_scnum == 0)
4260 {
4261 /* The Microsoft compiler sometimes generates these if a
4262 small static function is inlined every time it is used.
4263 The function is discarded, but the symbol table entry
4264 remains. */
4265 return COFF_SYMBOL_LOCAL;
4266 }
252b5132 4267
bd826630
ILT
4268#if 0
4269 /* This is correct for Microsoft generated objects, but it
4270 breaks gas generated objects. */
4271
5d54c628
ILT
4272 if (syment->n_value == 0)
4273 {
4274 asection *sec;
4275 char buf[SYMNMLEN + 1];
4276
4277 sec = coff_section_from_bfd_index (abfd, syment->n_scnum);
4278 if (sec != NULL
4279 && (strcmp (bfd_get_section_name (abfd, sec),
4280 _bfd_coff_internal_syment_name (abfd, syment, buf))
4281 == 0))
4282 return COFF_SYMBOL_PE_SECTION;
4283 }
bd826630 4284#endif
252b5132 4285
5d54c628
ILT
4286 return COFF_SYMBOL_LOCAL;
4287 }
252b5132 4288
5d54c628
ILT
4289 if (syment->n_sclass == C_SECTION)
4290 {
4291 /* In some cases in a DLL generated by the Microsoft linker, the
4292 n_value field will contain garbage. FIXME: This should
4293 probably be handled by the swapping function instead. */
4294 syment->n_value = 0;
4295 if (syment->n_scnum == 0)
4296 return COFF_SYMBOL_UNDEFINED;
4297 return COFF_SYMBOL_PE_SECTION;
4298 }
4299#endif /* COFF_WITH_PE */
252b5132 4300
5d54c628 4301 /* If it is not a global symbol, we presume it is a local symbol. */
252b5132 4302
5d54c628
ILT
4303 if (syment->n_scnum == 0)
4304 {
4305 char buf[SYMNMLEN + 1];
252b5132 4306
5d54c628
ILT
4307 (*_bfd_error_handler)
4308 (_("warning: %s: local symbol `%s' has no section"),
4309 bfd_get_filename (abfd),
4310 _bfd_coff_internal_syment_name (abfd, syment, buf));
4311 }
252b5132 4312
5d54c628
ILT
4313 return COFF_SYMBOL_LOCAL;
4314}
252b5132
RH
4315
4316/*
4317SUBSUBSECTION
4318 Reading relocations
4319
4320 Coff relocations are easily transformed into the internal BFD form
4321 (@code{arelent}).
4322
4323 Reading a coff relocation table is done in the following stages:
4324
4325 o Read the entire coff relocation table into memory.
4326
4327 o Process each relocation in turn; first swap it from the
4328 external to the internal form.
4329
4330 o Turn the symbol referenced in the relocation's symbol index
4331 into a pointer into the canonical symbol table.
4332 This table is the same as the one returned by a call to
4333 @code{bfd_canonicalize_symtab}. The back end will call that
4334 routine and save the result if a canonicalization hasn't been done.
4335
4336 o The reloc index is turned into a pointer to a howto
4337 structure, in a back end specific way. For instance, the 386
4338 and 960 use the @code{r_type} to directly produce an index
4339 into a howto table vector; the 88k subtracts a number from the
4340 @code{r_type} field and creates an addend field.
4341
4342
4343*/
4344
4345#ifndef CALC_ADDEND
4346#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
4347 { \
4348 coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
4349 if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
4350 coffsym = (obj_symbols (abfd) \
4351 + (cache_ptr->sym_ptr_ptr - symbols)); \
4352 else if (ptr) \
4353 coffsym = coff_symbol_from (abfd, ptr); \
4354 if (coffsym != (coff_symbol_type *) NULL \
4355 && coffsym->native->u.syment.n_scnum == 0) \
4356 cache_ptr->addend = 0; \
4357 else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
4358 && ptr->section != (asection *) NULL) \
4359 cache_ptr->addend = - (ptr->section->vma + ptr->value); \
4360 else \
4361 cache_ptr->addend = 0; \
4362 }
4363#endif
4364
4365static boolean
4366coff_slurp_reloc_table (abfd, asect, symbols)
4367 bfd * abfd;
4368 sec_ptr asect;
4369 asymbol ** symbols;
4370{
4371 RELOC *native_relocs;
4372 arelent *reloc_cache;
4373 arelent *cache_ptr;
4374
4375 unsigned int idx;
4376
4377 if (asect->relocation)
4378 return true;
4379 if (asect->reloc_count == 0)
4380 return true;
4381 if (asect->flags & SEC_CONSTRUCTOR)
4382 return true;
4383 if (!coff_slurp_symbol_table (abfd))
4384 return false;
4385 native_relocs =
4386 (RELOC *) buy_and_read (abfd,
4387 asect->rel_filepos,
4388 SEEK_SET,
4389 (size_t) (RELSZ *
4390 asect->reloc_count));
4391 reloc_cache = (arelent *)
4392 bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
4393
4394 if (reloc_cache == NULL)
4395 return false;
4396
4397
4398 for (idx = 0; idx < asect->reloc_count; idx++)
4399 {
4400 struct internal_reloc dst;
4401 struct external_reloc *src;
4402#ifndef RELOC_PROCESSING
4403 asymbol *ptr;
4404#endif
4405
4406 cache_ptr = reloc_cache + idx;
4407 src = native_relocs + idx;
4408
4409 coff_swap_reloc_in (abfd, src, &dst);
4410
4411#ifdef RELOC_PROCESSING
4412 RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
4413#else
4414 cache_ptr->address = dst.r_vaddr;
4415
4416 if (dst.r_symndx != -1)
4417 {
4418 if (dst.r_symndx < 0 || dst.r_symndx >= obj_conv_table_size (abfd))
4419 {
4420 (*_bfd_error_handler)
4421 (_("%s: warning: illegal symbol index %ld in relocs"),
4422 bfd_get_filename (abfd), dst.r_symndx);
4423 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4424 ptr = NULL;
4425 }
4426 else
4427 {
4428 cache_ptr->sym_ptr_ptr = (symbols
4429 + obj_convert (abfd)[dst.r_symndx]);
4430 ptr = *(cache_ptr->sym_ptr_ptr);
4431 }
4432 }
4433 else
4434 {
4435 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4436 ptr = NULL;
4437 }
4438
4439 /* The symbols definitions that we have read in have been
4440 relocated as if their sections started at 0. But the offsets
4441 refering to the symbols in the raw data have not been
4442 modified, so we have to have a negative addend to compensate.
4443
4444 Note that symbols which used to be common must be left alone */
4445
4446 /* Calculate any reloc addend by looking at the symbol */
4447 CALC_ADDEND (abfd, ptr, dst, cache_ptr);
4448
4449 cache_ptr->address -= asect->vma;
4450/* !! cache_ptr->section = (asection *) NULL;*/
4451
4452 /* Fill in the cache_ptr->howto field from dst.r_type */
4453 RTYPE2HOWTO (cache_ptr, &dst);
4454#endif /* RELOC_PROCESSING */
4455
4456 if (cache_ptr->howto == NULL)
4457 {
4458 (*_bfd_error_handler)
4459 (_("%s: illegal relocation type %d at address 0x%lx"),
4460 bfd_get_filename (abfd), dst.r_type, (long) dst.r_vaddr);
4461 bfd_set_error (bfd_error_bad_value);
4462 return false;
4463 }
4464 }
4465
4466 asect->relocation = reloc_cache;
4467 return true;
4468}
4469
4470#ifndef coff_rtype_to_howto
4471#ifdef RTYPE2HOWTO
4472
4473/* Get the howto structure for a reloc. This is only used if the file
4474 including this one defines coff_relocate_section to be
4475 _bfd_coff_generic_relocate_section, so it is OK if it does not
4476 always work. It is the responsibility of the including file to
4477 make sure it is reasonable if it is needed. */
4478
4479static reloc_howto_type *coff_rtype_to_howto
4480 PARAMS ((bfd *, asection *, struct internal_reloc *,
4481 struct coff_link_hash_entry *, struct internal_syment *,
4482 bfd_vma *));
4483
4484/*ARGSUSED*/
4485static reloc_howto_type *
4486coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
5f771d47
ILT
4487 bfd *abfd ATTRIBUTE_UNUSED;
4488 asection *sec ATTRIBUTE_UNUSED;
252b5132 4489 struct internal_reloc *rel;
5f771d47
ILT
4490 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
4491 struct internal_syment *sym ATTRIBUTE_UNUSED;
4492 bfd_vma *addendp ATTRIBUTE_UNUSED;
252b5132
RH
4493{
4494 arelent genrel;
4495
4496 RTYPE2HOWTO (&genrel, rel);
4497 return genrel.howto;
4498}
4499
4500#else /* ! defined (RTYPE2HOWTO) */
4501
4502#define coff_rtype_to_howto NULL
4503
4504#endif /* ! defined (RTYPE2HOWTO) */
4505#endif /* ! defined (coff_rtype_to_howto) */
4506
4507/* This is stupid. This function should be a boolean predicate. */
4508static long
4509coff_canonicalize_reloc (abfd, section, relptr, symbols)
4510 bfd * abfd;
4511 sec_ptr section;
4512 arelent ** relptr;
4513 asymbol ** symbols;
4514{
4515 arelent *tblptr = section->relocation;
4516 unsigned int count = 0;
4517
4518
4519 if (section->flags & SEC_CONSTRUCTOR)
4520 {
4521 /* this section has relocs made up by us, they are not in the
4522 file, so take them out of their chain and place them into
4523 the data area provided */
4524 arelent_chain *chain = section->constructor_chain;
4525 for (count = 0; count < section->reloc_count; count++)
4526 {
4527 *relptr++ = &chain->relent;
4528 chain = chain->next;
4529 }
4530
4531 }
4532 else
4533 {
4534 if (! coff_slurp_reloc_table (abfd, section, symbols))
4535 return -1;
4536
4537 tblptr = section->relocation;
4538
4539 for (; count++ < section->reloc_count;)
4540 *relptr++ = tblptr++;
4541
4542
4543 }
4544 *relptr = 0;
4545 return section->reloc_count;
4546}
4547
4548#ifdef GNU960
4549file_ptr
4550coff_sym_filepos (abfd)
4551 bfd *abfd;
4552{
4553 return obj_sym_filepos (abfd);
4554}
4555#endif
4556
4557#ifndef coff_reloc16_estimate
4558#define coff_reloc16_estimate dummy_reloc16_estimate
4559
4560static int dummy_reloc16_estimate
4561 PARAMS ((bfd *, asection *, arelent *, unsigned int,
4562 struct bfd_link_info *));
4563
4564static int
4565dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
5f771d47
ILT
4566 bfd *abfd ATTRIBUTE_UNUSED;
4567 asection *input_section ATTRIBUTE_UNUSED;
4568 arelent *reloc ATTRIBUTE_UNUSED;
4569 unsigned int shrink ATTRIBUTE_UNUSED;
4570 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
252b5132
RH
4571{
4572 abort ();
00692651 4573 return 0;
252b5132
RH
4574}
4575
4576#endif
4577
4578#ifndef coff_reloc16_extra_cases
4579
4580#define coff_reloc16_extra_cases dummy_reloc16_extra_cases
4581
4582/* This works even if abort is not declared in any header file. */
4583
4584static void dummy_reloc16_extra_cases
4585 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, arelent *,
4586 bfd_byte *, unsigned int *, unsigned int *));
4587
4588static void
4589dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
4590 dst_ptr)
5f771d47
ILT
4591 bfd *abfd ATTRIBUTE_UNUSED;
4592 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
4593 struct bfd_link_order *link_order ATTRIBUTE_UNUSED;
4594 arelent *reloc ATTRIBUTE_UNUSED;
4595 bfd_byte *data ATTRIBUTE_UNUSED;
4596 unsigned int *src_ptr ATTRIBUTE_UNUSED;
4597 unsigned int *dst_ptr ATTRIBUTE_UNUSED;
252b5132
RH
4598{
4599 abort ();
4600}
4601#endif
4602
4603/* If coff_relocate_section is defined, we can use the optimized COFF
4604 backend linker. Otherwise we must continue to use the old linker. */
4605#ifdef coff_relocate_section
4606#ifndef coff_bfd_link_hash_table_create
4607#define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
4608#endif
4609#ifndef coff_bfd_link_add_symbols
4610#define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
4611#endif
4612#ifndef coff_bfd_final_link
4613#define coff_bfd_final_link _bfd_coff_final_link
4614#endif
4615#else /* ! defined (coff_relocate_section) */
4616#define coff_relocate_section NULL
4617#ifndef coff_bfd_link_hash_table_create
4618#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
4619#endif
4620#ifndef coff_bfd_link_add_symbols
4621#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
4622#endif
4623#define coff_bfd_final_link _bfd_generic_final_link
4624#endif /* ! defined (coff_relocate_section) */
4625
4626#define coff_bfd_link_split_section _bfd_generic_link_split_section
4627
4628#ifndef coff_start_final_link
4629#define coff_start_final_link NULL
4630#endif
4631
4632#ifndef coff_adjust_symndx
4633#define coff_adjust_symndx NULL
4634#endif
4635
4636#ifndef coff_link_add_one_symbol
4637#define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol
4638#endif
4639
4640#ifndef coff_link_output_has_begun
4641
4642static boolean coff_link_output_has_begun
4643 PARAMS ((bfd *, struct coff_final_link_info *));
4644
4645static boolean
4646coff_link_output_has_begun (abfd, info)
4647 bfd * abfd;
5f771d47 4648 struct coff_final_link_info * info ATTRIBUTE_UNUSED;
252b5132
RH
4649{
4650 return abfd->output_has_begun;
4651}
4652#endif
4653
4654#ifndef coff_final_link_postscript
4655
4656static boolean coff_final_link_postscript
4657 PARAMS ((bfd *, struct coff_final_link_info *));
4658
4659static boolean
4660coff_final_link_postscript (abfd, pfinfo)
5f771d47
ILT
4661 bfd * abfd ATTRIBUTE_UNUSED;
4662 struct coff_final_link_info * pfinfo ATTRIBUTE_UNUSED;
252b5132
RH
4663{
4664 return true;
4665}
4666#endif
4667
4668#ifndef coff_SWAP_aux_in
4669#define coff_SWAP_aux_in coff_swap_aux_in
4670#endif
4671#ifndef coff_SWAP_sym_in
4672#define coff_SWAP_sym_in coff_swap_sym_in
4673#endif
4674#ifndef coff_SWAP_lineno_in
4675#define coff_SWAP_lineno_in coff_swap_lineno_in
4676#endif
4677#ifndef coff_SWAP_aux_out
4678#define coff_SWAP_aux_out coff_swap_aux_out
4679#endif
4680#ifndef coff_SWAP_sym_out
4681#define coff_SWAP_sym_out coff_swap_sym_out
4682#endif
4683#ifndef coff_SWAP_lineno_out
4684#define coff_SWAP_lineno_out coff_swap_lineno_out
4685#endif
4686#ifndef coff_SWAP_reloc_out
4687#define coff_SWAP_reloc_out coff_swap_reloc_out
4688#endif
4689#ifndef coff_SWAP_filehdr_out
4690#define coff_SWAP_filehdr_out coff_swap_filehdr_out
4691#endif
4692#ifndef coff_SWAP_aouthdr_out
4693#define coff_SWAP_aouthdr_out coff_swap_aouthdr_out
4694#endif
4695#ifndef coff_SWAP_scnhdr_out
4696#define coff_SWAP_scnhdr_out coff_swap_scnhdr_out
4697#endif
4698#ifndef coff_SWAP_reloc_in
4699#define coff_SWAP_reloc_in coff_swap_reloc_in
4700#endif
4701#ifndef coff_SWAP_filehdr_in
4702#define coff_SWAP_filehdr_in coff_swap_filehdr_in
4703#endif
4704#ifndef coff_SWAP_aouthdr_in
4705#define coff_SWAP_aouthdr_in coff_swap_aouthdr_in
4706#endif
4707#ifndef coff_SWAP_scnhdr_in
4708#define coff_SWAP_scnhdr_in coff_swap_scnhdr_in
4709#endif
4710
692b7d62 4711static const bfd_coff_backend_data bfd_coff_std_swap_table =
252b5132
RH
4712{
4713 coff_SWAP_aux_in, coff_SWAP_sym_in, coff_SWAP_lineno_in,
4714 coff_SWAP_aux_out, coff_SWAP_sym_out,
4715 coff_SWAP_lineno_out, coff_SWAP_reloc_out,
4716 coff_SWAP_filehdr_out, coff_SWAP_aouthdr_out,
4717 coff_SWAP_scnhdr_out,
692b7d62 4718 FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, FILNMLEN,
252b5132
RH
4719#ifdef COFF_LONG_FILENAMES
4720 true,
4721#else
4722 false,
4723#endif
4724#ifdef COFF_LONG_SECTION_NAMES
4725 true,
4726#else
4727 false,
4728#endif
4729 COFF_DEFAULT_SECTION_ALIGNMENT_POWER,
4730 coff_SWAP_filehdr_in, coff_SWAP_aouthdr_in, coff_SWAP_scnhdr_in,
4731 coff_SWAP_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
4732 coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
4733 coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
4734 coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate,
5d54c628 4735 coff_classify_symbol, coff_compute_section_file_positions,
252b5132
RH
4736 coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
4737 coff_adjust_symndx, coff_link_add_one_symbol,
4738 coff_link_output_has_begun, coff_final_link_postscript
4739};
4740
4741#ifndef coff_close_and_cleanup
4742#define coff_close_and_cleanup _bfd_generic_close_and_cleanup
4743#endif
4744
4745#ifndef coff_bfd_free_cached_info
4746#define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
4747#endif
4748
4749#ifndef coff_get_section_contents
4750#define coff_get_section_contents _bfd_generic_get_section_contents
4751#endif
4752
4753#ifndef coff_bfd_copy_private_symbol_data
4754#define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
4755#endif
4756
4757#ifndef coff_bfd_copy_private_section_data
4758#define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
4759#endif
4760
4761#ifndef coff_bfd_copy_private_bfd_data
4762#define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
4763#endif
4764
4765#ifndef coff_bfd_merge_private_bfd_data
4766#define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
4767#endif
4768
4769#ifndef coff_bfd_set_private_flags
4770#define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
4771#endif
4772
4773#ifndef coff_bfd_print_private_bfd_data
4774#define coff_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
4775#endif
4776
4777#ifndef coff_bfd_is_local_label_name
4778#define coff_bfd_is_local_label_name _bfd_coff_is_local_label_name
4779#endif
4780
4781#ifndef coff_read_minisymbols
4782#define coff_read_minisymbols _bfd_generic_read_minisymbols
4783#endif
4784
4785#ifndef coff_minisymbol_to_symbol
4786#define coff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
4787#endif
4788
4789/* The reloc lookup routine must be supplied by each individual COFF
4790 backend. */
4791#ifndef coff_bfd_reloc_type_lookup
4792#define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4793#endif
4794
4795#ifndef coff_bfd_get_relocated_section_contents
4796#define coff_bfd_get_relocated_section_contents \
4797 bfd_generic_get_relocated_section_contents
4798#endif
4799
4800#ifndef coff_bfd_relax_section
4801#define coff_bfd_relax_section bfd_generic_relax_section
4802#endif
4803
4804#ifndef coff_bfd_gc_sections
4805#define coff_bfd_gc_sections bfd_generic_gc_sections
4806#endif
c3c89269
NC
4807
4808#define CREATE_BIG_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4c117b10
ILT
4809const bfd_target VAR = \
4810{ \
4811 NAME , \
4812 bfd_target_coff_flavour, \
4813 BFD_ENDIAN_BIG, /* data byte order is big */ \
4814 BFD_ENDIAN_BIG, /* header byte order is big */ \
4815 /* object flags */ \
4816 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
4817 HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
4818 /* section flags */ \
4819 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
4820 UNDER, /* leading symbol underscore */ \
4821 '/', /* ar_pad_char */ \
4822 15, /* ar_max_namelen */ \
4823 \
4824 /* Data conversion functions. */ \
4825 bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
4826 bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
4827 bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
4828 \
4829 /* Header conversion functions. */ \
4830 bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
4831 bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
4832 bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
4833 \
4834 /* bfd_check_format */ \
4835 { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, \
4836 _bfd_dummy_target }, \
4837 /* bfd_set_format */ \
4838 { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false }, \
4839 /* bfd_write_contents */ \
4840 { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
4841 bfd_false }, \
4842 \
4843 BFD_JUMP_TABLE_GENERIC (coff), \
4844 BFD_JUMP_TABLE_COPY (coff), \
4845 BFD_JUMP_TABLE_CORE (_bfd_nocore), \
4846 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \
4847 BFD_JUMP_TABLE_SYMBOLS (coff), \
4848 BFD_JUMP_TABLE_RELOCS (coff), \
4849 BFD_JUMP_TABLE_WRITE (coff), \
4850 BFD_JUMP_TABLE_LINK (coff), \
4851 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
4852 \
4853 ALTERNATIVE, \
4854 \
4855 COFF_SWAP_TABLE \
c3c89269
NC
4856};
4857
4858#define CREATE_LITTLE_COFF_TARGET_VEC(VAR, NAME, EXTRA_O_FLAGS, EXTRA_S_FLAGS, UNDER, ALTERNATIVE) \
4c117b10
ILT
4859const bfd_target VAR = \
4860{ \
4861 NAME , \
4862 bfd_target_coff_flavour, \
4863 BFD_ENDIAN_LITTLE, /* data byte order is little */ \
4864 BFD_ENDIAN_LITTLE, /* header byte order is little */ \
4865 /* object flags */ \
4866 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | \
4867 HAS_SYMS | HAS_LOCALS | WP_TEXT | EXTRA_O_FLAGS), \
4868 /* section flags */ \
4869 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | EXTRA_S_FLAGS),\
4870 UNDER, /* leading symbol underscore */ \
4871 '/', /* ar_pad_char */ \
4872 15, /* ar_max_namelen */ \
4873 \
4874 /* Data conversion functions. */ \
4875 bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
4876 bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
4877 bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
4878 /* Header conversion functions. */ \
4879 bfd_getl64, bfd_getl_signed_64, bfd_putl64, \
4880 bfd_getl32, bfd_getl_signed_32, bfd_putl32, \
4881 bfd_getl16, bfd_getl_signed_16, bfd_putl16, \
4882 /* bfd_check_format */ \
4883 { _bfd_dummy_target, coff_object_p, bfd_generic_archive_p, \
4884 _bfd_dummy_target }, \
4885 /* bfd_set_format */ \
4886 { bfd_false, coff_mkobject, _bfd_generic_mkarchive, bfd_false }, \
4887 /* bfd_write_contents */ \
4888 { bfd_false, coff_write_object_contents, _bfd_write_archive_contents, \
4889 bfd_false }, \
4890 \
4891 BFD_JUMP_TABLE_GENERIC (coff), \
4892 BFD_JUMP_TABLE_COPY (coff), \
4893 BFD_JUMP_TABLE_CORE (_bfd_nocore), \
4894 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), \
4895 BFD_JUMP_TABLE_SYMBOLS (coff), \
4896 BFD_JUMP_TABLE_RELOCS (coff), \
4897 BFD_JUMP_TABLE_WRITE (coff), \
4898 BFD_JUMP_TABLE_LINK (coff), \
4899 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
4900 \
4901 ALTERNATIVE, \
4902 \
4903 COFF_SWAP_TABLE \
c3c89269 4904};