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