Tue May 10 11:20:54 1994 Stan Shebs (shebs@andros.cygnus.com)
[deliverable/binutils-gdb.git] / bfd / coffcode.h
CommitLineData
6d7c88c3 1/* Support for the generic parts of most COFF variants, for BFD.
192d8ee8 2 Copyright 1990, 1991, 1992, 1993, 1994 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
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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
075caafd 301#include "coffswap.h"
0f268757
SC
302\f
303/* void warning(); */
6f715d66 304
cbdc7909
JG
305/*
306 * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the
41f50af0
SC
307 * incoming SEC_* flags. The inverse of this function is styp_to_sec_flags().
308 * NOTE: If you add to/change this routine, you should mirror the changes
309 * in styp_to_sec_flags().
310 */
cbdc7909 311static long
fbb61b50
SC
312sec_to_styp_flags (sec_name, sec_flags)
313 CONST char *sec_name;
314 flagword sec_flags;
41f50af0 315{
47cf4997
SC
316 long styp_flags = 0;
317
9783e04a 318 if (!strcmp (sec_name, _TEXT))
fbb61b50
SC
319 {
320 styp_flags = STYP_TEXT;
321 }
9783e04a 322 else if (!strcmp (sec_name, _DATA))
fbb61b50
SC
323 {
324 styp_flags = STYP_DATA;
b26059aa 325#ifdef TWO_DATA_SECS
fbb61b50 326 }
9783e04a 327 else if (!strcmp (sec_name, ".data2"))
fbb61b50
SC
328 {
329 styp_flags = STYP_DATA;
9783e04a 330#endif /* TWO_DATA_SECS */
fbb61b50 331 }
9783e04a 332 else if (!strcmp (sec_name, _BSS))
fbb61b50
SC
333 {
334 styp_flags = STYP_BSS;
8c4a1ace 335#ifdef _COMMENT
9783e04a
DM
336 }
337 else if (!strcmp (sec_name, _COMMENT))
fbb61b50
SC
338 {
339 styp_flags = STYP_INFO;
9783e04a 340#endif /* _COMMENT */
b26059aa 341#ifdef _LIB
fbb61b50 342 }
9783e04a 343 else if (!strcmp (sec_name, _LIB))
fbb61b50
SC
344 {
345 styp_flags = STYP_LIB;
9783e04a 346#endif /* _LIB */
35d835c4 347#ifdef _LIT
fbb61b50 348 }
35d835c4 349 else if (!strcmp (sec_name, _LIT))
fbb61b50
SC
350 {
351 styp_flags = STYP_LIT;
35d835c4 352#endif /* _LIT */
fbb61b50 353 }
9783e04a 354 else if (!strcmp (sec_name, ".debug"))
fbb61b50 355 {
9783e04a
DM
356#ifdef STYP_DEBUG
357 styp_flags = STYP_DEBUG;
358#else
fbb61b50 359 styp_flags = STYP_INFO;
9783e04a 360#endif
fbb61b50 361 }
9783e04a
DM
362 else if (!strcmp (sec_name, ".stab")
363 || !strncmp (sec_name, ".stabstr", 8))
fbb61b50
SC
364 {
365 styp_flags = STYP_INFO;
366 }
47cf4997 367 /* Try and figure out what it should be */
9783e04a 368 else if (sec_flags & SEC_CODE)
fbb61b50
SC
369 {
370 styp_flags = STYP_TEXT;
371 }
9783e04a 372 else if (sec_flags & SEC_DATA)
fbb61b50
SC
373 {
374 styp_flags = STYP_DATA;
375 }
47cf4997 376 else if (sec_flags & SEC_READONLY)
fbb61b50 377 {
47cf4997 378#ifdef STYP_LIT /* 29k readonly text/data section */
fbb61b50 379 styp_flags = STYP_LIT;
41f50af0 380#else
fbb61b50 381 styp_flags = STYP_TEXT;
9783e04a 382#endif /* STYP_LIT */
fbb61b50 383 }
47cf4997 384 else if (sec_flags & SEC_LOAD)
fbb61b50
SC
385 {
386 styp_flags = STYP_TEXT;
387 }
388 else if (sec_flags & SEC_ALLOC)
389 {
390 styp_flags = STYP_BSS;
391 }
41f50af0 392
b26059aa 393#ifdef STYP_NOLOAD
47cf4997 394 if (sec_flags & SEC_NEVER_LOAD)
9783e04a 395 styp_flags |= STYP_NOLOAD;
b26059aa
ILT
396#endif
397
9783e04a 398 return (styp_flags);
41f50af0 399}
cbdc7909 400/*
41f50af0 401 * Return a word with SEC_* flags set to represent the incoming
cbdc7909
JG
402 * STYP_* flags (from scnhdr.s_flags). The inverse of this
403 * function is sec_to_styp_flags().
41f50af0
SC
404 * NOTE: If you add to/change this routine, you should mirror the changes
405 * in sec_to_styp_flags().
406 */
cbdc7909 407static flagword
57a1867e
DM
408styp_to_sec_flags (abfd, hdr)
409 bfd * abfd;
410 PTR hdr;
41f50af0 411{
075caafd
ILT
412 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
413 long styp_flags = internal_s->s_flags;
9783e04a 414 flagword sec_flags = 0;
41f50af0 415
b26059aa
ILT
416#ifdef STYP_NOLOAD
417 if (styp_flags & STYP_NOLOAD)
9783e04a
DM
418 {
419 sec_flags |= SEC_NEVER_LOAD;
420 }
b26059aa
ILT
421#endif /* STYP_NOLOAD */
422
8f718ed3
ILT
423 /* For 386 COFF, at least, an unloadable text or data section is
424 actually a shared library section. */
425 if (styp_flags & STYP_TEXT)
9783e04a
DM
426 {
427 if (sec_flags & SEC_NEVER_LOAD)
428 sec_flags |= SEC_CODE | SEC_SHARED_LIBRARY;
429 else
430 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
431 }
8f718ed3 432 else if (styp_flags & STYP_DATA)
9783e04a
DM
433 {
434 if (sec_flags & SEC_NEVER_LOAD)
435 sec_flags |= SEC_DATA | SEC_SHARED_LIBRARY;
436 else
437 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
438 }
439 else if (styp_flags & STYP_BSS)
440 {
35d835c4 441#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY
9783e04a
DM
442 if (sec_flags & SEC_NEVER_LOAD)
443 sec_flags |= SEC_ALLOC | SEC_SHARED_LIBRARY;
444 else
35d835c4 445#endif
9783e04a
DM
446 sec_flags |= SEC_ALLOC;
447 }
448 else if (styp_flags & STYP_INFO)
fbb61b50 449 {
56775366
ILT
450 /* This should be marked as SEC_DEBUGGING, but that can't be
451 done until we make sure that strip can still work. strip
452 will probably have to preserve the same number of sections to
453 ensure that the section vma matches the section file
454 position. */
fbb61b50 455 }
8070f29d 456 else
9783e04a
DM
457 {
458 sec_flags |= SEC_ALLOC | SEC_LOAD;
459 }
b26059aa 460
8070f29d
KR
461#ifdef STYP_LIT /* A29k readonly text/data section type */
462 if ((styp_flags & STYP_LIT) == STYP_LIT)
9783e04a
DM
463 {
464 sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY);
465 }
466#endif /* STYP_LIT */
8070f29d
KR
467#ifdef STYP_OTHER_LOAD /* Other loaded sections */
468 if (styp_flags & STYP_OTHER_LOAD)
9783e04a
DM
469 {
470 sec_flags = (SEC_LOAD | SEC_ALLOC);
471 }
472#endif /* STYP_SDATA */
41f50af0 473
9783e04a 474 return (sec_flags);
41f50af0 475}
0f268757 476
4d09e8ac 477#define get_index(symbol) ((long) (symbol)->udata)
0f268757 478
07de8e96
KR
479/*
480INTERNAL_DEFINITION
481 bfd_coff_backend_data
482
483CODE_FRAGMENT
484
c188b0be 485Special entry points for gdb to swap in coff symbol table parts:
9783e04a 486.typedef struct
60ac749c 487.{
07de8e96 488. void (*_bfd_coff_swap_aux_in) PARAMS ((
330595d0 489. bfd *abfd,
07de8e96
KR
490. PTR ext,
491. int type,
330595d0
ILT
492. int class,
493. int indaux,
494. int numaux,
07de8e96
KR
495. PTR in));
496.
497. void (*_bfd_coff_swap_sym_in) PARAMS ((
498. bfd *abfd ,
499. PTR ext,
500. PTR in));
501.
502. void (*_bfd_coff_swap_lineno_in) PARAMS ((
503. bfd *abfd,
504. PTR ext,
505. PTR in));
506.
507
c188b0be 508Special entry points for gas to swap out coff parts:
07de8e96
KR
509
510. unsigned int (*_bfd_coff_swap_aux_out) PARAMS ((
511. bfd *abfd,
512. PTR in,
513. int type,
514. int class,
330595d0
ILT
515. int indaux,
516. int numaux,
07de8e96
KR
517. PTR ext));
518.
519. unsigned int (*_bfd_coff_swap_sym_out) PARAMS ((
520. bfd *abfd,
521. PTR in,
522. PTR ext));
523.
524. unsigned int (*_bfd_coff_swap_lineno_out) PARAMS ((
525. bfd *abfd,
526. PTR in,
527. PTR ext));
528.
529. unsigned int (*_bfd_coff_swap_reloc_out) PARAMS ((
530. bfd *abfd,
531. PTR src,
532. PTR dst));
533.
534. unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS ((
535. bfd *abfd,
536. PTR in,
537. PTR out));
538.
539. unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS ((
540. bfd *abfd,
541. PTR in,
542. PTR out));
543.
544. unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS ((
545. bfd *abfd,
546. PTR in,
547. PTR out));
548.
075caafd
ILT
549
550Special entry points for generic COFF routines to call target
c188b0be 551dependent COFF routines:
075caafd
ILT
552
553. unsigned int _bfd_filhsz;
554. unsigned int _bfd_aoutsz;
555. unsigned int _bfd_scnhsz;
556. unsigned int _bfd_symesz;
557. unsigned int _bfd_auxesz;
558. unsigned int _bfd_linesz;
559. boolean _bfd_coff_long_filenames;
560. void (*_bfd_coff_swap_filehdr_in) PARAMS ((
561. bfd *abfd,
562. PTR ext,
563. PTR in));
564. void (*_bfd_coff_swap_aouthdr_in) PARAMS ((
565. bfd *abfd,
566. PTR ext,
567. PTR in));
568. void (*_bfd_coff_swap_scnhdr_in) PARAMS ((
569. bfd *abfd,
570. PTR ext,
571. PTR in));
572. boolean (*_bfd_coff_bad_format_hook) PARAMS ((
573. bfd *abfd,
574. PTR internal_filehdr));
575. boolean (*_bfd_coff_set_arch_mach_hook) PARAMS ((
576. bfd *abfd,
577. PTR internal_filehdr));
578. PTR (*_bfd_coff_mkobject_hook) PARAMS ((
579. bfd *abfd,
27f524a3
ILT
580. PTR internal_filehdr,
581. PTR internal_aouthdr));
075caafd
ILT
582. flagword (*_bfd_styp_to_sec_flags_hook) PARAMS ((
583. bfd *abfd,
584. PTR internal_scnhdr));
585. asection *(*_bfd_make_section_hook) PARAMS ((
586. bfd *abfd,
587. char *name));
588. void (*_bfd_set_alignment_hook) PARAMS ((
589. bfd *abfd,
590. asection *sec,
591. PTR internal_scnhdr));
592. boolean (*_bfd_coff_slurp_symbol_table) PARAMS ((
593. bfd *abfd));
594. boolean (*_bfd_coff_symname_in_debug) PARAMS ((
595. bfd *abfd,
596. struct internal_syment *sym));
597. void (*_bfd_coff_reloc16_extra_cases) PARAMS ((
598. bfd *abfd,
330595d0
ILT
599. struct bfd_link_info *link_info,
600. struct bfd_link_order *link_order,
075caafd
ILT
601. arelent *reloc,
602. bfd_byte *data,
603. unsigned int *src_ptr,
604. unsigned int *dst_ptr));
fbb61b50 605. int (*_bfd_coff_reloc16_estimate) PARAMS ((
09a28207 606. bfd *abfd,
fbb61b50 607. asection *input_section,
fbb61b50 608. arelent *r,
330595d0
ILT
609. unsigned int shrink,
610. struct bfd_link_info *link_info));
fbb61b50 611.
07de8e96
KR
612.} bfd_coff_backend_data;
613.
07de8e96
KR
614.#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data)
615.
330595d0
ILT
616.#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \
617. ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i))
07de8e96
KR
618.
619.#define bfd_coff_swap_sym_in(a,e,i) \
620. ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i))
621.
622.#define bfd_coff_swap_lineno_in(a,e,i) \
623. ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i))
624.
625.#define bfd_coff_swap_reloc_out(abfd, i, o) \
626. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o))
627.
628.#define bfd_coff_swap_lineno_out(abfd, i, o) \
629. ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o))
630.
330595d0
ILT
631.#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \
632. ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o))
07de8e96
KR
633.
634.#define bfd_coff_swap_sym_out(abfd, i,o) \
635. ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o))
636.
637.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \
638. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o))
639.
640.#define bfd_coff_swap_filehdr_out(abfd, i,o) \
641. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o))
642.
643.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \
644. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o))
645.
075caafd
ILT
646.#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz)
647.#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz)
648.#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz)
649.#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz)
650.#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz)
651.#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz)
652.#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames)
653.#define bfd_coff_swap_filehdr_in(abfd, i,o) \
654. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o))
655.
656.#define bfd_coff_swap_aouthdr_in(abfd, i,o) \
657. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o))
658.
659.#define bfd_coff_swap_scnhdr_in(abfd, i,o) \
660. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o))
661.
662.#define bfd_coff_bad_format_hook(abfd, filehdr) \
663. ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr))
664.
665.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\
666. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr))
27f524a3
ILT
667.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\
668. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr))
075caafd
ILT
669.
670.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr)\
671. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr))
672.
673.#define bfd_coff_make_section_hook(abfd, name)\
674. ((coff_backend_info (abfd)->_bfd_make_section_hook) (abfd, name))
675.
676.#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\
677. ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr))
678.
679.#define bfd_coff_slurp_symbol_table(abfd)\
680. ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd))
681.
682.#define bfd_coff_symname_in_debug(abfd, sym)\
683. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym))
684.
330595d0 685.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\
075caafd 686. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\
330595d0 687. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr))
fbb61b50 688.
09a28207 689.#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\
fbb61b50 690. ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\
09a28207 691. (abfd, section, reloc, shrink, link_info))
9783e04a 692.
07de8e96 693*/
0f268757 694
075caafd 695/* See whether the magic number matches. */
7a8b18b6 696
075caafd 697static boolean
57a1867e
DM
698coff_bad_format_hook (abfd, filehdr)
699 bfd * abfd;
700 PTR filehdr;
0f268757 701{
075caafd 702 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
0f268757 703
075caafd
ILT
704 if (BADMAG (*internal_f))
705 return false;
0f268757 706
075caafd
ILT
707 /* if the optional header is NULL or not the correct size then
708 quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
709 and Intel 960 readwrite headers (I960WRMAGIC) is that the
710 optional header is of a different size.
cbdc7909 711
075caafd
ILT
712 But the mips keeps extra stuff in it's opthdr, so dont check
713 when doing that
714 */
0f268757 715
075caafd
ILT
716#if defined(M88) || defined(I960)
717 if (internal_f->f_opthdr != 0 && AOUTSZ != internal_f->f_opthdr)
718 return false;
0f268757 719#endif
0f268757 720
075caafd 721 return true;
0f268757
SC
722}
723
075caafd 724static asection *
57a1867e
DM
725coff_make_section_hook (abfd, name)
726 bfd * abfd;
727 char *name;
0f268757 728{
075caafd 729#ifdef TWO_DATA_SECS
fbb61b50
SC
730 /* FIXME: This predates the call to bfd_make_section_anyway
731 in make_a_section_from_file, and can probably go away. */
075caafd
ILT
732 /* On SCO a file created by the Microsoft assembler can have two
733 .data sections. We use .data2 for the second one. */
734 if (strcmp (name, _DATA) == 0)
735 return bfd_make_section (abfd, ".data2");
0f268757 736#endif
075caafd 737 return (asection *) NULL;
0f268757
SC
738}
739
740/*
741 initialize a section structure with information peculiar to this
742 particular implementation of coff
743*/
744
075caafd 745static boolean
57a1867e
DM
746coff_new_section_hook (abfd, section)
747 bfd * abfd;
748 asection * section;
0f268757 749{
8070f29d
KR
750 section->alignment_power = abfd->xvec->align_power_min;
751 /* Allocate aux records for section symbols, to store size and
752 related info.
753
754 @@ Shouldn't use constant multiplier here! */
755 coffsymbol (section->symbol)->native =
756 (combined_entry_type *) bfd_zalloc (abfd,
757 sizeof (combined_entry_type) * 10);
0f268757
SC
758 return true;
759}
760
0f268757 761
0f268757 762#ifdef I960
e98e6ec1 763
075caafd
ILT
764/* Set the alignment of a BFD section. */
765
766static void
57a1867e
DM
767coff_set_alignment_hook (abfd, section, scnhdr)
768 bfd * abfd;
769 asection * section;
770 PTR scnhdr;
e98e6ec1 771{
075caafd
ILT
772 struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr;
773 unsigned int i;
774
775 for (i = 0; i < 32; i++)
776 if ((1 << i) >= hdr->s_align)
777 break;
778 section->alignment_power = i;
e98e6ec1
SC
779}
780
075caafd 781#else /* ! I960 */
0f268757 782
075caafd
ILT
783#define coff_set_alignment_hook \
784 ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void)
41f50af0 785
075caafd 786#endif /* ! I960 */
0f268757 787
9783e04a 788static boolean
57a1867e
DM
789coff_mkobject (abfd)
790 bfd * abfd;
0f268757 791{
075caafd
ILT
792 coff_data_type *coff;
793
9783e04a
DM
794 abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type));
795 if (abfd->tdata.coff_obj_data == 0)
796 {
57a1867e 797 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
798 return false;
799 }
075caafd
ILT
800 coff = coff_data (abfd);
801 coff->symbols = (coff_symbol_type *) NULL;
802 coff->conversion_table = (unsigned int *) NULL;
803 coff->raw_syments = (struct coff_ptr_struct *) NULL;
804 coff->raw_linenos = (struct lineno *) NULL;
805 coff->relocbase = 0;
6590a8c9 806/* make_abs_section(abfd);*/
0f268757
SC
807 return true;
808}
809
075caafd
ILT
810/* Create the COFF backend specific information. */
811
9783e04a 812static PTR
57a1867e
DM
813coff_mkobject_hook (abfd, filehdr, aouthdr)
814 bfd * abfd;
815 PTR filehdr;
816 PTR aouthdr;
0f268757 817{
075caafd 818 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
0f268757 819 coff_data_type *coff;
cbdc7909 820
075caafd
ILT
821 if (coff_mkobject (abfd) == false)
822 return NULL;
e98e6ec1 823
075caafd 824 coff = coff_data (abfd);
cbdc7909 825
075caafd
ILT
826 coff->sym_filepos = internal_f->f_symptr;
827 coff->flags = internal_f->f_flags;
cbdc7909 828
075caafd
ILT
829 /* These members communicate important constants about the symbol
830 table to GDB's symbol-reading code. These `constants'
831 unfortunately vary among coff implementations... */
832 coff->local_n_btmask = N_BTMASK;
833 coff->local_n_btshft = N_BTSHFT;
9783e04a 834 coff->local_n_tmask = N_TMASK;
075caafd 835 coff->local_n_tshift = N_TSHIFT;
9783e04a
DM
836 coff->local_symesz = SYMESZ;
837 coff->local_auxesz = AUXESZ;
838 coff->local_linesz = LINESZ;
cbdc7909 839
075caafd
ILT
840 return (PTR) coff;
841}
cbdc7909 842
075caafd
ILT
843/* Determine the machine architecture and type. FIXME: This is target
844 dependent because the magic numbers are defined in the target
845 dependent header files. But there is no particular need for this.
846 If the magic numbers were moved to a separate file, this function
847 would be target independent and would also be much more successful
848 at linking together COFF files for different architectures. */
cbdc7909 849
075caafd 850static boolean
9783e04a 851coff_set_arch_mach_hook (abfd, filehdr)
4d09e8ac
JK
852 bfd *abfd;
853 PTR filehdr;
075caafd
ILT
854{
855 long machine;
856 enum bfd_architecture arch;
857 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
e98e6ec1 858
075caafd 859 machine = 0;
9783e04a
DM
860 switch (internal_f->f_magic)
861 {
20fdc627 862#ifdef I386MAGIC
9783e04a
DM
863 case I386MAGIC:
864 case I386PTXMAGIC:
865 case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */
866 case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */
867 arch = bfd_arch_i386;
868 machine = 0;
869 break;
20fdc627 870#endif
cbdc7909
JG
871
872#ifdef A29K_MAGIC_BIG
9783e04a
DM
873 case A29K_MAGIC_BIG:
874 case A29K_MAGIC_LITTLE:
875 arch = bfd_arch_a29k;
876 machine = 0;
877 break;
41f50af0 878#endif
cbdc7909 879
0f268757 880#ifdef MC68MAGIC
9783e04a
DM
881 case MC68MAGIC:
882 case M68MAGIC:
97eb2f0c 883#ifdef MC68KBCSMAGIC
9783e04a 884 case MC68KBCSMAGIC:
97eb2f0c
KR
885#endif
886#ifdef APOLLOM68KMAGIC
9783e04a 887 case APOLLOM68KMAGIC:
c188b0be
DM
888#endif
889#ifdef LYNXCOFFMAGIC
9783e04a 890 case LYNXCOFFMAGIC:
97eb2f0c 891#endif
9783e04a
DM
892 arch = bfd_arch_m68k;
893 machine = 68020;
894 break;
0f268757
SC
895#endif
896#ifdef MC88MAGIC
9783e04a
DM
897 case MC88MAGIC:
898 case MC88DMAGIC:
899 case MC88OMAGIC:
900 arch = bfd_arch_m88k;
901 machine = 88100;
902 break;
0f268757 903#endif
dc999ad9 904#ifdef Z8KMAGIC
9783e04a
DM
905 case Z8KMAGIC:
906 arch = bfd_arch_z8k;
907 switch (internal_f->f_flags & F_MACHMASK)
908 {
909 case F_Z8001:
910 machine = bfd_mach_z8001;
911 break;
912 case F_Z8002:
913 machine = bfd_mach_z8002;
914 break;
915 default:
916 return false;
917 }
918 break;
dc999ad9 919#endif
0f268757
SC
920#ifdef I960
921#ifdef I960ROMAGIC
9783e04a
DM
922 case I960ROMAGIC:
923 case I960RWMAGIC:
924 arch = bfd_arch_i960;
925 switch (F_I960TYPE & internal_f->f_flags)
0f268757
SC
926 {
927 default:
928 case F_I960CORE:
0d740984 929 machine = bfd_mach_i960_core;
0f268757
SC
930 break;
931 case F_I960KB:
0d740984 932 machine = bfd_mach_i960_kb_sb;
0f268757 933 break;
9783e04a 934 case F_I960MC:
0d740984 935 machine = bfd_mach_i960_mc;
0f268757
SC
936 break;
937 case F_I960XA:
0d740984 938 machine = bfd_mach_i960_xa;
0f268757
SC
939 break;
940 case F_I960CA:
0d740984 941 machine = bfd_mach_i960_ca;
0f268757
SC
942 break;
943 case F_I960KA:
0d740984 944 machine = bfd_mach_i960_ka_sa;
0f268757 945 break;
0f268757 946 }
9783e04a 947 break;
0f268757
SC
948#endif
949#endif
cbdc7909
JG
950
951#ifdef U802ROMAGIC
9783e04a
DM
952 case U802ROMAGIC:
953 case U802WRMAGIC:
954 case U802TOCMAGIC:
955 arch = bfd_arch_rs6000;
956 machine = 6000;
957 break;
cbdc7909
JG
958#endif
959
dc999ad9 960#ifdef WE32KMAGIC
9783e04a
DM
961 case WE32KMAGIC:
962 arch = bfd_arch_we32k;
963 machine = 0;
964 break;
dc999ad9
ILT
965#endif
966
3b4f1a5d 967#ifdef H8300MAGIC
9783e04a
DM
968 case H8300MAGIC:
969 arch = bfd_arch_h8300;
970 machine = bfd_mach_h8300;
971 /* !! FIXME this probably isn't the right place for this */
972 abfd->flags |= BFD_IS_RELAXABLE;
973 break;
4d09e8ac
JK
974#endif
975
976#ifdef H8300HMAGIC
9783e04a
DM
977 case H8300HMAGIC:
978 arch = bfd_arch_h8300;
979 machine = bfd_mach_h8300h;
980 /* !! FIXME this probably isn't the right place for this */
981 abfd->flags |= BFD_IS_RELAXABLE;
982 break;
142ce43e
SC
983#endif
984
9faacb92 985#ifdef SHMAGIC
9783e04a
DM
986 case SHMAGIC:
987 arch = bfd_arch_sh;
988 machine = 0;
989 break;
9faacb92
SC
990#endif
991
142ce43e 992#ifdef H8500MAGIC
9783e04a
DM
993 case H8500MAGIC:
994 arch = bfd_arch_h8500;
995 machine = 0;
996 break;
3b4f1a5d 997#endif
cbdc7909 998
c188b0be 999#ifdef SPARCMAGIC
9783e04a
DM
1000 case SPARCMAGIC:
1001 arch = bfd_arch_sparc;
1002 machine = 0;
1003 break;
c188b0be
DM
1004#endif
1005
9783e04a
DM
1006 default: /* Unreadable input file type */
1007 arch = bfd_arch_obscure;
1008 break;
1009 }
cbdc7909 1010
9783e04a 1011 bfd_default_set_arch_mach (abfd, arch, machine);
075caafd
ILT
1012 return true;
1013}
cbdc7909 1014
075caafd 1015#ifdef SYMNAME_IN_DEBUG
6f715d66 1016
075caafd 1017static boolean
57a1867e
DM
1018symname_in_debug_hook (abfd, sym)
1019 bfd * abfd;
1020 struct internal_syment *sym;
075caafd
ILT
1021{
1022 return SYMNAME_IN_DEBUG (sym) ? true : false;
1023}
6f715d66 1024
075caafd 1025#else
cbdc7909 1026
075caafd
ILT
1027#define symname_in_debug_hook \
1028 (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false
cbdc7909 1029
075caafd 1030#endif
7a8b18b6 1031
9fda1a39
SC
1032/*
1033SUBSUBSECTION
c188b0be 1034 Writing relocations
9fda1a39 1035
c188b0be
DM
1036 To write relocations, the back end steps though the
1037 canonical relocation table and create an
9fda1a39 1038 @code{internal_reloc}. The symbol index to use is removed from
c188b0be 1039 the @code{offset} field in the symbol table supplied. The
9fda1a39 1040 address comes directly from the sum of the section base
c188b0be 1041 address and the relocation offset; the type is dug directly
9fda1a39
SC
1042 from the howto field. Then the @code{internal_reloc} is
1043 swapped into the shape of an @code{external_reloc} and written
9783e04a 1044 out to disk.
9fda1a39 1045
6f715d66 1046*/
0f268757 1047
791a3db4 1048static boolean
57a1867e
DM
1049coff_write_relocs (abfd)
1050 bfd * abfd;
6f715d66 1051{
9783e04a
DM
1052 asection *s;
1053 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1054 {
1055 unsigned int i;
1056 struct external_reloc dst;
1057
1058 arelent **p = s->orelocation;
791a3db4
ILT
1059 if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0)
1060 return false;
9783e04a
DM
1061 for (i = 0; i < s->reloc_count; i++)
1062 {
1063 struct internal_reloc n;
1064 arelent *q = p[i];
1065 memset ((PTR) & n, 0, sizeof (n));
1066
1067 n.r_vaddr = q->address + s->vma;
1068
1069#ifdef R_IHCONST
1070 /* The 29k const/consth reloc pair is a real kludge. The consth
cd83759c
KR
1071 part doesn't have a symbol; it has an offset. So rebuilt
1072 that here. */
9783e04a
DM
1073 if (q->howto->type == R_IHCONST)
1074 n.r_symndx = q->addend;
1075 else
780c477a 1076#endif
9783e04a
DM
1077 if (q->sym_ptr_ptr)
1078 {
1079 if (q->sym_ptr_ptr == bfd_abs_section.symbol_ptr_ptr)
1080 /* This is a relocation relative to the absolute symbol. */
1081 n.r_symndx = -1;
1082 else
1083 {
1084 n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
1085 /* Take notice if the symbol reloc points to a symbol
cd83759c
KR
1086 we don't have in our symbol table. What should we
1087 do for this?? */
9783e04a
DM
1088 if (n.r_symndx > obj_conv_table_size (abfd))
1089 abort ();
1090 }
1091 }
780c477a 1092
cd83759c 1093#ifdef SWAP_OUT_RELOC_OFFSET
9783e04a 1094 n.r_offset = q->addend;
cd83759c 1095#endif
c26d7d17 1096
0f268757 1097#ifdef SELECT_RELOC
9783e04a
DM
1098 /* Work out reloc type from what is required */
1099 SELECT_RELOC (n, q->howto);
0f268757 1100#else
9783e04a 1101 n.r_type = q->howto->type;
0f268757 1102#endif
9783e04a 1103 coff_swap_reloc_out (abfd, &n, &dst);
791a3db4
ILT
1104 if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ)
1105 return false;
9783e04a 1106 }
0f268757 1107 }
791a3db4
ILT
1108
1109 return true;
6f715d66 1110}
7a8b18b6
SC
1111
1112/* Set flags and magic number of a coff file from architecture and machine
1113 type. Result is true if we can represent the arch&type, false if not. */
0f268757 1114
9783e04a 1115static boolean
57a1867e
DM
1116coff_set_flags (abfd, magicp, flagsp)
1117 bfd * abfd;
1118 unsigned *magicp;
1119 unsigned short *flagsp;
6f715d66 1120{
9783e04a 1121 switch (bfd_get_arch (abfd))
dc999ad9 1122 {
9783e04a
DM
1123#ifdef Z8KMAGIC
1124 case bfd_arch_z8k:
1125 *magicp = Z8KMAGIC;
1126 switch (bfd_get_mach (abfd))
1127 {
1128 case bfd_mach_z8001:
1129 *flagsp = F_Z8001;
1130 break;
1131 case bfd_mach_z8002:
1132 *flagsp = F_Z8002;
1133 break;
1134 default:
1135 return false;
1136 }
1137 return true;
dc999ad9 1138#endif
0f268757 1139#ifdef I960ROMAGIC
cbdc7909 1140
3b4f1a5d 1141 case bfd_arch_i960:
cbdc7909 1142
6f715d66 1143 {
9783e04a 1144 unsigned flags;
6f715d66
SC
1145 *magicp = I960ROMAGIC;
1146 /*
1147 ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC :
1148 I960RWMAGIC); FIXME???
1149 */
9783e04a
DM
1150 switch (bfd_get_mach (abfd))
1151 {
1152 case bfd_mach_i960_core:
1153 flags = F_I960CORE;
1154 break;
1155 case bfd_mach_i960_kb_sb:
1156 flags = F_I960KB;
1157 break;
1158 case bfd_mach_i960_mc:
1159 flags = F_I960MC;
1160 break;
1161 case bfd_mach_i960_xa:
1162 flags = F_I960XA;
1163 break;
1164 case bfd_mach_i960_ca:
1165 flags = F_I960CA;
1166 break;
1167 case bfd_mach_i960_ka_sa:
1168 flags = F_I960KA;
1169 break;
1170 default:
1171 return false;
1172 }
6f715d66
SC
1173 *flagsp = flags;
1174 return true;
1175 }
9783e04a 1176 break;
0f268757 1177#endif
20fdc627 1178#ifdef I386MAGIC
9783e04a
DM
1179 case bfd_arch_i386:
1180 *magicp = I386MAGIC;
c188b0be 1181#ifdef LYNXOS
9783e04a
DM
1182 /* Just overwrite the usual value if we're doing Lynx. */
1183 *magicp = LYNXCOFFMAGIC;
c188b0be 1184#endif
9783e04a
DM
1185 return true;
1186 break;
20fdc627 1187#endif
0f268757 1188#ifdef MC68MAGIC
9783e04a 1189 case bfd_arch_m68k:
97eb2f0c 1190#ifdef APOLLOM68KMAGIC
9783e04a 1191 *magicp = APOLLO_COFF_VERSION_NUMBER;
97eb2f0c 1192#else
9783e04a 1193 *magicp = MC68MAGIC;
c188b0be
DM
1194#endif
1195#ifdef LYNXOS
9783e04a
DM
1196 /* Just overwrite the usual value if we're doing Lynx. */
1197 *magicp = LYNXCOFFMAGIC;
97eb2f0c 1198#endif
9783e04a
DM
1199 return true;
1200 break;
0f268757 1201#endif
cbdc7909 1202
0f268757 1203#ifdef MC88MAGIC
3b4f1a5d
SC
1204 case bfd_arch_m88k:
1205 *magicp = MC88OMAGIC;
1206 return true;
1207 break;
1208#endif
1209#ifdef H8300MAGIC
1210 case bfd_arch_h8300:
9783e04a
DM
1211 switch (bfd_get_mach (abfd))
1212 {
1213 case bfd_mach_h8300:
1214 *magicp = H8300MAGIC;
1215 return true;
1216 case bfd_mach_h8300h:
1217 *magicp = H8300HMAGIC;
1218 return true;
1219 }
3b4f1a5d 1220 break;
0f268757 1221#endif
9faacb92
SC
1222
1223#ifdef SHMAGIC
9783e04a 1224 case bfd_arch_sh:
9faacb92
SC
1225 *magicp = SHMAGIC;
1226 return true;
1227 break;
1228#endif
1229
c188b0be 1230#ifdef SPARCMAGIC
9783e04a
DM
1231 case bfd_arch_sparc:
1232 *magicp = SPARCMAGIC;
c188b0be 1233#ifdef LYNXOS
9783e04a
DM
1234 /* Just overwrite the usual value if we're doing Lynx. */
1235 *magicp = LYNXCOFFMAGIC;
c188b0be 1236#endif
9783e04a
DM
1237 return true;
1238 break;
c188b0be
DM
1239#endif
1240
142ce43e
SC
1241#ifdef H8500MAGIC
1242 case bfd_arch_h8500:
1243 *magicp = H8500MAGIC;
1244 return true;
1245 break;
1246#endif
41f50af0 1247#ifdef A29K_MAGIC_BIG
3b4f1a5d
SC
1248 case bfd_arch_a29k:
1249 if (abfd->xvec->byteorder_big_p)
9783e04a 1250 *magicp = A29K_MAGIC_BIG;
3b4f1a5d 1251 else
9783e04a 1252 *magicp = A29K_MAGIC_LITTLE;
3b4f1a5d
SC
1253 return true;
1254 break;
41f50af0 1255#endif
cbdc7909 1256
dc999ad9 1257#ifdef WE32KMAGIC
9783e04a
DM
1258 case bfd_arch_we32k:
1259 *magicp = WE32KMAGIC;
1260 return true;
1261 break;
dc999ad9
ILT
1262#endif
1263
cbdc7909 1264#ifdef U802TOCMAGIC
9783e04a 1265 case bfd_arch_rs6000:
09a28207 1266 case bfd_arch_powerpc:
9783e04a
DM
1267 *magicp = U802TOCMAGIC;
1268 return true;
1269 break;
cbdc7909
JG
1270#endif
1271
9783e04a
DM
1272 default: /* Unknown architecture */
1273 /* return false; -- fall through to "return false" below, to avoid
cbdc7909 1274 "statement never reached" errors on the one below. */
9783e04a
DM
1275 break;
1276 }
cbdc7909 1277
6f715d66
SC
1278 return false;
1279}
0f268757
SC
1280
1281
9783e04a 1282static boolean
57a1867e
DM
1283coff_set_arch_mach (abfd, arch, machine)
1284 bfd * abfd;
1285 enum bfd_architecture arch;
1286 unsigned long machine;
6f715d66 1287{
9783e04a
DM
1288 unsigned dummy1;
1289 unsigned short dummy2;
1290 bfd_default_set_arch_mach (abfd, arch, machine);
0d740984
SC
1291
1292 if (arch != bfd_arch_unknown &&
9783e04a 1293 coff_set_flags (abfd, &dummy1, &dummy2) != true)
0d740984
SC
1294 return false; /* We can't represent this type */
1295 return true; /* We're easy ... */
1296}
0f268757
SC
1297
1298
1299/* Calculate the file position for each section. */
1300
cbdc7909 1301static void
57a1867e
DM
1302coff_compute_section_file_positions (abfd)
1303 bfd * abfd;
6f715d66 1304{
9783e04a
DM
1305 asection *current;
1306 asection *previous = (asection *) NULL;
1307 file_ptr sofar = FILHSZ;
55c95b04 1308#ifndef I960
9783e04a 1309 file_ptr old_sofar;
55c95b04 1310#endif
9783e04a
DM
1311 if (bfd_get_start_address (abfd))
1312 {
1313 /* A start address may have been added to the original file. In this
e98e6ec1 1314 case it will need an optional header to record it. */
9783e04a
DM
1315 abfd->flags |= EXEC_P;
1316 }
85e0c721 1317
e98e6ec1 1318 if (abfd->flags & EXEC_P)
9783e04a 1319 sofar += AOUTSZ;
cbdc7909 1320
e98e6ec1
SC
1321 sofar += abfd->section_count * SCNHSZ;
1322 for (current = abfd->sections;
9783e04a
DM
1323 current != (asection *) NULL;
1324 current = current->next)
1325 {
cbdc7909 1326
e98e6ec1
SC
1327 /* Only deal with sections which have contents */
1328 if (!(current->flags & SEC_HAS_CONTENTS))
9783e04a 1329 continue;
cbdc7909 1330
e98e6ec1
SC
1331 /* Align the sections in the file to the same boundary on
1332 which they are aligned in virtual memory. I960 doesn't
1333 do this (FIXME) so we can stay in sync with Intel. 960
1334 doesn't yet page from files... */
0f268757 1335#ifndef I960
9783e04a
DM
1336 {
1337 /* make sure this section is aligned on the right boundary - by
e98e6ec1
SC
1338 padding the previous section up if necessary */
1339
9783e04a
DM
1340 old_sofar = sofar;
1341 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
1342 if (previous != (asection *) NULL)
1343 {
1344 previous->_raw_size += sofar - old_sofar;
1345 }
1346 }
85e0c721 1347
0f268757 1348#endif
e98e6ec1
SC
1349 /* FIXME, in demand paged files, the low order bits of the file
1350 offset must match the low order bits of the virtual address.
1351 "Low order" is apparently implementation defined. Add code
1352 here to round sofar up to match the virtual address. */
cbdc7909 1353
e98e6ec1 1354 current->filepos = sofar;
85e0c721 1355
5e167886
KR
1356 sofar += current->_raw_size;
1357#ifndef I960
e98e6ec1 1358 /* make sure that this section is of the right size too */
9783e04a
DM
1359 old_sofar = sofar;
1360 sofar = BFD_ALIGN (sofar, 1 << current->alignment_power);
1361 current->_raw_size += sofar - old_sofar;
5e167886 1362#endif
85e0c721 1363
35d835c4
JK
1364#ifdef _LIB
1365 /* Force .lib sections to start at zero. The vma is then
1366 incremented in coff_set_section_contents. This is right for
1367 SVR3.2. */
1368 if (strcmp (current->name, _LIB) == 0)
1369 bfd_set_section_vma (abfd, current, 0);
1370#endif
1371
e98e6ec1 1372 previous = current;
85e0c721 1373 }
9783e04a 1374 obj_relocbase (abfd) = sofar;
6f715d66 1375}
0f268757 1376
9783e04a
DM
1377#ifndef RS6000COFF_C
1378
8070f29d
KR
1379/* If .file, .text, .data, .bss symbols are missing, add them. */
1380/* @@ Should we only be adding missing symbols, or overriding the aux
1381 values for existing section symbols? */
9783e04a 1382static boolean
8070f29d
KR
1383coff_add_missing_symbols (abfd)
1384 bfd *abfd;
1385{
1386 unsigned int nsyms = bfd_get_symcount (abfd);
1387 asymbol **sympp = abfd->outsymbols;
1388 asymbol **sympp2;
1389 unsigned int i;
1390 int need_text = 1, need_data = 1, need_bss = 1, need_file = 1;
0f268757 1391
8070f29d
KR
1392 for (i = 0; i < nsyms; i++)
1393 {
1394 coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]);
1395 CONST char *name;
9783e04a 1396 if (csym)
8070f29d 1397 {
9783e04a
DM
1398 /* only do this if there is a coff representation of the input
1399 symbol */
1400 if (csym->native && csym->native->u.syment.n_sclass == C_FILE)
1401 {
1402 need_file = 0;
1403 continue;
1404 }
1405 name = csym->symbol.name;
1406 if (!name)
1407 continue;
1408 if (!strcmp (name, _TEXT))
1409 need_text = 0;
97eb2f0c 1410#ifdef APOLLO_M68
9783e04a
DM
1411 else if (!strcmp (name, ".wtext"))
1412 need_text = 0;
97eb2f0c 1413#endif
9783e04a
DM
1414 else if (!strcmp (name, _DATA))
1415 need_data = 0;
1416 else if (!strcmp (name, _BSS))
1417 need_bss = 0;
1418 }
8070f29d
KR
1419 }
1420 /* Now i == bfd_get_symcount (abfd). */
1421 /* @@ For now, don't deal with .file symbol. */
1422 need_file = 0;
1423
1424 if (!need_text && !need_data && !need_bss && !need_file)
9783e04a 1425 return true;
8070f29d 1426 nsyms += need_text + need_data + need_bss + need_file;
9783e04a
DM
1427 sympp2 = (asymbol **) bfd_alloc_by_size_t (abfd, nsyms * sizeof (asymbol *));
1428 if (!sympp2)
1429 {
57a1867e 1430 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
1431 return false;
1432 }
8070f29d
KR
1433 memcpy (sympp2, sympp, i * sizeof (asymbol *));
1434 if (need_file)
1435 {
1436 /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */
1437 abort ();
1438 }
1439 if (need_text)
1440 sympp2[i++] = coff_section_symbol (abfd, _TEXT);
1441 if (need_data)
1442 sympp2[i++] = coff_section_symbol (abfd, _DATA);
1443 if (need_bss)
1444 sympp2[i++] = coff_section_symbol (abfd, _BSS);
9465d03e 1445 BFD_ASSERT (i == nsyms);
8070f29d 1446 bfd_set_symtab (abfd, sympp2, nsyms);
9783e04a 1447 return true;
8070f29d 1448}
0f268757 1449
9783e04a
DM
1450#endif /* ! defined (RS6000COFF_C) */
1451
0f268757
SC
1452/* SUPPRESS 558 */
1453/* SUPPRESS 529 */
9783e04a 1454static boolean
57a1867e
DM
1455coff_write_object_contents (abfd)
1456 bfd * abfd;
e98e6ec1 1457{
9783e04a 1458 asection *current;
e98e6ec1 1459 unsigned int count;
9783e04a
DM
1460
1461 boolean hasrelocs = false;
1462 boolean haslinno = false;
1463 file_ptr reloc_base;
1464 file_ptr lineno_base;
1465 file_ptr sym_base;
1466 file_ptr scn_base;
1467 file_ptr data_base;
1468 unsigned long reloc_size = 0;
1469 unsigned long lnno_size = 0;
1470 asection *text_sec = NULL;
1471 asection *data_sec = NULL;
1472 asection *bss_sec = NULL;
cbdc7909 1473
e98e6ec1
SC
1474 struct internal_filehdr internal_f;
1475 struct internal_aouthdr internal_a;
cbdc7909 1476
cbdc7909 1477
57a1867e 1478 bfd_set_error (bfd_error_system_call);
e98e6ec1 1479 /* Number the output sections, starting from one on the first section
8070f29d
KR
1480 with a name which doesn't start with a *.
1481 @@ The code doesn't make this check. Is it supposed to be done,
1482 or isn't it?? */
e98e6ec1 1483 count = 1;
9783e04a
DM
1484 for (current = abfd->sections; current != (asection *) NULL;
1485 current = current->next)
1486 {
e98e6ec1 1487 current->target_index = count;
8070f29d 1488 count++;
9783e04a 1489 }
6590a8c9 1490
9783e04a
DM
1491 if (abfd->output_has_begun == false)
1492 {
1493 coff_compute_section_file_positions (abfd);
6f715d66 1494 }
cbdc7909 1495
9783e04a
DM
1496 if (abfd->sections != (asection *) NULL)
1497 {
6f715d66 1498 scn_base = abfd->sections->filepos;
e98e6ec1 1499 }
9783e04a
DM
1500 else
1501 {
e98e6ec1
SC
1502 scn_base = 0;
1503 }
9783e04a
DM
1504 if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
1505 return false;
1506 reloc_base = obj_relocbase (abfd);
cbdc7909 1507
0f268757
SC
1508 /* Make a pass through the symbol table to count line number entries and
1509 put them into the correct asections */
cbdc7909 1510
9783e04a 1511 lnno_size = coff_count_linenumbers (abfd) * LINESZ;
0f268757 1512 data_base = scn_base;
cbdc7909 1513
0f268757 1514 /* Work out the size of the reloc and linno areas */
cbdc7909 1515
e98e6ec1 1516 for (current = abfd->sections; current != NULL; current =
9783e04a 1517 current->next)
e98e6ec1 1518 {
9783e04a
DM
1519 /* We give section headers to +ve indexes */
1520 if (current->target_index > 0)
1521 {
1522
1523 reloc_size += current->reloc_count * RELSZ;
1524 data_base += SCNHSZ;
1525 }
1526
e98e6ec1 1527 }
cbdc7909 1528
0f268757
SC
1529 lineno_base = reloc_base + reloc_size;
1530 sym_base = lineno_base + lnno_size;
cbdc7909 1531
0f268757 1532 /* Indicate in each section->line_filepos its actual file address */
e98e6ec1 1533 for (current = abfd->sections; current != NULL; current =
9783e04a 1534 current->next)
e98e6ec1 1535 {
9783e04a
DM
1536 if (current->target_index > 0)
1537 {
1538
1539 if (current->lineno_count)
1540 {
1541 current->line_filepos = lineno_base;
1542 current->moving_line_filepos = lineno_base;
1543 lineno_base += current->lineno_count * LINESZ;
1544 }
1545 else
1546 {
1547 current->line_filepos = 0;
1548 }
1549 if (current->reloc_count)
1550 {
1551 current->rel_filepos = reloc_base;
1552 reloc_base += current->reloc_count * RELSZ;
1553 }
1554 else
1555 {
1556 current->rel_filepos = 0;
1557 }
e98e6ec1 1558 }
0f268757 1559 }
9783e04a 1560
cbdc7909 1561
cbdc7909 1562
e98e6ec1
SC
1563 /* Write section headers to the file. */
1564 internal_f.f_nscns = 0;
791a3db4
ILT
1565 if (bfd_seek (abfd,
1566 (file_ptr) ((abfd->flags & EXEC_P) ?
1567 (FILHSZ + AOUTSZ) : FILHSZ),
1568 SEEK_SET)
1569 != 0)
1570 return false;
cbdc7909 1571
9783e04a 1572 {
0f268757 1573#if 0
9783e04a 1574 unsigned int pad = abfd->flags & D_PAGED ? data_base : 0;
0f268757 1575#endif
9783e04a 1576 unsigned int pad = 0;
cbdc7909 1577
9783e04a
DM
1578 for (current = abfd->sections;
1579 current != NULL;
1580 current = current->next)
e98e6ec1 1581 {
9783e04a
DM
1582 struct internal_scnhdr section;
1583 if (current->target_index > 0)
1584 {
1585 internal_f.f_nscns++;
1586 strncpy (&(section.s_name[0]), current->name, 8);
b26059aa 1587#ifdef _LIB
9783e04a 1588 /* Always set s_vaddr of .lib to 0. This is right for SVR3.2
b26059aa 1589 Ian Taylor <ian@cygnus.com>. */
9783e04a
DM
1590 if (strcmp (current->name, _LIB) == 0)
1591 section.s_vaddr = 0;
1592 else
b26059aa 1593#endif
9783e04a
DM
1594 section.s_vaddr = current->lma + pad;
1595 section.s_paddr = current->lma + pad;
1596 section.s_size = current->_raw_size - pad;
1597 /*
0f268757
SC
1598 If this section has no size or is unloadable then the scnptr
1599 will be 0 too
1600 */
9783e04a
DM
1601 if (current->_raw_size - pad == 0 ||
1602 (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1603 {
1604 section.s_scnptr = 0;
1605 }
1606 else
1607 {
1608 section.s_scnptr = current->filepos;
1609 }
1610 section.s_relptr = current->rel_filepos;
1611 section.s_lnnoptr = current->line_filepos;
1612 section.s_nreloc = current->reloc_count;
1613 section.s_nlnno = current->lineno_count;
1614 if (current->reloc_count != 0)
1615 hasrelocs = true;
1616 if (current->lineno_count != 0)
1617 haslinno = true;
1618
1619 section.s_flags = sec_to_styp_flags (current->name, current->flags);
1620
1621 if (!strcmp (current->name, _TEXT))
1622 {
1623 text_sec = current;
1624 }
1625 else if (!strcmp (current->name, _DATA))
1626 {
1627 data_sec = current;
b26059aa 1628#ifdef TWO_DATA_SECS
9783e04a
DM
1629 }
1630 else if (!strcmp (current->name, ".data2"))
1631 {
1632 data_sec = current;
b26059aa 1633#endif /* TWO_DATA_SECS */
9783e04a
DM
1634 }
1635 else if (!strcmp (current->name, _BSS))
1636 {
e98e6ec1
SC
1637 bss_sec = current;
1638 }
cbdc7909 1639
0f268757 1640#ifdef I960
9783e04a
DM
1641 section.s_align = (current->alignment_power
1642 ? 1 << current->alignment_power
1643 : 0);
0f268757
SC
1644
1645#endif
9783e04a
DM
1646 {
1647 SCNHDR buff;
0f268757 1648
9783e04a 1649 coff_swap_scnhdr_out (abfd, &section, &buff);
791a3db4
ILT
1650 if (bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ)
1651 return false;
e98e6ec1 1652
9783e04a 1653 }
0f268757 1654
9783e04a
DM
1655 pad = 0;
1656 }
0f268757 1657 }
9783e04a 1658 }
e98e6ec1 1659
0f268757
SC
1660
1661 /* OK, now set up the filehdr... */
e98e6ec1
SC
1662
1663 /* Don't include the internal abs section in the section count */
1664
0f268757
SC
1665 /*
1666 We will NOT put a fucking timestamp in the header here. Every time you
17f9c817 1667 put it back, I will come in and take it out again. I'm sorry. This
0f268757
SC
1668 field does not belong here. We fill it with a 0 so it compares the
1669 same but is not a reasonable time. -- gnu@cygnus.com
1670 */
0f268757 1671 internal_f.f_timdat = 0;
0f268757 1672
9783e04a
DM
1673 if (bfd_get_symcount (abfd) != 0)
1674 internal_f.f_symptr = sym_base;
0f268757 1675 else
9783e04a 1676 internal_f.f_symptr = 0;
0f268757
SC
1677
1678 internal_f.f_flags = 0;
1679
1680 if (abfd->flags & EXEC_P)
9783e04a 1681 internal_f.f_opthdr = AOUTSZ;
0f268757 1682 else
9783e04a 1683 internal_f.f_opthdr = 0;
0f268757
SC
1684
1685 if (!hasrelocs)
9783e04a 1686 internal_f.f_flags |= F_RELFLG;
0f268757 1687 if (!haslinno)
9783e04a
DM
1688 internal_f.f_flags |= F_LNNO;
1689 if (0 == bfd_get_symcount (abfd))
1690 internal_f.f_flags |= F_LSYMS;
0f268757 1691 if (abfd->flags & EXEC_P)
9783e04a 1692 internal_f.f_flags |= F_EXEC;
a0f3f080 1693
0f268757 1694 if (!abfd->xvec->byteorder_big_p)
9783e04a
DM
1695 internal_f.f_flags |= F_AR32WR;
1696 else
1697 internal_f.f_flags |= F_AR32W;
a0f3f080 1698
0f268757
SC
1699 /*
1700 FIXME, should do something about the other byte orders and
1701 architectures.
1702 */
1703
ab31ae53
KR
1704 memset (&internal_a, 0, sizeof internal_a);
1705
0f268757
SC
1706 /* Set up architecture-dependent stuff */
1707
9783e04a
DM
1708 {
1709 unsigned int magic = 0;
1710 unsigned short flags = 0;
1711 coff_set_flags (abfd, &magic, &flags);
1712 internal_f.f_magic = magic;
1713 internal_f.f_flags |= flags;
1714 /* ...and the "opt"hdr... */
0f268757 1715
cbdc7909 1716#ifdef A29K
9783e04a
DM
1717#ifdef ULTRA3 /* NYU's machine */
1718 /* FIXME: This is a bogus check. I really want to see if there
e98e6ec1
SC
1719 * is a .shbss or a .shdata section, if so then set the magic
1720 * number to indicate a shared data executable.
1721 */
9783e04a
DM
1722 if (internal_f.f_nscns >= 7)
1723 internal_a.magic = SHMAGIC; /* Shared magic */
1724 else
1725#endif /* ULTRA3 */
1726 internal_a.magic = NMAGIC;/* Assume separate i/d */
41f50af0 1727#define __A_MAGIC_SET__
9783e04a 1728#endif /* A29K */
0f268757 1729#ifdef I960
9783e04a 1730 internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC);
41f50af0 1731#define __A_MAGIC_SET__
9783e04a 1732#endif /* I960 */
0f268757 1733#if M88
41f50af0 1734#define __A_MAGIC_SET__
9783e04a
DM
1735 internal_a.magic = PAGEMAGICBCS;
1736#endif /* M88 */
41f50af0 1737
97eb2f0c
KR
1738#if APOLLO_M68
1739#define __A_MAGIC_SET__
9783e04a 1740 internal_a.magic = APOLLO_COFF_VERSION_NUMBER;
97eb2f0c
KR
1741#endif
1742
1a8c6d5b 1743#if M68 || WE32K
41f50af0 1744#define __A_MAGIC_SET__
9783e04a
DM
1745 /* Never was anything here for the 68k */
1746#endif /* M68 || WE32K */
8ad2a31d
SC
1747
1748#if I386
9783e04a
DM
1749#define __A_MAGIC_SET__
1750 internal_a.magic = ZMAGIC;
8ad2a31d 1751#endif /* I386 */
41f50af0 1752
cbdc7909
JG
1753#if RS6000COFF_C
1754#define __A_MAGIC_SET__
9783e04a
DM
1755 internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC :
1756 (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC :
1757 RS6K_AOUTHDR_OMAGIC;
cbdc7909
JG
1758#endif
1759
41f50af0 1760#ifndef __A_MAGIC_SET__
9783e04a 1761#include "Your aouthdr magic number is not being set!"
41f50af0 1762#else
9783e04a 1763#undef __A_MAGIC_SET__
0f268757 1764#endif
9783e04a 1765 }
0f268757 1766 /* Now should write relocs, strings, syms */
9783e04a
DM
1767 obj_sym_filepos (abfd) = sym_base;
1768
1769 if (bfd_get_symcount (abfd) != 0)
1770 {
1771#ifndef RS6000COFF_C
1772 if (!coff_add_missing_symbols (abfd))
1773 return false;
1774#endif
1775 if (!coff_renumber_symbols (abfd))
1776 return false;
1777 coff_mangle_symbols (abfd);
bfe8224f
ILT
1778 if (! coff_write_symbols (abfd))
1779 return false;
791a3db4
ILT
1780 if (! coff_write_linenumbers (abfd))
1781 return false;
1782 if (! coff_write_relocs (abfd))
9783e04a 1783 return false;
e98e6ec1 1784 }
9783e04a
DM
1785 if (text_sec)
1786 {
1787 internal_a.tsize = bfd_get_section_size_before_reloc (text_sec);
e98e6ec1
SC
1788 internal_a.text_start = internal_a.tsize ? text_sec->vma : 0;
1789 }
9783e04a
DM
1790 if (data_sec)
1791 {
1792 internal_a.dsize = bfd_get_section_size_before_reloc (data_sec);
1793 internal_a.data_start = internal_a.dsize ? data_sec->vma : 0;
e98e6ec1 1794 }
9783e04a
DM
1795 if (bss_sec)
1796 {
1797 internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec);
e98e6ec1 1798 }
0f268757 1799
9783e04a
DM
1800 internal_a.entry = bfd_get_start_address (abfd);
1801 internal_f.f_nsyms = bfd_get_symcount (abfd);
0f268757
SC
1802
1803 /* now write them */
9783e04a
DM
1804 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1805 return false;
1806 {
1807 FILHDR buff;
1808 coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) & buff);
791a3db4
ILT
1809 if (bfd_write ((PTR) & buff, 1, FILHSZ, abfd) != FILHSZ)
1810 return false;
9783e04a
DM
1811 }
1812 if (abfd->flags & EXEC_P)
1813 {
e98e6ec1 1814 AOUTHDR buff;
9783e04a 1815 coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) & buff);
791a3db4
ILT
1816 if (bfd_write ((PTR) & buff, 1, AOUTSZ, abfd) != AOUTSZ)
1817 return false;
e98e6ec1 1818 }
0f268757 1819 return true;
6f715d66
SC
1820}
1821
9783e04a 1822static boolean
57a1867e
DM
1823coff_set_section_contents (abfd, section, location, offset, count)
1824 bfd * abfd;
1825 sec_ptr section;
1826 PTR location;
1827 file_ptr offset;
1828 bfd_size_type count;
0f268757 1829{
9783e04a
DM
1830 if (abfd->output_has_begun == false) /* set by bfd.c handler */
1831 coff_compute_section_file_positions (abfd);
cbdc7909 1832
075caafd 1833#ifdef _LIB
9783e04a 1834 /* If this is a .lib section, bump the vma address so that it
075caafd
ILT
1835 winds up being the number of .lib sections output. This is
1836 right for SVR3.2. Shared libraries should probably get more
1837 generic support. Ian Taylor <ian@cygnus.com>. */
9783e04a
DM
1838 if (strcmp (section->name, _LIB) == 0)
1839 ++section->lma;
075caafd 1840#endif
0f268757 1841
9783e04a
DM
1842 /* Don't write out bss sections - one way to do this is to
1843 see if the filepos has not been set. */
1844 if (section->filepos == 0)
1845 return true;
55c95b04 1846
791a3db4
ILT
1847 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0)
1848 return false;
7a8b18b6 1849
9783e04a
DM
1850 if (count != 0)
1851 {
1852 return (bfd_write (location, 1, count, abfd) == count) ? true : false;
075caafd 1853 }
9783e04a 1854 return true;
075caafd
ILT
1855}
1856#if 0
9783e04a
DM
1857static boolean
1858coff_close_and_cleanup (abfd)
1859 bfd *abfd;
0f268757 1860{
9783e04a
DM
1861 if (!bfd_read_p (abfd))
1862 switch (abfd->format)
1863 {
1864 case bfd_archive:
1865 if (!_bfd_write_archive_contents (abfd))
1866 return false;
1867 break;
1868 case bfd_object:
1869 if (!coff_write_object_contents (abfd))
1870 return false;
1871 break;
1872 default:
57a1867e 1873 bfd_set_error (bfd_error_invalid_operation);
075caafd 1874 return false;
9783e04a 1875 }
075caafd
ILT
1876
1877 /* We depend on bfd_close to free all the memory on the obstack. */
1878 /* FIXME if bfd_release is not using obstacks! */
1879 return true;
0f268757
SC
1880}
1881
075caafd
ILT
1882#endif
1883
1884static PTR
9783e04a
DM
1885buy_and_read (abfd, where, seek_direction, size)
1886 bfd *abfd;
1887 file_ptr where;
1888 int seek_direction;
1889 size_t size;
075caafd 1890{
9783e04a
DM
1891 PTR area = (PTR) bfd_alloc (abfd, size);
1892 if (!area)
1893 {
57a1867e 1894 bfd_set_error (bfd_error_no_memory);
9783e04a 1895 return (NULL);
075caafd 1896 }
791a3db4
ILT
1897 if (bfd_seek (abfd, where, seek_direction) != 0
1898 || bfd_read (area, 1, size, abfd) != size)
1899 return (NULL);
9783e04a 1900 return (area);
075caafd 1901} /* buy_and_read() */
0f268757 1902
9fda1a39 1903/*
9783e04a 1904SUBSUBSECTION
c188b0be 1905 Reading linenumbers
9fda1a39 1906
9fda1a39
SC
1907 Creating the linenumber table is done by reading in the entire
1908 coff linenumber table, and creating another table for internal use.
6f715d66 1909
c188b0be 1910 A coff linenumber table is structured so that each function
9fda1a39
SC
1911 is marked as having a line number of 0. Each line within the
1912 function is an offset from the first line in the function. The
1913 base of the line number information for the table is stored in
9783e04a 1914 the symbol associated with the function.
6f715d66 1915
9fda1a39
SC
1916 The information is copied from the external to the internal
1917 table, and each symbol which marks a function is marked by
1918 pointing its...
6f715d66 1919
9fda1a39 1920 How does this work ?
6f715d66
SC
1921
1922*/
0f268757
SC
1923
1924static boolean
9783e04a 1925coff_slurp_line_table (abfd, asect)
ab31ae53
KR
1926 bfd *abfd;
1927 asection *asect;
1928{
9783e04a 1929 LINENO *native_lineno;
ab31ae53
KR
1930 alent *lineno_cache;
1931
9783e04a 1932 BFD_ASSERT (asect->lineno == (alent *) NULL);
ab31ae53 1933
9783e04a
DM
1934 native_lineno = (LINENO *) buy_and_read (abfd,
1935 asect->line_filepos,
1936 SEEK_SET,
1937 (size_t) (LINESZ *
1938 asect->lineno_count));
ab31ae53 1939 lineno_cache =
9783e04a 1940 (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent)));
ab31ae53
KR
1941 if (lineno_cache == NULL)
1942 {
57a1867e 1943 bfd_set_error (bfd_error_no_memory);
0f268757 1944 return false;
ab31ae53
KR
1945 }
1946 else
1947 {
9783e04a
DM
1948 unsigned int counter = 0;
1949 alent *cache_ptr = lineno_cache;
1950 LINENO *src = native_lineno;
cbdc7909 1951
ab31ae53
KR
1952 while (counter < asect->lineno_count)
1953 {
1954 struct internal_lineno dst;
9783e04a 1955 coff_swap_lineno_in (abfd, src, &dst);
ab31ae53
KR
1956 cache_ptr->line_number = dst.l_lnno;
1957
1958 if (cache_ptr->line_number == 0)
1959 {
1960 coff_symbol_type *sym =
9783e04a
DM
1961 (coff_symbol_type *) (dst.l_addr.l_symndx
1962 + obj_raw_syments (abfd))->u.syment._n._n_n._n_zeroes;
ab31ae53
KR
1963 cache_ptr->u.sym = (asymbol *) sym;
1964 sym->lineno = cache_ptr;
1965 }
1966 else
1967 {
1968 cache_ptr->u.offset = dst.l_addr.l_paddr
9783e04a
DM
1969 - bfd_section_vma (abfd, asect);
1970 } /* If no linenumber expect a symbol index */
ab31ae53
KR
1971
1972 cache_ptr++;
1973 src++;
1974 counter++;
0f268757 1975 }
0f268757 1976 cache_ptr->line_number = 0;
cbdc7909 1977
0f268757 1978 }
ab31ae53
KR
1979 asect->lineno = lineno_cache;
1980 /* FIXME, free native_lineno here, or use alloca or something. */
1981 return true;
1982}
0f268757 1983
ab31ae53 1984static boolean
57a1867e
DM
1985coff_slurp_symbol_table (abfd)
1986 bfd * abfd;
6f715d66 1987{
9783e04a 1988 combined_entry_type *native_symbols;
6f715d66 1989 coff_symbol_type *cached_area;
9783e04a 1990 unsigned int *table_ptr;
cbdc7909 1991
9783e04a
DM
1992 unsigned int number_of_symbols = 0;
1993 if (obj_symbols (abfd))
6f715d66 1994 return true;
791a3db4
ILT
1995 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
1996 return false;
cbdc7909 1997
6f715d66 1998 /* Read in the symbol table */
9783e04a
DM
1999 if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL)
2000 {
2001 return (false);
2002 } /* on error */
cbdc7909 2003
6f715d66
SC
2004 /* Allocate enough room for all the symbols in cached form */
2005 cached_area =
2006 (coff_symbol_type *)
9783e04a 2007 bfd_alloc (abfd, (size_t) (bfd_get_symcount (abfd) * sizeof (coff_symbol_type)));
cbdc7909 2008
9783e04a
DM
2009 if (cached_area == NULL)
2010 {
57a1867e 2011 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
2012 return false;
2013 } /* on error */
6f715d66
SC
2014 table_ptr =
2015 (unsigned int *)
9783e04a 2016 bfd_alloc (abfd, (size_t) (bfd_get_symcount (abfd) * sizeof (unsigned int)));
cbdc7909 2017
9783e04a
DM
2018 if (table_ptr == NULL)
2019 {
57a1867e 2020 bfd_set_error (bfd_error_no_memory);
9783e04a
DM
2021 return false;
2022 }
2023 else
2024 {
2025 coff_symbol_type *dst = cached_area;
2026 unsigned int last_native_index = bfd_get_symcount (abfd);
2027 unsigned int this_index = 0;
2028 while (this_index < last_native_index)
2029 {
2030 combined_entry_type *src = native_symbols + this_index;
2031 table_ptr[this_index] = number_of_symbols;
2032 dst->symbol.the_bfd = abfd;
2033
2034 dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset);
2035 /* We use the native name field to point to the cached field. */
2036 src->u.syment._n._n_n._n_zeroes = (long) dst;
2037 dst->symbol.section = coff_section_from_bfd_index (abfd,
2038 src->u.syment.n_scnum);
2039 dst->symbol.flags = 0;
2040 dst->done_lineno = false;
2041
2042 switch (src->u.syment.n_sclass)
2043 {
0f268757 2044#ifdef I960
9783e04a 2045 case C_LEAFEXT:
0f268757 2046#if 0
9783e04a
DM
2047 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
2048 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
2049 dst->symbol.flags |= BSF_NOT_AT_END;
0f268757 2050#endif
9783e04a 2051 /* Fall through to next case */
cbdc7909 2052
0f268757 2053#endif
cbdc7909 2054
9783e04a 2055 case C_EXT:
cbdc7909 2056#ifdef RS6000COFF_C
9783e04a
DM
2057 case C_HIDEXT:
2058#endif
2059 if ((src->u.syment.n_scnum) == 0)
2060 {
2061 if ((src->u.syment.n_value) == 0)
2062 {
2063 dst->symbol.section = &bfd_und_section;
2064 dst->symbol.value = 0;
2065 }
2066 else
2067 {
2068 dst->symbol.section = &bfd_com_section;
2069 dst->symbol.value = (src->u.syment.n_value);
2070 }
2071 }
2072 else
2073 {
2074 /*
6f715d66
SC
2075 Base the value as an index from the base of the
2076 section
2077 */
e98e6ec1 2078
9783e04a
DM
2079 dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL;
2080 dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma;
e98e6ec1 2081
9783e04a
DM
2082 if (ISFCN ((src->u.syment.n_type)))
2083 {
2084 /*
6f715d66
SC
2085 A function ext does not go at the end of a file
2086 */
9783e04a
DM
2087 dst->symbol.flags |= BSF_NOT_AT_END;
2088 }
2089 }
85e0c721 2090
9783e04a
DM
2091#ifdef RS6000COFF_C
2092 /* If this symbol has a csect aux of type LD, the scnlen field
2093 is actually the index of the containing csect symbol. We
2094 need to pointerize it. */
2095 if (src->u.syment.n_numaux > 0)
2096 {
2097 combined_entry_type *aux;
2098
2099 aux = src + src->u.syment.n_numaux - 1;
2100 if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD)
2101 {
2102 aux->u.auxent.x_csect.x_scnlen.p =
2103 native_symbols + aux->u.auxent.x_csect.x_scnlen.l;
2104 aux->fix_scnlen = 1;
2105 }
2106 }
2107#endif
2108
2109 break;
2110
2111 case C_STAT: /* static */
0f268757 2112#ifdef I960
9783e04a
DM
2113 case C_LEAFSTAT: /* static leaf procedure */
2114#endif
2115 case C_LABEL: /* label */
2116 if (src->u.syment.n_scnum == -2)
2117 dst->symbol.flags = BSF_DEBUGGING;
2118 else
2119 dst->symbol.flags = BSF_LOCAL;
2120 /*
0d740984
SC
2121 Base the value as an index from the base of the section, if
2122 there is one
6f715d66 2123 */
9783e04a
DM
2124 if (dst->symbol.section)
2125 dst->symbol.value = (src->u.syment.n_value) -
2126 dst->symbol.section->vma;
2127 else
2128 dst->symbol.value = (src->u.syment.n_value);
2129 break;
2130
2131 case C_MOS: /* member of structure */
2132 case C_EOS: /* end of structure */
2133#ifdef NOTDEF /* C_AUTOARG has the same value */
41f50af0 2134#ifdef C_GLBLREG
9783e04a 2135 case C_GLBLREG: /* A29k-specific storage class */
41f50af0
SC
2136#endif
2137#endif
9783e04a
DM
2138 case C_REGPARM: /* register parameter */
2139 case C_REG: /* register variable */
0f268757 2140#ifdef C_AUTOARG
9783e04a
DM
2141 case C_AUTOARG: /* 960-specific storage class */
2142#endif
2143 case C_TPDEF: /* type definition */
2144 case C_ARG:
2145 case C_AUTO: /* automatic variable */
2146 case C_FIELD: /* bit field */
2147 case C_ENTAG: /* enumeration tag */
2148 case C_MOE: /* member of enumeration */
2149 case C_MOU: /* member of union */
2150 case C_UNTAG: /* union tag */
2151 dst->symbol.flags = BSF_DEBUGGING;
2152 dst->symbol.value = (src->u.syment.n_value);
2153 break;
2154
2155 case C_FILE: /* file name */
2156 case C_STRTAG: /* structure tag */
cbdc7909 2157#ifdef RS6000COFF_C
9783e04a
DM
2158 case C_BINCL: /* beginning of include file */
2159 case C_EINCL: /* ending of include file */
2160 case C_GSYM:
2161 case C_LSYM:
2162 case C_PSYM:
2163 case C_RSYM:
2164 case C_RPSYM:
2165 case C_STSYM:
2166 case C_DECL:
2167 case C_ENTRY:
2168 case C_FUN:
2169 case C_ESTAT:
2170#endif
2171 dst->symbol.flags = BSF_DEBUGGING;
2172 dst->symbol.value = (src->u.syment.n_value);
2173 break;
cbdc7909 2174
9783e04a
DM
2175#ifdef RS6000COFF_C
2176 case C_BSTAT:
2177 dst->symbol.flags = BSF_DEBUGGING;
2178 dst->symbol.value = src->u.syment.n_value;
2179
2180 /* The value is actually a symbol index. Save a pointer to
2181 the symbol instead of the index. FIXME: This should use a
2182 union. */
2183 src->u.syment.n_value =
2184 (long) (native_symbols + src->u.syment.n_value);
2185 src->fix_value = 1;
2186 break;
2187#endif
2188
2189 case C_BLOCK: /* ".bb" or ".eb" */
2190 case C_FCN: /* ".bf" or ".ef" */
2191 case C_EFCN: /* physical end of function */
2192 dst->symbol.flags = BSF_LOCAL;
2193 /*
6f715d66
SC
2194 Base the value as an index from the base of the section
2195 */
9783e04a
DM
2196 dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma;
2197 break;
2198
2199 case C_NULL:
2200 case C_EXTDEF: /* external definition */
2201 case C_ULABEL: /* undefined label */
2202 case C_USTATIC: /* undefined static */
2203 case C_LINE: /* line # reformatted as symbol table entry */
2204 case C_ALIAS: /* duplicate tag */
2205 case C_HIDDEN: /* ext symbol in dmert public lib */
2206 default:
2207
2208 fprintf (stderr, "Unrecognized storage class %d (assuming debugging)\n for %s symbol `%s'\n",
2209 src->u.syment.n_sclass, dst->symbol.section->name,
2210 dst->symbol.name);
954d412a 2211/* abort();*/
9783e04a
DM
2212 dst->symbol.flags = BSF_DEBUGGING;
2213 dst->symbol.value = (src->u.syment.n_value);
2214 break;
2215 }
cbdc7909 2216
6590a8c9 2217/* BFD_ASSERT(dst->symbol.flags != 0);*/
cbdc7909 2218
9783e04a 2219 dst->native = src;
cbdc7909 2220
9783e04a
DM
2221 dst->symbol.udata = 0;
2222 dst->lineno = (alent *) NULL;
2223 this_index += (src->u.syment.n_numaux) + 1;
2224 dst++;
2225 number_of_symbols++;
2226 } /* walk the native symtab */
2227 } /* bfdize the native symtab */
cbdc7909 2228
9783e04a
DM
2229 obj_symbols (abfd) = cached_area;
2230 obj_raw_syments (abfd) = native_symbols;
cbdc7909 2231
8070f29d 2232 obj_conv_table_size (abfd) = bfd_get_symcount (abfd);
9783e04a
DM
2233 bfd_get_symcount (abfd) = number_of_symbols;
2234 obj_convert (abfd) = table_ptr;
6f715d66 2235 /* Slurp the line tables for each section too */
9783e04a
DM
2236 {
2237 asection *p;
2238 p = abfd->sections;
2239 while (p)
2240 {
2241 coff_slurp_line_table (abfd, p);
6f715d66 2242 p = p->next;
0f268757 2243 }
9783e04a 2244 }
6f715d66
SC
2245 return true;
2246} /* coff_slurp_symbol_table() */
0f268757 2247
9fda1a39 2248/*
9783e04a 2249SUBSUBSECTION
c188b0be 2250 Reading relocations
9fda1a39 2251
9fda1a39
SC
2252 Coff relocations are easily transformed into the internal BFD form
2253 (@code{arelent}).
2254
2255 Reading a coff relocation table is done in the following stages:
2256
c188b0be 2257 o Read the entire coff relocation table into memory.
9fda1a39 2258
c188b0be 2259 o Process each relocation in turn; first swap it from the
9fda1a39
SC
2260 external to the internal form.
2261
c188b0be
DM
2262 o Turn the symbol referenced in the relocation's symbol index
2263 into a pointer into the canonical symbol table.
2264 This table is the same as the one returned by a call to
2265 @code{bfd_canonicalize_symtab}. The back end will call that
9fda1a39
SC
2266 routine and save the result if a canonicalization hasn't been done.
2267
2268 o The reloc index is turned into a pointer to a howto
2269 structure, in a back end specific way. For instance, the 386
2270 and 960 use the @code{r_type} to directly produce an index
2271 into a howto table vector; the 88k subtracts a number from the
2272 @code{r_type} field and creates an addend field.
2273
2274
6f715d66
SC
2275*/
2276
3b4f1a5d 2277#ifndef CALC_ADDEND
492d52cc
ILT
2278#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \
2279 { \
2280 coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \
2281 if (ptr && bfd_asymbol_bfd (ptr) != abfd) \
2282 coffsym = (obj_symbols (abfd) \
2283 + (cache_ptr->sym_ptr_ptr - symbols)); \
2284 else if (ptr) \
2285 coffsym = coff_symbol_from (abfd, ptr); \
2286 if (coffsym != (coff_symbol_type *) NULL \
2287 && coffsym->native->u.syment.n_scnum == 0) \
2288 cache_ptr->addend = 0; \
2289 else if (ptr && bfd_asymbol_bfd (ptr) == abfd \
2290 && ptr->section != (asection *) NULL) \
2291 cache_ptr->addend = - (ptr->section->vma + ptr->value); \
2292 else \
2293 cache_ptr->addend = 0; \
2294 }
3b4f1a5d
SC
2295#endif
2296
9783e04a 2297static boolean
57a1867e
DM
2298coff_slurp_reloc_table (abfd, asect, symbols)
2299 bfd * abfd;
2300 sec_ptr asect;
2301 asymbol ** symbols;
85e0c721 2302{
9783e04a
DM
2303 RELOC *native_relocs;
2304 arelent *reloc_cache;
2305 arelent *cache_ptr;
3b4f1a5d
SC
2306
2307 unsigned int idx;
9783e04a 2308
3b4f1a5d 2309 if (asect->relocation)
9783e04a 2310 return true;
3b4f1a5d 2311 if (asect->reloc_count == 0)
9783e04a 2312 return true;
3b4f1a5d 2313 if (asect->flags & SEC_CONSTRUCTOR)
9783e04a
DM
2314 return true;
2315 if (!coff_slurp_symbol_table (abfd))
2316 return false;
3b4f1a5d 2317 native_relocs =
9783e04a
DM
2318 (RELOC *) buy_and_read (abfd,
2319 asect->rel_filepos,
2320 SEEK_SET,
2321 (size_t) (RELSZ *
2322 asect->reloc_count));
3b4f1a5d 2323 reloc_cache = (arelent *)
9783e04a 2324 bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent)));
3b4f1a5d 2325
9783e04a
DM
2326 if (reloc_cache == NULL)
2327 {
57a1867e 2328 bfd_set_error (bfd_error_no_memory);
3b4f1a5d 2329 return false;
9783e04a 2330 }
3b4f1a5d 2331
9783e04a
DM
2332
2333 for (idx = 0; idx < asect->reloc_count; idx++)
2334 {
616ebcfd 2335#ifdef RELOC_PROCESSING
3b4f1a5d 2336 struct internal_reloc dst;
9783e04a 2337 struct external_reloc *src;
3b4f1a5d
SC
2338
2339 cache_ptr = reloc_cache + idx;
2340 src = native_relocs + idx;
9783e04a 2341 bfd_swap_reloc_in (abfd, src, &dst);
3b4f1a5d 2342
9783e04a 2343 RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect);
9898b929 2344#else
616ebcfd 2345 struct internal_reloc dst;
9783e04a
DM
2346 asymbol *ptr;
2347 struct external_reloc *src;
616ebcfd
SC
2348
2349 cache_ptr = reloc_cache + idx;
2350 src = native_relocs + idx;
2351
9783e04a 2352 bfd_swap_reloc_in (abfd, src, &dst);
616ebcfd 2353
9898b929
JG
2354
2355 cache_ptr->address = dst.r_vaddr;
2356
9783e04a 2357 if (dst.r_symndx != -1)
8070f29d
KR
2358 {
2359 /* @@ Should never be greater than count of symbols! */
2360 if (dst.r_symndx >= obj_conv_table_size (abfd))
2361 abort ();
9783e04a 2362 cache_ptr->sym_ptr_ptr = symbols + obj_convert (abfd)[dst.r_symndx];
9898b929 2363 ptr = *(cache_ptr->sym_ptr_ptr);
8070f29d 2364 }
9783e04a 2365 else
8070f29d 2366 {
9783e04a 2367 cache_ptr->sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr;
8070f29d
KR
2368 ptr = 0;
2369 }
85e0c721 2370
cd83759c
KR
2371 /* The symbols definitions that we have read in have been
2372 relocated as if their sections started at 0. But the offsets
2373 refering to the symbols in the raw data have not been
2374 modified, so we have to have a negative addend to compensate.
2375
2376 Note that symbols which used to be common must be left alone */
cbdc7909 2377
3b4f1a5d 2378 /* Calculate any reloc addend by looking at the symbol */
9783e04a 2379 CALC_ADDEND (abfd, ptr, dst, cache_ptr);
cbdc7909 2380
3b4f1a5d 2381 cache_ptr->address -= asect->vma;
e98e6ec1 2382/* !! cache_ptr->section = (asection *) NULL;*/
20fdc627 2383
3b4f1a5d 2384 /* Fill in the cache_ptr->howto field from dst.r_type */
9783e04a 2385 RTYPE2HOWTO (cache_ptr, &dst);
9898b929
JG
2386#endif
2387
9783e04a 2388 }
cbdc7909 2389
3b4f1a5d
SC
2390 asect->relocation = reloc_cache;
2391 return true;
85e0c721 2392}
0f268757
SC
2393
2394
cd83759c 2395/* This is stupid. This function should be a boolean predicate. */
326e32d7 2396static long
57a1867e
DM
2397coff_canonicalize_reloc (abfd, section, relptr, symbols)
2398 bfd * abfd;
2399 sec_ptr section;
2400 arelent ** relptr;
2401 asymbol ** symbols;
85e0c721 2402{
9783e04a
DM
2403 arelent *tblptr = section->relocation;
2404 unsigned int count = 0;
cbdc7909 2405
cbdc7909 2406
9783e04a
DM
2407 if (section->flags & SEC_CONSTRUCTOR)
2408 {
2409 /* this section has relocs made up by us, they are not in the
e98e6ec1
SC
2410 file, so take them out of their chain and place them into
2411 the data area provided */
9783e04a
DM
2412 arelent_chain *chain = section->constructor_chain;
2413 for (count = 0; count < section->reloc_count; count++)
2414 {
2415 *relptr++ = &chain->relent;
2416 chain = chain->next;
2417 }
e98e6ec1 2418
9783e04a
DM
2419 }
2420 else
2421 {
326e32d7
ILT
2422 if (! coff_slurp_reloc_table (abfd, section, symbols))
2423 return -1;
85e0c721 2424
9783e04a 2425 tblptr = section->relocation;
85e0c721 2426
9783e04a
DM
2427 for (; count++ < section->reloc_count;)
2428 *relptr++ = tblptr++;
cbdc7909 2429
85e0c721 2430
9783e04a 2431 }
e98e6ec1
SC
2432 *relptr = 0;
2433 return section->reloc_count;
85e0c721 2434}
0f268757 2435
0f268757
SC
2436#ifdef GNU960
2437file_ptr
9783e04a
DM
2438coff_sym_filepos (abfd)
2439 bfd *abfd;
2440{
2441 return obj_sym_filepos (abfd);
2442}
0f268757
SC
2443#endif
2444
fbb61b50
SC
2445#ifndef coff_reloc16_estimate
2446#define coff_reloc16_estimate dummy_reloc16_estimate
2447
56775366 2448static int
09a28207
ILT
2449dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info)
2450 bfd *abfd;
fbb61b50 2451 asection *input_section;
fbb61b50 2452 arelent *reloc;
56775366 2453 unsigned int shrink;
330595d0 2454 struct bfd_link_info *link_info;
fbb61b50 2455{
56775366 2456 abort ();
fbb61b50
SC
2457}
2458
2459#endif
2460
075caafd 2461#ifndef coff_reloc16_extra_cases
9e768fa2
JK
2462#define coff_reloc16_extra_cases dummy_reloc16_extra_cases
2463/* This works even if abort is not declared in any header file. */
4d09e8ac 2464static void
330595d0
ILT
2465dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
2466 dst_ptr)
9e768fa2 2467 bfd *abfd;
330595d0
ILT
2468 struct bfd_link_info *link_info;
2469 struct bfd_link_order *link_order;
9e768fa2
JK
2470 arelent *reloc;
2471 bfd_byte *data;
2472 unsigned int *src_ptr;
2473 unsigned int *dst_ptr;
2474{
9783e04a 2475 fprintf (stderr, "%s\n", reloc->howto->name);
9e768fa2
JK
2476 abort ();
2477}
8ad2a31d 2478#endif
6590a8c9 2479
9783e04a
DM
2480static CONST bfd_coff_backend_data bfd_coff_std_swap_table =
2481{
2482 coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in,
2483 coff_swap_aux_out, coff_swap_sym_out,
2484 coff_swap_lineno_out, coff_swap_reloc_out,
2485 coff_swap_filehdr_out, coff_swap_aouthdr_out,
2486 coff_swap_scnhdr_out,
2487 FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, LINESZ,
075caafd 2488#ifdef COFF_LONG_FILENAMES
9783e04a 2489 true,
075caafd 2490#else
9783e04a 2491 false,
07de8e96 2492#endif
9783e04a
DM
2493 coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in,
2494 coff_bad_format_hook, coff_set_arch_mach_hook, coff_mkobject_hook,
2495 styp_to_sec_flags, coff_make_section_hook, coff_set_alignment_hook,
2496 coff_slurp_symbol_table, symname_in_debug_hook,
2497 coff_reloc16_extra_cases, coff_reloc16_estimate
075caafd 2498};
0f268757 2499
6812b607
ILT
2500#define coff_close_and_cleanup _bfd_generic_close_and_cleanup
2501#define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
2502#define coff_get_section_contents _bfd_generic_get_section_contents
09a28207 2503
09a28207 2504#define coff_bfd_copy_private_section_data \
6812b607
ILT
2505 _bfd_generic_bfd_copy_private_section_data
2506#define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
2507
09a28207
ILT
2508#ifndef coff_bfd_is_local_label
2509#define coff_bfd_is_local_label bfd_generic_is_local_label
2510#endif
6812b607
ILT
2511
2512/* The reloc lookup routine must be supplied by each individual COFF
2513 backend. */
2514#ifndef coff_bfd_reloc_type_lookup
2515#define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
2516#endif
2517
2518#define coff_bfd_get_relocated_section_contents \
2519 bfd_generic_get_relocated_section_contents
2520#define coff_bfd_relax_section bfd_generic_relax_section
2521#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
2522#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols
2523#define coff_bfd_final_link _bfd_generic_final_link
This page took 0.267434 seconds and 4 git commands to generate.