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