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