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