* coffcode.h (bfd_coff_backend_data): Add new field
[deliverable/binutils-gdb.git] / bfd / coffcode.h
CommitLineData
6d7c88c3 1/* Support for the generic parts of most COFF variants, for BFD.
f135c692 2 Copyright 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
7a8b18b6 3 Written by Cygnus Support.
0f268757 4
7a8b18b6 5This file is part of BFD, the Binary File Descriptor library.
0f268757 6
7a8b18b6
SC
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
0f268757 11
7a8b18b6
SC
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
0f268757 16
7a8b18b6
SC
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
e9614321 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
6f715d66 20
9783e04a 21/*
6590a8c9 22Most of this hacked by Steve Chamberlain,
9783e04a 23 sac@cygnus.com
6590a8c9 24*/
9fda1a39 25/*
6f715d66 26
9fda1a39
SC
27SECTION
28 coff backends
29
9fda1a39 30 BFD supports a number of different flavours of coff format.
c188b0be 31 The major differences between formats are the sizes and
9fda1a39 32 alignments of fields in structures on disk, and the occasional
9783e04a 33 extra field.
9fda1a39 34
c188b0be 35 Coff in all its varieties is implemented with a few common
9fda1a39
SC
36 files and a number of implementation specific files. For
37 example, The 88k bcs coff format is implemented in the file
c188b0be
DM
38 @file{coff-m88k.c}. This file @code{#include}s
39 @file{coff/m88k.h} which defines the external structure of the
40 coff format for the 88k, and @file{coff/internal.h} which
41 defines the internal structure. @file{coff-m88k.c} also
075caafd
ILT
42 defines the relocations used by the 88k format
43 @xref{Relocations}.
9fda1a39
SC
44
45 The Intel i960 processor version of coff is implemented in
c188b0be
DM
46 @file{coff-i960.c}. This file has the same structure as
47 @file{coff-m88k.c}, except that it includes @file{coff/i960.h}
9783e04a 48 rather than @file{coff-m88k.h}.
9fda1a39
SC
49
50SUBSECTION
c188b0be 51 Porting to a new version of coff
9fda1a39 52
9fda1a39 53 The recommended method is to select from the existing
c188b0be
DM
54 implementations the version of coff which is most like the one
55 you want to use. For example, we'll say that i386 coff is
9fda1a39 56 the one you select, and that your coff flavour is called foo.
c188b0be
DM
57 Copy @file{i386coff.c} to @file{foocoff.c}, copy
58 @file{../include/coff/i386.h} to @file{../include/coff/foo.h},
59 and add the lines to @file{targets.c} and @file{Makefile.in}
9fda1a39 60 so that your new back end is used. Alter the shapes of the
c188b0be 61 structures in @file{../include/coff/foo.h} so that they match
9fda1a39 62 what you need. You will probably also have to add
c188b0be 63 @code{#ifdef}s to the code in @file{coff/internal.h} and
9783e04a 64 @file{coffcode.h} if your version of coff is too wild.
9fda1a39
SC
65
66 You can verify that your new BFD backend works quite simply by
c188b0be
DM
67 building @file{objdump} from the @file{binutils} directory,
68 and making sure that its version of what's going on and your
69 host system's idea (assuming it has the pretty standard coff
70 dump utility, usually called @code{att-dump} or just
71 @code{dump}) are the same. Then clean up your code, and send
9fda1a39
SC
72 what you've done to Cygnus. Then your stuff will be in the
73 next release, and you won't have to keep integrating it.
74
75SUBSECTION
c188b0be 76 How the coff backend works
9fda1a39 77
075caafd 78SUBSUBSECTION
c188b0be 79 File layout
075caafd
ILT
80
81 The Coff backend is split into generic routines that are
82 applicable to any Coff target and routines that are specific
83 to a particular target. The target-specific routines are
84 further split into ones which are basically the same for all
85 Coff targets except that they use the external symbol format
86 or use different values for certain constants.
87
88 The generic routines are in @file{coffgen.c}. These routines
89 work for any Coff target. They use some hooks into the target
90 specific code; the hooks are in a @code{bfd_coff_backend_data}
91 structure, one of which exists for each target.
92
93 The essentially similar target-specific routines are in
c188b0be 94 @file{coffcode.h}. This header file includes executable C code.
075caafd
ILT
95 The various Coff targets first include the appropriate Coff
96 header file, make any special defines that are needed, and
97 then include @file{coffcode.h}.
98
99 Some of the Coff targets then also have additional routines in
100 the target source file itself.
101
102 For example, @file{coff-i960.c} includes
103 @file{coff/internal.h} and @file{coff/i960.h}. It then
104 defines a few constants, such as @code{I960}, and includes
105 @file{coffcode.h}. Since the i960 has complex relocation
106 types, @file{coff-i960.c} also includes some code to
107 manipulate the i960 relocs. This code is not in
108 @file{coffcode.h} because it would not be used by any other
109 target.
110
9fda1a39 111SUBSUBSECTION
c188b0be 112 Bit twiddling
9fda1a39 113
9fda1a39 114 Each flavour of coff supported in BFD has its own header file
c188b0be
DM
115 describing the external layout of the structures. There is also
116 an internal description of the coff layout, in
117 @file{coff/internal.h}. A major function of the
9fda1a39
SC
118 coff backend is swapping the bytes and twiddling the bits to
119 translate the external form of the structures into the normal
120 internal form. This is all performed in the
121 @code{bfd_swap}_@i{thing}_@i{direction} routines. Some
122 elements are different sizes between different versions of
c188b0be 123 coff; it is the duty of the coff version specific include file
9fda1a39 124 to override the definitions of various packing routines in
c188b0be 125 @file{coffcode.h}. E.g., the size of line number entry in coff is
9fda1a39
SC
126 sometimes 16 bits, and sometimes 32 bits. @code{#define}ing
127 @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the
128 correct one. No doubt, some day someone will find a version of
c188b0be 129 coff which has a varying field size not catered to at the
9783e04a 130 moment. To port BFD, that person will have to add more @code{#defines}.
9fda1a39
SC
131 Three of the bit twiddling routines are exported to
132 @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in}
133 and @code{coff_swap_linno_in}. @code{GDB} reads the symbol
134 table on its own, but uses BFD to fix things up. More of the
135 bit twiddlers are exported for @code{gas};
136 @code{coff_swap_aux_out}, @code{coff_swap_sym_out},
137 @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out},
138 @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out},
139 @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track
140 of all the symbol table and reloc drudgery itself, thereby
141 saving the internal BFD overhead, but uses BFD to swap things
c188b0be 142 on the way out, making cross ports much safer. Doing so also
9fda1a39
SC
143 allows BFD (and thus the linker) to use the same header files
144 as @code{gas}, which makes one avenue to disaster disappear.
145
146SUBSUBSECTION
c188b0be 147 Symbol reading
9fda1a39 148
9fda1a39
SC
149 The simple canonical form for symbols used by BFD is not rich
150 enough to keep all the information available in a coff symbol
c188b0be 151 table. The back end gets around this problem by keeping the original
9783e04a 152 symbol table around, "behind the scenes".
9fda1a39
SC
153
154 When a symbol table is requested (through a call to
c188b0be 155 @code{bfd_canonicalize_symtab}), a request gets through to
075caafd 156 @code{coff_get_normalized_symtab}. This reads the symbol table from
9fda1a39
SC
157 the coff file and swaps all the structures inside into the
158 internal form. It also fixes up all the pointers in the table
159 (represented in the file by offsets from the first symbol in
160 the table) into physical pointers to elements in the new
161 internal table. This involves some work since the meanings of
c188b0be 162 fields change depending upon context: a field that is a
9fda1a39 163 pointer to another structure in the symbol table at one moment
c188b0be 164 may be the size in bytes of a structure at the next. Another
9fda1a39 165 pass is made over the table. All symbols which mark file names
616ebcfd 166 (<<C_FILE>> symbols) are modified so that the internal
9fda1a39
SC
167 string points to the value in the auxent (the real filename)
168 rather than the normal text associated with the symbol
9783e04a 169 (@code{".file"}).
9fda1a39
SC
170
171 At this time the symbol names are moved around. Coff stores
172 all symbols less than nine characters long physically
c188b0be 173 within the symbol table; longer strings are kept at the end of
9fda1a39 174 the file in the string table. This pass moves all strings
c188b0be 175 into memory and replaces them with pointers to the strings.
9fda1a39
SC
176
177
178 The symbol table is massaged once again, this time to create
179 the canonical table used by the BFD application. Each symbol
180 is inspected in turn, and a decision made (using the
181 @code{sclass} field) about the various flags to set in the
c188b0be 182 @code{asymbol}. @xref{Symbols}. The generated canonical table
9783e04a 183 shares strings with the hidden internal symbol table.
9fda1a39
SC
184
185 Any linenumbers are read from the coff file too, and attached
9783e04a 186 to the symbols which own the functions the linenumbers belong to.
9fda1a39
SC
187
188SUBSUBSECTION
c188b0be 189 Symbol writing
9fda1a39 190
9fda1a39
SC
191 Writing a symbol to a coff file which didn't come from a coff
192 file will lose any debugging information. The @code{asymbol}
c188b0be
DM
193 structure remembers the BFD from which the symbol was taken, and on
194 output the back end makes sure that the same destination target as
9fda1a39
SC
195 source target is present.
196
197 When the symbols have come from a coff file then all the
198 debugging information is preserved.
199
200 Symbol tables are provided for writing to the back end in a
201 vector of pointers to pointers. This allows applications like
202 the linker to accumulate and output large symbol tables
203 without having to do too much byte copying.
204
9fda1a39
SC
205 This function runs through the provided symbol table and
206 patches each symbol marked as a file place holder
207 (@code{C_FILE}) to point to the next file place holder in the
208 list. It also marks each @code{offset} field in the list with
209 the offset from the first symbol of the current symbol.
210
211 Another function of this procedure is to turn the canonical
212 value form of BFD into the form used by coff. Internally, BFD
213 expects symbol values to be offsets from a section base; so a
214 symbol physically at 0x120, but in a section starting at
215 0x100, would have the value 0x20. Coff expects symbols to
216 contain their final value, so symbols have their values
217 changed at this point to reflect their sum with their owning
c188b0be 218 section. This transformation uses the
9fda1a39 219 <<output_section>> field of the @code{asymbol}'s
9783e04a 220 @code{asection} @xref{Sections}.
9fda1a39 221
c188b0be 222 o <<coff_mangle_symbols>>
616ebcfd 223
9fda1a39
SC
224 This routine runs though the provided symbol table and uses
225 the offsets generated by the previous pass and the pointers
226 generated when the symbol table was read in to create the
227 structured hierachy required by coff. It changes each pointer
c188b0be 228 to a symbol into the index into the symbol table of the asymbol.
9fda1a39 229
c188b0be 230 o <<coff_write_symbols>>
616ebcfd 231
9fda1a39
SC
232 This routine runs through the symbol table and patches up the
233 symbols from their internal form into the coff way, calls the
9783e04a 234 bit twiddlers, and writes out the table to the file.
6f715d66 235
9fda1a39 236*/
6f715d66 237
9fda1a39 238/*
616ebcfd
SC
239INTERNAL_DEFINITION
240 coff_symbol_type
6f715d66 241
616ebcfd 242DESCRIPTION
c188b0be
DM
243 The hidden information for an <<asymbol>> is described in a
244 <<combined_entry_type>>:
6f715d66 245
616ebcfd 246CODE_FRAGMENT
e98e6ec1 247.
9783e04a 248.typedef struct coff_ptr_struct
616ebcfd
SC
249.{
250.
251. {* Remembers the offset from the first symbol in the file for
252. this symbol. Generated by coff_renumber_symbols. *}
253.unsigned int offset;
254.
9783e04a
DM
255. {* Should the value of this symbol be renumbered. Used for
256. XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. *}
257.unsigned int fix_value : 1;
258.
616ebcfd
SC
259. {* Should the tag field of this symbol be renumbered.
260. Created by coff_pointerize_aux. *}
9783e04a 261.unsigned int fix_tag : 1;
616ebcfd
SC
262.
263. {* Should the endidx field of this symbol be renumbered.
264. Created by coff_pointerize_aux. *}
9783e04a
DM
265.unsigned int fix_end : 1;
266.
267. {* Should the x_csect.x_scnlen field be renumbered.
268. Created by coff_slurp_symbol_table. *}
269.unsigned int fix_scnlen : 1;
616ebcfd
SC
270.
271. {* The container for the symbol structure as read and translated
272. from the file. *}
273.
274.union {
275. union internal_auxent auxent;
276. struct internal_syment syment;
277. } u;
278.} combined_entry_type;
279.
280.
281.{* Each canonical asymbol really looks like this: *}
282.
283.typedef struct coff_symbol_struct
284.{
285. {* The actual symbol which the rest of BFD works with *}
286.asymbol symbol;
287.
288. {* A pointer to the hidden information for this symbol *}
289.combined_entry_type *native;
290.
291. {* A pointer to the linenumber information for this symbol *}
292.struct lineno_cache_entry *lineno;
293.
d58b7049
SC
294. {* Have the line numbers been relocated yet ? *}
295.boolean done_lineno;
616ebcfd 296.} coff_symbol_type;
6f715d66 297
6f715d66 298
0f268757
SC
299*/
300
80b2dd82 301#if defined(COFF_IMAGE_WITH_PE) || (defined(COFF_OBJ_WITH_PE) && defined(PPC))
beee31b1
SC
302#include "peicode.h"
303#else
304#include "coffswap.h"
89665c85
SC
305#endif
306
0f268757
SC
307\f
308/* void warning(); */
6f715d66 309
cbdc7909
JG
310/*
311 * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
41f50af0
SC
312 * incoming SEC_* flags. The inverse of this function is styp_to_sec_flags().
313 * NOTE: If you add to/change this routine, you should mirror the changes
314 * in styp_to_sec_flags().
315 */
cbdc7909 316static long
fbb61b50
SC
317sec_to_styp_flags (sec_name, sec_flags)
318 CONST char *sec_name;
319 flagword sec_flags;
41f50af0 320{
47cf4997
SC
321 long styp_flags = 0;
322
9783e04a 323 if (!strcmp (sec_name, _TEXT))
fbb61b50
SC
324 {
325 styp_flags = STYP_TEXT;
326 }
9783e04a 327 else if (!strcmp (sec_name, _DATA))
fbb61b50
SC
328 {
329 styp_flags = STYP_DATA;
fbb61b50 330 }
9783e04a 331 else if (!strcmp (sec_name, _BSS))
fbb61b50
SC
332 {
333 styp_flags = STYP_BSS;
8c4a1ace 334#ifdef _COMMENT
9783e04a
DM
335 }
336 else if (!strcmp (sec_name, _COMMENT))
fbb61b50
SC
337 {
338 styp_flags = STYP_INFO;
9783e04a 339#endif /* _COMMENT */
b26059aa 340#ifdef _LIB
fbb61b50 341 }
9783e04a 342 else if (!strcmp (sec_name, _LIB))
fbb61b50
SC
343 {
344 styp_flags = STYP_LIB;
9783e04a 345#endif /* _LIB */
35d835c4 346#ifdef _LIT
fbb61b50 347 }
35d835c4 348 else if (!strcmp (sec_name, _LIT))
fbb61b50
SC
349 {
350 styp_flags = STYP_LIT;
35d835c4 351#endif /* _LIT */
fbb61b50 352 }
9783e04a 353 else if (!strcmp (sec_name, ".debug"))
fbb61b50 354 {
9783e04a
DM
355#ifdef STYP_DEBUG
356 styp_flags = STYP_DEBUG;
357#else
fbb61b50 358 styp_flags = STYP_INFO;
9783e04a 359#endif
fbb61b50 360 }
89665c85 361 else if (!strncmp (sec_name, ".stab", 5))
fbb61b50
SC
362 {
363 styp_flags = STYP_INFO;
364 }
3ea928f5
SC
365#ifdef COFF_WITH_PE
366 else if (!strcmp (sec_name, ".edata"))
367 {
368 styp_flags = STYP_DATA;
369 }
370#endif
47cf4997 371 /* Try and figure out what it should be */
9783e04a 372 else if (sec_flags & SEC_CODE)
fbb61b50
SC
373 {
374 styp_flags = STYP_TEXT;
375 }
9783e04a 376 else if (sec_flags & SEC_DATA)
fbb61b50
SC
377 {
378 styp_flags = STYP_DATA;
379 }
47cf4997 380 else if (sec_flags & SEC_READONLY)
fbb61b50 381 {
47cf4997 382#ifdef STYP_LIT /* 29k readonly text/data section */
fbb61b50 383 styp_flags = STYP_LIT;
41f50af0 384#else
fbb61b50 385 styp_flags = STYP_TEXT;
9783e04a 386#endif /* STYP_LIT */
fbb61b50 387 }
47cf4997 388 else if (sec_flags & SEC_LOAD)
fbb61b50
SC
389 {
390 styp_flags = STYP_TEXT;
391 }
392 else if (sec_flags & SEC_ALLOC)
393 {
394 styp_flags = STYP_BSS;
395 }
41f50af0 396
b26059aa 397#ifdef STYP_NOLOAD
c16313f0 398 if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0)
9783e04a 399 styp_flags |= STYP_NOLOAD;
b26059aa
ILT
400#endif
401
9783e04a 402 return (styp_flags);
41f50af0 403}
cbdc7909 404/*
41f50af0 405 * Return a word with SEC_* flags set to represent the incoming
cbdc7909
JG
406 * STYP_* flags (from scnhdr.s_flags). The inverse of this
407 * function is sec_to_styp_flags().
41f50af0
SC
408 * NOTE: If you add to/change this routine, you should mirror the changes
409 * in sec_to_styp_flags().
410 */
cbdc7909 411static flagword
e8fbe6d9
ILT
412styp_to_sec_flags (abfd, hdr, name)
413 bfd *abfd;
57a1867e 414 PTR hdr;
e8fbe6d9 415 const char *name;
41f50af0 416{
075caafd
ILT
417 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
418 long styp_flags = internal_s->s_flags;
9783e04a 419 flagword sec_flags = 0;
41f50af0 420
b26059aa
ILT
421#ifdef STYP_NOLOAD
422 if (styp_flags & STYP_NOLOAD)
9783e04a
DM
423 {
424 sec_flags |= SEC_NEVER_LOAD;
425 }
b26059aa
ILT
426#endif /* STYP_NOLOAD */
427
8f718ed3
ILT
428 /* For 386 COFF, at least, an unloadable text or data section is
429 actually a shared library section. */
430 if (styp_flags & STYP_TEXT)
9783e04a
DM
431 {
432 if (sec_flags & SEC_NEVER_LOAD)
c16313f0 433 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
9783e04a
DM
434 else
435 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
436 }
8f718ed3 437 else if (styp_flags & STYP_DATA)
9783e04a
DM
438 {
439 if (sec_flags & SEC_NEVER_LOAD)
c16313f0 440 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
9783e04a
DM
441 else
442 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
443 }
444 else if (styp_flags & STYP_BSS)
445 {
35d835c4 446#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
9783e04a 447 if (sec_flags & SEC_NEVER_LOAD)
c16313f0 448 sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
9783e04a 449 else
35d835c4 450#endif
9783e04a
DM
451 sec_flags |= SEC_ALLOC;
452 }
453 else if (styp_flags & STYP_INFO)
fbb61b50 454 {
b5b056fc
KR
455 /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is
456 defined. coff_compute_section_file_positions uses
457 COFF_PAGE_SIZE to ensure that the low order bits of the
458 section VMA and the file offset match. If we don't know
459 COFF_PAGE_SIZE, we can't ensure the correct correspondence,
460 and demand page loading of the file will fail. */
461#ifdef COFF_PAGE_SIZE
462 sec_flags |= SEC_DEBUGGING;
463#endif
fbb61b50 464 }
e8fbe6d9
ILT
465 else if (strcmp (name, _TEXT) == 0)
466 {
467 if (sec_flags & SEC_NEVER_LOAD)
468 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
469 else
470 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
471 }
1af85fbb 472 else if (strcmp (name, _DATA) == 0)
e8fbe6d9
ILT
473 {
474 if (sec_flags & SEC_NEVER_LOAD)
475 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
476 else
477 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
478 }
479 else if (strcmp (name, _BSS) == 0)
480 {
481#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
482 if (sec_flags & SEC_NEVER_LOAD)
483 sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY;
484 else
485#endif
486 sec_flags |= SEC_ALLOC;
487 }
488 else if (strcmp (name, ".debug") == 0
489#ifdef _COMMENT
490 || strcmp (name, _COMMENT) == 0
491#endif
89665c85 492 || strncmp (name, ".stab", 5) == 0)
e8fbe6d9
ILT
493 {
494#ifdef COFF_PAGE_SIZE
495 sec_flags |= SEC_DEBUGGING;
496#endif
497 }
498#ifdef _LIB
499 else if (strcmp (name, _LIB) == 0)
500 ;
501#endif
502#ifdef _LIT
503 else if (strcmp (name, _LIT) == 0)
504 {
505 sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY;
506 }
507#endif
8070f29d 508 else
9783e04a
DM
509 {
510 sec_flags |= SEC_ALLOC | SEC_LOAD;
511 }
b26059aa 512
8070f29d
KR
513#ifdef STYP_LIT /* A29k readonly text/data section type */
514 if ((styp_flags & STYP_LIT) == STYP_LIT)
9783e04a
DM
515 {
516 sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
517 }
518#endif /* STYP_LIT */
8070f29d
KR
519#ifdef STYP_OTHER_LOAD /* Other loaded sections */
520 if (styp_flags & STYP_OTHER_LOAD)
9783e04a
DM
521 {
522 sec_flags = (SEC_LOAD | SEC_ALLOC);
523 }
524#endif /* STYP_SDATA */
41f50af0 525
9783e04a 526 return (sec_flags);
41f50af0 527}
0f268757 528
f135c692 529#define get_index(symbol) ((symbol)->udata.i)
0f268757 530
07de8e96
KR
531/*
532INTERNAL_DEFINITION
533 bfd_coff_backend_data
534
535CODE_FRAGMENT
536
c188b0be 537Special entry points for gdb to swap in coff symbol table parts:
9783e04a 538.typedef struct
60ac749c 539.{
07de8e96 540. void (*_bfd_coff_swap_aux_in) PARAMS ((
330595d0 541. bfd *abfd,
07de8e96
KR
542. PTR ext,
543. int type,
330595d0
ILT
544. int class,
545. int indaux,
546. int numaux,
07de8e96
KR
547. PTR in));
548.
549. void (*_bfd_coff_swap_sym_in) PARAMS ((
550. bfd *abfd ,
551. PTR ext,
552. PTR in));
553.
554. void (*_bfd_coff_swap_lineno_in) PARAMS ((
555. bfd *abfd,
556. PTR ext,
557. PTR in));
558.
559
c188b0be 560Special entry points for gas to swap out coff parts:
07de8e96
KR
561
562. unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
563. bfd *abfd,
564. PTR in,
565. int type,
566. int class,
330595d0
ILT
567. int indaux,
568. int numaux,
07de8e96
KR
569. PTR ext));
570.
571. unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
572. bfd *abfd,
573. PTR in,
574. PTR ext));
575.
576. unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
577. bfd *abfd,
578. PTR in,
579. PTR ext));
580.
581. unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
582. bfd *abfd,
583. PTR src,
584. PTR dst));
585.
586. unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
587. bfd *abfd,
588. PTR in,
589. PTR out));
590.
591. unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
592. bfd *abfd,
593. PTR in,
594. PTR out));
595.
596. unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
597. bfd *abfd,
598. PTR in,
599. PTR out));
600.
075caafd
ILT
601
602Special entry points for generic COFF routines to call target
c188b0be 603dependent COFF routines:
075caafd
ILT
604
605. unsigned int _bfd_filhsz;
606. unsigned int _bfd_aoutsz;
607. unsigned int _bfd_scnhsz;
608. unsigned int _bfd_symesz;
609. unsigned int _bfd_auxesz;
69645d10 610. unsigned int _bfd_relsz;
075caafd
ILT
611. unsigned int _bfd_linesz;
612. boolean _bfd_coff_long_filenames;
613. void (*_bfd_coff_swap_filehdr_in) PARAMS ((
614. bfd *abfd,
615. PTR ext,
616. PTR in));
617. void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
618. bfd *abfd,
619. PTR ext,
620. PTR in));
621. void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
622. bfd *abfd,
623. PTR ext,
624. PTR in));
69645d10
ILT
625. void (*_bfd_coff_swap_reloc_in) PARAMS ((
626. bfd *abfd,
627. PTR ext,
628. PTR in));
075caafd
ILT
629. boolean (*_bfd_coff_bad_format_hook) PARAMS ((
630. bfd *abfd,
631. PTR internal_filehdr));
632. boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
633. bfd *abfd,
634. PTR internal_filehdr));
635. PTR (*_bfd_coff_mkobject_hook) PARAMS ((
636. bfd *abfd,
27f524a3
ILT
637. PTR internal_filehdr,
638. PTR internal_aouthdr));
075caafd
ILT
639. flagword (*_bfd_styp_to_sec_flags_hook) PARAMS ((
640. bfd *abfd,
e8fbe6d9
ILT
641. PTR internal_scnhdr,
642. const char *name));
075caafd
ILT
643. void (*_bfd_set_alignment_hook) PARAMS ((
644. bfd *abfd,
645. asection *sec,
646. PTR internal_scnhdr));
647. boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
648. bfd *abfd));
649. boolean (*_bfd_coff_symname_in_debug) PARAMS ((
650. bfd *abfd,
651. struct internal_syment *sym));
c80cc833
ILT
652. boolean (*_bfd_coff_pointerize_aux_hook) PARAMS ((
653. bfd *abfd,
654. combined_entry_type *table_base,
655. combined_entry_type *symbol,
656. unsigned int indaux,
657. combined_entry_type *aux));
075caafd
ILT
658. void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
659. bfd *abfd,
330595d0
ILT
660. struct bfd_link_info *link_info,
661. struct bfd_link_order *link_order,
075caafd
ILT
662. arelent *reloc,
663. bfd_byte *data,
664. unsigned int *src_ptr,
665. unsigned int *dst_ptr));
fbb61b50 666. int (*_bfd_coff_reloc16_estimate) PARAMS ((
09a28207 667. bfd *abfd,
fbb61b50 668. asection *input_section,
fbb61b50 669. arelent *r,
330595d0
ILT
670. unsigned int shrink,
671. struct bfd_link_info *link_info));
69645d10
ILT
672. boolean (*_bfd_coff_sym_is_global) PARAMS ((
673. bfd *abfd,
674. struct internal_syment *));
675. void (*_bfd_coff_compute_section_file_positions) PARAMS ((
676. bfd *abfd));
a208a70f
ILT
677. boolean (*_bfd_coff_start_final_link) PARAMS ((
678. bfd *output_bfd,
679. struct bfd_link_info *info));
69645d10
ILT
680. boolean (*_bfd_coff_relocate_section) PARAMS ((
681. bfd *output_bfd,
682. struct bfd_link_info *info,
683. bfd *input_bfd,
684. asection *input_section,
685. bfd_byte *contents,
686. struct internal_reloc *relocs,
687. struct internal_syment *syms,
688. asection **sections));
f135c692
ILT
689. reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS ((
690. bfd *abfd,
691. asection *sec,
692. struct internal_reloc *rel,
693. struct coff_link_hash_entry *h,
694. struct internal_syment *sym,
695. bfd_vma *addendp));
696. boolean (*_bfd_coff_adjust_symndx) PARAMS ((
697. bfd *obfd,
698. struct bfd_link_info *info,
699. bfd *ibfd,
700. asection *sec,
701. struct internal_reloc *reloc,
702. boolean *adjustedp));
fbb61b50 703.
07de8e96
KR
704.} bfd_coff_backend_data;
705.
07de8e96
KR
706.#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
707.
330595d0
ILT
708.#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
709. ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
07de8e96
KR
710.
711.#define bfd_coff_swap_sym_in(a,e,i) \
712. ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
713.
714.#define bfd_coff_swap_lineno_in(a,e,i) \
715. ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
716.
717.#define bfd_coff_swap_reloc_out(abfd, i, o) \
718. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
719.
720.#define bfd_coff_swap_lineno_out(abfd, i, o) \
721. ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
722.
330595d0
ILT
723.#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
724. ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
07de8e96
KR
725.
726.#define bfd_coff_swap_sym_out(abfd, i,o) \
727. ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
728.
729.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
730. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
731.
732.#define bfd_coff_swap_filehdr_out(abfd, i,o) \
733. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
734.
735.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
736. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
737.
075caafd
ILT
738.#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
739.#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
740.#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
741.#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
742.#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
69645d10 743.#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz)
075caafd
ILT
744.#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
745.#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
746.#define bfd_coff_swap_filehdr_in(abfd, i,o) \
747. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
748.
749.#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
750. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
751.
752.#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
753. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
754.
69645d10
ILT
755.#define bfd_coff_swap_reloc_in(abfd, i, o) \
756. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o))
757.
075caafd
ILT
758.#define bfd_coff_bad_format_hook(abfd, filehdr) \
759. ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
760.
761.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
762. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
27f524a3
ILT
763.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
764. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
075caafd 765.
e8fbe6d9
ILT
766.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name)\
767. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr, name))
075caafd 768.
075caafd
ILT
769.#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
770. ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
771.
772.#define bfd_coff_slurp_symbol_table(abfd)\
773. ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
774.
775.#define bfd_coff_symname_in_debug(abfd, sym)\
776. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
777.
330595d0 778.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
075caafd 779. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
330595d0 780. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
fbb61b50 781.
09a28207 782.#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
fbb61b50 783. ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
09a28207 784. (abfd, section, reloc, shrink, link_info))
9783e04a 785.
69645d10
ILT
786.#define bfd_coff_sym_is_global(abfd, sym)\
787. ((coff_backend_info (abfd)->_bfd_coff_sym_is_global)\
788. (abfd, sym))
789.
790.#define bfd_coff_compute_section_file_positions(abfd)\
791. ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\
792. (abfd))
793.
a208a70f
ILT
794.#define bfd_coff_start_final_link(obfd, info)\
795. ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\
796. (obfd, info))
69645d10
ILT
797.#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\
798. ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\
799. (obfd, info, ibfd, o, con, rel, isyms, secs))
f135c692
ILT
800.#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\
801. ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\
802. (abfd, sec, rel, h, sym, addendp))
803.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\
804. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\
805. (obfd, info, ibfd, sec, rel, adjustedp))
69645d10 806.
07de8e96 807*/
0f268757 808
075caafd 809/* See whether the magic number matches. */
7a8b18b6 810
075caafd 811static boolean
57a1867e
DM
812coff_bad_format_hook (abfd, filehdr)
813 bfd * abfd;
814 PTR filehdr;
0f268757 815{
075caafd 816 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
0f268757 817
075caafd
ILT
818 if (BADMAG (*internal_f))
819 return false;
0f268757 820
075caafd
ILT
821 /* if the optional header is NULL or not the correct size then
822 quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
823 and Intel 960 readwrite headers (I960WRMAGIC) is that the
824 optional header is of a different size.
cbdc7909 825
075caafd
ILT
826 But the mips keeps extra stuff in it's opthdr, so dont check
827 when doing that
828 */
0f268757 829
075caafd
ILT
830#if defined(M88) || defined(I960)
831 if (internal_f->f_opthdr != 0 && AOUTSZ != internal_f->f_opthdr)
832 return false;
0f268757 833#endif
0f268757 834
075caafd 835 return true;
0f268757
SC
836}
837
0f268757
SC
838/*
839 initialize a section structure with information peculiar to this
840 particular implementation of coff
841*/
842
075caafd 843static boolean
57a1867e
DM
844coff_new_section_hook (abfd, section)
845 bfd * abfd;
846 asection * section;
0f268757 847{
f135c692
ILT
848 section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
849
8070f29d
KR
850 /* Allocate aux records for section symbols, to store size and
851 related info.
852
853 @@ Shouldn't use constant multiplier here! */
854 coffsymbol (section->symbol)->native =
855 (combined_entry_type *) bfd_zalloc (abfd,
856 sizeof (combined_entry_type) * 10);
c16313f0 857
f135c692
ILT
858 /* The .stab section must be aligned to 2**2 at most, because
859 otherwise there may be gaps in the section which gdb will not
860 know how to interpret. Examining the section name is a hack, but
850985ee
ILT
861 that is also how gdb locates the section.
862 We need to handle the .ctors and .dtors sections similarly, to
863 avoid introducing null words in the tables. */
f135c692 864 if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 2
850985ee
ILT
865 && (strncmp (section->name, ".stab", 5) == 0
866 || strcmp (section->name, ".ctors") == 0
867 || strcmp (section->name, ".dtors") == 0))
f135c692 868 section->alignment_power = 2;
c16313f0 869
0f268757
SC
870 return true;
871}
872
0f268757 873#ifdef I960
e98e6ec1 874
075caafd
ILT
875/* Set the alignment of a BFD section. */
876
877static void
57a1867e
DM
878coff_set_alignment_hook (abfd, section, scnhdr)
879 bfd * abfd;
880 asection * section;
881 PTR scnhdr;
e98e6ec1 882{
075caafd
ILT
883 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
884 unsigned int i;
885
886 for (i = 0; i < 32; i++)
887 if ((1 << i) >= hdr->s_align)
888 break;
889 section->alignment_power = i;
e98e6ec1
SC
890}
891
075caafd 892#else /* ! I960 */
0f268757 893
075caafd
ILT
894#define coff_set_alignment_hook \
895 ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
41f50af0 896
075caafd 897#endif /* ! I960 */
0f268757 898
beee31b1 899#ifndef coff_mkobject
9783e04a 900static boolean
57a1867e
DM
901coff_mkobject (abfd)
902 bfd * abfd;
0f268757 903{
075caafd
ILT
904 coff_data_type *coff;
905
9783e04a
DM
906 abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
907 if (abfd->tdata.coff_obj_data == 0)
908 {
57a1867e 909 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
910 return false;
911 }
075caafd
ILT
912 coff = coff_data (abfd);
913 coff->symbols = (coff_symbol_type *) NULL;
914 coff->conversion_table = (unsigned int *) NULL;
915 coff->raw_syments = (struct coff_ptr_struct *) NULL;
075caafd 916 coff->relocbase = 0;
6590a8c9 917/* make_abs_section(abfd);*/
89665c85 918
0f268757
SC
919 return true;
920}
beee31b1 921#endif
0f268757 922
075caafd 923/* Create the COFF backend specific information. */
beee31b1 924#ifndef coff_mkobject_hook
9783e04a 925static PTR
57a1867e
DM
926coff_mkobject_hook (abfd, filehdr, aouthdr)
927 bfd * abfd;
928 PTR filehdr;
929 PTR aouthdr;
0f268757 930{
075caafd 931 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
0f268757 932 coff_data_type *coff;
cbdc7909 933
075caafd
ILT
934 if (coff_mkobject (abfd) == false)
935 return NULL;
e98e6ec1 936
075caafd 937 coff = coff_data (abfd);
cbdc7909 938
075caafd 939 coff->sym_filepos = internal_f->f_symptr;
cbdc7909 940
075caafd
ILT
941 /* These members communicate important constants about the symbol
942 table to GDB's symbol-reading code. These `constants'
943 unfortunately vary among coff implementations... */
944 coff->local_n_btmask = N_BTMASK;
945 coff->local_n_btshft = N_BTSHFT;
9783e04a 946 coff->local_n_tmask = N_TMASK;
075caafd 947 coff->local_n_tshift = N_TSHIFT;
9783e04a
DM
948 coff->local_symesz = SYMESZ;
949 coff->local_auxesz = AUXESZ;
950 coff->local_linesz = LINESZ;
cbdc7909 951
69645d10
ILT
952 obj_raw_syment_count (abfd) =
953 obj_conv_table_size (abfd) =
954 internal_f->f_nsyms;
955
075caafd
ILT
956 return (PTR) coff;
957}
beee31b1 958#endif
cbdc7909 959
075caafd
ILT
960/* Determine the machine architecture and type. FIXME: This is target
961 dependent because the magic numbers are defined in the target
962 dependent header files. But there is no particular need for this.
963 If the magic numbers were moved to a separate file, this function
964 would be target independent and would also be much more successful
965 at linking together COFF files for different architectures. */
cbdc7909 966
075caafd 967static boolean
9783e04a 968coff_set_arch_mach_hook (abfd, filehdr)
4d09e8ac
JK
969 bfd *abfd;
970 PTR filehdr;
075caafd
ILT
971{
972 long machine;
973 enum bfd_architecture arch;
974 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
e98e6ec1 975
075caafd 976 machine = 0;
9783e04a
DM
977 switch (internal_f->f_magic)
978 {
80b2dd82
KK
979#ifdef PPCMAGIC
980 case PPCMAGIC:
981 arch = bfd_arch_powerpc;
982 machine = 0; /* what does this mean? (krk) */
983 break;
984#endif
20fdc627 985#ifdef I386MAGIC
9783e04a
DM
986 case I386MAGIC:
987 case I386PTXMAGIC:
988 case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
989 case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
990 arch = bfd_arch_i386;
991 machine = 0;
992 break;
20fdc627 993#endif
cbdc7909 994#ifdef A29K_MAGIC_BIG
9783e04a
DM
995 case A29K_MAGIC_BIG:
996 case A29K_MAGIC_LITTLE:
997 arch = bfd_arch_a29k;
998 machine = 0;
999 break;
41f50af0 1000#endif
89665c85
SC
1001#ifdef ARMMAGIC
1002 case ARMMAGIC:
1003 arch = bfd_arch_arm;
1004 machine =0;
1005 break;
1006#endif
0f268757 1007#ifdef MC68MAGIC
9783e04a
DM
1008 case MC68MAGIC:
1009 case M68MAGIC:
97eb2f0c 1010#ifdef MC68KBCSMAGIC
9783e04a 1011 case MC68KBCSMAGIC:
97eb2f0c
KR
1012#endif
1013#ifdef APOLLOM68KMAGIC
9783e04a 1014 case APOLLOM68KMAGIC:
c188b0be
DM
1015#endif
1016#ifdef LYNXCOFFMAGIC
9783e04a 1017 case LYNXCOFFMAGIC:
97eb2f0c 1018#endif
9783e04a
DM
1019 arch = bfd_arch_m68k;
1020 machine = 68020;
1021 break;
0f268757
SC
1022#endif
1023#ifdef MC88MAGIC
9783e04a
DM
1024 case MC88MAGIC:
1025 case MC88DMAGIC:
1026 case MC88OMAGIC:
1027 arch = bfd_arch_m88k;
1028 machine = 88100;
1029 break;
0f268757 1030#endif
dc999ad9 1031#ifdef Z8KMAGIC
9783e04a
DM
1032 case Z8KMAGIC:
1033 arch = bfd_arch_z8k;
1034 switch (internal_f->f_flags & F_MACHMASK)
1035 {
1036 case F_Z8001:
1037 machine = bfd_mach_z8001;
1038 break;
1039 case F_Z8002:
1040 machine = bfd_mach_z8002;
1041 break;
1042 default:
1043 return false;
1044 }
1045 break;
dc999ad9 1046#endif
0f268757
SC
1047#ifdef I960
1048#ifdef I960ROMAGIC
9783e04a
DM
1049 case I960ROMAGIC:
1050 case I960RWMAGIC:
1051 arch = bfd_arch_i960;
1052 switch (F_I960TYPE & internal_f->f_flags)
0f268757
SC
1053 {
1054 default:
1055 case F_I960CORE:
0d740984 1056 machine = bfd_mach_i960_core;
0f268757
SC
1057 break;
1058 case F_I960KB:
0d740984 1059 machine = bfd_mach_i960_kb_sb;
0f268757 1060 break;
9783e04a 1061 case F_I960MC:
0d740984 1062 machine = bfd_mach_i960_mc;
0f268757
SC
1063 break;
1064 case F_I960XA:
0d740984 1065 machine = bfd_mach_i960_xa;
0f268757
SC
1066 break;
1067 case F_I960CA:
0d740984 1068 machine = bfd_mach_i960_ca;
0f268757
SC
1069 break;
1070 case F_I960KA:
0d740984 1071 machine = bfd_mach_i960_ka_sa;
0f268757 1072 break;
b5b056fc
KR
1073 /* start-sanitize-i960xl */
1074 case F_I960XL:
1075 machine = bfd_mach_i960_xl;
1076 break;
1077 /* end-sanitize-i960xl */
0f268757 1078 }
9783e04a 1079 break;
0f268757
SC
1080#endif
1081#endif
cbdc7909
JG
1082
1083#ifdef U802ROMAGIC
9783e04a
DM
1084 case U802ROMAGIC:
1085 case U802WRMAGIC:
1086 case U802TOCMAGIC:
db344f82
SC
1087#ifdef POWERMAC
1088 /* PowerPC Macs use the same magic numbers as RS/6000 (because
1089 that's how they were bootstrapped originally), but they are
1090 always PowerPC architecture. */
1091 arch = bfd_arch_powerpc;
1092 machine = 601;
1093#else
1094 /* FIXME The architecture and machine can now (as of AIX 4.1) be
1095 identified by looking at fields in the a.out header. */
9783e04a
DM
1096 arch = bfd_arch_rs6000;
1097 machine = 6000;
db344f82 1098#endif /* POWERMAC */
9783e04a 1099 break;
cbdc7909
JG
1100#endif
1101
dc999ad9 1102#ifdef WE32KMAGIC
9783e04a
DM
1103 case WE32KMAGIC:
1104 arch = bfd_arch_we32k;
1105 machine = 0;
1106 break;
dc999ad9
ILT
1107#endif
1108
3b4f1a5d 1109#ifdef H8300MAGIC
9783e04a
DM
1110 case H8300MAGIC:
1111 arch = bfd_arch_h8300;
1112 machine = bfd_mach_h8300;
1113 /* !! FIXME this probably isn't the right place for this */
1114 abfd->flags |= BFD_IS_RELAXABLE;
1115 break;
4d09e8ac
JK
1116#endif
1117
1118#ifdef H8300HMAGIC
9783e04a
DM
1119 case H8300HMAGIC:
1120 arch = bfd_arch_h8300;
1121 machine = bfd_mach_h8300h;
1122 /* !! FIXME this probably isn't the right place for this */
1123 abfd->flags |= BFD_IS_RELAXABLE;
1124 break;
142ce43e
SC
1125#endif
1126
f135c692
ILT
1127#ifdef SH_ARCH_MAGIC_BIG
1128 case SH_ARCH_MAGIC_BIG:
1129 case SH_ARCH_MAGIC_LITTLE:
9783e04a
DM
1130 arch = bfd_arch_sh;
1131 machine = 0;
1132 break;
9faacb92
SC
1133#endif
1134
142ce43e 1135#ifdef H8500MAGIC
9783e04a
DM
1136 case H8500MAGIC:
1137 arch = bfd_arch_h8500;
1138 machine = 0;
1139 break;
3b4f1a5d 1140#endif
cbdc7909 1141
c188b0be 1142#ifdef SPARCMAGIC
9783e04a 1143 case SPARCMAGIC:
c16313f0
ILT
1144#ifdef LYNXCOFFMAGIC
1145 case LYNXCOFFMAGIC:
1146#endif
9783e04a
DM
1147 arch = bfd_arch_sparc;
1148 machine = 0;
1149 break;
c188b0be
DM
1150#endif
1151
9783e04a
DM
1152 default: /* Unreadable input file type */
1153 arch = bfd_arch_obscure;
1154 break;
1155 }
cbdc7909 1156
9783e04a 1157 bfd_default_set_arch_mach (abfd, arch, machine);
075caafd
ILT
1158 return true;
1159}
cbdc7909 1160
075caafd 1161#ifdef SYMNAME_IN_DEBUG
6f715d66 1162
075caafd 1163static boolean
57a1867e
DM
1164symname_in_debug_hook (abfd, sym)
1165 bfd * abfd;
1166 struct internal_syment *sym;
075caafd
ILT
1167{
1168 return SYMNAME_IN_DEBUG (sym) ? true : false;
1169}
6f715d66 1170
075caafd 1171#else
cbdc7909 1172
075caafd
ILT
1173#define symname_in_debug_hook \
1174 (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
cbdc7909 1175
075caafd 1176#endif
7a8b18b6 1177
c80cc833
ILT
1178#ifdef RS6000COFF_C
1179
1180/* We don't want to pointerize the csect auxent of a C_EXT or C_HIDEXT
1181 symbol. */
1182
1183static boolean coff_pointerize_aux_hook
1184 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1185 unsigned int, combined_entry_type *));
1186
1187/*ARGSUSED*/
1188static boolean
1189coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
1190 bfd *abfd;
1191 combined_entry_type *table_base;
1192 combined_entry_type *symbol;
1193 unsigned int indaux;
1194 combined_entry_type *aux;
1195{
1196 int class = symbol->u.syment.n_sclass;
1197
1198 /* Return true if we don't want to pointerize this aux entry, which
1199 is the case for the last aux entry for a C_EXT or C_HIDEXT
1200 symbol. */
1201 return ((class == C_EXT || class == C_HIDEXT)
1202 && indaux + 1 == symbol->u.syment.n_numaux);
1203}
1204
1205#else
1206#ifdef I960
1207
1208/* We don't want to pointerize bal entries. */
1209
1210static boolean coff_pointerize_aux_hook
1211 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
1212 unsigned int, combined_entry_type *));
1213
1214/*ARGSUSED*/
1215static boolean
1216coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux)
1217 bfd *abfd;
1218 combined_entry_type *table_base;
1219 combined_entry_type *symbol;
1220 unsigned int indaux;
1221 combined_entry_type *aux;
1222{
1223 /* Return true if we don't want to pointerize this aux entry, which
1224 is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */
1225 return indaux == 1 && symbol->u.syment.n_sclass == C_LEAFPROC;
1226}
1227
1228#else /* ! I960 */
1229
1230#define coff_pointerize_aux_hook 0
1231
1232#endif /* ! I960 */
1233#endif /* ! RS6000COFF_C */
1234
9fda1a39
SC
1235/*
1236SUBSUBSECTION
c188b0be 1237 Writing relocations
9fda1a39 1238
c188b0be
DM
1239 To write relocations, the back end steps though the
1240 canonical relocation table and create an
9fda1a39 1241 @code{internal_reloc}. The symbol index to use is removed from
c188b0be 1242 the @code{offset} field in the symbol table supplied. The
9fda1a39 1243 address comes directly from the sum of the section base
c188b0be 1244 address and the relocation offset; the type is dug directly
9fda1a39
SC
1245 from the howto field. Then the @code{internal_reloc} is
1246 swapped into the shape of an @code{external_reloc} and written
9783e04a 1247 out to disk.
9fda1a39 1248
6f715d66 1249*/
0f268757 1250
791a3db4 1251static boolean
89665c85 1252coff_write_relocs (abfd, first_undef)
57a1867e 1253 bfd * abfd;
89665c85 1254 int first_undef;
6f715d66 1255{
9783e04a
DM
1256 asection *s;
1257 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1258 {
1259 unsigned int i;
1260 struct external_reloc dst;
1261
1262 arelent **p = s->orelocation;
791a3db4
ILT
1263 if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
1264 return false;
9783e04a
DM
1265 for (i = 0; i < s->reloc_count; i++)
1266 {
1267 struct internal_reloc n;
1268 arelent *q = p[i];
1269 memset ((PTR) & n, 0, sizeof (n));
1270
89665c85
SC
1271 /* Now we've renumbered the symbols we know where the
1272 undefined symbols live in the table. Check the reloc
1273 entries for symbols who's output bfd isn't the right one.
1274 This is because the symbol was undefined (which means
1275 that all the pointers are never made to point to the same
1276 place). This is a bad thing,'cause the symbols attached
1277 to the output bfd are indexed, so that the relocation
1278 entries know which symbol index they point to. So we
1279 have to look up the output symbol here. */
1280
1281 if (q->sym_ptr_ptr[0]->the_bfd != abfd)
1282 {
1283 int i;
1284 const char *sname = q->sym_ptr_ptr[0]->name;
1285 asymbol **outsyms = abfd->outsymbols;
1286 for (i = first_undef; outsyms[i]; i++)
1287 {
1288 const char *intable = outsyms[i]->name;
1289 if (strcmp (intable, sname) == 0) {
1290 /* got a hit, so repoint the reloc */
1291 q->sym_ptr_ptr = outsyms + i;
1292 break;
1293 }
1294 }
1295 }
1296
9783e04a
DM
1297 n.r_vaddr = q->address + s->vma;
1298
1299#ifdef R_IHCONST
1300 /* The 29k const/consth reloc pair is a real kludge. The consth
89665c85
SC
1301 part doesn't have a symbol; it has an offset. So rebuilt
1302 that here. */
9783e04a
DM
1303 if (q->howto->type == R_IHCONST)
1304 n.r_symndx = q->addend;
1305 else
780c477a 1306#endif
89665c85
SC
1307 if (q->sym_ptr_ptr)
1308 {
1309 if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr)
1310 /* This is a relocation relative to the absolute symbol. */
1311 n.r_symndx = -1;
1312 else
1313 {
1314 n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
1315 /* Take notice if the symbol reloc points to a symbol
1316 we don't have in our symbol table. What should we
1317 do for this?? */
1318 if (n.r_symndx > obj_conv_table_size (abfd))
1319 abort ();
1320 }
1321 }
780c477a 1322
cd83759c 1323#ifdef SWAP_OUT_RELOC_OFFSET
9783e04a 1324 n.r_offset = q->addend;
cd83759c 1325#endif
c26d7d17 1326
0f268757 1327#ifdef SELECT_RELOC
9783e04a
DM
1328 /* Work out reloc type from what is required */
1329 SELECT_RELOC (n, q->howto);
0f268757 1330#else
9783e04a 1331 n.r_type = q->howto->type;
0f268757 1332#endif
9783e04a 1333 coff_swap_reloc_out (abfd, &n, &dst);
791a3db4
ILT
1334 if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
1335 return false;
9783e04a 1336 }
0f268757 1337 }
791a3db4
ILT
1338
1339 return true;
6f715d66 1340}
7a8b18b6
SC
1341
1342/* Set flags and magic number of a coff file from architecture and machine
1343 type. Result is true if we can represent the arch&type, false if not. */
0f268757 1344
9783e04a 1345static boolean
57a1867e
DM
1346coff_set_flags (abfd, magicp, flagsp)
1347 bfd * abfd;
1348 unsigned *magicp;
1349 unsigned short *flagsp;
6f715d66 1350{
9783e04a 1351 switch (bfd_get_arch (abfd))
dc999ad9 1352 {
9783e04a
DM
1353#ifdef Z8KMAGIC
1354 case bfd_arch_z8k:
1355 *magicp = Z8KMAGIC;
1356 switch (bfd_get_mach (abfd))
1357 {
1358 case bfd_mach_z8001:
1359 *flagsp = F_Z8001;
1360 break;
1361 case bfd_mach_z8002:
1362 *flagsp = F_Z8002;
1363 break;
1364 default:
1365 return false;
1366 }
1367 return true;
dc999ad9 1368#endif
0f268757 1369#ifdef I960ROMAGIC
cbdc7909 1370
3b4f1a5d 1371 case bfd_arch_i960:
cbdc7909 1372
6f715d66 1373 {
9783e04a 1374 unsigned flags;
6f715d66
SC
1375 *magicp = I960ROMAGIC;
1376 /*
1377 ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
1378 I960RWMAGIC); FIXME???
1379 */
9783e04a
DM
1380 switch (bfd_get_mach (abfd))
1381 {
1382 case bfd_mach_i960_core:
1383 flags = F_I960CORE;
1384 break;
1385 case bfd_mach_i960_kb_sb:
1386 flags = F_I960KB;
1387 break;
1388 case bfd_mach_i960_mc:
1389 flags = F_I960MC;
1390 break;
1391 case bfd_mach_i960_xa:
1392 flags = F_I960XA;
1393 break;
1394 case bfd_mach_i960_ca:
1395 flags = F_I960CA;
1396 break;
1397 case bfd_mach_i960_ka_sa:
1398 flags = F_I960KA;
1399 break;
b5b056fc
KR
1400 /* start-sanitize-i960xl */
1401 case bfd_mach_i960_xl:
1402 flags = F_I960XL;
1403 break;
1404 /* end-sanitize-i960xl */
9783e04a
DM
1405 default:
1406 return false;
1407 }
6f715d66
SC
1408 *flagsp = flags;
1409 return true;
1410 }
9783e04a 1411 break;
0f268757 1412#endif
89665c85
SC
1413#ifdef ARMMAGIC
1414 case bfd_arch_arm:
1415 *magicp = ARMMAGIC;
1416 return true;
1417#endif
80b2dd82
KK
1418#ifdef PPCMAGIC
1419 case bfd_arch_powerpc:
1420 *magicp = PPCMAGIC;
1421 return true;
1422 break;
1423#endif
20fdc627 1424#ifdef I386MAGIC
9783e04a
DM
1425 case bfd_arch_i386:
1426 *magicp = I386MAGIC;
c188b0be 1427#ifdef LYNXOS
9783e04a
DM
1428 /* Just overwrite the usual value if we're doing Lynx. */
1429 *magicp = LYNXCOFFMAGIC;
c188b0be 1430#endif
9783e04a
DM
1431 return true;
1432 break;
20fdc627 1433#endif
0f268757 1434#ifdef MC68MAGIC
9783e04a 1435 case bfd_arch_m68k:
97eb2f0c 1436#ifdef APOLLOM68KMAGIC
9783e04a 1437 *magicp = APOLLO_COFF_VERSION_NUMBER;
97eb2f0c 1438#else
9783e04a 1439 *magicp = MC68MAGIC;
c188b0be
DM
1440#endif
1441#ifdef LYNXOS
9783e04a
DM
1442 /* Just overwrite the usual value if we're doing Lynx. */
1443 *magicp = LYNXCOFFMAGIC;
97eb2f0c 1444#endif
9783e04a
DM
1445 return true;
1446 break;
0f268757 1447#endif
cbdc7909 1448
0f268757 1449#ifdef MC88MAGIC
3b4f1a5d
SC
1450 case bfd_arch_m88k:
1451 *magicp = MC88OMAGIC;
1452 return true;
1453 break;
1454#endif
1455#ifdef H8300MAGIC
1456 case bfd_arch_h8300:
9783e04a
DM
1457 switch (bfd_get_mach (abfd))
1458 {
1459 case bfd_mach_h8300:
1460 *magicp = H8300MAGIC;
1461 return true;
1462 case bfd_mach_h8300h:
1463 *magicp = H8300HMAGIC;
1464 return true;
1465 }
3b4f1a5d 1466 break;
0f268757 1467#endif
9faacb92 1468
f135c692 1469#ifdef SH_ARCH_MAGIC_BIG
9783e04a 1470 case bfd_arch_sh:
f135c692
ILT
1471 if (abfd->xvec->byteorder_big_p)
1472 *magicp = SH_ARCH_MAGIC_BIG;
1473 else
1474 *magicp = SH_ARCH_MAGIC_LITTLE;
9faacb92
SC
1475 return true;
1476 break;
1477#endif
1478
c188b0be 1479#ifdef SPARCMAGIC
9783e04a
DM
1480 case bfd_arch_sparc:
1481 *magicp = SPARCMAGIC;
c188b0be 1482#ifdef LYNXOS
9783e04a
DM
1483 /* Just overwrite the usual value if we're doing Lynx. */
1484 *magicp = LYNXCOFFMAGIC;
c188b0be 1485#endif
9783e04a
DM
1486 return true;
1487 break;
c188b0be
DM
1488#endif
1489
142ce43e
SC
1490#ifdef H8500MAGIC
1491 case bfd_arch_h8500:
1492 *magicp = H8500MAGIC;
1493 return true;
1494 break;
1495#endif
41f50af0 1496#ifdef A29K_MAGIC_BIG
3b4f1a5d
SC
1497 case bfd_arch_a29k:
1498 if (abfd->xvec->byteorder_big_p)
9783e04a 1499 *magicp = A29K_MAGIC_BIG;
3b4f1a5d 1500 else
9783e04a 1501 *magicp = A29K_MAGIC_LITTLE;
3b4f1a5d
SC
1502 return true;
1503 break;
41f50af0 1504#endif
cbdc7909 1505
dc999ad9 1506#ifdef WE32KMAGIC
9783e04a
DM
1507 case bfd_arch_we32k:
1508 *magicp = WE32KMAGIC;
1509 return true;
1510 break;
dc999ad9
ILT
1511#endif
1512
cbdc7909 1513#ifdef U802TOCMAGIC
9783e04a 1514 case bfd_arch_rs6000:
80b2dd82 1515#ifndef PPCMAGIC
09a28207 1516 case bfd_arch_powerpc:
80b2dd82 1517#endif
9783e04a
DM
1518 *magicp = U802TOCMAGIC;
1519 return true;
1520 break;
cbdc7909
JG
1521#endif
1522
9783e04a
DM
1523 default: /* Unknown architecture */
1524 /* return false; -- fall through to "return false" below, to avoid
cbdc7909 1525 "statement never reached" errors on the one below. */
9783e04a
DM
1526 break;
1527 }
cbdc7909 1528
6f715d66
SC
1529 return false;
1530}
0f268757
SC
1531
1532
9783e04a 1533static boolean
57a1867e
DM
1534coff_set_arch_mach (abfd, arch, machine)
1535 bfd * abfd;
1536 enum bfd_architecture arch;
1537 unsigned long machine;
6f715d66 1538{
9783e04a
DM
1539 unsigned dummy1;
1540 unsigned short dummy2;
c16313f0
ILT
1541
1542 if (! bfd_default_set_arch_mach (abfd, arch, machine))
1543 return false;
0d740984
SC
1544
1545 if (arch != bfd_arch_unknown &&
9783e04a 1546 coff_set_flags (abfd, &dummy1, &dummy2) != true)
0d740984 1547 return false; /* We can't represent this type */
c16313f0 1548
0d740984
SC
1549 return true; /* We're easy ... */
1550}
0f268757
SC
1551
1552
1553/* Calculate the file position for each section. */
1554
cbdc7909 1555static void
57a1867e
DM
1556coff_compute_section_file_positions (abfd)
1557 bfd * abfd;
6f715d66 1558{
9783e04a
DM
1559 asection *current;
1560 asection *previous = (asection *) NULL;
1561 file_ptr sofar = FILHSZ;
275143eb 1562
55c95b04 1563#ifndef I960
9783e04a 1564 file_ptr old_sofar;
55c95b04 1565#endif
69645d10
ILT
1566 unsigned int count;
1567
c7f6ebe2 1568
3ea928f5 1569#ifdef COFF_IMAGE_WITH_PE
275143eb 1570 int page_size;
c7f6ebe2
SC
1571 if (coff_data (abfd)->link_info)
1572 {
beee31b1 1573 page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
c7f6ebe2
SC
1574 }
1575 else
1576 page_size = PE_DEF_FILE_ALIGNMENT;
275143eb
SC
1577#elif defined (COFF_PAGE_SIZE)
1578 int page_size = COFF_PAGE_SIZE;
3ea928f5 1579#endif
275143eb 1580
9783e04a
DM
1581 if (bfd_get_start_address (abfd))
1582 {
1583 /* A start address may have been added to the original file. In this
c7f6ebe2 1584 case it will need an optional header to record it. */
9783e04a
DM
1585 abfd->flags |= EXEC_P;
1586 }
85e0c721 1587
e98e6ec1 1588 if (abfd->flags & EXEC_P)
9783e04a 1589 sofar += AOUTSZ;
cbdc7909 1590
e98e6ec1 1591 sofar += abfd->section_count * SCNHSZ;
69645d10 1592 for (current = abfd->sections, count = 1;
9783e04a 1593 current != (asection *) NULL;
69645d10 1594 current = current->next, ++count)
9783e04a 1595 {
69645d10 1596 current->target_index = count;
cbdc7909 1597
e98e6ec1
SC
1598 /* Only deal with sections which have contents */
1599 if (!(current->flags & SEC_HAS_CONTENTS))
9783e04a 1600 continue;
cbdc7909 1601
89665c85
SC
1602#ifdef COFF_WITH_PE
1603 /* Do not include the .junk section. This is where we collect section
1604 data which we don't need. This is mainly the MS .debug$ data which
1605 stores codeview debug data. */
1606 if (strcmp (current->name, ".junk") == 0)
1607 {
c7f6ebe2 1608 continue;
89665c85
SC
1609 }
1610#endif
1611
e98e6ec1
SC
1612 /* Align the sections in the file to the same boundary on
1613 which they are aligned in virtual memory. I960 doesn't
1614 do this (FIXME) so we can stay in sync with Intel. 960
1615 doesn't yet page from files... */
0f268757 1616#ifndef I960
9783e04a
DM
1617 {
1618 /* make sure this section is aligned on the right boundary - by
c7f6ebe2 1619 padding the previous section up if necessary */
e98e6ec1 1620
9783e04a
DM
1621 old_sofar = sofar;
1622 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
1623 if (previous != (asection *) NULL)
1624 {
1625 previous->_raw_size += sofar - old_sofar;
1626 }
1627 }
85e0c721 1628
0f268757 1629#endif
b5b056fc 1630
b5b056fc
KR
1631 /* In demand paged files the low order bits of the file offset
1632 must match the low order bits of the virtual address. */
275143eb 1633#ifdef COFF_PAGE_SIZE
e8fbe6d9
ILT
1634 if ((abfd->flags & D_PAGED) != 0
1635 && (current->flags & SEC_ALLOC) != 0)
3ea928f5 1636 sofar += (current->vma - sofar) % page_size;
275143eb 1637#endif
e98e6ec1 1638 current->filepos = sofar;
85e0c721 1639
beee31b1
SC
1640#ifdef COFF_IMAGE_WITH_PE
1641 /* With PE we have to pad each section to be a multiple of its page size
1642 too, and remember both sizes. Cooked_size becomes very useful. */
1643 current->_cooked_size = current->_raw_size;
1644 current->_raw_size = (current->_raw_size + page_size -1) & -page_size;
1645#endif
1646
5e167886 1647 sofar += current->_raw_size;
beee31b1 1648
5e167886 1649#ifndef I960
e98e6ec1 1650 /* make sure that this section is of the right size too */
9783e04a
DM
1651 old_sofar = sofar;
1652 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
1653 current->_raw_size += sofar - old_sofar;
5e167886 1654#endif
85e0c721 1655
35d835c4
JK
1656#ifdef _LIB
1657 /* Force .lib sections to start at zero. The vma is then
1658 incremented in coff_set_section_contents. This is right for
1659 SVR3.2. */
1660 if (strcmp (current->name, _LIB) == 0)
1661 bfd_set_section_vma (abfd, current, 0);
1662#endif
1663
e98e6ec1 1664 previous = current;
85e0c721 1665 }
89665c85 1666
9783e04a 1667 obj_relocbase (abfd) = sofar;
69645d10 1668 abfd->output_has_begun = true;
89665c85 1669
6f715d66 1670}
0f268757 1671
9783e04a
DM
1672#ifndef RS6000COFF_C
1673
8070f29d
KR
1674/* If .file, .text, .data, .bss symbols are missing, add them. */
1675/* @@ Should we only be adding missing symbols, or overriding the aux
1676 values for existing section symbols? */
9783e04a 1677static boolean
8070f29d
KR
1678coff_add_missing_symbols (abfd)
1679 bfd *abfd;
1680{
1681 unsigned int nsyms = bfd_get_symcount (abfd);
1682 asymbol **sympp = abfd->outsymbols;
1683 asymbol **sympp2;
1684 unsigned int i;
1685 int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
0f268757 1686
8070f29d
KR
1687 for (i = 0; i < nsyms; i++)
1688 {
1689 coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
1690 CONST char *name;
9783e04a 1691 if (csym)
8070f29d 1692 {
9783e04a
DM
1693 /* only do this if there is a coff representation of the input
1694 symbol */
1695 if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
1696 {
1697 need_file = 0;
1698 continue;
1699 }
1700 name = csym->symbol.name;
1701 if (!name)
1702 continue;
1703 if (!strcmp (name, _TEXT))
1704 need_text = 0;
97eb2f0c 1705#ifdef APOLLO_M68
9783e04a
DM
1706 else if (!strcmp (name, ".wtext"))
1707 need_text = 0;
97eb2f0c 1708#endif
9783e04a
DM
1709 else if (!strcmp (name, _DATA))
1710 need_data = 0;
1711 else if (!strcmp (name, _BSS))
1712 need_bss = 0;
1713 }
8070f29d
KR
1714 }
1715 /* Now i == bfd_get_symcount (abfd). */
1716 /* @@ For now, don't deal with .file symbol. */
1717 need_file = 0;
1718
1719 if (!need_text && !need_data && !need_bss && !need_file)
9783e04a 1720 return true;
8070f29d 1721 nsyms += need_text + need_data + need_bss + need_file;
9783e04a
DM
1722 sympp2 = (asymbol **) bfd_alloc_by_size_t (abfd, nsyms * sizeof (asymbol *));
1723 if (!sympp2)
1724 {
57a1867e 1725 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1726 return false;
1727 }
8070f29d
KR
1728 memcpy (sympp2, sympp, i * sizeof (asymbol *));
1729 if (need_file)
1730 {
1731 /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */
1732 abort ();
1733 }
1734 if (need_text)
1735 sympp2[i++] = coff_section_symbol (abfd, _TEXT);
1736 if (need_data)
1737 sympp2[i++] = coff_section_symbol (abfd, _DATA);
1738 if (need_bss)
1739 sympp2[i++] = coff_section_symbol (abfd, _BSS);
9465d03e 1740 BFD_ASSERT (i == nsyms);
8070f29d 1741 bfd_set_symtab (abfd, sympp2, nsyms);
9783e04a 1742 return true;
8070f29d 1743}
0f268757 1744
9783e04a
DM
1745#endif /* ! defined (RS6000COFF_C) */
1746
e9614321 1747
89665c85 1748
0f268757
SC
1749/* SUPPRESS 558 */
1750/* SUPPRESS 529 */
9783e04a 1751static boolean
57a1867e
DM
1752coff_write_object_contents (abfd)
1753 bfd * abfd;
e98e6ec1 1754{
9783e04a 1755 asection *current;
9783e04a
DM
1756 boolean hasrelocs = false;
1757 boolean haslinno = false;
1758 file_ptr reloc_base;
1759 file_ptr lineno_base;
1760 file_ptr sym_base;
9783e04a
DM
1761 unsigned long reloc_size = 0;
1762 unsigned long lnno_size = 0;
1763 asection *text_sec = NULL;
1764 asection *data_sec = NULL;
1765 asection *bss_sec = NULL;
cbdc7909 1766
e98e6ec1
SC
1767 struct internal_filehdr internal_f;
1768 struct internal_aouthdr internal_a;
cbdc7909 1769
57a1867e 1770 bfd_set_error (bfd_error_system_call);
6590a8c9 1771
9783e04a 1772 if (abfd->output_has_begun == false)
69645d10 1773 coff_compute_section_file_positions (abfd);
cbdc7909 1774
9783e04a 1775 reloc_base = obj_relocbase (abfd);
cbdc7909 1776
0f268757
SC
1777 /* Make a pass through the symbol table to count line number entries and
1778 put them into the correct asections */
cbdc7909 1779
9783e04a 1780 lnno_size = coff_count_linenumbers (abfd) * LINESZ;
cbdc7909 1781
0f268757 1782 /* Work out the size of the reloc and linno areas */
cbdc7909 1783
e98e6ec1 1784 for (current = abfd->sections; current != NULL; current =
9783e04a 1785 current->next)
69645d10 1786 reloc_size += current->reloc_count * RELSZ;
cbdc7909 1787
0f268757
SC
1788 lineno_base = reloc_base + reloc_size;
1789 sym_base = lineno_base + lnno_size;
cbdc7909 1790
0f268757 1791 /* Indicate in each section->line_filepos its actual file address */
e98e6ec1 1792 for (current = abfd->sections; current != NULL; current =
9783e04a 1793 current->next)
e98e6ec1 1794 {
69645d10 1795 if (current->lineno_count)
9783e04a 1796 {
69645d10
ILT
1797 current->line_filepos = lineno_base;
1798 current->moving_line_filepos = lineno_base;
1799 lineno_base += current->lineno_count * LINESZ;
1800 }
1801 else
1802 {
1803 current->line_filepos = 0;
1804 }
1805 if (current->reloc_count)
1806 {
1807 current->rel_filepos = reloc_base;
1808 reloc_base += current->reloc_count * RELSZ;
1809 }
1810 else
1811 {
1812 current->rel_filepos = 0;
e98e6ec1 1813 }
0f268757 1814 }
9783e04a 1815
e98e6ec1
SC
1816 /* Write section headers to the file. */
1817 internal_f.f_nscns = 0;
89665c85 1818
791a3db4
ILT
1819 if (bfd_seek (abfd,
1820 (file_ptr) ((abfd->flags & EXEC_P) ?
3332ea9c
SC
1821 (FILHSZ + AOUTSZ) : FILHSZ),
1822 SEEK_SET) != 0)
1823 return false;
cbdc7909 1824
3332ea9c
SC
1825 for (current = abfd->sections;
1826 current != NULL;
1827 current = current->next)
1828 {
1829 struct internal_scnhdr section;
69645d10 1830
89665c85 1831#ifdef COFF_WITH_PE
3332ea9c
SC
1832 /* Do not include the .junk section. This is where we collect section
1833 data which we don't need. This is mainly the MS .debug$ data which
1834 stores codeview debug data. */
1835 if (strcmp (current->name, ".junk") == 0)
1836 {
1837 continue;
1838 }
beee31b1
SC
1839
1840 /* If we've got a .reloc section, remember. */
1841
1842 if (strcmp (current->name, ".reloc") == 0)
1843 {
1844 pe_data (abfd)->has_reloc_section = 1;
1845 }
89665c85 1846#endif
3332ea9c
SC
1847 internal_f.f_nscns++;
1848 strncpy (&(section.s_name[0]), current->name, 8);
b26059aa 1849#ifdef _LIB
3332ea9c
SC
1850 /* Always set s_vaddr of .lib to 0. This is right for SVR3.2
1851 Ian Taylor <ian@cygnus.com>. */
1852 if (strcmp (current->name, _LIB) == 0)
1853 section.s_vaddr = 0;
1854 else
69645d10 1855#endif
beee31b1 1856 section.s_vaddr = current->lma;
3332ea9c 1857 section.s_paddr = current->lma;
beee31b1
SC
1858 section.s_size = current->_raw_size;
1859
1860#ifdef COFF_WITH_PE
1861 section.s_paddr = current->_cooked_size;
1862#endif
3332ea9c
SC
1863
1864 /*
1865 If this section has no size or is unloadable then the scnptr
1866 will be 0 too
1867 */
1868 if (current->_raw_size == 0 ||
1869 (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1870 {
1871 section.s_scnptr = 0;
1872 }
1873 else
1874 {
1875 section.s_scnptr = current->filepos;
1876 }
1877 section.s_relptr = current->rel_filepos;
1878 section.s_lnnoptr = current->line_filepos;
1879 section.s_nreloc = current->reloc_count;
1880 section.s_nlnno = current->lineno_count;
1881 if (current->reloc_count != 0)
1882 hasrelocs = true;
1883 if (current->lineno_count != 0)
1884 haslinno = true;
1885
1886 section.s_flags = sec_to_styp_flags (current->name, current->flags);
1887
1888 if (!strcmp (current->name, _TEXT))
1889 {
1890 text_sec = current;
1891 }
1892 else if (!strcmp (current->name, _DATA))
1893 {
1894 data_sec = current;
3332ea9c
SC
1895 }
1896 else if (!strcmp (current->name, _BSS))
1897 {
1898 bss_sec = current;
1899 }
cbdc7909 1900
0f268757 1901#ifdef I960
3332ea9c
SC
1902 section.s_align = (current->alignment_power
1903 ? 1 << current->alignment_power
1904 : 0);
1905
1906#endif
0f268757 1907
3332ea9c
SC
1908#ifdef COFF_IMAGE_WITH_PE
1909 /* suppress output of the sections if they are null. ld includes
1910 the bss and data sections even if there is no size assigned
1911 to them. NT loader doesn't like it if these section headers are
1912 included if the sections themselves are not needed */
1913 if (section.s_size == 0)
1914 internal_f.f_nscns--;
1915 else
0f268757 1916#endif
69645d10
ILT
1917 {
1918 SCNHDR buff;
3332ea9c
SC
1919 if (coff_swap_scnhdr_out (abfd, &section, &buff) == 0
1920 || bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
1921 return false;
69645d10 1922 }
3332ea9c
SC
1923 }
1924
e98e6ec1 1925
0f268757
SC
1926
1927 /* OK, now set up the filehdr... */
e98e6ec1
SC
1928
1929 /* Don't include the internal abs section in the section count */
1930
0f268757 1931 /*
89665c85
SC
1932 We will NOT put a fucking timestamp in the header here. Every time you
1933 put it back, I will come in and take it out again. I'm sorry. This
1934 field does not belong here. We fill it with a 0 so it compares the
1935 same but is not a reasonable time. -- gnu@cygnus.com
1936 */
5944d75b 1937 internal_f.f_timdat = 0;
0f268757 1938
0f268757
SC
1939 internal_f.f_flags = 0;
1940
1941 if (abfd->flags & EXEC_P)
9783e04a 1942 internal_f.f_opthdr = AOUTSZ;
0f268757 1943 else
9783e04a 1944 internal_f.f_opthdr = 0;
0f268757
SC
1945
1946 if (!hasrelocs)
9783e04a 1947 internal_f.f_flags |= F_RELFLG;
0f268757 1948 if (!haslinno)
9783e04a 1949 internal_f.f_flags |= F_LNNO;
0f268757 1950 if (abfd->flags & EXEC_P)
9783e04a 1951 internal_f.f_flags |= F_EXEC;
a0f3f080 1952
0f268757 1953 if (!abfd->xvec->byteorder_big_p)
9783e04a
DM
1954 internal_f.f_flags |= F_AR32WR;
1955 else
1956 internal_f.f_flags |= F_AR32W;
a0f3f080 1957
0f268757 1958 /*
89665c85
SC
1959 FIXME, should do something about the other byte orders and
1960 architectures.
1961 */
0f268757 1962
ab31ae53
KR
1963 memset (&internal_a, 0, sizeof internal_a);
1964
0f268757
SC
1965 /* Set up architecture-dependent stuff */
1966
9783e04a
DM
1967 {
1968 unsigned int magic = 0;
1969 unsigned short flags = 0;
1970 coff_set_flags (abfd, &magic, &flags);
1971 internal_f.f_magic = magic;
1972 internal_f.f_flags |= flags;
1973 /* ...and the "opt"hdr... */
0f268757 1974
cbdc7909 1975#ifdef A29K
9783e04a
DM
1976#ifdef ULTRA3 /* NYU's machine */
1977 /* FIXME: This is a bogus check. I really want to see if there
89665c85
SC
1978 * is a .shbss or a .shdata section, if so then set the magic
1979 * number to indicate a shared data executable.
1980 */
9783e04a 1981 if (internal_f.f_nscns >= 7)
89665c85 1982 internal_a.magic = SHMAGIC; /* Shared magic */
9783e04a
DM
1983 else
1984#endif /* ULTRA3 */
89665c85 1985 internal_a.magic = NMAGIC; /* Assume separate i/d */
41f50af0 1986#define __A_MAGIC_SET__
9783e04a 1987#endif /* A29K */
0f268757 1988#ifdef I960
9783e04a 1989 internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
41f50af0 1990#define __A_MAGIC_SET__
9783e04a 1991#endif /* I960 */
0f268757 1992#if M88
41f50af0 1993#define __A_MAGIC_SET__
9783e04a
DM
1994 internal_a.magic = PAGEMAGICBCS;
1995#endif /* M88 */
41f50af0 1996
97eb2f0c
KR
1997#if APOLLO_M68
1998#define __A_MAGIC_SET__
9783e04a 1999 internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
97eb2f0c
KR
2000#endif
2001
e8fbe6d9 2002#if defined(M68) || defined(WE32K) || defined(M68K)
41f50af0 2003#define __A_MAGIC_SET__
e8fbe6d9
ILT
2004#if defined(LYNXOS)
2005 internal_a.magic = LYNXCOFFMAGIC;
89665c85
SC
2006#endif /* LYNXOS */
2007#endif /* M68 || WE32K || M68K */
8ad2a31d 2008
89665c85
SC
2009#if defined(ARM)
2010#define __A_MAGIC_SET__
2011 internal_a.magic = ZMAGIC;
2012#endif
80b2dd82
KK
2013#if defined(PPC)
2014#define __A_MAGIC_SET__
2015 internal_a.magic = PPCMAGIC;
2016#endif
e8fbe6d9 2017#if defined(I386)
9783e04a 2018#define __A_MAGIC_SET__
e8fbe6d9
ILT
2019#if defined(LYNXOS)
2020 internal_a.magic = LYNXCOFFMAGIC;
89665c85 2021#else /* LYNXOS */
9783e04a 2022 internal_a.magic = ZMAGIC;
e8fbe6d9 2023#endif /* LYNXOS */
8ad2a31d 2024#endif /* I386 */
41f50af0 2025
e8fbe6d9
ILT
2026#if defined(SPARC)
2027#define __A_MAGIC_SET__
2028#if defined(LYNXOS)
89665c85
SC
2029 internal_a.magic = LYNXCOFFMAGIC;
2030#endif /* LYNXOS */
2031#endif /* SPARC */
e8fbe6d9 2032
cbdc7909
JG
2033#if RS6000COFF_C
2034#define __A_MAGIC_SET__
9783e04a 2035 internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
89665c85
SC
2036 (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
2037 RS6K_AOUTHDR_OMAGIC;
cbdc7909
JG
2038#endif
2039
41f50af0 2040#ifndef __A_MAGIC_SET__
9783e04a 2041#include "Your aouthdr magic number is not being set!"
41f50af0 2042#else
9783e04a 2043#undef __A_MAGIC_SET__
0f268757 2044#endif
9783e04a 2045 }
e18c4e8f
ILT
2046
2047 /* FIXME: Does anybody ever set this to another value? */
2048 internal_a.vstamp = 0;
2049
0f268757 2050 /* Now should write relocs, strings, syms */
9783e04a
DM
2051 obj_sym_filepos (abfd) = sym_base;
2052
2053 if (bfd_get_symcount (abfd) != 0)
2054 {
89665c85 2055 int firstundef;
9783e04a
DM
2056#ifndef RS6000COFF_C
2057 if (!coff_add_missing_symbols (abfd))
2058 return false;
2059#endif
89665c85 2060 if (!coff_renumber_symbols (abfd, &firstundef))
9783e04a
DM
2061 return false;
2062 coff_mangle_symbols (abfd);
bfe8224f
ILT
2063 if (! coff_write_symbols (abfd))
2064 return false;
791a3db4
ILT
2065 if (! coff_write_linenumbers (abfd))
2066 return false;
89665c85 2067 if (! coff_write_relocs (abfd, firstundef))
9783e04a 2068 return false;
e98e6ec1 2069 }
6ceff8e7
ILT
2070
2071 /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF
2072 backend linker, and obj_raw_syment_count is not valid until after
2073 coff_write_symbols is called. */
2074 if (obj_raw_syment_count (abfd) != 0)
2075 internal_f.f_symptr = sym_base;
2076 else
2077 {
2078 internal_f.f_symptr = 0;
2079 internal_f.f_flags |= F_LSYMS;
2080 }
2081
9783e04a
DM
2082 if (text_sec)
2083 {
2084 internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
e9614321 2085 internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
e98e6ec1 2086 }
9783e04a
DM
2087 if (data_sec)
2088 {
2089 internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
e9614321 2090 internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
e98e6ec1 2091 }
9783e04a
DM
2092 if (bss_sec)
2093 {
2094 internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
e98e6ec1 2095 }
0f268757 2096
e9614321 2097 internal_a.entry = bfd_get_start_address (abfd);
69645d10 2098 internal_f.f_nsyms = obj_raw_syment_count (abfd);
0f268757
SC
2099
2100 /* now write them */
9783e04a
DM
2101 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2102 return false;
2103 {
2104 FILHDR buff;
2105 coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) & buff);
791a3db4
ILT
2106 if (bfd_write ((PTR) & buff, 1, FILHSZ, abfd) != FILHSZ)
2107 return false;
9783e04a
DM
2108 }
2109 if (abfd->flags & EXEC_P)
2110 {
e98e6ec1 2111 AOUTHDR buff;
9783e04a 2112 coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) & buff);
791a3db4
ILT
2113 if (bfd_write ((PTR) & buff, 1, AOUTSZ, abfd) != AOUTSZ)
2114 return false;
e98e6ec1 2115 }
89665c85 2116
0f268757 2117 return true;
6f715d66
SC
2118}
2119
9783e04a 2120static boolean
57a1867e
DM
2121coff_set_section_contents (abfd, section, location, offset, count)
2122 bfd * abfd;
2123 sec_ptr section;
2124 PTR location;
2125 file_ptr offset;
2126 bfd_size_type count;
0f268757 2127{
9783e04a
DM
2128 if (abfd->output_has_begun == false) /* set by bfd.c handler */
2129 coff_compute_section_file_positions (abfd);
cbdc7909 2130
075caafd 2131#ifdef _LIB
9783e04a 2132 /* If this is a .lib section, bump the vma address so that it
075caafd
ILT
2133 winds up being the number of .lib sections output. This is
2134 right for SVR3.2. Shared libraries should probably get more
2135 generic support. Ian Taylor <ian@cygnus.com>. */
9783e04a
DM
2136 if (strcmp (section->name, _LIB) == 0)
2137 ++section->lma;
075caafd 2138#endif
0f268757 2139
9783e04a
DM
2140 /* Don't write out bss sections - one way to do this is to
2141 see if the filepos has not been set. */
2142 if (section->filepos == 0)
2143 return true;
55c95b04 2144
791a3db4
ILT
2145 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
2146 return false;
7a8b18b6 2147
9783e04a
DM
2148 if (count != 0)
2149 {
2150 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
075caafd 2151 }
9783e04a 2152 return true;
075caafd
ILT
2153}
2154#if 0
9783e04a
DM
2155static boolean
2156coff_close_and_cleanup (abfd)
2157 bfd *abfd;
0f268757 2158{
9783e04a
DM
2159 if (!bfd_read_p (abfd))
2160 switch (abfd->format)
2161 {
2162 case bfd_archive:
2163 if (!_bfd_write_archive_contents (abfd))
2164 return false;
2165 break;
2166 case bfd_object:
2167 if (!coff_write_object_contents (abfd))
2168 return false;
2169 break;
2170 default:
57a1867e 2171 bfd_set_error (bfd_error_invalid_operation);
075caafd 2172 return false;
9783e04a 2173 }
075caafd
ILT
2174
2175 /* We depend on bfd_close to free all the memory on the obstack. */
2176 /* FIXME if bfd_release is not using obstacks! */
2177 return true;
0f268757
SC
2178}
2179
075caafd
ILT
2180#endif
2181
2182static PTR
9783e04a
DM
2183buy_and_read (abfd, where, seek_direction, size)
2184 bfd *abfd;
2185 file_ptr where;
2186 int seek_direction;
2187 size_t size;
075caafd 2188{
9783e04a
DM
2189 PTR area = (PTR) bfd_alloc (abfd, size);
2190 if (!area)
2191 {
57a1867e 2192 bfd_set_error (bfd_error_no_memory);
9783e04a 2193 return (NULL);
075caafd 2194 }
791a3db4
ILT
2195 if (bfd_seek (abfd, where, seek_direction) != 0
2196 || bfd_read (area, 1, size, abfd) != size)
2197 return (NULL);
9783e04a 2198 return (area);
075caafd 2199} /* buy_and_read() */
0f268757 2200
9fda1a39 2201/*
9783e04a 2202SUBSUBSECTION
c188b0be 2203 Reading linenumbers
9fda1a39 2204
9fda1a39
SC
2205 Creating the linenumber table is done by reading in the entire
2206 coff linenumber table, and creating another table for internal use.
6f715d66 2207
c188b0be 2208 A coff linenumber table is structured so that each function
9fda1a39
SC
2209 is marked as having a line number of 0. Each line within the
2210 function is an offset from the first line in the function. The
2211 base of the line number information for the table is stored in
9783e04a 2212 the symbol associated with the function.
6f715d66 2213
9fda1a39
SC
2214 The information is copied from the external to the internal
2215 table, and each symbol which marks a function is marked by
2216 pointing its...
6f715d66 2217
9fda1a39 2218 How does this work ?
6f715d66
SC
2219
2220*/
0f268757
SC
2221
2222static boolean
9783e04a 2223coff_slurp_line_table (abfd, asect)
ab31ae53
KR
2224 bfd *abfd;
2225 asection *asect;
2226{
9783e04a 2227 LINENO *native_lineno;
ab31ae53
KR
2228 alent *lineno_cache;
2229
9783e04a 2230 BFD_ASSERT (asect->lineno == (alent *) NULL);
ab31ae53 2231
9783e04a
DM
2232 native_lineno = (LINENO *) buy_and_read (abfd,
2233 asect->line_filepos,
2234 SEEK_SET,
2235 (size_t) (LINESZ *
2236 asect->lineno_count));
ab31ae53 2237 lineno_cache =
9783e04a 2238 (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
ab31ae53
KR
2239 if (lineno_cache == NULL)
2240 {
57a1867e 2241 bfd_set_error (bfd_error_no_memory);
0f268757 2242 return false;
ab31ae53
KR
2243 }
2244 else
2245 {
9783e04a
DM
2246 unsigned int counter = 0;
2247 alent *cache_ptr = lineno_cache;
2248 LINENO *src = native_lineno;
cbdc7909 2249
ab31ae53
KR
2250 while (counter < asect->lineno_count)
2251 {
2252 struct internal_lineno dst;
9783e04a 2253 coff_swap_lineno_in (abfd, src, &dst);
ab31ae53
KR
2254 cache_ptr->line_number = dst.l_lnno;
2255
2256 if (cache_ptr->line_number == 0)
2257 {
2258 coff_symbol_type *sym =
9783e04a
DM
2259 (coff_symbol_type *) (dst.l_addr.l_symndx
2260 + obj_raw_syments (abfd))->u.syment._n._n_n._n_zeroes;
ab31ae53
KR
2261 cache_ptr->u.sym = (asymbol *) sym;
2262 sym->lineno = cache_ptr;
2263 }
2264 else
2265 {
2266 cache_ptr->u.offset = dst.l_addr.l_paddr
9783e04a
DM
2267 - bfd_section_vma (abfd, asect);
2268 } /* If no linenumber expect a symbol index */
ab31ae53
KR
2269
2270 cache_ptr++;
2271 src++;
2272 counter++;
0f268757 2273 }
0f268757 2274 cache_ptr->line_number = 0;
cbdc7909 2275
0f268757 2276 }
ab31ae53
KR
2277 asect->lineno = lineno_cache;
2278 /* FIXME, free native_lineno here, or use alloca or something. */
2279 return true;
2280}
0f268757 2281
ab31ae53 2282static boolean
57a1867e
DM
2283coff_slurp_symbol_table (abfd)
2284 bfd * abfd;
6f715d66 2285{
9783e04a 2286 combined_entry_type *native_symbols;
6f715d66 2287 coff_symbol_type *cached_area;
9783e04a 2288 unsigned int *table_ptr;
cbdc7909 2289
9783e04a 2290 unsigned int number_of_symbols = 0;
89665c85 2291
9783e04a 2292 if (obj_symbols (abfd))
6f715d66 2293 return true;
cbdc7909 2294
6f715d66 2295 /* Read in the symbol table */
9783e04a
DM
2296 if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
2297 {
2298 return (false);
2299 } /* on error */
cbdc7909 2300
6f715d66 2301 /* Allocate enough room for all the symbols in cached form */
69645d10
ILT
2302 cached_area = ((coff_symbol_type *)
2303 bfd_alloc (abfd,
2304 (obj_raw_syment_count (abfd)
2305 * sizeof (coff_symbol_type))));
cbdc7909 2306
9783e04a
DM
2307 if (cached_area == NULL)
2308 {
57a1867e 2309 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
2310 return false;
2311 } /* on error */
69645d10
ILT
2312 table_ptr = ((unsigned int *)
2313 bfd_alloc (abfd,
2314 (obj_raw_syment_count (abfd)
2315 * sizeof (unsigned int))));
cbdc7909 2316
9783e04a
DM
2317 if (table_ptr == NULL)
2318 {
57a1867e 2319 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
2320 return false;
2321 }
2322 else
2323 {
2324 coff_symbol_type *dst = cached_area;
69645d10 2325 unsigned int last_native_index = obj_raw_syment_count (abfd);
9783e04a
DM
2326 unsigned int this_index = 0;
2327 while (this_index < last_native_index)
2328 {
2329 combined_entry_type *src = native_symbols + this_index;
2330 table_ptr[this_index] = number_of_symbols;
2331 dst->symbol.the_bfd = abfd;
2332
2333 dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
2334 /* We use the native name field to point to the cached field. */
2335 src->u.syment._n._n_n._n_zeroes = (long) dst;
2336 dst->symbol.section = coff_section_from_bfd_index (abfd,
2337 src->u.syment.n_scnum);
2338 dst->symbol.flags = 0;
2339 dst->done_lineno = false;
2340
2341 switch (src->u.syment.n_sclass)
2342 {
0f268757 2343#ifdef I960
9783e04a 2344 case C_LEAFEXT:
0f268757 2345#if 0
9783e04a
DM
2346 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
2347 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
c7e76b5e 2348 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
0f268757 2349#endif
9783e04a 2350 /* Fall through to next case */
cbdc7909 2351
0f268757 2352#endif
cbdc7909 2353
9783e04a 2354 case C_EXT:
cbdc7909 2355#ifdef RS6000COFF_C
9783e04a 2356 case C_HIDEXT:
89665c85
SC
2357#endif
2358#ifdef COFF_WITH_PE
2359 /* PE uses storage class 0x68 to denote a section symbol */
2360 case C_SECTION:
9783e04a
DM
2361#endif
2362 if ((src->u.syment.n_scnum) == 0)
2363 {
2364 if ((src->u.syment.n_value) == 0)
2365 {
b5b056fc 2366 dst->symbol.section = bfd_und_section_ptr;
9783e04a
DM
2367 dst->symbol.value = 0;
2368 }
2369 else
2370 {
b5b056fc 2371 dst->symbol.section = bfd_com_section_ptr;
9783e04a
DM
2372 dst->symbol.value = (src->u.syment.n_value);
2373 }
2374 }
2375 else
2376 {
e7cac9de
ILT
2377 /* Base the value as an index from the base of the
2378 section */
e98e6ec1 2379
9783e04a 2380 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
e7cac9de
ILT
2381 dst->symbol.value = (src->u.syment.n_value
2382 - dst->symbol.section->vma);
e98e6ec1 2383
9783e04a
DM
2384 if (ISFCN ((src->u.syment.n_type)))
2385 {
e7cac9de
ILT
2386 /* A function ext does not go at the end of a
2387 file. */
c7e76b5e 2388 dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION;
9783e04a
DM
2389 }
2390 }
85e0c721 2391
9783e04a 2392#ifdef RS6000COFF_C
e7cac9de
ILT
2393 /* A C_HIDEXT symbol is not global. */
2394 if (src->u.syment.n_sclass == C_HIDEXT)
2395 dst->symbol.flags = BSF_LOCAL;
2396
2397 /* If this symbol has a csect aux of type LD, the scnlen
2398 field is actually the index of the containing csect
2399 symbol. We need to pointerize it. */
9783e04a
DM
2400 if (src->u.syment.n_numaux > 0)
2401 {
2402 combined_entry_type *aux;
2403
2404 aux = src + src->u.syment.n_numaux - 1;
2405 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2406 {
2407 aux->u.auxent.x_csect.x_scnlen.p =
2408 native_symbols + aux->u.auxent.x_csect.x_scnlen.l;
2409 aux->fix_scnlen = 1;
2410 }
2411 }
2412#endif
2413
2414 break;
2415
2416 case C_STAT: /* static */
0f268757 2417#ifdef I960
9783e04a
DM
2418 case C_LEAFSTAT: /* static leaf procedure */
2419#endif
2420 case C_LABEL: /* label */
2421 if (src->u.syment.n_scnum == -2)
2422 dst->symbol.flags = BSF_DEBUGGING;
2423 else
2424 dst->symbol.flags = BSF_LOCAL;
2425 /*
0d740984
SC
2426 Base the value as an index from the base of the section, if
2427 there is one
6f715d66 2428 */
9783e04a
DM
2429 if (dst->symbol.section)
2430 dst->symbol.value = (src->u.syment.n_value) -
2431 dst->symbol.section->vma;
2432 else
2433 dst->symbol.value = (src->u.syment.n_value);
2434 break;
2435
2436 case C_MOS: /* member of structure */
2437 case C_EOS: /* end of structure */
2438#ifdef NOTDEF /* C_AUTOARG has the same value */
41f50af0 2439#ifdef C_GLBLREG
9783e04a 2440 case C_GLBLREG: /* A29k-specific storage class */
41f50af0
SC
2441#endif
2442#endif
9783e04a
DM
2443 case C_REGPARM: /* register parameter */
2444 case C_REG: /* register variable */
0f268757 2445#ifdef C_AUTOARG
9783e04a
DM
2446 case C_AUTOARG: /* 960-specific storage class */
2447#endif
2448 case C_TPDEF: /* type definition */
2449 case C_ARG:
2450 case C_AUTO: /* automatic variable */
2451 case C_FIELD: /* bit field */
2452 case C_ENTAG: /* enumeration tag */
2453 case C_MOE: /* member of enumeration */
2454 case C_MOU: /* member of union */
2455 case C_UNTAG: /* union tag */
2456 dst->symbol.flags = BSF_DEBUGGING;
2457 dst->symbol.value = (src->u.syment.n_value);
2458 break;
2459
2460 case C_FILE: /* file name */
2461 case C_STRTAG: /* structure tag */
cbdc7909 2462#ifdef RS6000COFF_C
9783e04a
DM
2463 case C_BINCL: /* beginning of include file */
2464 case C_EINCL: /* ending of include file */
2465 case C_GSYM:
2466 case C_LSYM:
2467 case C_PSYM:
2468 case C_RSYM:
2469 case C_RPSYM:
2470 case C_STSYM:
2471 case C_DECL:
2472 case C_ENTRY:
2473 case C_FUN:
2474 case C_ESTAT:
2475#endif
2476 dst->symbol.flags = BSF_DEBUGGING;
2477 dst->symbol.value = (src->u.syment.n_value);
2478 break;
cbdc7909 2479
9783e04a
DM
2480#ifdef RS6000COFF_C
2481 case C_BSTAT:
2482 dst->symbol.flags = BSF_DEBUGGING;
2483 dst->symbol.value = src->u.syment.n_value;
2484
2485 /* The value is actually a symbol index. Save a pointer to
2486 the symbol instead of the index. FIXME: This should use a
2487 union. */
2488 src->u.syment.n_value =
2489 (long) (native_symbols + src->u.syment.n_value);
2490 src->fix_value = 1;
2491 break;
2492#endif
2493
2494 case C_BLOCK: /* ".bb" or ".eb" */
2495 case C_FCN: /* ".bf" or ".ef" */
2496 case C_EFCN: /* physical end of function */
2497 dst->symbol.flags = BSF_LOCAL;
2498 /*
6f715d66
SC
2499 Base the value as an index from the base of the section
2500 */
9783e04a
DM
2501 dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma;
2502 break;
2503
2504 case C_NULL:
2505 case C_EXTDEF: /* external definition */
2506 case C_ULABEL: /* undefined label */
2507 case C_USTATIC: /* undefined static */
89665c85
SC
2508#ifndef COFF_WITH_PE
2509 /* C_LINE in regular coff is 0x68. NT has taken over this storage
2510 class to represent a section symbol */
9783e04a 2511 case C_LINE: /* line # reformatted as symbol table entry */
89665c85 2512#endif
9783e04a
DM
2513 case C_ALIAS: /* duplicate tag */
2514 case C_HIDDEN: /* ext symbol in dmert public lib */
2515 default:
7a7fbffb
ILT
2516 (*_bfd_error_handler)
2517 ("%s: Unrecognized storage class %d for %s symbol `%s'",
2518 bfd_get_filename (abfd), src->u.syment.n_sclass,
2519 dst->symbol.section->name, dst->symbol.name);
9783e04a
DM
2520 dst->symbol.flags = BSF_DEBUGGING;
2521 dst->symbol.value = (src->u.syment.n_value);
2522 break;
2523 }
cbdc7909 2524
6590a8c9 2525/* BFD_ASSERT(dst->symbol.flags != 0);*/
cbdc7909 2526
9783e04a 2527 dst->native = src;
cbdc7909 2528
f135c692 2529 dst->symbol.udata.i = 0;
9783e04a
DM
2530 dst->lineno = (alent *) NULL;
2531 this_index += (src->u.syment.n_numaux) + 1;
2532 dst++;
2533 number_of_symbols++;
2534 } /* walk the native symtab */
2535 } /* bfdize the native symtab */
cbdc7909 2536
9783e04a
DM
2537 obj_symbols (abfd) = cached_area;
2538 obj_raw_syments (abfd) = native_symbols;
cbdc7909 2539
9783e04a
DM
2540 bfd_get_symcount (abfd) = number_of_symbols;
2541 obj_convert (abfd) = table_ptr;
6f715d66 2542 /* Slurp the line tables for each section too */
9783e04a
DM
2543 {
2544 asection *p;
2545 p = abfd->sections;
2546 while (p)
2547 {
2548 coff_slurp_line_table (abfd, p);
6f715d66 2549 p = p->next;
0f268757 2550 }
9783e04a 2551 }
6f715d66
SC
2552 return true;
2553} /* coff_slurp_symbol_table() */
0f268757 2554
69645d10
ILT
2555/* Check whether a symbol is globally visible. This is used by the
2556 COFF backend linker code in cofflink.c, since a couple of targets
2557 have globally visible symbols which are not class C_EXT. This
2558 function need not handle the case of n_class == C_EXT. */
2559
2560#undef OTHER_GLOBAL_CLASS
2561
2562#ifdef I960
2563#define OTHER_GLOBAL_CLASS C_LEAFEXT
2564#endif
2565
89665c85
SC
2566#ifdef COFF_WITH_PE
2567#define OTHER_GLOBAL_CLASS C_SECTION
2568#endif
2569
69645d10
ILT
2570#ifdef OTHER_GLOBAL_CLASS
2571
2572static boolean
2573coff_sym_is_global (abfd, syment)
2574 bfd *abfd;
2575 struct internal_syment *syment;
2576{
2577 if (syment->n_sclass == OTHER_GLOBAL_CLASS)
2578 return true;
2579 return false;
2580}
2581
2582#undef OTHER_GLOBAL_CLASS
2583
2584#else /* ! defined (OTHER_GLOBAL_CLASS) */
2585
2586/* sym_is_global should not be defined if it has nothing to do. */
2587
2588#define coff_sym_is_global 0
2589
2590#endif /* ! defined (OTHER_GLOBAL_CLASS) */
2591
9fda1a39 2592/*
9783e04a 2593SUBSUBSECTION
c188b0be 2594 Reading relocations
9fda1a39 2595
9fda1a39
SC
2596 Coff relocations are easily transformed into the internal BFD form
2597 (@code{arelent}).
2598
2599 Reading a coff relocation table is done in the following stages:
2600
c188b0be 2601 o Read the entire coff relocation table into memory.
9fda1a39 2602
c188b0be 2603 o Process each relocation in turn; first swap it from the
9fda1a39
SC
2604 external to the internal form.
2605
c188b0be
DM
2606 o Turn the symbol referenced in the relocation's symbol index
2607 into a pointer into the canonical symbol table.
2608 This table is the same as the one returned by a call to
2609 @code{bfd_canonicalize_symtab}. The back end will call that
9fda1a39
SC
2610 routine and save the result if a canonicalization hasn't been done.
2611
2612 o The reloc index is turned into a pointer to a howto
2613 structure, in a back end specific way. For instance, the 386
2614 and 960 use the @code{r_type} to directly produce an index
2615 into a howto table vector; the 88k subtracts a number from the
2616 @code{r_type} field and creates an addend field.
2617
2618
6f715d66
SC
2619*/
2620
3b4f1a5d 2621#ifndef CALC_ADDEND
492d52cc
ILT
2622#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
2623 { \
2624 coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
2625 if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
2626 coffsym = (obj_symbols (abfd) \
2627 + (cache_ptr->sym_ptr_ptr - symbols)); \
2628 else if (ptr) \
2629 coffsym = coff_symbol_from (abfd, ptr); \
2630 if (coffsym != (coff_symbol_type *) NULL \
2631 && coffsym->native->u.syment.n_scnum == 0) \
2632 cache_ptr->addend = 0; \
2633 else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
2634 && ptr->section != (asection *) NULL) \
2635 cache_ptr->addend = - (ptr->section->vma + ptr->value); \
2636 else \
2637 cache_ptr->addend = 0; \
2638 }
3b4f1a5d
SC
2639#endif
2640
9783e04a 2641static boolean
57a1867e
DM
2642coff_slurp_reloc_table (abfd, asect, symbols)
2643 bfd * abfd;
2644 sec_ptr asect;
2645 asymbol ** symbols;
85e0c721 2646{
9783e04a
DM
2647 RELOC *native_relocs;
2648 arelent *reloc_cache;
2649 arelent *cache_ptr;
3b4f1a5d
SC
2650
2651 unsigned int idx;
9783e04a 2652
3b4f1a5d 2653 if (asect->relocation)
9783e04a 2654 return true;
3b4f1a5d 2655 if (asect->reloc_count == 0)
9783e04a 2656 return true;
3b4f1a5d 2657 if (asect->flags & SEC_CONSTRUCTOR)
9783e04a
DM
2658 return true;
2659 if (!coff_slurp_symbol_table (abfd))
2660 return false;
3b4f1a5d 2661 native_relocs =
9783e04a
DM
2662 (RELOC *) buy_and_read (abfd,
2663 asect->rel_filepos,
2664 SEEK_SET,
2665 (size_t) (RELSZ *
2666 asect->reloc_count));
3b4f1a5d 2667 reloc_cache = (arelent *)
9783e04a 2668 bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
3b4f1a5d 2669
9783e04a
DM
2670 if (reloc_cache == NULL)
2671 {
57a1867e 2672 bfd_set_error (bfd_error_no_memory);
3b4f1a5d 2673 return false;
9783e04a 2674 }
3b4f1a5d 2675
9783e04a
DM
2676
2677 for (idx = 0; idx < asect->reloc_count; idx++)
2678 {
616ebcfd 2679#ifdef RELOC_PROCESSING
3b4f1a5d 2680 struct internal_reloc dst;
9783e04a 2681 struct external_reloc *src;
3b4f1a5d
SC
2682
2683 cache_ptr = reloc_cache + idx;
2684 src = native_relocs + idx;
69645d10 2685 coff_swap_reloc_in (abfd, src, &dst);
3b4f1a5d 2686
9783e04a 2687 RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
9898b929 2688#else
616ebcfd 2689 struct internal_reloc dst;
9783e04a
DM
2690 asymbol *ptr;
2691 struct external_reloc *src;
616ebcfd
SC
2692
2693 cache_ptr = reloc_cache + idx;
2694 src = native_relocs + idx;
2695
69645d10 2696 coff_swap_reloc_in (abfd, src, &dst);
616ebcfd 2697
9898b929
JG
2698
2699 cache_ptr->address = dst.r_vaddr;
2700
9783e04a 2701 if (dst.r_symndx != -1)
8070f29d
KR
2702 {
2703 /* @@ Should never be greater than count of symbols! */
2704 if (dst.r_symndx >= obj_conv_table_size (abfd))
2705 abort ();
9783e04a 2706 cache_ptr->sym_ptr_ptr = symbols + obj_convert (abfd)[dst.r_symndx];
9898b929 2707 ptr = *(cache_ptr->sym_ptr_ptr);
8070f29d 2708 }
9783e04a 2709 else
8070f29d 2710 {
b5b056fc 2711 cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
8070f29d
KR
2712 ptr = 0;
2713 }
85e0c721 2714
cd83759c
KR
2715 /* The symbols definitions that we have read in have been
2716 relocated as if their sections started at 0. But the offsets
2717 refering to the symbols in the raw data have not been
2718 modified, so we have to have a negative addend to compensate.
2719
2720 Note that symbols which used to be common must be left alone */
cbdc7909 2721
3b4f1a5d 2722 /* Calculate any reloc addend by looking at the symbol */
9783e04a 2723 CALC_ADDEND (abfd, ptr, dst, cache_ptr);
cbdc7909 2724
3b4f1a5d 2725 cache_ptr->address -= asect->vma;
e98e6ec1 2726/* !! cache_ptr->section = (asection *) NULL;*/
20fdc627 2727
3b4f1a5d 2728 /* Fill in the cache_ptr->howto field from dst.r_type */
9783e04a 2729 RTYPE2HOWTO (cache_ptr, &dst);
9898b929
JG
2730#endif
2731
9783e04a 2732 }
cbdc7909 2733
3b4f1a5d
SC
2734 asect->relocation = reloc_cache;
2735 return true;
85e0c721 2736}
0f268757 2737
f135c692
ILT
2738#ifndef coff_rtype_to_howto
2739#ifdef RTYPE2HOWTO
2740
2741/* Get the howto structure for a reloc. This is only used if the file
2742 including this one defines coff_relocate_section to be
2743 _bfd_coff_generic_relocate_section, so it is OK if it does not
2744 always work. It is the responsibility of the including file to
2745 make sure it is reasonable if it is needed. */
2746
2747static reloc_howto_type *coff_rtype_to_howto
2748 PARAMS ((bfd *, asection *, struct internal_reloc *,
2749 struct coff_link_hash_entry *, struct internal_syment *,
2750 bfd_vma *));
2751
2752/*ARGSUSED*/
2753static reloc_howto_type *
2754coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
2755 bfd *abfd;
2756 asection *sec;
2757 struct internal_reloc *rel;
2758 struct coff_link_hash_entry *h;
2759 struct internal_syment *sym;
2760 bfd_vma *addendp;
2761{
2762 arelent genrel;
2763
2764 RTYPE2HOWTO (&genrel, rel);
2765 return genrel.howto;
2766}
2767
2768#else /* ! defined (RTYPE2HOWTO) */
2769
2770#define coff_rtype_to_howto NULL
2771
2772#endif /* ! defined (RTYPE2HOWTO) */
2773#endif /* ! defined (coff_rtype_to_howto) */
0f268757 2774
cd83759c 2775/* This is stupid. This function should be a boolean predicate. */
326e32d7 2776static long
57a1867e
DM
2777coff_canonicalize_reloc (abfd, section, relptr, symbols)
2778 bfd * abfd;
2779 sec_ptr section;
2780 arelent ** relptr;
2781 asymbol ** symbols;
85e0c721 2782{
9783e04a
DM
2783 arelent *tblptr = section->relocation;
2784 unsigned int count = 0;
cbdc7909 2785
cbdc7909 2786
9783e04a
DM
2787 if (section->flags & SEC_CONSTRUCTOR)
2788 {
2789 /* this section has relocs made up by us, they are not in the
e98e6ec1
SC
2790 file, so take them out of their chain and place them into
2791 the data area provided */
9783e04a
DM
2792 arelent_chain *chain = section->constructor_chain;
2793 for (count = 0; count < section->reloc_count; count++)
2794 {
2795 *relptr++ = &chain->relent;
2796 chain = chain->next;
2797 }
e98e6ec1 2798
9783e04a
DM
2799 }
2800 else
2801 {
326e32d7
ILT
2802 if (! coff_slurp_reloc_table (abfd, section, symbols))
2803 return -1;
85e0c721 2804
9783e04a 2805 tblptr = section->relocation;
85e0c721 2806
9783e04a
DM
2807 for (; count++ < section->reloc_count;)
2808 *relptr++ = tblptr++;
cbdc7909 2809
85e0c721 2810
9783e04a 2811 }
e98e6ec1
SC
2812 *relptr = 0;
2813 return section->reloc_count;
85e0c721 2814}
0f268757 2815
0f268757
SC
2816#ifdef GNU960
2817file_ptr
9783e04a
DM
2818coff_sym_filepos (abfd)
2819 bfd *abfd;
2820{
2821 return obj_sym_filepos (abfd);
2822}
0f268757
SC
2823#endif
2824
fbb61b50
SC
2825#ifndef coff_reloc16_estimate
2826#define coff_reloc16_estimate dummy_reloc16_estimate
2827
56775366 2828static int
09a28207
ILT
2829dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
2830 bfd *abfd;
fbb61b50 2831 asection *input_section;
fbb61b50 2832 arelent *reloc;
56775366 2833 unsigned int shrink;
330595d0 2834 struct bfd_link_info *link_info;
fbb61b50 2835{
56775366 2836 abort ();
fbb61b50
SC
2837}
2838
2839#endif
2840
075caafd 2841#ifndef coff_reloc16_extra_cases
9e768fa2
JK
2842#define coff_reloc16_extra_cases dummy_reloc16_extra_cases
2843/* This works even if abort is not declared in any header file. */
4d09e8ac 2844static void
330595d0
ILT
2845dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
2846 dst_ptr)
9e768fa2 2847 bfd *abfd;
330595d0
ILT
2848 struct bfd_link_info *link_info;
2849 struct bfd_link_order *link_order;
9e768fa2
JK
2850 arelent *reloc;
2851 bfd_byte *data;
2852 unsigned int *src_ptr;
2853 unsigned int *dst_ptr;
2854{
2855 abort ();
2856}
8ad2a31d 2857#endif
6590a8c9 2858
69645d10
ILT
2859/* If coff_relocate_section is defined, we can use the optimized COFF
2860 backend linker. Otherwise we must continue to use the old linker. */
2861#ifdef coff_relocate_section
f135c692 2862#ifndef coff_bfd_link_hash_table_create
69645d10 2863#define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create
f135c692
ILT
2864#endif
2865#ifndef coff_bfd_link_add_symbols
69645d10 2866#define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols
f135c692
ILT
2867#endif
2868#ifndef coff_bfd_final_link
69645d10 2869#define coff_bfd_final_link _bfd_coff_final_link
f135c692 2870#endif
69645d10
ILT
2871#else /* ! defined (coff_relocate_section) */
2872#define coff_relocate_section NULL
2873#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
2874#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
2875#define coff_bfd_final_link _bfd_generic_final_link
2876#endif /* ! defined (coff_relocate_section) */
89665c85 2877#define coff_bfd_link_split_section _bfd_generic_link_split_section
69645d10 2878
a208a70f
ILT
2879#ifndef coff_start_final_link
2880#define coff_start_final_link NULL
2881#endif
2882
f135c692
ILT
2883#ifndef coff_adjust_symndx
2884#define coff_adjust_symndx NULL
2885#endif
2886
9783e04a
DM
2887static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
2888{
2889 coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in,
2890 coff_swap_aux_out, coff_swap_sym_out,
2891 coff_swap_lineno_out, coff_swap_reloc_out,
2892 coff_swap_filehdr_out, coff_swap_aouthdr_out,
2893 coff_swap_scnhdr_out,
69645d10 2894 FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ,
075caafd 2895#ifdef COFF_LONG_FILENAMES
9783e04a 2896 true,
075caafd 2897#else
9783e04a 2898 false,
07de8e96 2899#endif
9783e04a 2900 coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in,
69645d10 2901 coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook,
1af85fbb 2902 coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook,
c80cc833 2903 coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook,
69645d10
ILT
2904 coff_reloc16_extra_cases, coff_reloc16_estimate,
2905 coff_sym_is_global, coff_compute_section_file_positions,
a208a70f
ILT
2906 coff_start_final_link, coff_relocate_section, coff_rtype_to_howto,
2907 coff_adjust_symndx
075caafd 2908};
0f268757 2909
6812b607
ILT
2910#define coff_close_and_cleanup _bfd_generic_close_and_cleanup
2911#define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
2912#define coff_get_section_contents _bfd_generic_get_section_contents
09a28207 2913
db344f82
SC
2914#ifndef coff_bfd_copy_private_symbol_data
2915#define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
2916#endif
2917
2918#ifndef coff_bfd_copy_private_section_data
2919#define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
2920#endif
2921
2922#ifndef coff_bfd_copy_private_bfd_data
6812b607 2923#define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
db344f82
SC
2924#endif
2925
89665c85
SC
2926#define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
2927#define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
6812b607 2928
beee31b1 2929#ifndef coff_bfd_print_private_bfd_data
db344f82 2930#define coff_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
beee31b1
SC
2931#endif
2932
09a28207
ILT
2933#ifndef coff_bfd_is_local_label
2934#define coff_bfd_is_local_label bfd_generic_is_local_label
2935#endif
e9614321
SC
2936#ifndef coff_read_minisymbols
2937#define coff_read_minisymbols _bfd_generic_read_minisymbols
2938#endif
2939#ifndef coff_minisymbol_to_symbol
2940#define coff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
2941#endif
6812b607
ILT
2942
2943/* The reloc lookup routine must be supplied by each individual COFF
2944 backend. */
2945#ifndef coff_bfd_reloc_type_lookup
2946#define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
2947#endif
2948
e9614321 2949#ifndef coff_bfd_get_relocated_section_contents
6812b607
ILT
2950#define coff_bfd_get_relocated_section_contents \
2951 bfd_generic_get_relocated_section_contents
e9614321
SC
2952#endif
2953#ifndef coff_bfd_relax_section
6812b607 2954#define coff_bfd_relax_section bfd_generic_relax_section
e9614321 2955#endif
This page took 0.353015 seconds and 4 git commands to generate.