1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Original version by Per Bothner.
6 Full support added by Ian Lance Taylor, ian@cygnus.com.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
30 #include "aout/ranlib.h"
31 #include "aout/stab_gnu.h"
33 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
34 some other stuff which we don't want and which conflicts with stuff
37 #include "aout/aout64.h"
40 #undef obj_sym_filepos
42 #include "coff/internal.h"
44 #include "coff/symconst.h"
45 #include "coff/ecoff.h"
48 #include "libiberty.h"
50 #define streq(a, b) (strcmp ((a), (b)) == 0)
51 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0)
54 /* This stuff is somewhat copied from coffcode.h. */
55 static asection bfd_debug_section
=
57 /* name, id, index, next, prev, flags, user_set_vma, */
58 "*DEBUG*", 0, 0, NULL
, NULL
, 0, 0,
59 /* linker_mark, linker_has_input, gc_mark, */
61 /* segment_mark, sec_info_type, use_rela_p, has_tls_reloc, */
63 /* has_tls_get_addr_call, has_gp_reloc, need_finalize_relax, */
65 /* reloc_done, vma, lma, size, rawsize, relax, relax_count, */
67 /* output_offset, output_section, alignment_power, */
69 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
71 /* line_filepos, userdata, contents, lineno, lineno_count, */
72 0, NULL
, NULL
, NULL
, 0,
73 /* entsize, kept_section, moving_line_filepos, */
75 /* target_index, used_by_bfd, constructor_chain, owner, */
81 /* map_head, map_tail */
85 /* Create an ECOFF object. */
88 _bfd_ecoff_mkobject (bfd
*abfd
)
90 bfd_size_type amt
= sizeof (ecoff_data_type
);
92 abfd
->tdata
.ecoff_obj_data
= (struct ecoff_tdata
*) bfd_zalloc (abfd
, amt
);
93 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
99 /* This is a hook called by coff_real_object_p to create any backend
100 specific information. */
103 _bfd_ecoff_mkobject_hook (bfd
*abfd
, void * filehdr
, void * aouthdr
)
105 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
106 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
107 ecoff_data_type
*ecoff
;
109 if (! _bfd_ecoff_mkobject (abfd
))
112 ecoff
= ecoff_data (abfd
);
114 ecoff
->sym_filepos
= internal_f
->f_symptr
;
116 if (internal_a
!= NULL
)
120 ecoff
->text_start
= internal_a
->text_start
;
121 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
122 ecoff
->gp
= internal_a
->gp_value
;
123 ecoff
->gprmask
= internal_a
->gprmask
;
124 for (i
= 0; i
< 4; i
++)
125 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
126 ecoff
->fprmask
= internal_a
->fprmask
;
127 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
128 abfd
->flags
|= D_PAGED
;
130 abfd
->flags
&=~ D_PAGED
;
133 /* It turns out that no special action is required by the MIPS or
134 Alpha ECOFF backends. They have different information in the
135 a.out header, but we just copy it all (e.g., gprmask, cprmask and
136 fprmask) and let the swapping routines ensure that only relevant
137 information is written out. */
139 return (void *) ecoff
;
142 /* Initialize a new section. */
145 _bfd_ecoff_new_section_hook (bfd
*abfd
, asection
*section
)
155 { _TEXT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
156 { _INIT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
157 { _FINI
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
158 { _DATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
159 { _SDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
160 { _RDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
161 { _LIT8
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
162 { _LIT4
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
163 { _RCONST
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
164 { _PDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
167 /* An Irix 4 shared libary. */
168 { _LIB
, SEC_COFF_SHARED_LIBRARY
}
171 section
->alignment_power
= 4;
173 for (i
= 0; i
< ARRAY_SIZE (section_flags
); i
++)
174 if (streq (section
->name
, section_flags
[i
].name
))
176 section
->flags
|= section_flags
[i
].flags
;
181 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
182 uncertain about .init on some systems and I don't know how shared
185 return _bfd_generic_new_section_hook (abfd
, section
);
188 /* Determine the machine architecture and type. This is called from
189 the generic COFF routines. It is the inverse of ecoff_get_magic,
190 below. This could be an ECOFF backend routine, with one version
191 for each target, but there aren't all that many ECOFF targets. */
194 _bfd_ecoff_set_arch_mach_hook (bfd
*abfd
, void * filehdr
)
196 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
197 enum bfd_architecture arch
;
200 switch (internal_f
->f_magic
)
203 case MIPS_MAGIC_LITTLE
:
205 arch
= bfd_arch_mips
;
206 mach
= bfd_mach_mips3000
;
209 case MIPS_MAGIC_LITTLE2
:
210 case MIPS_MAGIC_BIG2
:
211 /* MIPS ISA level 2: the r6000. */
212 arch
= bfd_arch_mips
;
213 mach
= bfd_mach_mips6000
;
216 case MIPS_MAGIC_LITTLE3
:
217 case MIPS_MAGIC_BIG3
:
218 /* MIPS ISA level 3: the r4000. */
219 arch
= bfd_arch_mips
;
220 mach
= bfd_mach_mips4000
;
224 arch
= bfd_arch_alpha
;
229 arch
= bfd_arch_obscure
;
234 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
238 _bfd_ecoff_no_long_sections (abfd
, enable
)
247 /* Get the magic number to use based on the architecture and machine.
248 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
251 ecoff_get_magic (bfd
*abfd
)
255 switch (bfd_get_arch (abfd
))
258 switch (bfd_get_mach (abfd
))
262 case bfd_mach_mips3000
:
263 big
= MIPS_MAGIC_BIG
;
264 little
= MIPS_MAGIC_LITTLE
;
267 case bfd_mach_mips6000
:
268 big
= MIPS_MAGIC_BIG2
;
269 little
= MIPS_MAGIC_LITTLE2
;
272 case bfd_mach_mips4000
:
273 big
= MIPS_MAGIC_BIG3
;
274 little
= MIPS_MAGIC_LITTLE3
;
278 return bfd_big_endian (abfd
) ? big
: little
;
289 /* Get the section s_flags to use for a section. */
292 ecoff_sec_to_styp_flags (const char *name
, flagword flags
)
302 { _TEXT
, STYP_TEXT
},
303 { _DATA
, STYP_DATA
},
304 { _SDATA
, STYP_SDATA
},
305 { _RDATA
, STYP_RDATA
},
306 { _LITA
, STYP_LITA
},
307 { _LIT8
, STYP_LIT8
},
308 { _LIT4
, STYP_LIT4
},
310 { _SBSS
, STYP_SBSS
},
311 { _INIT
, STYP_ECOFF_INIT
},
312 { _FINI
, STYP_ECOFF_FINI
},
313 { _PDATA
, STYP_PDATA
},
314 { _XDATA
, STYP_XDATA
},
315 { _LIB
, STYP_ECOFF_LIB
},
317 { _HASH
, STYP_HASH
},
318 { _DYNAMIC
, STYP_DYNAMIC
},
319 { _LIBLIST
, STYP_LIBLIST
},
320 { _RELDYN
, STYP_RELDYN
},
321 { _CONFLIC
, STYP_CONFLIC
},
322 { _DYNSTR
, STYP_DYNSTR
},
323 { _DYNSYM
, STYP_DYNSYM
},
324 { _RCONST
, STYP_RCONST
}
328 for (i
= 0; i
< ARRAY_SIZE (styp_flags
); i
++)
329 if (streq (name
, styp_flags
[i
].name
))
331 styp
= styp_flags
[i
].flags
;
337 if (streq (name
, _COMMENT
))
340 flags
&=~ SEC_NEVER_LOAD
;
342 else if (flags
& SEC_CODE
)
344 else if (flags
& SEC_DATA
)
346 else if (flags
& SEC_READONLY
)
348 else if (flags
& SEC_LOAD
)
354 if (flags
& SEC_NEVER_LOAD
)
360 /* Get the BFD flags to use for a section. */
363 _bfd_ecoff_styp_to_sec_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
365 const char *name ATTRIBUTE_UNUSED
,
366 asection
*section ATTRIBUTE_UNUSED
,
367 flagword
* flags_ptr
)
369 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
370 long styp_flags
= internal_s
->s_flags
;
371 flagword sec_flags
= 0;
373 if (styp_flags
& STYP_NOLOAD
)
374 sec_flags
|= SEC_NEVER_LOAD
;
376 /* For 386 COFF, at least, an unloadable text or data section is
377 actually a shared library section. */
378 if ((styp_flags
& STYP_TEXT
)
379 || (styp_flags
& STYP_ECOFF_INIT
)
380 || (styp_flags
& STYP_ECOFF_FINI
)
381 || (styp_flags
& STYP_DYNAMIC
)
382 || (styp_flags
& STYP_LIBLIST
)
383 || (styp_flags
& STYP_RELDYN
)
384 || styp_flags
== STYP_CONFLIC
385 || (styp_flags
& STYP_DYNSTR
)
386 || (styp_flags
& STYP_DYNSYM
)
387 || (styp_flags
& STYP_HASH
))
389 if (sec_flags
& SEC_NEVER_LOAD
)
390 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
392 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
394 else if ((styp_flags
& STYP_DATA
)
395 || (styp_flags
& STYP_RDATA
)
396 || (styp_flags
& STYP_SDATA
)
397 || styp_flags
== STYP_PDATA
398 || styp_flags
== STYP_XDATA
399 || (styp_flags
& STYP_GOT
)
400 || styp_flags
== STYP_RCONST
)
402 if (sec_flags
& SEC_NEVER_LOAD
)
403 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
405 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
406 if ((styp_flags
& STYP_RDATA
)
407 || styp_flags
== STYP_PDATA
408 || styp_flags
== STYP_RCONST
)
409 sec_flags
|= SEC_READONLY
;
411 else if ((styp_flags
& STYP_BSS
)
412 || (styp_flags
& STYP_SBSS
))
413 sec_flags
|= SEC_ALLOC
;
414 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
415 sec_flags
|= SEC_NEVER_LOAD
;
416 else if ((styp_flags
& STYP_LITA
)
417 || (styp_flags
& STYP_LIT8
)
418 || (styp_flags
& STYP_LIT4
))
419 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
420 else if (styp_flags
& STYP_ECOFF_LIB
)
421 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
423 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
425 * flags_ptr
= sec_flags
;
429 /* Read in the symbolic header for an ECOFF object file. */
432 ecoff_slurp_symbolic_header (bfd
*abfd
)
434 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
435 bfd_size_type external_hdr_size
;
437 HDRR
*internal_symhdr
;
439 /* See if we've already read it in. */
440 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
441 backend
->debug_swap
.sym_magic
)
444 /* See whether there is a symbolic header. */
445 if (ecoff_data (abfd
)->sym_filepos
== 0)
447 bfd_get_symcount (abfd
) = 0;
451 /* At this point bfd_get_symcount (abfd) holds the number of symbols
452 as read from the file header, but on ECOFF this is always the
453 size of the symbolic information header. It would be cleaner to
454 handle this when we first read the file in coffgen.c. */
455 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
456 if (bfd_get_symcount (abfd
) != external_hdr_size
)
458 bfd_set_error (bfd_error_bad_value
);
462 /* Read the symbolic information header. */
463 raw
= bfd_malloc (external_hdr_size
);
467 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) != 0
468 || bfd_bread (raw
, external_hdr_size
, abfd
) != external_hdr_size
)
470 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
471 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
473 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
475 bfd_set_error (bfd_error_bad_value
);
479 /* Now we can get the correct number of symbols. */
480 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
481 + internal_symhdr
->iextMax
);
492 /* Read in and swap the important symbolic information for an ECOFF
493 object file. This is called by gdb via the read_debug_info entry
494 point in the backend structure. */
497 _bfd_ecoff_slurp_symbolic_info (bfd
*abfd
,
498 asection
*ignore ATTRIBUTE_UNUSED
,
499 struct ecoff_debug_info
*debug
)
501 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
502 HDRR
*internal_symhdr
;
503 bfd_size_type raw_base
;
504 bfd_size_type raw_size
;
506 bfd_size_type external_fdr_size
;
510 bfd_size_type raw_end
;
511 bfd_size_type cb_end
;
515 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
517 /* Check whether we've already gotten it, and whether there's any to
519 if (ecoff_data (abfd
)->raw_syments
!= NULL
)
521 if (ecoff_data (abfd
)->sym_filepos
== 0)
523 bfd_get_symcount (abfd
) = 0;
527 if (! ecoff_slurp_symbolic_header (abfd
))
530 internal_symhdr
= &debug
->symbolic_header
;
532 /* Read all the symbolic information at once. */
533 raw_base
= (ecoff_data (abfd
)->sym_filepos
534 + backend
->debug_swap
.external_hdr_size
);
536 /* Alpha ecoff makes the determination of raw_size difficult. It has
537 an undocumented debug data section between the symhdr and the first
538 documented section. And the ordering of the sections varies between
539 statically and dynamically linked executables.
540 If bfd supports SEEK_END someday, this code could be simplified. */
543 #define UPDATE_RAW_END(start, count, size) \
544 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
545 if (cb_end > raw_end) \
548 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
549 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
550 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
551 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
552 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
553 optimization symtab, not the number of entries. */
554 UPDATE_RAW_END (cbOptOffset
, ioptMax
, sizeof (char));
555 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
556 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
557 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
558 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
559 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
560 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
562 #undef UPDATE_RAW_END
564 raw_size
= raw_end
- raw_base
;
567 ecoff_data (abfd
)->sym_filepos
= 0;
570 raw
= bfd_alloc (abfd
, raw_size
);
574 pos
= ecoff_data (abfd
)->sym_filepos
;
575 pos
+= backend
->debug_swap
.external_hdr_size
;
576 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
577 || bfd_bread (raw
, raw_size
, abfd
) != raw_size
)
579 bfd_release (abfd
, raw
);
583 ecoff_data (abfd
)->raw_syments
= raw
;
585 /* Get pointers for the numeric offsets in the HDRR structure. */
586 #define FIX(off1, off2, type) \
587 if (internal_symhdr->off1 == 0) \
588 debug->off2 = NULL; \
590 debug->off2 = (type) ((char *) raw \
591 + (internal_symhdr->off1 \
594 FIX (cbLineOffset
, line
, unsigned char *);
595 FIX (cbDnOffset
, external_dnr
, void *);
596 FIX (cbPdOffset
, external_pdr
, void *);
597 FIX (cbSymOffset
, external_sym
, void *);
598 FIX (cbOptOffset
, external_opt
, void *);
599 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
600 FIX (cbSsOffset
, ss
, char *);
601 FIX (cbSsExtOffset
, ssext
, char *);
602 FIX (cbFdOffset
, external_fdr
, void *);
603 FIX (cbRfdOffset
, external_rfd
, void *);
604 FIX (cbExtOffset
, external_ext
, void *);
607 /* I don't want to always swap all the data, because it will just
608 waste time and most programs will never look at it. The only
609 time the linker needs most of the debugging information swapped
610 is when linking big-endian and little-endian MIPS object files
611 together, which is not a common occurrence.
613 We need to look at the fdr to deal with a lot of information in
614 the symbols, so we swap them here. */
615 amt
= internal_symhdr
->ifdMax
;
616 amt
*= sizeof (struct fdr
);
617 debug
->fdr
= (FDR
*) bfd_alloc (abfd
, amt
);
618 if (debug
->fdr
== NULL
)
620 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
621 fdr_ptr
= debug
->fdr
;
622 fraw_src
= (char *) debug
->external_fdr
;
623 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
624 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
625 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (void *) fraw_src
, fdr_ptr
);
630 /* ECOFF symbol table routines. The ECOFF symbol table is described
631 in gcc/mips-tfile.c. */
633 /* ECOFF uses two common sections. One is the usual one, and the
634 other is for small objects. All the small objects are kept
635 together, and then referenced via the gp pointer, which yields
636 faster assembler code. This is what we use for the small common
638 static asection ecoff_scom_section
;
639 static asymbol ecoff_scom_symbol
;
640 static asymbol
*ecoff_scom_symbol_ptr
;
642 /* Create an empty symbol. */
645 _bfd_ecoff_make_empty_symbol (bfd
*abfd
)
647 ecoff_symbol_type
*new_symbol
;
648 bfd_size_type amt
= sizeof (ecoff_symbol_type
);
650 new_symbol
= (ecoff_symbol_type
*) bfd_zalloc (abfd
, amt
);
651 if (new_symbol
== NULL
)
653 new_symbol
->symbol
.section
= NULL
;
654 new_symbol
->fdr
= NULL
;
655 new_symbol
->local
= FALSE
;
656 new_symbol
->native
= NULL
;
657 new_symbol
->symbol
.the_bfd
= abfd
;
658 return &new_symbol
->symbol
;
661 /* Set the BFD flags and section for an ECOFF symbol. */
664 ecoff_set_symbol_info (bfd
*abfd
,
670 asym
->the_bfd
= abfd
;
671 asym
->value
= ecoff_sym
->value
;
672 asym
->section
= &bfd_debug_section
;
675 /* Most symbol types are just for debugging. */
676 switch (ecoff_sym
->st
)
685 if (ECOFF_IS_STAB (ecoff_sym
))
687 asym
->flags
= BSF_DEBUGGING
;
692 asym
->flags
= BSF_DEBUGGING
;
697 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
699 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
702 asym
->flags
= BSF_LOCAL
;
703 /* Normally, a local stProc symbol will have a corresponding
704 external symbol. We mark the local symbol as a debugging
705 symbol, in order to prevent nm from printing both out.
706 Similarly, we mark stLabel and stabs symbols as debugging
707 symbols. In both cases, we do want to set the value
708 correctly based on the symbol class. */
709 if (ecoff_sym
->st
== stProc
710 || ecoff_sym
->st
== stLabel
711 || ECOFF_IS_STAB (ecoff_sym
))
712 asym
->flags
|= BSF_DEBUGGING
;
715 if (ecoff_sym
->st
== stProc
|| ecoff_sym
->st
== stStaticProc
)
716 asym
->flags
|= BSF_FUNCTION
;
718 switch (ecoff_sym
->sc
)
721 /* Used for compiler generated labels. Leave them in the
722 debugging section, and mark them as local. If BSF_DEBUGGING
723 is set, then nm does not display them for some reason. If no
724 flags are set then the linker whines about them. */
725 asym
->flags
= BSF_LOCAL
;
728 asym
->section
= bfd_make_section_old_way (abfd
, _TEXT
);
729 asym
->value
-= asym
->section
->vma
;
732 asym
->section
= bfd_make_section_old_way (abfd
, _DATA
);
733 asym
->value
-= asym
->section
->vma
;
736 asym
->section
= bfd_make_section_old_way (abfd
, _BSS
);
737 asym
->value
-= asym
->section
->vma
;
740 asym
->flags
= BSF_DEBUGGING
;
743 asym
->section
= bfd_abs_section_ptr
;
746 asym
->section
= bfd_und_section_ptr
;
756 asym
->flags
= BSF_DEBUGGING
;
759 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
760 asym
->value
-= asym
->section
->vma
;
763 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
764 asym
->value
-= asym
->section
->vma
;
767 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
768 asym
->value
-= asym
->section
->vma
;
771 asym
->flags
= BSF_DEBUGGING
;
774 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
776 asym
->section
= bfd_com_section_ptr
;
782 if (ecoff_scom_section
.name
== NULL
)
784 /* Initialize the small common section. */
785 ecoff_scom_section
.name
= SCOMMON
;
786 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
787 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
788 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
789 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
790 ecoff_scom_symbol
.name
= SCOMMON
;
791 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
792 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
793 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
795 asym
->section
= &ecoff_scom_section
;
800 asym
->flags
= BSF_DEBUGGING
;
803 asym
->section
= bfd_und_section_ptr
;
808 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
809 asym
->value
-= asym
->section
->vma
;
814 asym
->flags
= BSF_DEBUGGING
;
817 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
818 asym
->value
-= asym
->section
->vma
;
821 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
822 asym
->value
-= asym
->section
->vma
;
828 /* Look for special constructors symbols and make relocation entries
829 in a special construction section. These are produced by the
830 -fgnu-linker argument to g++. */
831 if (ECOFF_IS_STAB (ecoff_sym
))
833 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
842 /* Mark the symbol as a constructor. */
843 asym
->flags
|= BSF_CONSTRUCTOR
;
850 /* Read an ECOFF symbol table. */
853 _bfd_ecoff_slurp_symbol_table (bfd
*abfd
)
855 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
856 const bfd_size_type external_ext_size
857 = backend
->debug_swap
.external_ext_size
;
858 const bfd_size_type external_sym_size
859 = backend
->debug_swap
.external_sym_size
;
860 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
861 = backend
->debug_swap
.swap_ext_in
;
862 void (* const swap_sym_in
) (bfd
*, void *, SYMR
*)
863 = backend
->debug_swap
.swap_sym_in
;
864 bfd_size_type internal_size
;
865 ecoff_symbol_type
*internal
;
866 ecoff_symbol_type
*internal_ptr
;
872 /* If we've already read in the symbol table, do nothing. */
873 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
876 /* Get the symbolic information. */
877 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
878 &ecoff_data (abfd
)->debug_info
))
880 if (bfd_get_symcount (abfd
) == 0)
883 internal_size
= bfd_get_symcount (abfd
);
884 internal_size
*= sizeof (ecoff_symbol_type
);
885 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
886 if (internal
== NULL
)
889 internal_ptr
= internal
;
890 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
892 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
893 * external_ext_size
));
894 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
898 (*swap_ext_in
) (abfd
, (void *) eraw_src
, &internal_esym
);
899 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
900 + internal_esym
.asym
.iss
);
901 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
902 &internal_ptr
->symbol
, 1,
903 internal_esym
.weakext
))
905 /* The alpha uses a negative ifd field for section symbols. */
906 if (internal_esym
.ifd
>= 0)
907 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
908 + internal_esym
.ifd
);
910 internal_ptr
->fdr
= NULL
;
911 internal_ptr
->local
= FALSE
;
912 internal_ptr
->native
= (void *) eraw_src
;
915 /* The local symbols must be accessed via the fdr's, because the
916 string and aux indices are relative to the fdr information. */
917 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
918 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
919 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
924 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
925 + fdr_ptr
->isymBase
* external_sym_size
);
926 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
929 lraw_src
+= external_sym_size
, internal_ptr
++)
933 (*swap_sym_in
) (abfd
, (void *) lraw_src
, &internal_sym
);
934 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
937 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
938 &internal_ptr
->symbol
, 0, 0))
940 internal_ptr
->fdr
= fdr_ptr
;
941 internal_ptr
->local
= TRUE
;
942 internal_ptr
->native
= (void *) lraw_src
;
946 ecoff_data (abfd
)->canonical_symbols
= internal
;
951 /* Return the amount of space needed for the canonical symbols. */
954 _bfd_ecoff_get_symtab_upper_bound (bfd
*abfd
)
956 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
957 &ecoff_data (abfd
)->debug_info
))
960 if (bfd_get_symcount (abfd
) == 0)
963 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
966 /* Get the canonical symbols. */
969 _bfd_ecoff_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
971 unsigned int counter
= 0;
972 ecoff_symbol_type
*symbase
;
973 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
975 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
977 if (bfd_get_symcount (abfd
) == 0)
980 symbase
= ecoff_data (abfd
)->canonical_symbols
;
981 while (counter
< bfd_get_symcount (abfd
))
983 *(location
++) = symbase
++;
987 return bfd_get_symcount (abfd
);
990 /* Turn ECOFF type information into a printable string.
991 ecoff_emit_aggregate and ecoff_type_to_string are from
992 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
994 /* Write aggregate information to a string. */
997 ecoff_emit_aggregate (bfd
*abfd
,
1004 const struct ecoff_debug_swap
* const debug_swap
=
1005 &ecoff_backend (abfd
)->debug_swap
;
1006 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1007 unsigned int ifd
= rndx
->rfd
;
1008 unsigned int indx
= rndx
->index
;
1014 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1015 struct return type of a procedure compiled without -g. */
1016 if (ifd
== 0xffffffff
1017 || (rndx
->rfd
== 0xfff && indx
== 0))
1018 name
= "<undefined>";
1019 else if (indx
== indexNil
)
1025 if (debug_info
->external_rfd
== NULL
)
1026 fdr
= debug_info
->fdr
+ ifd
;
1031 (*debug_swap
->swap_rfd_in
) (abfd
,
1032 ((char *) debug_info
->external_rfd
1033 + ((fdr
->rfdBase
+ ifd
)
1034 * debug_swap
->external_rfd_size
)),
1036 fdr
= debug_info
->fdr
+ rfd
;
1039 indx
+= fdr
->isymBase
;
1041 (*debug_swap
->swap_sym_in
) (abfd
,
1042 ((char *) debug_info
->external_sym
1043 + indx
* debug_swap
->external_sym_size
),
1046 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1050 "%s %s { ifd = %u, index = %lu }",
1052 ((unsigned long) indx
1053 + debug_info
->symbolic_header
.iextMax
));
1056 /* Convert the type information to string format. */
1059 ecoff_type_to_string (bfd
*abfd
, FDR
*fdr
, unsigned int indx
)
1061 union aux_ext
*aux_ptr
;
1071 unsigned int basic_type
;
1074 static char buffer2
[1024];
1079 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1080 bigendian
= fdr
->fBigendian
;
1082 for (i
= 0; i
< 7; i
++)
1084 qualifiers
[i
].low_bound
= 0;
1085 qualifiers
[i
].high_bound
= 0;
1086 qualifiers
[i
].stride
= 0;
1089 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1090 return "-1 (no type)";
1091 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1093 basic_type
= u
.ti
.bt
;
1094 qualifiers
[0].type
= u
.ti
.tq0
;
1095 qualifiers
[1].type
= u
.ti
.tq1
;
1096 qualifiers
[2].type
= u
.ti
.tq2
;
1097 qualifiers
[3].type
= u
.ti
.tq3
;
1098 qualifiers
[4].type
= u
.ti
.tq4
;
1099 qualifiers
[5].type
= u
.ti
.tq5
;
1100 qualifiers
[6].type
= tqNil
;
1102 /* Go get the basic type. */
1105 case btNil
: /* Undefined. */
1109 case btAdr
: /* Address - integer same size as pointer. */
1110 strcpy (p1
, "address");
1113 case btChar
: /* Character. */
1114 strcpy (p1
, "char");
1117 case btUChar
: /* Unsigned character. */
1118 strcpy (p1
, "unsigned char");
1121 case btShort
: /* Short. */
1122 strcpy (p1
, "short");
1125 case btUShort
: /* Unsigned short. */
1126 strcpy (p1
, "unsigned short");
1129 case btInt
: /* Int. */
1133 case btUInt
: /* Unsigned int. */
1134 strcpy (p1
, "unsigned int");
1137 case btLong
: /* Long. */
1138 strcpy (p1
, "long");
1141 case btULong
: /* Unsigned long. */
1142 strcpy (p1
, "unsigned long");
1145 case btFloat
: /* Float (real). */
1146 strcpy (p1
, "float");
1149 case btDouble
: /* Double (real). */
1150 strcpy (p1
, "double");
1153 /* Structures add 1-2 aux words:
1154 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1155 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1157 case btStruct
: /* Structure (Record). */
1158 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1159 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1160 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1162 indx
++; /* Skip aux words. */
1165 /* Unions add 1-2 aux words:
1166 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1167 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1169 case btUnion
: /* Union. */
1170 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1171 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1172 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1174 indx
++; /* Skip aux words. */
1177 /* Enumerations add 1-2 aux words:
1178 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1179 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1181 case btEnum
: /* Enumeration. */
1182 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1183 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1184 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1186 indx
++; /* Skip aux words. */
1189 case btTypedef
: /* Defined via a typedef, isymRef points. */
1190 strcpy (p1
, "typedef");
1193 case btRange
: /* Subrange of int. */
1194 strcpy (p1
, "subrange");
1197 case btSet
: /* Pascal sets. */
1201 case btComplex
: /* Fortran complex. */
1202 strcpy (p1
, "complex");
1205 case btDComplex
: /* Fortran double complex. */
1206 strcpy (p1
, "double complex");
1209 case btIndirect
: /* Forward or unnamed typedef. */
1210 strcpy (p1
, "forward/unamed typedef");
1213 case btFixedDec
: /* Fixed Decimal. */
1214 strcpy (p1
, "fixed decimal");
1217 case btFloatDec
: /* Float Decimal. */
1218 strcpy (p1
, "float decimal");
1221 case btString
: /* Varying Length Character String. */
1222 strcpy (p1
, "string");
1225 case btBit
: /* Aligned Bit String. */
1229 case btPicture
: /* Picture. */
1230 strcpy (p1
, "picture");
1233 case btVoid
: /* Void. */
1234 strcpy (p1
, "void");
1238 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1242 p1
+= strlen (buffer1
);
1244 /* If this is a bitfield, get the bitsize. */
1249 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1250 sprintf (p1
, " : %d", bitsize
);
1251 p1
+= strlen (buffer1
);
1254 /* Deal with any qualifiers. */
1255 if (qualifiers
[0].type
!= tqNil
)
1257 /* Snarf up any array bounds in the correct order. Arrays
1258 store 5 successive words in the aux. table:
1259 word 0 RNDXR to type of the bounds (ie, int)
1260 word 1 Current file descriptor index
1262 word 3 high bound (or -1 if [])
1263 word 4 stride size in bits. */
1264 for (i
= 0; i
< 7; i
++)
1266 if (qualifiers
[i
].type
== tqArray
)
1268 qualifiers
[i
].low_bound
=
1269 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1270 qualifiers
[i
].high_bound
=
1271 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1272 qualifiers
[i
].stride
=
1273 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1278 /* Now print out the qualifiers. */
1279 for (i
= 0; i
< 6; i
++)
1281 switch (qualifiers
[i
].type
)
1288 strcpy (p2
, "ptr to ");
1289 p2
+= sizeof ("ptr to ")-1;
1293 strcpy (p2
, "volatile ");
1294 p2
+= sizeof ("volatile ")-1;
1298 strcpy (p2
, "far ");
1299 p2
+= sizeof ("far ")-1;
1303 strcpy (p2
, "func. ret. ");
1304 p2
+= sizeof ("func. ret. ");
1309 int first_array
= i
;
1312 /* Print array bounds reversed (ie, in the order the C
1313 programmer writes them). C is such a fun language.... */
1314 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1317 for (j
= i
; j
>= first_array
; j
--)
1319 strcpy (p2
, "array [");
1320 p2
+= sizeof ("array [")-1;
1321 if (qualifiers
[j
].low_bound
!= 0)
1323 "%ld:%ld {%ld bits}",
1324 (long) qualifiers
[j
].low_bound
,
1325 (long) qualifiers
[j
].high_bound
,
1326 (long) qualifiers
[j
].stride
);
1328 else if (qualifiers
[j
].high_bound
!= -1)
1331 (long) (qualifiers
[j
].high_bound
+ 1),
1332 (long) (qualifiers
[j
].stride
));
1335 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1338 strcpy (p2
, "] of ");
1339 p2
+= sizeof ("] of ")-1;
1347 strcpy (p2
, buffer1
);
1351 /* Return information about ECOFF symbol SYMBOL in RET. */
1354 _bfd_ecoff_get_symbol_info (bfd
*abfd ATTRIBUTE_UNUSED
,
1358 bfd_symbol_info (symbol
, ret
);
1361 /* Return whether this is a local label. */
1364 _bfd_ecoff_bfd_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
,
1367 return name
[0] == '$';
1370 /* Print information about an ECOFF symbol. */
1373 _bfd_ecoff_print_symbol (bfd
*abfd
,
1376 bfd_print_symbol_type how
)
1378 const struct ecoff_debug_swap
* const debug_swap
1379 = &ecoff_backend (abfd
)->debug_swap
;
1380 FILE *file
= (FILE *)filep
;
1384 case bfd_print_symbol_name
:
1385 fprintf (file
, "%s", symbol
->name
);
1387 case bfd_print_symbol_more
:
1388 if (ecoffsymbol (symbol
)->local
)
1392 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1394 fprintf (file
, "ecoff local ");
1395 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1396 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1397 (unsigned) ecoff_sym
.sc
);
1403 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1405 fprintf (file
, "ecoff extern ");
1406 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1407 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1408 (unsigned) ecoff_ext
.asym
.sc
);
1411 case bfd_print_symbol_all
:
1412 /* Print out the symbols in a reasonable way. */
1421 if (ecoffsymbol (symbol
)->local
)
1423 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1426 pos
= ((((char *) ecoffsymbol (symbol
)->native
1427 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1428 / debug_swap
->external_sym_size
)
1429 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1436 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1439 pos
= (((char *) ecoffsymbol (symbol
)->native
1440 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1441 / debug_swap
->external_ext_size
);
1442 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1443 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1444 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1447 fprintf (file
, "[%3d] %c ",
1449 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1450 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1451 (unsigned) ecoff_ext
.asym
.st
,
1452 (unsigned) ecoff_ext
.asym
.sc
,
1453 (unsigned) ecoff_ext
.asym
.index
,
1454 jmptbl
, cobol_main
, weakext
,
1457 if (ecoffsymbol (symbol
)->fdr
!= NULL
1458 && ecoff_ext
.asym
.index
!= indexNil
)
1463 bfd_size_type sym_base
;
1464 union aux_ext
*aux_base
;
1466 fdr
= ecoffsymbol (symbol
)->fdr
;
1467 indx
= ecoff_ext
.asym
.index
;
1469 /* sym_base is used to map the fdr relative indices which
1470 appear in the file to the position number which we are
1472 sym_base
= fdr
->isymBase
;
1473 if (ecoffsymbol (symbol
)->local
)
1475 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1477 /* aux_base is the start of the aux entries for this file;
1478 asym.index is an offset from this. */
1479 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1482 /* The aux entries are stored in host byte order; the
1483 order is indicated by a bit in the fdr. */
1484 bigendian
= fdr
->fBigendian
;
1486 /* This switch is basically from gcc/mips-tdump.c. */
1487 switch (ecoff_ext
.asym
.st
)
1495 fprintf (file
, _("\n End+1 symbol: %ld"),
1496 (long) (indx
+ sym_base
));
1500 if (ecoff_ext
.asym
.sc
== scText
1501 || ecoff_ext
.asym
.sc
== scInfo
)
1502 fprintf (file
, _("\n First symbol: %ld"),
1503 (long) (indx
+ sym_base
));
1505 fprintf (file
, _("\n First symbol: %ld"),
1507 (AUX_GET_ISYM (bigendian
,
1508 &aux_base
[ecoff_ext
.asym
.index
])
1514 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1516 else if (ecoffsymbol (symbol
)->local
)
1517 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1519 (AUX_GET_ISYM (bigendian
,
1520 &aux_base
[ecoff_ext
.asym
.index
])
1522 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1524 fprintf (file
, _("\n Local symbol: %ld"),
1527 + (ecoff_data (abfd
)
1528 ->debug_info
.symbolic_header
.iextMax
)));
1532 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1533 (long) (indx
+ sym_base
));
1537 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1538 (long) (indx
+ sym_base
));
1542 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1543 (long) (indx
+ sym_base
));
1547 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1548 fprintf (file
, _("\n Type: %s"),
1549 ecoff_type_to_string (abfd
, fdr
, indx
));
1558 /* Read in the relocs for a section. */
1561 ecoff_slurp_reloc_table (bfd
*abfd
,
1565 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1566 arelent
*internal_relocs
;
1567 bfd_size_type external_reloc_size
;
1569 char *external_relocs
;
1573 if (section
->relocation
!= NULL
1574 || section
->reloc_count
== 0
1575 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1578 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1581 amt
= section
->reloc_count
;
1582 amt
*= sizeof (arelent
);
1583 internal_relocs
= (arelent
*) bfd_alloc (abfd
, amt
);
1585 external_reloc_size
= backend
->external_reloc_size
;
1586 amt
= external_reloc_size
* section
->reloc_count
;
1587 external_relocs
= (char *) bfd_alloc (abfd
, amt
);
1588 if (internal_relocs
== NULL
|| external_relocs
== NULL
)
1590 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1592 if (bfd_bread (external_relocs
, amt
, abfd
) != amt
)
1595 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1597 struct internal_reloc intern
;
1599 (*backend
->swap_reloc_in
) (abfd
,
1600 external_relocs
+ i
* external_reloc_size
,
1603 if (intern
.r_extern
)
1605 /* r_symndx is an index into the external symbols. */
1606 BFD_ASSERT (intern
.r_symndx
>= 0
1608 < (ecoff_data (abfd
)
1609 ->debug_info
.symbolic_header
.iextMax
)));
1610 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1613 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1614 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1616 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1621 const char *sec_name
;
1624 /* r_symndx is a section key. */
1625 switch (intern
.r_symndx
)
1627 case RELOC_SECTION_TEXT
: sec_name
= _TEXT
; break;
1628 case RELOC_SECTION_RDATA
: sec_name
= _RDATA
; break;
1629 case RELOC_SECTION_DATA
: sec_name
= _DATA
; break;
1630 case RELOC_SECTION_SDATA
: sec_name
= _SDATA
; break;
1631 case RELOC_SECTION_SBSS
: sec_name
= _SBSS
; break;
1632 case RELOC_SECTION_BSS
: sec_name
= _BSS
; break;
1633 case RELOC_SECTION_INIT
: sec_name
= _INIT
; break;
1634 case RELOC_SECTION_LIT8
: sec_name
= _LIT8
; break;
1635 case RELOC_SECTION_LIT4
: sec_name
= _LIT4
; break;
1636 case RELOC_SECTION_XDATA
: sec_name
= _XDATA
; break;
1637 case RELOC_SECTION_PDATA
: sec_name
= _PDATA
; break;
1638 case RELOC_SECTION_FINI
: sec_name
= _FINI
; break;
1639 case RELOC_SECTION_LITA
: sec_name
= _LITA
; break;
1640 case RELOC_SECTION_RCONST
: sec_name
= _RCONST
; break;
1644 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1647 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1649 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1652 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1654 /* Let the backend select the howto field and do any other
1655 required processing. */
1656 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1659 bfd_release (abfd
, external_relocs
);
1661 section
->relocation
= internal_relocs
;
1666 /* Get a canonical list of relocs. */
1669 _bfd_ecoff_canonicalize_reloc (bfd
*abfd
,
1676 if (section
->flags
& SEC_CONSTRUCTOR
)
1678 arelent_chain
*chain
;
1680 /* This section has relocs made up by us, not the file, so take
1681 them out of their chain and place them into the data area
1683 for (count
= 0, chain
= section
->constructor_chain
;
1684 count
< section
->reloc_count
;
1685 count
++, chain
= chain
->next
)
1686 *relptr
++ = &chain
->relent
;
1692 if (! ecoff_slurp_reloc_table (abfd
, section
, symbols
))
1695 tblptr
= section
->relocation
;
1697 for (count
= 0; count
< section
->reloc_count
; count
++)
1698 *relptr
++ = tblptr
++;
1703 return section
->reloc_count
;
1706 /* Provided a BFD, a section and an offset into the section, calculate
1707 and return the name of the source file and the line nearest to the
1711 _bfd_ecoff_find_nearest_line (bfd
*abfd
,
1713 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
,
1715 const char **filename_ptr
,
1716 const char **functionname_ptr
,
1717 unsigned int *retline_ptr
)
1719 const struct ecoff_debug_swap
* const debug_swap
1720 = &ecoff_backend (abfd
)->debug_swap
;
1721 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1722 struct ecoff_find_line
*line_info
;
1724 /* Make sure we have the FDR's. */
1725 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
, debug_info
)
1726 || bfd_get_symcount (abfd
) == 0)
1729 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1731 bfd_size_type amt
= sizeof (struct ecoff_find_line
);
1733 ecoff_data (abfd
)->find_line_info
=
1734 (struct ecoff_find_line
*) bfd_zalloc (abfd
, amt
);
1735 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1738 line_info
= ecoff_data (abfd
)->find_line_info
;
1740 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1741 debug_swap
, line_info
, filename_ptr
,
1742 functionname_ptr
, retline_ptr
);
1745 /* Copy private BFD data. This is called by objcopy and strip. We
1746 use it to copy the ECOFF debugging information from one BFD to the
1747 other. It would be theoretically possible to represent the ECOFF
1748 debugging information in the symbol table. However, it would be a
1749 lot of work, and there would be little gain (gas, gdb, and ld
1750 already access the ECOFF debugging information via the
1751 ecoff_debug_info structure, and that structure would have to be
1752 retained in order to support ECOFF debugging in MIPS ELF).
1754 The debugging information for the ECOFF external symbols comes from
1755 the symbol table, so this function only handles the other debugging
1759 _bfd_ecoff_bfd_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
1761 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1762 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1764 asymbol
**sym_ptr_ptr
;
1768 /* We only want to copy information over if both BFD's use ECOFF
1770 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1771 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1774 /* Copy the GP value and the register masks. */
1775 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1776 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1777 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1778 for (i
= 0; i
< 3; i
++)
1779 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1781 /* Copy the version stamp. */
1782 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1784 /* If there are no symbols, don't copy any debugging information. */
1785 c
= bfd_get_symcount (obfd
);
1786 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1787 if (c
== 0 || sym_ptr_ptr
== NULL
)
1790 /* See if there are any local symbols. */
1792 for (; c
> 0; c
--, sym_ptr_ptr
++)
1794 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1803 /* There are some local symbols. We just bring over all the
1804 debugging information. FIXME: This is not quite the right
1805 thing to do. If the user has asked us to discard all
1806 debugging information, then we are probably going to wind up
1807 keeping it because there will probably be some local symbol
1808 which objcopy did not discard. We should actually break
1809 apart the debugging information and only keep that which
1810 applies to the symbols we want to keep. */
1811 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1812 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1813 oinfo
->line
= iinfo
->line
;
1815 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1816 oinfo
->external_dnr
= iinfo
->external_dnr
;
1818 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1819 oinfo
->external_pdr
= iinfo
->external_pdr
;
1821 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1822 oinfo
->external_sym
= iinfo
->external_sym
;
1824 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1825 oinfo
->external_opt
= iinfo
->external_opt
;
1827 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1828 oinfo
->external_aux
= iinfo
->external_aux
;
1830 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1831 oinfo
->ss
= iinfo
->ss
;
1833 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1834 oinfo
->external_fdr
= iinfo
->external_fdr
;
1836 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1837 oinfo
->external_rfd
= iinfo
->external_rfd
;
1841 /* We are discarding all the local symbol information. Look
1842 through the external symbols and remove all references to FDR
1843 or aux information. */
1844 c
= bfd_get_symcount (obfd
);
1845 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1846 for (; c
> 0; c
--, sym_ptr_ptr
++)
1850 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1851 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1853 esym
.asym
.index
= indexNil
;
1854 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1855 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1862 /* Set the architecture. The supported architecture is stored in the
1863 backend pointer. We always set the architecture anyhow, since many
1864 callers ignore the return value. */
1867 _bfd_ecoff_set_arch_mach (bfd
*abfd
,
1868 enum bfd_architecture arch
,
1869 unsigned long machine
)
1871 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1872 return arch
== ecoff_backend (abfd
)->arch
;
1875 /* Get the size of the section headers. */
1878 _bfd_ecoff_sizeof_headers (bfd
*abfd
,
1879 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1886 for (current
= abfd
->sections
;
1888 current
= current
->next
)
1891 ret
= (bfd_coff_filhsz (abfd
)
1892 + bfd_coff_aoutsz (abfd
)
1893 + c
* bfd_coff_scnhsz (abfd
));
1894 return BFD_ALIGN (ret
, 16);
1897 /* Get the contents of a section. */
1900 _bfd_ecoff_get_section_contents (bfd
*abfd
,
1904 bfd_size_type count
)
1906 return _bfd_generic_get_section_contents (abfd
, section
, location
,
1910 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1911 called via qsort. */
1914 ecoff_sort_hdrs (const void * arg1
, const void * arg2
)
1916 const asection
*hdr1
= *(const asection
**) arg1
;
1917 const asection
*hdr2
= *(const asection
**) arg2
;
1919 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
1921 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
1926 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
1929 if (hdr1
->vma
< hdr2
->vma
)
1931 else if (hdr1
->vma
> hdr2
->vma
)
1937 /* Calculate the file position for each section, and set
1941 ecoff_compute_section_file_positions (bfd
*abfd
)
1943 file_ptr sofar
, file_sofar
;
1944 asection
**sorted_hdrs
;
1948 bfd_boolean rdata_in_text
;
1949 bfd_boolean first_data
, first_nonalloc
;
1950 const bfd_vma round
= ecoff_backend (abfd
)->round
;
1953 sofar
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
1956 /* Sort the sections by VMA. */
1957 amt
= abfd
->section_count
;
1958 amt
*= sizeof (asection
*);
1959 sorted_hdrs
= (asection
**) bfd_malloc (amt
);
1960 if (sorted_hdrs
== NULL
)
1962 for (current
= abfd
->sections
, i
= 0;
1964 current
= current
->next
, i
++)
1965 sorted_hdrs
[i
] = current
;
1966 BFD_ASSERT (i
== abfd
->section_count
);
1968 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
1971 /* Some versions of the OSF linker put the .rdata section in the
1972 text segment, and some do not. */
1973 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
1976 for (i
= 0; i
< abfd
->section_count
; i
++)
1978 current
= sorted_hdrs
[i
];
1979 if (streq (current
->name
, _RDATA
))
1981 if ((current
->flags
& SEC_CODE
) == 0
1982 && ! streq (current
->name
, _PDATA
)
1983 && ! streq (current
->name
, _RCONST
))
1985 rdata_in_text
= FALSE
;
1990 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
1993 first_nonalloc
= TRUE
;
1994 for (i
= 0; i
< abfd
->section_count
; i
++)
1996 unsigned int alignment_power
;
1998 current
= sorted_hdrs
[i
];
2000 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2001 supposed to indicate the number of .pdata entries that are
2002 really in the section. Each entry is 8 bytes. We store this
2003 away in line_filepos before increasing the section size. */
2004 if (streq (current
->name
, _PDATA
))
2005 current
->line_filepos
= current
->size
/ 8;
2007 alignment_power
= current
->alignment_power
;
2009 /* On Ultrix, the data sections in an executable file must be
2010 aligned to a page boundary within the file. This does not
2011 affect the section size, though. FIXME: Does this work for
2012 other platforms? It requires some modification for the
2013 Alpha, because .rdata on the Alpha goes with the text, not
2015 if ((abfd
->flags
& EXEC_P
) != 0
2016 && (abfd
->flags
& D_PAGED
) != 0
2018 && (current
->flags
& SEC_CODE
) == 0
2020 || ! streq (current
->name
, _RDATA
))
2021 && ! streq (current
->name
, _PDATA
)
2022 && ! streq (current
->name
, _RCONST
))
2024 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2025 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2028 else if (streq (current
->name
, _LIB
))
2030 /* On Irix 4, the location of contents of the .lib section
2031 from a shared library section is also rounded up to a
2034 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2035 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2037 else if (first_nonalloc
2038 && (current
->flags
& SEC_ALLOC
) == 0
2039 && (abfd
->flags
& D_PAGED
) != 0)
2041 /* Skip up to the next page for an unallocated section, such
2042 as the .comment section on the Alpha. This leaves room
2043 for the .bss section. */
2044 first_nonalloc
= FALSE
;
2045 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2046 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2049 /* Align the sections in the file to the same boundary on
2050 which they are aligned in virtual memory. */
2051 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2052 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2053 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2055 if ((abfd
->flags
& D_PAGED
) != 0
2056 && (current
->flags
& SEC_ALLOC
) != 0)
2058 sofar
+= (current
->vma
- sofar
) % round
;
2059 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2060 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2063 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2064 current
->filepos
= file_sofar
;
2066 sofar
+= current
->size
;
2067 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2068 file_sofar
+= current
->size
;
2070 /* Make sure that this section is of the right size too. */
2072 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2073 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2074 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2075 current
->size
+= sofar
- old_sofar
;
2081 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2086 /* Determine the location of the relocs for all the sections in the
2087 output file, as well as the location of the symbolic debugging
2090 static bfd_size_type
2091 ecoff_compute_reloc_file_positions (bfd
*abfd
)
2093 const bfd_size_type external_reloc_size
=
2094 ecoff_backend (abfd
)->external_reloc_size
;
2095 file_ptr reloc_base
;
2096 bfd_size_type reloc_size
;
2100 if (! abfd
->output_has_begun
)
2102 if (! ecoff_compute_section_file_positions (abfd
))
2104 abfd
->output_has_begun
= TRUE
;
2107 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2110 for (current
= abfd
->sections
;
2112 current
= current
->next
)
2114 if (current
->reloc_count
== 0)
2115 current
->rel_filepos
= 0;
2118 bfd_size_type relsize
;
2120 current
->rel_filepos
= reloc_base
;
2121 relsize
= current
->reloc_count
* external_reloc_size
;
2122 reloc_size
+= relsize
;
2123 reloc_base
+= relsize
;
2127 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2129 /* At least on Ultrix, the symbol table of an executable file must
2130 be aligned to a page boundary. FIXME: Is this true on other
2132 if ((abfd
->flags
& EXEC_P
) != 0
2133 && (abfd
->flags
& D_PAGED
) != 0)
2134 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2135 &~ (ecoff_backend (abfd
)->round
- 1));
2137 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2142 /* Set the contents of a section. */
2145 _bfd_ecoff_set_section_contents (bfd
*abfd
,
2147 const void * location
,
2149 bfd_size_type count
)
2153 /* This must be done first, because bfd_set_section_contents is
2154 going to set output_has_begun to TRUE. */
2155 if (! abfd
->output_has_begun
2156 && ! ecoff_compute_section_file_positions (abfd
))
2159 /* Handle the .lib section specially so that Irix 4 shared libraries
2160 work out. See coff_set_section_contents in coffcode.h. */
2161 if (streq (section
->name
, _LIB
))
2163 bfd_byte
*rec
, *recend
;
2165 rec
= (bfd_byte
*) location
;
2166 recend
= rec
+ count
;
2167 while (rec
< recend
)
2170 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2173 BFD_ASSERT (rec
== recend
);
2179 pos
= section
->filepos
+ offset
;
2180 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2181 || bfd_bwrite (location
, count
, abfd
) != count
)
2187 /* Get the GP value for an ECOFF file. This is a hook used by
2191 bfd_ecoff_get_gp_value (bfd
*abfd
)
2193 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2194 || bfd_get_format (abfd
) != bfd_object
)
2196 bfd_set_error (bfd_error_invalid_operation
);
2200 return ecoff_data (abfd
)->gp
;
2203 /* Set the GP value for an ECOFF file. This is a hook used by the
2207 bfd_ecoff_set_gp_value (bfd
*abfd
, bfd_vma gp_value
)
2209 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2210 || bfd_get_format (abfd
) != bfd_object
)
2212 bfd_set_error (bfd_error_invalid_operation
);
2216 ecoff_data (abfd
)->gp
= gp_value
;
2221 /* Set the register masks for an ECOFF file. This is a hook used by
2225 bfd_ecoff_set_regmasks (bfd
*abfd
,
2226 unsigned long gprmask
,
2227 unsigned long fprmask
,
2228 unsigned long *cprmask
)
2230 ecoff_data_type
*tdata
;
2232 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2233 || bfd_get_format (abfd
) != bfd_object
)
2235 bfd_set_error (bfd_error_invalid_operation
);
2239 tdata
= ecoff_data (abfd
);
2240 tdata
->gprmask
= gprmask
;
2241 tdata
->fprmask
= fprmask
;
2242 if (cprmask
!= NULL
)
2246 for (i
= 0; i
< 3; i
++)
2247 tdata
->cprmask
[i
] = cprmask
[i
];
2253 /* Get ECOFF EXTR information for an external symbol. This function
2254 is passed to bfd_ecoff_debug_externals. */
2257 ecoff_get_extr (asymbol
*sym
, EXTR
*esym
)
2259 ecoff_symbol_type
*ecoff_sym_ptr
;
2262 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2263 || ecoffsymbol (sym
)->native
== NULL
)
2265 /* Don't include debugging, local, or section symbols. */
2266 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2267 || (sym
->flags
& BSF_LOCAL
) != 0
2268 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2272 esym
->cobol_main
= 0;
2273 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2276 /* FIXME: we can do better than this for st and sc. */
2277 esym
->asym
.st
= stGlobal
;
2278 esym
->asym
.sc
= scAbs
;
2279 esym
->asym
.reserved
= 0;
2280 esym
->asym
.index
= indexNil
;
2284 ecoff_sym_ptr
= ecoffsymbol (sym
);
2286 if (ecoff_sym_ptr
->local
)
2289 input_bfd
= bfd_asymbol_bfd (sym
);
2290 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2291 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2293 /* If the symbol was defined by the linker, then esym will be
2294 undefined but sym will not be. Get a better class for such a
2296 if ((esym
->asym
.sc
== scUndefined
2297 || esym
->asym
.sc
== scSUndefined
)
2298 && ! bfd_is_und_section (bfd_get_section (sym
)))
2299 esym
->asym
.sc
= scAbs
;
2301 /* Adjust the FDR index for the symbol by that used for the input
2303 if (esym
->ifd
!= -1)
2305 struct ecoff_debug_info
*input_debug
;
2307 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2308 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2309 if (input_debug
->ifdmap
!= NULL
)
2310 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2316 /* Set the external symbol index. This routine is passed to
2317 bfd_ecoff_debug_externals. */
2320 ecoff_set_index (asymbol
*sym
, bfd_size_type indx
)
2322 ecoff_set_sym_index (sym
, indx
);
2325 /* Write out an ECOFF file. */
2328 _bfd_ecoff_write_object_contents (bfd
*abfd
)
2330 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2331 const bfd_vma round
= backend
->round
;
2332 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2333 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2334 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2335 const bfd_size_type external_hdr_size
2336 = backend
->debug_swap
.external_hdr_size
;
2337 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2338 void (* const adjust_reloc_out
) (bfd
*, const arelent
*, struct internal_reloc
*)
2339 = backend
->adjust_reloc_out
;
2340 void (* const swap_reloc_out
) (bfd
*, const struct internal_reloc
*, void *)
2341 = backend
->swap_reloc_out
;
2342 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2343 HDRR
* const symhdr
= &debug
->symbolic_header
;
2346 bfd_size_type reloc_size
;
2347 bfd_size_type text_size
;
2349 bfd_boolean set_text_start
;
2350 bfd_size_type data_size
;
2352 bfd_boolean set_data_start
;
2353 bfd_size_type bss_size
;
2355 void * reloc_buff
= NULL
;
2356 struct internal_filehdr internal_f
;
2357 struct internal_aouthdr internal_a
;
2360 /* Determine where the sections and relocs will go in the output
2362 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2365 for (current
= abfd
->sections
;
2367 current
= current
->next
)
2369 current
->target_index
= count
;
2373 if ((abfd
->flags
& D_PAGED
) != 0)
2374 text_size
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
2378 set_text_start
= FALSE
;
2381 set_data_start
= FALSE
;
2384 /* Write section headers to the file. */
2386 /* Allocate buff big enough to hold a section header,
2387 file header, or a.out header. */
2396 buff
= bfd_malloc (siz
);
2401 internal_f
.f_nscns
= 0;
2402 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2405 for (current
= abfd
->sections
;
2407 current
= current
->next
)
2409 struct internal_scnhdr section
;
2412 ++internal_f
.f_nscns
;
2414 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2416 /* This seems to be correct for Irix 4 shared libraries. */
2417 vma
= bfd_get_section_vma (abfd
, current
);
2418 if (streq (current
->name
, _LIB
))
2419 section
.s_vaddr
= 0;
2421 section
.s_vaddr
= vma
;
2423 section
.s_paddr
= current
->lma
;
2424 section
.s_size
= current
->size
;
2426 /* If this section is unloadable then the scnptr will be 0. */
2427 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2428 section
.s_scnptr
= 0;
2430 section
.s_scnptr
= current
->filepos
;
2431 section
.s_relptr
= current
->rel_filepos
;
2433 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2434 object file produced by the assembler is supposed to point to
2435 information about how much room is required by objects of
2436 various different sizes. I think this only matters if we
2437 want the linker to compute the best size to use, or
2438 something. I don't know what happens if the information is
2440 if (! streq (current
->name
, _PDATA
))
2441 section
.s_lnnoptr
= 0;
2444 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2445 hold the number of entries in the section (each entry is
2446 8 bytes). We stored this in the line_filepos field in
2447 ecoff_compute_section_file_positions. */
2448 section
.s_lnnoptr
= current
->line_filepos
;
2451 section
.s_nreloc
= current
->reloc_count
;
2452 section
.s_nlnno
= 0;
2453 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2456 if (bfd_coff_swap_scnhdr_out (abfd
, (void *) §ion
, buff
) == 0
2457 || bfd_bwrite (buff
, scnhsz
, abfd
) != scnhsz
)
2460 if ((section
.s_flags
& STYP_TEXT
) != 0
2461 || ((section
.s_flags
& STYP_RDATA
) != 0
2462 && ecoff_data (abfd
)->rdata_in_text
)
2463 || section
.s_flags
== STYP_PDATA
2464 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2465 || (section
.s_flags
& STYP_LIBLIST
) != 0
2466 || (section
.s_flags
& STYP_RELDYN
) != 0
2467 || section
.s_flags
== STYP_CONFLIC
2468 || (section
.s_flags
& STYP_DYNSTR
) != 0
2469 || (section
.s_flags
& STYP_DYNSYM
) != 0
2470 || (section
.s_flags
& STYP_HASH
) != 0
2471 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2472 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2473 || section
.s_flags
== STYP_RCONST
)
2475 text_size
+= current
->size
;
2476 if (! set_text_start
|| text_start
> vma
)
2479 set_text_start
= TRUE
;
2482 else if ((section
.s_flags
& STYP_RDATA
) != 0
2483 || (section
.s_flags
& STYP_DATA
) != 0
2484 || (section
.s_flags
& STYP_LITA
) != 0
2485 || (section
.s_flags
& STYP_LIT8
) != 0
2486 || (section
.s_flags
& STYP_LIT4
) != 0
2487 || (section
.s_flags
& STYP_SDATA
) != 0
2488 || section
.s_flags
== STYP_XDATA
2489 || (section
.s_flags
& STYP_GOT
) != 0)
2491 data_size
+= current
->size
;
2492 if (! set_data_start
|| data_start
> vma
)
2495 set_data_start
= TRUE
;
2498 else if ((section
.s_flags
& STYP_BSS
) != 0
2499 || (section
.s_flags
& STYP_SBSS
) != 0)
2500 bss_size
+= current
->size
;
2501 else if (section
.s_flags
== 0
2502 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2503 || section
.s_flags
== STYP_COMMENT
)
2509 /* Set up the file header. */
2510 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2512 /* We will NOT put a fucking timestamp in the header here. Every
2513 time you put it back, I will come in and take it out again. I'm
2514 sorry. This field does not belong here. We fill it with a 0 so
2515 it compares the same but is not a reasonable time. --
2517 internal_f
.f_timdat
= 0;
2519 if (bfd_get_symcount (abfd
) != 0)
2521 /* The ECOFF f_nsyms field is not actually the number of
2522 symbols, it's the size of symbolic information header. */
2523 internal_f
.f_nsyms
= external_hdr_size
;
2524 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2528 internal_f
.f_nsyms
= 0;
2529 internal_f
.f_symptr
= 0;
2532 internal_f
.f_opthdr
= aoutsz
;
2534 internal_f
.f_flags
= F_LNNO
;
2535 if (reloc_size
== 0)
2536 internal_f
.f_flags
|= F_RELFLG
;
2537 if (bfd_get_symcount (abfd
) == 0)
2538 internal_f
.f_flags
|= F_LSYMS
;
2539 if (abfd
->flags
& EXEC_P
)
2540 internal_f
.f_flags
|= F_EXEC
;
2542 if (bfd_little_endian (abfd
))
2543 internal_f
.f_flags
|= F_AR32WR
;
2545 internal_f
.f_flags
|= F_AR32W
;
2547 /* Set up the ``optional'' header. */
2548 if ((abfd
->flags
& D_PAGED
) != 0)
2549 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2551 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2553 /* FIXME: Is this really correct? */
2554 internal_a
.vstamp
= symhdr
->vstamp
;
2556 /* At least on Ultrix, these have to be rounded to page boundaries.
2557 FIXME: Is this true on other platforms? */
2558 if ((abfd
->flags
& D_PAGED
) != 0)
2560 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2561 internal_a
.text_start
= text_start
&~ (round
- 1);
2562 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2563 internal_a
.data_start
= data_start
&~ (round
- 1);
2567 internal_a
.tsize
= text_size
;
2568 internal_a
.text_start
= text_start
;
2569 internal_a
.dsize
= data_size
;
2570 internal_a
.data_start
= data_start
;
2573 /* On Ultrix, the initial portions of the .sbss and .bss segments
2574 are at the end of the data section. The bsize field in the
2575 optional header records how many bss bytes are required beyond
2576 those in the data section. The value is not rounded to a page
2578 if (bss_size
< internal_a
.dsize
- data_size
)
2581 bss_size
-= internal_a
.dsize
- data_size
;
2582 internal_a
.bsize
= bss_size
;
2583 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2585 internal_a
.entry
= bfd_get_start_address (abfd
);
2587 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2589 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2590 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2591 for (i
= 0; i
< 4; i
++)
2592 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2594 /* Let the backend adjust the headers if necessary. */
2595 if (backend
->adjust_headers
)
2597 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2601 /* Write out the file header and the optional header. */
2602 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2605 bfd_coff_swap_filehdr_out (abfd
, (void *) &internal_f
, buff
);
2606 if (bfd_bwrite (buff
, filhsz
, abfd
) != filhsz
)
2609 bfd_coff_swap_aouthdr_out (abfd
, (void *) &internal_a
, buff
);
2610 if (bfd_bwrite (buff
, aoutsz
, abfd
) != aoutsz
)
2613 /* Build the external symbol information. This must be done before
2614 writing out the relocs so that we know the symbol indices. We
2615 don't do this if this BFD was created by the backend linker,
2616 since it will have already handled the symbols and relocs. */
2617 if (! ecoff_data (abfd
)->linker
)
2619 symhdr
->iextMax
= 0;
2620 symhdr
->issExtMax
= 0;
2621 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2622 debug
->ssext
= debug
->ssext_end
= NULL
;
2623 if (! bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2624 (abfd
->flags
& EXEC_P
) == 0,
2625 ecoff_get_extr
, ecoff_set_index
))
2628 /* Write out the relocs. */
2629 for (current
= abfd
->sections
;
2631 current
= current
->next
)
2633 arelent
**reloc_ptr_ptr
;
2634 arelent
**reloc_end
;
2638 if (current
->reloc_count
== 0)
2641 amt
= current
->reloc_count
* external_reloc_size
;
2642 reloc_buff
= bfd_alloc (abfd
, amt
);
2643 if (reloc_buff
== NULL
)
2646 reloc_ptr_ptr
= current
->orelocation
;
2647 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2648 out_ptr
= (char *) reloc_buff
;
2651 reloc_ptr_ptr
< reloc_end
;
2652 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2656 struct internal_reloc in
;
2658 memset ((void *) &in
, 0, sizeof in
);
2660 reloc
= *reloc_ptr_ptr
;
2661 sym
= *reloc
->sym_ptr_ptr
;
2663 /* If the howto field has not been initialised then skip this reloc.
2664 This assumes that an error message has been issued elsewhere. */
2665 if (reloc
->howto
== NULL
)
2668 in
.r_vaddr
= (reloc
->address
2669 + bfd_get_section_vma (abfd
, current
));
2670 in
.r_type
= reloc
->howto
->type
;
2672 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2674 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2688 { _TEXT
, RELOC_SECTION_TEXT
},
2689 { _RDATA
, RELOC_SECTION_RDATA
},
2690 { _DATA
, RELOC_SECTION_DATA
},
2691 { _SDATA
, RELOC_SECTION_SDATA
},
2692 { _SBSS
, RELOC_SECTION_SBSS
},
2693 { _BSS
, RELOC_SECTION_BSS
},
2694 { _INIT
, RELOC_SECTION_INIT
},
2695 { _LIT8
, RELOC_SECTION_LIT8
},
2696 { _LIT4
, RELOC_SECTION_LIT4
},
2697 { _XDATA
, RELOC_SECTION_XDATA
},
2698 { _PDATA
, RELOC_SECTION_PDATA
},
2699 { _FINI
, RELOC_SECTION_FINI
},
2700 { _LITA
, RELOC_SECTION_LITA
},
2701 { "*ABS*", RELOC_SECTION_ABS
},
2702 { _RCONST
, RELOC_SECTION_RCONST
}
2705 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2707 for (j
= 0; j
< ARRAY_SIZE (section_symndx
); j
++)
2708 if (streq (name
, section_symndx
[j
].name
))
2710 in
.r_symndx
= section_symndx
[j
].r_symndx
;
2714 if (j
== ARRAY_SIZE (section_symndx
))
2719 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2721 (*swap_reloc_out
) (abfd
, &in
, (void *) out_ptr
);
2724 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2726 amt
= current
->reloc_count
* external_reloc_size
;
2727 if (bfd_bwrite (reloc_buff
, amt
, abfd
) != amt
)
2729 bfd_release (abfd
, reloc_buff
);
2733 /* Write out the symbolic debugging information. */
2734 if (bfd_get_symcount (abfd
) > 0)
2736 /* Write out the debugging information. */
2737 if (! bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2738 ecoff_data (abfd
)->sym_filepos
))
2743 /* The .bss section of a demand paged executable must receive an
2744 entire page. If there are symbols, the symbols will start on the
2745 next page. If there are no symbols, we must fill out the page by
2747 if (bfd_get_symcount (abfd
) == 0
2748 && (abfd
->flags
& EXEC_P
) != 0
2749 && (abfd
->flags
& D_PAGED
) != 0)
2753 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2756 if (bfd_bread (&c
, (bfd_size_type
) 1, abfd
) == 0)
2758 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2761 if (bfd_bwrite (&c
, (bfd_size_type
) 1, abfd
) != 1)
2765 if (reloc_buff
!= NULL
)
2766 bfd_release (abfd
, reloc_buff
);
2771 if (reloc_buff
!= NULL
)
2772 bfd_release (abfd
, reloc_buff
);
2778 /* Archive handling. ECOFF uses what appears to be a unique type of
2779 archive header (armap). The byte ordering of the armap and the
2780 contents are encoded in the name of the armap itself. At least for
2781 now, we only support archives with the same byte ordering in the
2782 armap and the contents.
2784 The first four bytes in the armap are the number of symbol
2785 definitions. This is always a power of two.
2787 This is followed by the symbol definitions. Each symbol definition
2788 occupies 8 bytes. The first four bytes are the offset from the
2789 start of the armap strings to the null-terminated string naming
2790 this symbol. The second four bytes are the file offset to the
2791 archive member which defines this symbol. If the second four bytes
2792 are 0, then this is not actually a symbol definition, and it should
2795 The symbols are hashed into the armap with a closed hashing scheme.
2796 See the functions below for the details of the algorithm.
2798 After the symbol definitions comes four bytes holding the size of
2799 the string table, followed by the string table itself. */
2801 /* The name of an archive headers looks like this:
2802 __________E[BL]E[BL]_ (with a trailing space).
2803 The trailing space is changed to an X if the archive is changed to
2804 indicate that the armap is out of date.
2806 The Alpha seems to use ________64E[BL]E[BL]_. */
2808 #define ARMAP_BIG_ENDIAN 'B'
2809 #define ARMAP_LITTLE_ENDIAN 'L'
2810 #define ARMAP_MARKER 'E'
2811 #define ARMAP_START_LENGTH 10
2812 #define ARMAP_HEADER_MARKER_INDEX 10
2813 #define ARMAP_HEADER_ENDIAN_INDEX 11
2814 #define ARMAP_OBJECT_MARKER_INDEX 12
2815 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2816 #define ARMAP_END_INDEX 14
2817 #define ARMAP_END "_ "
2819 /* This is a magic number used in the hashing algorithm. */
2820 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2822 /* This returns the hash value to use for a string. It also sets
2823 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2824 is the number of entries in the hash table, and HLOG is the log
2828 ecoff_armap_hash (const char *s
,
2829 unsigned int *rehash
,
2839 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2840 hash
*= ARMAP_HASH_MAGIC
;
2841 *rehash
= (hash
& (size
- 1)) | 1;
2842 return hash
>> (32 - hlog
);
2845 /* Read in the armap. */
2848 _bfd_ecoff_slurp_armap (bfd
*abfd
)
2852 struct areltdata
*mapdata
;
2853 bfd_size_type parsed_size
;
2855 struct artdata
*ardata
;
2858 struct symdef
*symdef_ptr
;
2862 /* Get the name of the first element. */
2863 i
= bfd_bread ((void *) nextname
, (bfd_size_type
) 16, abfd
);
2869 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2872 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2873 standard COFF armap. We could move the ECOFF armap stuff into
2874 bfd_slurp_armap, but that seems inappropriate since no other
2875 target uses this format. Instead, we check directly for a COFF
2877 if (CONST_STRNEQ (nextname
, "/ "))
2878 return bfd_slurp_armap (abfd
);
2880 /* See if the first element is an armap. */
2881 if (! strneq (nextname
, ecoff_backend (abfd
)->armap_start
, ARMAP_START_LENGTH
)
2882 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
2883 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2884 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2885 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
2886 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2887 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2888 || ! strneq (nextname
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1))
2890 bfd_has_map (abfd
) = FALSE
;
2894 /* Make sure we have the right byte ordering. */
2895 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2896 ^ (bfd_header_big_endian (abfd
)))
2897 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2898 ^ (bfd_big_endian (abfd
))))
2900 bfd_set_error (bfd_error_wrong_format
);
2904 /* Read in the armap. */
2905 ardata
= bfd_ardata (abfd
);
2906 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
2907 if (mapdata
== NULL
)
2909 parsed_size
= mapdata
->parsed_size
;
2910 bfd_release (abfd
, (void *) mapdata
);
2912 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
2913 if (raw_armap
== NULL
)
2916 if (bfd_bread ((void *) raw_armap
, parsed_size
, abfd
) != parsed_size
)
2918 if (bfd_get_error () != bfd_error_system_call
)
2919 bfd_set_error (bfd_error_malformed_archive
);
2920 bfd_release (abfd
, (void *) raw_armap
);
2924 ardata
->tdata
= (void *) raw_armap
;
2926 count
= H_GET_32 (abfd
, raw_armap
);
2928 ardata
->symdef_count
= 0;
2929 ardata
->cache
= NULL
;
2931 /* This code used to overlay the symdefs over the raw archive data,
2932 but that doesn't work on a 64 bit host. */
2933 stringbase
= raw_armap
+ count
* 8 + 8;
2935 #ifdef CHECK_ARMAP_HASH
2939 /* Double check that I have the hashing algorithm right by making
2940 sure that every symbol can be looked up successfully. */
2942 for (i
= 1; i
< count
; i
<<= 1)
2944 BFD_ASSERT (i
== count
);
2946 raw_ptr
= raw_armap
+ 4;
2947 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2949 unsigned int name_offset
, file_offset
;
2950 unsigned int hash
, rehash
, srch
;
2952 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2953 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2954 if (file_offset
== 0)
2956 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
2961 /* See if we can rehash to this location. */
2962 for (srch
= (hash
+ rehash
) & (count
- 1);
2963 srch
!= hash
&& srch
!= i
;
2964 srch
= (srch
+ rehash
) & (count
- 1))
2965 BFD_ASSERT (H_GET_32 (abfd
, (raw_armap
+ 8 + srch
* 8)) != 0);
2966 BFD_ASSERT (srch
== i
);
2970 #endif /* CHECK_ARMAP_HASH */
2972 raw_ptr
= raw_armap
+ 4;
2973 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2974 if (H_GET_32 (abfd
, (raw_ptr
+ 4)) != 0)
2975 ++ardata
->symdef_count
;
2977 amt
= ardata
->symdef_count
;
2978 amt
*= sizeof (struct symdef
);
2979 symdef_ptr
= (struct symdef
*) bfd_alloc (abfd
, amt
);
2983 ardata
->symdefs
= (carsym
*) symdef_ptr
;
2985 raw_ptr
= raw_armap
+ 4;
2986 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2988 unsigned int name_offset
, file_offset
;
2990 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2991 if (file_offset
== 0)
2993 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2994 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
2995 symdef_ptr
->file_offset
= file_offset
;
2999 ardata
->first_file_filepos
= bfd_tell (abfd
);
3000 /* Pad to an even boundary. */
3001 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3003 bfd_has_map (abfd
) = TRUE
;
3008 /* Write out an armap. */
3011 _bfd_ecoff_write_armap (bfd
*abfd
,
3012 unsigned int elength
,
3014 unsigned int orl_count
,
3017 unsigned int hashsize
, hashlog
;
3018 bfd_size_type symdefsize
;
3020 unsigned int stringsize
;
3021 unsigned int mapsize
;
3024 struct stat statbuf
;
3027 bfd_byte
*hashtable
;
3031 /* Ultrix appears to use as a hash table size the least power of two
3032 greater than twice the number of entries. */
3033 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3035 hashsize
= 1 << hashlog
;
3037 symdefsize
= hashsize
* 8;
3039 stringsize
= stridx
+ padit
;
3041 /* Include 8 bytes to store symdefsize and stringsize in output. */
3042 mapsize
= symdefsize
+ stringsize
+ 8;
3044 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3046 memset ((void *) &hdr
, 0, sizeof hdr
);
3048 /* Work out the ECOFF armap name. */
3049 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3050 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3051 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3052 (bfd_header_big_endian (abfd
)
3054 : ARMAP_LITTLE_ENDIAN
);
3055 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3056 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3057 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3058 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3060 /* Write the timestamp of the archive header to be just a little bit
3061 later than the timestamp of the file, otherwise the linker will
3062 complain that the index is out of date. Actually, the Ultrix
3063 linker just checks the archive name; the GNU linker may check the
3065 stat (abfd
->filename
, &statbuf
);
3066 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3068 /* The DECstation uses zeroes for the uid, gid and mode of the
3070 hdr
.ar_uid
[0] = '0';
3071 hdr
.ar_gid
[0] = '0';
3072 /* Building gcc ends up extracting the armap as a file - twice. */
3073 hdr
.ar_mode
[0] = '6';
3074 hdr
.ar_mode
[1] = '4';
3075 hdr
.ar_mode
[2] = '4';
3077 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3079 hdr
.ar_fmag
[0] = '`';
3080 hdr
.ar_fmag
[1] = '\012';
3082 /* Turn all null bytes in the header into spaces. */
3083 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3084 if (((char *) (&hdr
))[i
] == '\0')
3085 (((char *) (&hdr
))[i
]) = ' ';
3087 if (bfd_bwrite ((void *) &hdr
, (bfd_size_type
) sizeof (struct ar_hdr
), abfd
)
3088 != sizeof (struct ar_hdr
))
3091 H_PUT_32 (abfd
, hashsize
, temp
);
3092 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3095 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3099 current
= abfd
->archive_head
;
3101 for (i
= 0; i
< orl_count
; i
++)
3103 unsigned int hash
, rehash
= 0;
3105 /* Advance firstreal to the file position of this archive
3107 if (map
[i
].u
.abfd
!= last_elt
)
3111 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3112 firstreal
+= firstreal
% 2;
3113 current
= current
->archive_next
;
3115 while (current
!= map
[i
].u
.abfd
);
3120 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3121 if (H_GET_32 (abfd
, (hashtable
+ (hash
* 8) + 4)) != 0)
3125 /* The desired slot is already taken. */
3126 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3128 srch
= (srch
+ rehash
) & (hashsize
- 1))
3129 if (H_GET_32 (abfd
, (hashtable
+ (srch
* 8) + 4)) == 0)
3132 BFD_ASSERT (srch
!= hash
);
3137 H_PUT_32 (abfd
, map
[i
].namidx
, (hashtable
+ hash
* 8));
3138 H_PUT_32 (abfd
, firstreal
, (hashtable
+ hash
* 8 + 4));
3141 if (bfd_bwrite ((void *) hashtable
, symdefsize
, abfd
) != symdefsize
)
3144 bfd_release (abfd
, hashtable
);
3146 /* Now write the strings. */
3147 H_PUT_32 (abfd
, stringsize
, temp
);
3148 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3150 for (i
= 0; i
< orl_count
; i
++)
3154 len
= strlen (*map
[i
].name
) + 1;
3155 if (bfd_bwrite ((void *) (*map
[i
].name
), len
, abfd
) != len
)
3159 /* The spec sez this should be a newline. But in order to be
3160 bug-compatible for DECstation ar we use a null. */
3163 if (bfd_bwrite ("", (bfd_size_type
) 1, abfd
) != 1)
3170 /* ECOFF linker code. */
3172 /* Routine to create an entry in an ECOFF link hash table. */
3174 static struct bfd_hash_entry
*
3175 ecoff_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3176 struct bfd_hash_table
*table
,
3179 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3181 /* Allocate the structure if it has not already been allocated by a
3184 ret
= ((struct ecoff_link_hash_entry
*)
3185 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3189 /* Call the allocation method of the superclass. */
3190 ret
= ((struct ecoff_link_hash_entry
*)
3191 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3196 /* Set local fields. */
3202 memset ((void *) &ret
->esym
, 0, sizeof ret
->esym
);
3204 return (struct bfd_hash_entry
*) ret
;
3207 /* Create an ECOFF link hash table. */
3209 struct bfd_link_hash_table
*
3210 _bfd_ecoff_bfd_link_hash_table_create (bfd
*abfd
)
3212 struct ecoff_link_hash_table
*ret
;
3213 bfd_size_type amt
= sizeof (struct ecoff_link_hash_table
);
3215 ret
= (struct ecoff_link_hash_table
*) bfd_malloc (amt
);
3218 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
3219 ecoff_link_hash_newfunc
,
3220 sizeof (struct ecoff_link_hash_entry
)))
3228 /* Look up an entry in an ECOFF link hash table. */
3230 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3231 ((struct ecoff_link_hash_entry *) \
3232 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3234 /* Traverse an ECOFF link hash table. */
3236 #define ecoff_link_hash_traverse(table, func, info) \
3237 (bfd_link_hash_traverse \
3239 (bfd_boolean (*) (struct bfd_link_hash_entry *, void *)) (func), \
3242 /* Get the ECOFF link hash table from the info structure. This is
3245 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3247 /* Add the external symbols of an object file to the global linker
3248 hash table. The external symbols and strings we are passed are
3249 just allocated on the stack, and will be discarded. We must
3250 explicitly save any information we may need later on in the link.
3251 We do not want to read the external symbol information again. */
3254 ecoff_link_add_externals (bfd
*abfd
,
3255 struct bfd_link_info
*info
,
3256 void * external_ext
,
3259 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3260 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
3261 = backend
->debug_swap
.swap_ext_in
;
3262 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3263 unsigned long ext_count
;
3264 struct bfd_link_hash_entry
**sym_hash
;
3269 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3272 amt
*= sizeof (struct bfd_link_hash_entry
*);
3273 sym_hash
= (struct bfd_link_hash_entry
**) bfd_alloc (abfd
, amt
);
3276 ecoff_data (abfd
)->sym_hashes
= (struct ecoff_link_hash_entry
**) sym_hash
;
3278 ext_ptr
= (char *) external_ext
;
3279 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3280 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3287 struct ecoff_link_hash_entry
*h
;
3291 (*swap_ext_in
) (abfd
, (void *) ext_ptr
, &esym
);
3293 /* Skip debugging symbols. */
3295 switch (esym
.asym
.st
)
3311 /* Get the information for this symbol. */
3312 value
= esym
.asym
.value
;
3313 switch (esym
.asym
.sc
)
3333 section
= bfd_make_section_old_way (abfd
, _TEXT
);
3334 value
-= section
->vma
;
3337 section
= bfd_make_section_old_way (abfd
, _DATA
);
3338 value
-= section
->vma
;
3341 section
= bfd_make_section_old_way (abfd
, _BSS
);
3342 value
-= section
->vma
;
3345 section
= bfd_abs_section_ptr
;
3348 section
= bfd_und_section_ptr
;
3351 section
= bfd_make_section_old_way (abfd
, _SDATA
);
3352 value
-= section
->vma
;
3355 section
= bfd_make_section_old_way (abfd
, _SBSS
);
3356 value
-= section
->vma
;
3359 section
= bfd_make_section_old_way (abfd
, _RDATA
);
3360 value
-= section
->vma
;
3363 if (value
> ecoff_data (abfd
)->gp_size
)
3365 section
= bfd_com_section_ptr
;
3370 if (ecoff_scom_section
.name
== NULL
)
3372 /* Initialize the small common section. */
3373 ecoff_scom_section
.name
= SCOMMON
;
3374 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3375 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3376 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3377 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3378 ecoff_scom_symbol
.name
= SCOMMON
;
3379 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3380 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3381 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3383 section
= &ecoff_scom_section
;
3386 section
= bfd_und_section_ptr
;
3389 section
= bfd_make_section_old_way (abfd
, _INIT
);
3390 value
-= section
->vma
;
3393 section
= bfd_make_section_old_way (abfd
, _FINI
);
3394 value
-= section
->vma
;
3397 section
= bfd_make_section_old_way (abfd
, _RCONST
);
3398 value
-= section
->vma
;
3402 if (section
== NULL
)
3405 name
= ssext
+ esym
.asym
.iss
;
3407 if (! (_bfd_generic_link_add_one_symbol
3409 (flagword
) (esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
),
3410 section
, value
, NULL
, TRUE
, TRUE
, sym_hash
)))
3413 h
= (struct ecoff_link_hash_entry
*) *sym_hash
;
3415 /* If we are building an ECOFF hash table, save the external
3416 symbol information. */
3417 if (bfd_get_flavour (info
->output_bfd
) == bfd_get_flavour (abfd
))
3420 || (! bfd_is_und_section (section
)
3421 && (! bfd_is_com_section (section
)
3422 || (h
->root
.type
!= bfd_link_hash_defined
3423 && h
->root
.type
!= bfd_link_hash_defweak
))))
3429 /* Remember whether this symbol was small undefined. */
3430 if (esym
.asym
.sc
== scSUndefined
)
3433 /* If this symbol was ever small undefined, it needs to wind
3434 up in a GP relative section. We can't control the
3435 section of a defined symbol, but we can control the
3436 section of a common symbol. This case is actually needed
3437 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3439 && h
->root
.type
== bfd_link_hash_common
3440 && streq (h
->root
.u
.c
.p
->section
->name
, SCOMMON
))
3442 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
3444 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
3445 if (h
->esym
.asym
.sc
== scCommon
)
3446 h
->esym
.asym
.sc
= scSCommon
;
3454 /* Add symbols from an ECOFF object file to the global linker hash
3458 ecoff_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3461 bfd_size_type external_ext_size
;
3462 void * external_ext
= NULL
;
3463 bfd_size_type esize
;
3467 if (! ecoff_slurp_symbolic_header (abfd
))
3470 /* If there are no symbols, we don't want it. */
3471 if (bfd_get_symcount (abfd
) == 0)
3474 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3476 /* Read in the external symbols and external strings. */
3477 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3478 esize
= symhdr
->iextMax
* external_ext_size
;
3479 external_ext
= bfd_malloc (esize
);
3480 if (external_ext
== NULL
&& esize
!= 0)
3483 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3484 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3487 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3488 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3491 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3492 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3493 != (bfd_size_type
) symhdr
->issExtMax
))
3496 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3500 if (external_ext
!= NULL
)
3501 free (external_ext
);
3507 if (external_ext
!= NULL
)
3508 free (external_ext
);
3512 /* This is called if we used _bfd_generic_link_add_archive_symbols
3513 because we were not dealing with an ECOFF archive. */
3516 ecoff_link_check_archive_element (bfd
*abfd
,
3517 struct bfd_link_info
*info
,
3518 bfd_boolean
*pneeded
)
3520 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3521 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
3522 = backend
->debug_swap
.swap_ext_in
;
3524 bfd_size_type external_ext_size
;
3525 void * external_ext
= NULL
;
3526 bfd_size_type esize
;
3533 if (! ecoff_slurp_symbolic_header (abfd
))
3536 /* If there are no symbols, we don't want it. */
3537 if (bfd_get_symcount (abfd
) == 0)
3538 goto successful_return
;
3540 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3542 /* Read in the external symbols and external strings. */
3543 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3544 esize
= symhdr
->iextMax
* external_ext_size
;
3545 external_ext
= bfd_malloc (esize
);
3546 if (external_ext
== NULL
&& esize
!= 0)
3549 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3550 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3553 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3554 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3557 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3558 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3559 != (bfd_size_type
) symhdr
->issExtMax
))
3562 /* Look through the external symbols to see if they define some
3563 symbol that is currently undefined. */
3564 ext_ptr
= (char *) external_ext
;
3565 ext_end
= ext_ptr
+ esize
;
3566 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3571 struct bfd_link_hash_entry
*h
;
3573 (*swap_ext_in
) (abfd
, (void *) ext_ptr
, &esym
);
3575 /* See if this symbol defines something. */
3576 if (esym
.asym
.st
!= stGlobal
3577 && esym
.asym
.st
!= stLabel
3578 && esym
.asym
.st
!= stProc
)
3581 switch (esym
.asym
.sc
)
3605 name
= ssext
+ esym
.asym
.iss
;
3606 h
= bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
3608 /* Unlike the generic linker, we do not pull in elements because
3609 of common symbols. */
3611 || h
->type
!= bfd_link_hash_undefined
)
3614 /* Include this element. */
3615 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3617 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3621 goto successful_return
;
3625 if (external_ext
!= NULL
)
3626 free (external_ext
);
3631 if (external_ext
!= NULL
)
3632 free (external_ext
);
3638 /* Add the symbols from an archive file to the global hash table.
3639 This looks through the undefined symbols, looks each one up in the
3640 archive hash table, and adds any associated object file. We do not
3641 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3642 already have a hash table, so there is no reason to construct
3646 ecoff_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3648 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3649 const bfd_byte
*raw_armap
;
3650 struct bfd_link_hash_entry
**pundef
;
3651 unsigned int armap_count
;
3652 unsigned int armap_log
;
3654 const bfd_byte
*hashtable
;
3655 const char *stringbase
;
3657 if (! bfd_has_map (abfd
))
3659 /* An empty archive is a special case. */
3660 if (bfd_openr_next_archived_file (abfd
, NULL
) == NULL
)
3662 bfd_set_error (bfd_error_no_armap
);
3666 /* If we don't have any raw data for this archive, as can happen on
3667 Irix 4.0.5F, we call the generic routine.
3668 FIXME: We should be more clever about this, since someday tdata
3669 may get to something for a generic archive. */
3670 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3671 if (raw_armap
== NULL
)
3672 return (_bfd_generic_link_add_archive_symbols
3673 (abfd
, info
, ecoff_link_check_archive_element
));
3675 armap_count
= H_GET_32 (abfd
, raw_armap
);
3678 for (i
= 1; i
< armap_count
; i
<<= 1)
3680 BFD_ASSERT (i
== armap_count
);
3682 hashtable
= raw_armap
+ 4;
3683 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3685 /* Look through the list of undefined symbols. */
3686 pundef
= &info
->hash
->undefs
;
3687 while (*pundef
!= NULL
)
3689 struct bfd_link_hash_entry
*h
;
3690 unsigned int hash
, rehash
= 0;
3691 unsigned int file_offset
;
3697 /* When a symbol is defined, it is not necessarily removed from
3699 if (h
->type
!= bfd_link_hash_undefined
3700 && h
->type
!= bfd_link_hash_common
)
3702 /* Remove this entry from the list, for general cleanliness
3703 and because we are going to look through the list again
3704 if we search any more libraries. We can't remove the
3705 entry if it is the tail, because that would lose any
3706 entries we add to the list later on. */
3707 if (*pundef
!= info
->hash
->undefs_tail
)
3708 *pundef
= (*pundef
)->u
.undef
.next
;
3710 pundef
= &(*pundef
)->u
.undef
.next
;
3714 /* Native ECOFF linkers do not pull in archive elements merely
3715 to satisfy common definitions, so neither do we. We leave
3716 them on the list, though, in case we are linking against some
3717 other object format. */
3718 if (h
->type
!= bfd_link_hash_undefined
)
3720 pundef
= &(*pundef
)->u
.undef
.next
;
3724 /* Look for this symbol in the archive hash table. */
3725 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3728 file_offset
= H_GET_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3729 if (file_offset
== 0)
3731 /* Nothing in this slot. */
3732 pundef
= &(*pundef
)->u
.undef
.next
;
3736 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (hash
* 8));
3737 if (name
[0] != h
->root
.string
[0]
3738 || ! streq (name
, h
->root
.string
))
3743 /* That was the wrong symbol. Try rehashing. */
3745 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3747 srch
= (srch
+ rehash
) & (armap_count
- 1))
3749 file_offset
= H_GET_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3750 if (file_offset
== 0)
3752 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (srch
* 8));
3753 if (name
[0] == h
->root
.string
[0]
3754 && streq (name
, h
->root
.string
))
3763 pundef
= &(*pundef
)->u
.undef
.next
;
3770 element
= (*backend
->get_elt_at_filepos
) (abfd
, (file_ptr
) file_offset
);
3771 if (element
== NULL
)
3774 if (! bfd_check_format (element
, bfd_object
))
3777 /* Unlike the generic linker, we know that this element provides
3778 a definition for an undefined symbol and we know that we want
3779 to include it. We don't need to check anything. */
3780 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3782 if (! ecoff_link_add_object_symbols (element
, info
))
3785 pundef
= &(*pundef
)->u
.undef
.next
;
3791 /* Given an ECOFF BFD, add symbols to the global hash table as
3795 _bfd_ecoff_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3797 switch (bfd_get_format (abfd
))
3800 return ecoff_link_add_object_symbols (abfd
, info
);
3802 return ecoff_link_add_archive_symbols (abfd
, info
);
3804 bfd_set_error (bfd_error_wrong_format
);
3810 /* ECOFF final link routines. */
3812 /* Structure used to pass information to ecoff_link_write_external. */
3817 struct bfd_link_info
*info
;
3820 /* Accumulate the debugging information for an input BFD into the
3821 output BFD. This must read in the symbolic information of the
3825 ecoff_final_link_debug_accumulate (bfd
*output_bfd
,
3827 struct bfd_link_info
*info
,
3830 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
3831 const struct ecoff_debug_swap
* const swap
=
3832 &ecoff_backend (input_bfd
)->debug_swap
;
3833 HDRR
*symhdr
= &debug
->symbolic_header
;
3836 #define READ(ptr, offset, count, size, type) \
3837 if (symhdr->count == 0) \
3838 debug->ptr = NULL; \
3841 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
3842 debug->ptr = (type) bfd_malloc (amt); \
3843 if (debug->ptr == NULL) \
3846 goto return_something; \
3848 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
3849 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
3852 goto return_something; \
3856 /* If raw_syments is not NULL, then the data was already by read by
3857 _bfd_ecoff_slurp_symbolic_info. */
3858 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3860 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
3862 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, void *);
3863 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, void *);
3864 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, void *);
3865 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, void *);
3866 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
3868 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
3869 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, void *);
3870 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, void *);
3874 /* We do not read the external strings or the external symbols. */
3876 ret
= (bfd_ecoff_debug_accumulate
3877 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
3878 &ecoff_backend (output_bfd
)->debug_swap
,
3879 input_bfd
, debug
, swap
, info
));
3882 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3884 if (debug
->line
!= NULL
)
3886 if (debug
->external_dnr
!= NULL
)
3887 free (debug
->external_dnr
);
3888 if (debug
->external_pdr
!= NULL
)
3889 free (debug
->external_pdr
);
3890 if (debug
->external_sym
!= NULL
)
3891 free (debug
->external_sym
);
3892 if (debug
->external_opt
!= NULL
)
3893 free (debug
->external_opt
);
3894 if (debug
->external_aux
!= NULL
)
3895 free (debug
->external_aux
);
3896 if (debug
->ss
!= NULL
)
3898 if (debug
->external_fdr
!= NULL
)
3899 free (debug
->external_fdr
);
3900 if (debug
->external_rfd
!= NULL
)
3901 free (debug
->external_rfd
);
3903 /* Make sure we don't accidentally follow one of these pointers
3904 into freed memory. */
3906 debug
->external_dnr
= NULL
;
3907 debug
->external_pdr
= NULL
;
3908 debug
->external_sym
= NULL
;
3909 debug
->external_opt
= NULL
;
3910 debug
->external_aux
= NULL
;
3912 debug
->external_fdr
= NULL
;
3913 debug
->external_rfd
= NULL
;
3919 /* Relocate and write an ECOFF section into an ECOFF output file. */
3922 ecoff_indirect_link_order (bfd
*output_bfd
,
3923 struct bfd_link_info
*info
,
3924 asection
*output_section
,
3925 struct bfd_link_order
*link_order
)
3927 asection
*input_section
;
3929 bfd_byte
*contents
= NULL
;
3930 bfd_size_type external_reloc_size
;
3931 bfd_size_type external_relocs_size
;
3932 void * external_relocs
= NULL
;
3934 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
3936 input_section
= link_order
->u
.indirect
.section
;
3937 input_bfd
= input_section
->owner
;
3938 if (input_section
->size
== 0)
3941 BFD_ASSERT (input_section
->output_section
== output_section
);
3942 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
3943 BFD_ASSERT (input_section
->size
== link_order
->size
);
3945 /* Get the section contents. */
3946 if (!bfd_malloc_and_get_section (input_bfd
, input_section
, &contents
))
3949 /* Get the relocs. If we are relaxing MIPS code, they will already
3950 have been read in. Otherwise, we read them in now. */
3951 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
3952 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
3954 external_relocs
= bfd_malloc (external_relocs_size
);
3955 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
3958 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
3959 || (bfd_bread (external_relocs
, external_relocs_size
, input_bfd
)
3960 != external_relocs_size
))
3963 /* Relocate the section contents. */
3964 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
3965 (output_bfd
, info
, input_bfd
, input_section
, contents
,
3969 /* Write out the relocated section. */
3970 if (! bfd_set_section_contents (output_bfd
,
3973 input_section
->output_offset
,
3974 input_section
->size
))
3977 /* If we are producing relocatable output, the relocs were
3978 modified, and we write them out now. We use the reloc_count
3979 field of output_section to keep track of the number of relocs we
3980 have output so far. */
3981 if (info
->relocatable
)
3983 file_ptr pos
= (output_section
->rel_filepos
3984 + output_section
->reloc_count
* external_reloc_size
);
3985 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
3986 || (bfd_bwrite (external_relocs
, external_relocs_size
, output_bfd
)
3987 != external_relocs_size
))
3989 output_section
->reloc_count
+= input_section
->reloc_count
;
3992 if (contents
!= NULL
)
3994 if (external_relocs
!= NULL
)
3995 free (external_relocs
);
3999 if (contents
!= NULL
)
4001 if (external_relocs
!= NULL
)
4002 free (external_relocs
);
4006 /* Generate a reloc when linking an ECOFF file. This is a reloc
4007 requested by the linker, and does come from any input file. This
4008 is used to build constructor and destructor tables when linking
4012 ecoff_reloc_link_order (bfd
*output_bfd
,
4013 struct bfd_link_info
*info
,
4014 asection
*output_section
,
4015 struct bfd_link_order
*link_order
)
4017 enum bfd_link_order_type type
;
4021 struct internal_reloc in
;
4022 bfd_size_type external_reloc_size
;
4027 type
= link_order
->type
;
4029 addend
= link_order
->u
.reloc
.p
->addend
;
4031 /* We set up an arelent to pass to the backend adjust_reloc_out
4033 rel
.address
= link_order
->offset
;
4035 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4038 bfd_set_error (bfd_error_bad_value
);
4042 if (type
== bfd_section_reloc_link_order
)
4044 section
= link_order
->u
.reloc
.p
->u
.section
;
4045 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4049 struct bfd_link_hash_entry
*h
;
4051 /* Treat a reloc against a defined symbol as though it were
4052 actually against the section. */
4053 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4054 link_order
->u
.reloc
.p
->u
.name
,
4055 FALSE
, FALSE
, FALSE
);
4057 && (h
->type
== bfd_link_hash_defined
4058 || h
->type
== bfd_link_hash_defweak
))
4060 type
= bfd_section_reloc_link_order
;
4061 section
= h
->u
.def
.section
->output_section
;
4062 /* It seems that we ought to add the symbol value to the
4063 addend here, but in practice it has already been added
4064 because it was passed to constructor_callback. */
4065 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4069 /* We can't set up a reloc against a symbol correctly,
4070 because we have no asymbol structure. Currently no
4071 adjust_reloc_out routine cares. */
4072 rel
.sym_ptr_ptr
= NULL
;
4076 /* All ECOFF relocs are in-place. Put the addend into the object
4079 BFD_ASSERT (rel
.howto
->partial_inplace
);
4083 bfd_reloc_status_type rstat
;
4086 size
= bfd_get_reloc_size (rel
.howto
);
4087 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4090 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
,
4091 (bfd_vma
) addend
, buf
);
4097 case bfd_reloc_outofrange
:
4099 case bfd_reloc_overflow
:
4100 if (! ((*info
->callbacks
->reloc_overflow
)
4102 (link_order
->type
== bfd_section_reloc_link_order
4103 ? bfd_section_name (output_bfd
, section
)
4104 : link_order
->u
.reloc
.p
->u
.name
),
4105 rel
.howto
->name
, addend
, NULL
,
4106 NULL
, (bfd_vma
) 0)))
4113 ok
= bfd_set_section_contents (output_bfd
, output_section
, (void *) buf
,
4114 (file_ptr
) link_order
->offset
, size
);
4122 /* Move the information into an internal_reloc structure. */
4123 in
.r_vaddr
= (rel
.address
4124 + bfd_get_section_vma (output_bfd
, output_section
));
4125 in
.r_type
= rel
.howto
->type
;
4127 if (type
== bfd_symbol_reloc_link_order
)
4129 struct ecoff_link_hash_entry
*h
;
4131 h
= ((struct ecoff_link_hash_entry
*)
4132 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4133 link_order
->u
.reloc
.p
->u
.name
,
4134 FALSE
, FALSE
, TRUE
));
4137 in
.r_symndx
= h
->indx
;
4140 if (! ((*info
->callbacks
->unattached_reloc
)
4141 (info
, link_order
->u
.reloc
.p
->u
.name
, NULL
,
4142 NULL
, (bfd_vma
) 0)))
4159 { _TEXT
, RELOC_SECTION_TEXT
},
4160 { _RDATA
, RELOC_SECTION_RDATA
},
4161 { _DATA
, RELOC_SECTION_DATA
},
4162 { _SDATA
, RELOC_SECTION_SDATA
},
4163 { _SBSS
, RELOC_SECTION_SBSS
},
4164 { _BSS
, RELOC_SECTION_BSS
},
4165 { _INIT
, RELOC_SECTION_INIT
},
4166 { _LIT8
, RELOC_SECTION_LIT8
},
4167 { _LIT4
, RELOC_SECTION_LIT4
},
4168 { _XDATA
, RELOC_SECTION_XDATA
},
4169 { _PDATA
, RELOC_SECTION_PDATA
},
4170 { _FINI
, RELOC_SECTION_FINI
},
4171 { _LITA
, RELOC_SECTION_LITA
},
4172 { "*ABS*", RELOC_SECTION_ABS
},
4173 { _RCONST
, RELOC_SECTION_RCONST
}
4176 name
= bfd_get_section_name (output_bfd
, section
);
4178 for (i
= 0; i
< ARRAY_SIZE (section_symndx
); i
++)
4179 if (streq (name
, section_symndx
[i
].name
))
4181 in
.r_symndx
= section_symndx
[i
].r_symndx
;
4185 if (i
== ARRAY_SIZE (section_symndx
))
4191 /* Let the BFD backend adjust the reloc. */
4192 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4194 /* Get some memory and swap out the reloc. */
4195 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4196 rbuf
= (bfd_byte
*) bfd_malloc (external_reloc_size
);
4200 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (void *) rbuf
);
4202 pos
= (output_section
->rel_filepos
4203 + output_section
->reloc_count
* external_reloc_size
);
4204 ok
= (bfd_seek (output_bfd
, pos
, SEEK_SET
) == 0
4205 && (bfd_bwrite ((void *) rbuf
, external_reloc_size
, output_bfd
)
4206 == external_reloc_size
));
4209 ++output_section
->reloc_count
;
4216 /* Put out information for an external symbol. These come only from
4220 ecoff_link_write_external (struct ecoff_link_hash_entry
*h
, void * data
)
4222 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4223 bfd
*output_bfd
= einfo
->abfd
;
4226 if (h
->root
.type
== bfd_link_hash_warning
)
4228 h
= (struct ecoff_link_hash_entry
*) h
->root
.u
.i
.link
;
4229 if (h
->root
.type
== bfd_link_hash_new
)
4233 /* We need to check if this symbol is being stripped. */
4234 if (h
->root
.type
== bfd_link_hash_undefined
4235 || h
->root
.type
== bfd_link_hash_undefweak
)
4237 else if (einfo
->info
->strip
== strip_all
4238 || (einfo
->info
->strip
== strip_some
4239 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4240 h
->root
.root
.string
,
4241 FALSE
, FALSE
) == NULL
))
4246 if (strip
|| h
->written
)
4249 if (h
->abfd
== NULL
)
4252 h
->esym
.cobol_main
= 0;
4253 h
->esym
.weakext
= 0;
4254 h
->esym
.reserved
= 0;
4255 h
->esym
.ifd
= ifdNil
;
4256 h
->esym
.asym
.value
= 0;
4257 h
->esym
.asym
.st
= stGlobal
;
4259 if (h
->root
.type
!= bfd_link_hash_defined
4260 && h
->root
.type
!= bfd_link_hash_defweak
)
4261 h
->esym
.asym
.sc
= scAbs
;
4264 asection
*output_section
;
4272 section_storage_classes
[] =
4276 { _SDATA
, scSData
},
4277 { _RDATA
, scRData
},
4282 { _PDATA
, scPData
},
4283 { _XDATA
, scXData
},
4284 { _RCONST
, scRConst
}
4287 output_section
= h
->root
.u
.def
.section
->output_section
;
4288 name
= bfd_section_name (output_section
->owner
, output_section
);
4290 for (i
= 0; i
< ARRAY_SIZE (section_storage_classes
); i
++)
4291 if (streq (name
, section_storage_classes
[i
].name
))
4293 h
->esym
.asym
.sc
= section_storage_classes
[i
].sc
;
4297 if (i
== ARRAY_SIZE (section_storage_classes
))
4298 h
->esym
.asym
.sc
= scAbs
;
4301 h
->esym
.asym
.reserved
= 0;
4302 h
->esym
.asym
.index
= indexNil
;
4304 else if (h
->esym
.ifd
!= -1)
4306 struct ecoff_debug_info
*debug
;
4308 /* Adjust the FDR index for the symbol by that used for the
4310 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4311 BFD_ASSERT (h
->esym
.ifd
>= 0
4312 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4313 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4316 switch (h
->root
.type
)
4319 case bfd_link_hash_warning
:
4320 case bfd_link_hash_new
:
4322 case bfd_link_hash_undefined
:
4323 case bfd_link_hash_undefweak
:
4324 if (h
->esym
.asym
.sc
!= scUndefined
4325 && h
->esym
.asym
.sc
!= scSUndefined
)
4326 h
->esym
.asym
.sc
= scUndefined
;
4328 case bfd_link_hash_defined
:
4329 case bfd_link_hash_defweak
:
4330 if (h
->esym
.asym
.sc
== scUndefined
4331 || h
->esym
.asym
.sc
== scSUndefined
)
4332 h
->esym
.asym
.sc
= scAbs
;
4333 else if (h
->esym
.asym
.sc
== scCommon
)
4334 h
->esym
.asym
.sc
= scBss
;
4335 else if (h
->esym
.asym
.sc
== scSCommon
)
4336 h
->esym
.asym
.sc
= scSBss
;
4337 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4338 + h
->root
.u
.def
.section
->output_section
->vma
4339 + h
->root
.u
.def
.section
->output_offset
);
4341 case bfd_link_hash_common
:
4342 if (h
->esym
.asym
.sc
!= scCommon
4343 && h
->esym
.asym
.sc
!= scSCommon
)
4344 h
->esym
.asym
.sc
= scCommon
;
4345 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4347 case bfd_link_hash_indirect
:
4348 /* We ignore these symbols, since the indirected symbol is
4349 already in the hash table. */
4353 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4355 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4358 return (bfd_ecoff_debug_one_external
4359 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4360 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4364 /* ECOFF final link routine. This looks through all the input BFDs
4365 and gathers together all the debugging information, and then
4366 processes all the link order information. This may cause it to
4367 close and reopen some input BFDs; I'll see how bad this is. */
4370 _bfd_ecoff_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
4372 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4373 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4378 struct bfd_link_order
*p
;
4379 struct extsym_info einfo
;
4381 /* We accumulate the debugging information counts in the symbolic
4383 symhdr
= &debug
->symbolic_header
;
4385 symhdr
->ilineMax
= 0;
4389 symhdr
->isymMax
= 0;
4390 symhdr
->ioptMax
= 0;
4391 symhdr
->iauxMax
= 0;
4393 symhdr
->issExtMax
= 0;
4396 symhdr
->iextMax
= 0;
4398 /* We accumulate the debugging information itself in the debug_info
4401 debug
->external_dnr
= NULL
;
4402 debug
->external_pdr
= NULL
;
4403 debug
->external_sym
= NULL
;
4404 debug
->external_opt
= NULL
;
4405 debug
->external_aux
= NULL
;
4407 debug
->ssext
= debug
->ssext_end
= NULL
;
4408 debug
->external_fdr
= NULL
;
4409 debug
->external_rfd
= NULL
;
4410 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4412 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4416 /* Accumulate the debugging symbols from each input BFD. */
4417 for (input_bfd
= info
->input_bfds
;
4419 input_bfd
= input_bfd
->link_next
)
4423 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4425 /* Arbitrarily set the symbolic header vstamp to the vstamp
4426 of the first object file in the link. */
4427 if (symhdr
->vstamp
== 0)
4429 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4430 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4434 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4435 debug
, &backend
->debug_swap
,
4440 /* Combine the register masks. */
4441 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4442 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4443 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4444 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4445 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4446 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4449 /* Write out the external symbols. */
4452 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4453 ecoff_link_write_external
,
4456 if (info
->relocatable
)
4458 /* We need to make a pass over the link_orders to count up the
4459 number of relocations we will need to output, so that we know
4460 how much space they will take up. */
4461 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4464 for (p
= o
->map_head
.link_order
;
4467 if (p
->type
== bfd_indirect_link_order
)
4468 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4469 else if (p
->type
== bfd_section_reloc_link_order
4470 || p
->type
== bfd_symbol_reloc_link_order
)
4475 /* Compute the reloc and symbol file positions. */
4476 ecoff_compute_reloc_file_positions (abfd
);
4478 /* Write out the debugging information. */
4479 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4480 &backend
->debug_swap
, info
,
4481 ecoff_data (abfd
)->sym_filepos
))
4484 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4486 if (info
->relocatable
)
4488 /* Now reset the reloc_count field of the sections in the output
4489 BFD to 0, so that we can use them to keep track of how many
4490 relocs we have output thus far. */
4491 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4495 /* Get a value for the GP register. */
4496 if (ecoff_data (abfd
)->gp
== 0)
4498 struct bfd_link_hash_entry
*h
;
4500 h
= bfd_link_hash_lookup (info
->hash
, "_gp", FALSE
, FALSE
, TRUE
);
4502 && h
->type
== bfd_link_hash_defined
)
4503 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4504 + h
->u
.def
.section
->output_section
->vma
4505 + h
->u
.def
.section
->output_offset
);
4506 else if (info
->relocatable
)
4510 /* Make up a value. */
4512 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4515 && (streq (o
->name
, _SBSS
)
4516 || streq (o
->name
, _SDATA
)
4517 || streq (o
->name
, _LIT4
)
4518 || streq (o
->name
, _LIT8
)
4519 || streq (o
->name
, _LITA
)))
4522 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4526 /* If the relocate_section function needs to do a reloc
4527 involving the GP value, it should make a reloc_dangerous
4528 callback to warn that GP is not defined. */
4532 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4534 for (p
= o
->map_head
.link_order
;
4538 if (p
->type
== bfd_indirect_link_order
4539 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4540 == bfd_target_ecoff_flavour
))
4542 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4545 else if (p
->type
== bfd_section_reloc_link_order
4546 || p
->type
== bfd_symbol_reloc_link_order
)
4548 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4553 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4559 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4561 ecoff_data (abfd
)->linker
= TRUE
;