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