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