1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright (C) 1990-2018 Free Software Foundation, Inc.
3 Original version by Per Bothner.
4 Full support added by Ian Lance Taylor, ian@cygnus.com.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
28 #include "aout/stab_gnu.h"
30 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
31 some other stuff which we don't want and which conflicts with stuff
34 #include "aout/aout64.h"
37 #undef obj_sym_filepos
39 #include "coff/internal.h"
41 #include "coff/symconst.h"
42 #include "coff/ecoff.h"
45 #include "libiberty.h"
47 #define streq(a, b) (strcmp ((a), (b)) == 0)
48 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0)
51 /* This stuff is somewhat copied from coffcode.h. */
52 static asection bfd_debug_section
=
54 /* name, id, index, next, prev, flags, user_set_vma, */
55 "*DEBUG*", 0, 0, NULL
, NULL
, 0, 0,
56 /* linker_mark, linker_has_input, gc_mark, compress_status, */
58 /* segment_mark, sec_info_type, use_rela_p, */
60 /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */
62 /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */
64 /* output_offset, output_section, alignment_power, */
66 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
68 /* line_filepos, userdata, contents, lineno, lineno_count, */
69 0, NULL
, NULL
, NULL
, 0,
70 /* entsize, kept_section, moving_line_filepos, */
72 /* target_index, used_by_bfd, constructor_chain, owner, */
78 /* map_head, map_tail */
82 /* Create an ECOFF object. */
85 _bfd_ecoff_mkobject (bfd
*abfd
)
87 bfd_size_type amt
= sizeof (ecoff_data_type
);
89 abfd
->tdata
.ecoff_obj_data
= (struct ecoff_tdata
*) bfd_zalloc (abfd
, amt
);
90 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
96 /* This is a hook called by coff_real_object_p to create any backend
97 specific information. */
100 _bfd_ecoff_mkobject_hook (bfd
*abfd
, void * filehdr
, void * aouthdr
)
102 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
103 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
104 ecoff_data_type
*ecoff
;
106 if (! _bfd_ecoff_mkobject (abfd
))
109 ecoff
= ecoff_data (abfd
);
111 ecoff
->sym_filepos
= internal_f
->f_symptr
;
113 if (internal_a
!= NULL
)
117 ecoff
->text_start
= internal_a
->text_start
;
118 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
119 ecoff
->gp
= internal_a
->gp_value
;
120 ecoff
->gprmask
= internal_a
->gprmask
;
121 for (i
= 0; i
< 4; i
++)
122 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
123 ecoff
->fprmask
= internal_a
->fprmask
;
124 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
125 abfd
->flags
|= D_PAGED
;
127 abfd
->flags
&=~ D_PAGED
;
130 /* It turns out that no special action is required by the MIPS or
131 Alpha ECOFF backends. They have different information in the
132 a.out header, but we just copy it all (e.g., gprmask, cprmask and
133 fprmask) and let the swapping routines ensure that only relevant
134 information is written out. */
136 return (void *) ecoff
;
139 /* Initialize a new section. */
142 _bfd_ecoff_new_section_hook (bfd
*abfd
, asection
*section
)
152 { _TEXT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
153 { _INIT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
154 { _FINI
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
155 { _DATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
156 { _SDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
157 { _RDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
158 { _LIT8
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
159 { _LIT4
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
160 { _RCONST
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
161 { _PDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
164 /* An Irix 4 shared libary. */
165 { _LIB
, SEC_COFF_SHARED_LIBRARY
}
168 section
->alignment_power
= 4;
170 for (i
= 0; i
< ARRAY_SIZE (section_flags
); i
++)
171 if (streq (section
->name
, section_flags
[i
].name
))
173 section
->flags
|= section_flags
[i
].flags
;
178 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
179 uncertain about .init on some systems and I don't know how shared
182 return _bfd_generic_new_section_hook (abfd
, section
);
186 _bfd_ecoff_set_alignment_hook (bfd
*abfd ATTRIBUTE_UNUSED
,
187 asection
*section ATTRIBUTE_UNUSED
,
188 void *scnhdr ATTRIBUTE_UNUSED
)
192 /* Determine the machine architecture and type. This is called from
193 the generic COFF routines. It is the inverse of ecoff_get_magic,
194 below. This could be an ECOFF backend routine, with one version
195 for each target, but there aren't all that many ECOFF targets. */
198 _bfd_ecoff_set_arch_mach_hook (bfd
*abfd
, void * filehdr
)
200 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
201 enum bfd_architecture arch
;
204 switch (internal_f
->f_magic
)
207 case MIPS_MAGIC_LITTLE
:
209 arch
= bfd_arch_mips
;
210 mach
= bfd_mach_mips3000
;
213 case MIPS_MAGIC_LITTLE2
:
214 case MIPS_MAGIC_BIG2
:
215 /* MIPS ISA level 2: the r6000. */
216 arch
= bfd_arch_mips
;
217 mach
= bfd_mach_mips6000
;
220 case MIPS_MAGIC_LITTLE3
:
221 case MIPS_MAGIC_BIG3
:
222 /* MIPS ISA level 3: the r4000. */
223 arch
= bfd_arch_mips
;
224 mach
= bfd_mach_mips4000
;
228 arch
= bfd_arch_alpha
;
233 arch
= bfd_arch_obscure
;
238 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
242 _bfd_ecoff_no_long_sections (bfd
*abfd
, int enable
)
249 /* Get the magic number to use based on the architecture and machine.
250 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
253 ecoff_get_magic (bfd
*abfd
)
257 switch (bfd_get_arch (abfd
))
260 switch (bfd_get_mach (abfd
))
264 case bfd_mach_mips3000
:
265 big
= MIPS_MAGIC_BIG
;
266 little
= MIPS_MAGIC_LITTLE
;
269 case bfd_mach_mips6000
:
270 big
= MIPS_MAGIC_BIG2
;
271 little
= MIPS_MAGIC_LITTLE2
;
274 case bfd_mach_mips4000
:
275 big
= MIPS_MAGIC_BIG3
;
276 little
= MIPS_MAGIC_LITTLE3
;
280 return bfd_big_endian (abfd
) ? big
: little
;
291 /* Get the section s_flags to use for a section. */
294 ecoff_sec_to_styp_flags (const char *name
, flagword flags
)
304 { _TEXT
, STYP_TEXT
},
305 { _DATA
, STYP_DATA
},
306 { _SDATA
, STYP_SDATA
},
307 { _RDATA
, STYP_RDATA
},
308 { _LITA
, STYP_LITA
},
309 { _LIT8
, STYP_LIT8
},
310 { _LIT4
, STYP_LIT4
},
312 { _SBSS
, STYP_SBSS
},
313 { _INIT
, STYP_ECOFF_INIT
},
314 { _FINI
, STYP_ECOFF_FINI
},
315 { _PDATA
, STYP_PDATA
},
316 { _XDATA
, STYP_XDATA
},
317 { _LIB
, STYP_ECOFF_LIB
},
319 { _HASH
, STYP_HASH
},
320 { _DYNAMIC
, STYP_DYNAMIC
},
321 { _LIBLIST
, STYP_LIBLIST
},
322 { _RELDYN
, STYP_RELDYN
},
323 { _CONFLIC
, STYP_CONFLIC
},
324 { _DYNSTR
, STYP_DYNSTR
},
325 { _DYNSYM
, STYP_DYNSYM
},
326 { _RCONST
, STYP_RCONST
}
330 for (i
= 0; i
< ARRAY_SIZE (styp_flags
); i
++)
331 if (streq (name
, styp_flags
[i
].name
))
333 styp
= styp_flags
[i
].flags
;
339 if (streq (name
, _COMMENT
))
342 flags
&=~ SEC_NEVER_LOAD
;
344 else if (flags
& SEC_CODE
)
346 else if (flags
& SEC_DATA
)
348 else if (flags
& SEC_READONLY
)
350 else if (flags
& SEC_LOAD
)
356 if (flags
& SEC_NEVER_LOAD
)
362 /* Get the BFD flags to use for a section. */
365 _bfd_ecoff_styp_to_sec_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
367 const char *name ATTRIBUTE_UNUSED
,
368 asection
*section ATTRIBUTE_UNUSED
,
369 flagword
* flags_ptr
)
371 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
372 long styp_flags
= internal_s
->s_flags
;
373 flagword sec_flags
= 0;
375 if (styp_flags
& STYP_NOLOAD
)
376 sec_flags
|= SEC_NEVER_LOAD
;
378 /* For 386 COFF, at least, an unloadable text or data section is
379 actually a shared library section. */
380 if ((styp_flags
& STYP_TEXT
)
381 || (styp_flags
& STYP_ECOFF_INIT
)
382 || (styp_flags
& STYP_ECOFF_FINI
)
383 || (styp_flags
& STYP_DYNAMIC
)
384 || (styp_flags
& STYP_LIBLIST
)
385 || (styp_flags
& STYP_RELDYN
)
386 || styp_flags
== STYP_CONFLIC
387 || (styp_flags
& STYP_DYNSTR
)
388 || (styp_flags
& STYP_DYNSYM
)
389 || (styp_flags
& STYP_HASH
))
391 if (sec_flags
& SEC_NEVER_LOAD
)
392 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
394 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
396 else if ((styp_flags
& STYP_DATA
)
397 || (styp_flags
& STYP_RDATA
)
398 || (styp_flags
& STYP_SDATA
)
399 || styp_flags
== STYP_PDATA
400 || styp_flags
== STYP_XDATA
401 || (styp_flags
& STYP_GOT
)
402 || styp_flags
== STYP_RCONST
)
404 if (sec_flags
& SEC_NEVER_LOAD
)
405 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
407 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
408 if ((styp_flags
& STYP_RDATA
)
409 || styp_flags
== STYP_PDATA
410 || styp_flags
== STYP_RCONST
)
411 sec_flags
|= SEC_READONLY
;
413 else if ((styp_flags
& STYP_BSS
)
414 || (styp_flags
& STYP_SBSS
))
415 sec_flags
|= SEC_ALLOC
;
416 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
417 sec_flags
|= SEC_NEVER_LOAD
;
418 else if ((styp_flags
& STYP_LITA
)
419 || (styp_flags
& STYP_LIT8
)
420 || (styp_flags
& STYP_LIT4
))
421 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
422 else if (styp_flags
& STYP_ECOFF_LIB
)
423 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
425 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
427 * flags_ptr
= sec_flags
;
431 /* Read in the symbolic header for an ECOFF object file. */
434 ecoff_slurp_symbolic_header (bfd
*abfd
)
436 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
437 bfd_size_type external_hdr_size
;
439 HDRR
*internal_symhdr
;
441 /* See if we've already read it in. */
442 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
443 backend
->debug_swap
.sym_magic
)
446 /* See whether there is a symbolic header. */
447 if (ecoff_data (abfd
)->sym_filepos
== 0)
449 bfd_get_symcount (abfd
) = 0;
453 /* At this point bfd_get_symcount (abfd) holds the number of symbols
454 as read from the file header, but on ECOFF this is always the
455 size of the symbolic information header. It would be cleaner to
456 handle this when we first read the file in coffgen.c. */
457 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
458 if (bfd_get_symcount (abfd
) != external_hdr_size
)
460 bfd_set_error (bfd_error_bad_value
);
464 /* Read the symbolic information header. */
465 raw
= bfd_malloc (external_hdr_size
);
469 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) != 0
470 || bfd_bread (raw
, external_hdr_size
, abfd
) != external_hdr_size
)
472 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
473 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
475 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
477 bfd_set_error (bfd_error_bad_value
);
481 /* Now we can get the correct number of symbols. */
482 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
483 + internal_symhdr
->iextMax
);
494 /* Read in and swap the important symbolic information for an ECOFF
495 object file. This is called by gdb via the read_debug_info entry
496 point in the backend structure. */
499 _bfd_ecoff_slurp_symbolic_info (bfd
*abfd
,
500 asection
*ignore ATTRIBUTE_UNUSED
,
501 struct ecoff_debug_info
*debug
)
503 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
504 HDRR
*internal_symhdr
;
505 bfd_size_type raw_base
;
506 bfd_size_type raw_size
;
508 bfd_size_type external_fdr_size
;
512 bfd_size_type raw_end
;
513 bfd_size_type cb_end
;
516 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
518 /* Check whether we've already gotten it, and whether there's any to
520 if (ecoff_data (abfd
)->raw_syments
!= NULL
)
522 if (ecoff_data (abfd
)->sym_filepos
== 0)
524 bfd_get_symcount (abfd
) = 0;
528 if (! ecoff_slurp_symbolic_header (abfd
))
531 internal_symhdr
= &debug
->symbolic_header
;
533 /* Read all the symbolic information at once. */
534 raw_base
= (ecoff_data (abfd
)->sym_filepos
535 + backend
->debug_swap
.external_hdr_size
);
537 /* Alpha ecoff makes the determination of raw_size difficult. It has
538 an undocumented debug data section between the symhdr and the first
539 documented section. And the ordering of the sections varies between
540 statically and dynamically linked executables.
541 If bfd supports SEEK_END someday, this code could be simplified. */
544 #define UPDATE_RAW_END(start, count, size) \
545 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
546 if (cb_end > raw_end) \
549 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
550 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
551 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
552 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
553 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
554 optimization symtab, not the number of entries. */
555 UPDATE_RAW_END (cbOptOffset
, ioptMax
, sizeof (char));
556 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
557 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
558 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
559 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
560 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
561 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
563 #undef UPDATE_RAW_END
565 raw_size
= raw_end
- raw_base
;
568 ecoff_data (abfd
)->sym_filepos
= 0;
571 raw
= bfd_alloc (abfd
, raw_size
);
575 pos
= ecoff_data (abfd
)->sym_filepos
;
576 pos
+= backend
->debug_swap
.external_hdr_size
;
577 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
578 || bfd_bread (raw
, raw_size
, abfd
) != raw_size
)
580 bfd_release (abfd
, raw
);
584 ecoff_data (abfd
)->raw_syments
= raw
;
586 /* Get pointers for the numeric offsets in the HDRR structure. */
587 #define FIX(off1, off2, type) \
588 if (internal_symhdr->off1 == 0) \
589 debug->off2 = NULL; \
591 debug->off2 = (type) ((char *) raw \
592 + (internal_symhdr->off1 \
595 FIX (cbLineOffset
, line
, unsigned char *);
596 FIX (cbDnOffset
, external_dnr
, void *);
597 FIX (cbPdOffset
, external_pdr
, void *);
598 FIX (cbSymOffset
, external_sym
, void *);
599 FIX (cbOptOffset
, external_opt
, void *);
600 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
601 FIX (cbSsOffset
, ss
, char *);
602 FIX (cbSsExtOffset
, ssext
, char *);
603 FIX (cbFdOffset
, external_fdr
, void *);
604 FIX (cbRfdOffset
, external_rfd
, void *);
605 FIX (cbExtOffset
, external_ext
, void *);
608 /* I don't want to always swap all the data, because it will just
609 waste time and most programs will never look at it. The only
610 time the linker needs most of the debugging information swapped
611 is when linking big-endian and little-endian MIPS object files
612 together, which is not a common occurrence.
614 We need to look at the fdr to deal with a lot of information in
615 the symbols, so we swap them here. */
616 debug
->fdr
= (FDR
*) bfd_alloc2 (abfd
, internal_symhdr
->ifdMax
,
617 sizeof (struct fdr
));
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 /* PR 17512: file: 3372-1243-0.004. */
624 if (fraw_src
== NULL
&& internal_symhdr
->ifdMax
> 0)
626 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
627 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
628 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (void *) fraw_src
, fdr_ptr
);
633 /* ECOFF symbol table routines. The ECOFF symbol table is described
634 in gcc/mips-tfile.c. */
636 /* ECOFF uses two common sections. One is the usual one, and the
637 other is for small objects. All the small objects are kept
638 together, and then referenced via the gp pointer, which yields
639 faster assembler code. This is what we use for the small common
641 static asection ecoff_scom_section
;
642 static asymbol ecoff_scom_symbol
;
643 static asymbol
*ecoff_scom_symbol_ptr
;
645 /* Create an empty symbol. */
648 _bfd_ecoff_make_empty_symbol (bfd
*abfd
)
650 ecoff_symbol_type
*new_symbol
;
651 bfd_size_type amt
= sizeof (ecoff_symbol_type
);
653 new_symbol
= (ecoff_symbol_type
*) bfd_zalloc (abfd
, amt
);
654 if (new_symbol
== NULL
)
656 new_symbol
->symbol
.section
= NULL
;
657 new_symbol
->fdr
= NULL
;
658 new_symbol
->local
= FALSE
;
659 new_symbol
->native
= NULL
;
660 new_symbol
->symbol
.the_bfd
= abfd
;
661 return &new_symbol
->symbol
;
664 /* Set the BFD flags and section for an ECOFF symbol. */
667 ecoff_set_symbol_info (bfd
*abfd
,
673 asym
->the_bfd
= abfd
;
674 asym
->value
= ecoff_sym
->value
;
675 asym
->section
= &bfd_debug_section
;
678 /* Most symbol types are just for debugging. */
679 switch (ecoff_sym
->st
)
688 if (ECOFF_IS_STAB (ecoff_sym
))
690 asym
->flags
= BSF_DEBUGGING
;
695 asym
->flags
= BSF_DEBUGGING
;
700 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
702 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
705 asym
->flags
= BSF_LOCAL
;
706 /* Normally, a local stProc symbol will have a corresponding
707 external symbol. We mark the local symbol as a debugging
708 symbol, in order to prevent nm from printing both out.
709 Similarly, we mark stLabel and stabs symbols as debugging
710 symbols. In both cases, we do want to set the value
711 correctly based on the symbol class. */
712 if (ecoff_sym
->st
== stProc
713 || ecoff_sym
->st
== stLabel
714 || ECOFF_IS_STAB (ecoff_sym
))
715 asym
->flags
|= BSF_DEBUGGING
;
718 if (ecoff_sym
->st
== stProc
|| ecoff_sym
->st
== stStaticProc
)
719 asym
->flags
|= BSF_FUNCTION
;
721 switch (ecoff_sym
->sc
)
724 /* Used for compiler generated labels. Leave them in the
725 debugging section, and mark them as local. If BSF_DEBUGGING
726 is set, then nm does not display them for some reason. If no
727 flags are set then the linker whines about them. */
728 asym
->flags
= BSF_LOCAL
;
731 asym
->section
= bfd_make_section_old_way (abfd
, _TEXT
);
732 asym
->value
-= asym
->section
->vma
;
735 asym
->section
= bfd_make_section_old_way (abfd
, _DATA
);
736 asym
->value
-= asym
->section
->vma
;
739 asym
->section
= bfd_make_section_old_way (abfd
, _BSS
);
740 asym
->value
-= asym
->section
->vma
;
743 asym
->flags
= BSF_DEBUGGING
;
746 asym
->section
= bfd_abs_section_ptr
;
749 asym
->section
= bfd_und_section_ptr
;
759 asym
->flags
= BSF_DEBUGGING
;
762 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
763 asym
->value
-= asym
->section
->vma
;
766 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
767 asym
->value
-= asym
->section
->vma
;
770 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
771 asym
->value
-= asym
->section
->vma
;
774 asym
->flags
= BSF_DEBUGGING
;
777 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
779 asym
->section
= bfd_com_section_ptr
;
785 if (ecoff_scom_section
.name
== NULL
)
787 /* Initialize the small common section. */
788 ecoff_scom_section
.name
= SCOMMON
;
789 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
790 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
791 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
792 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
793 ecoff_scom_symbol
.name
= SCOMMON
;
794 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
795 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
796 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
798 asym
->section
= &ecoff_scom_section
;
803 asym
->flags
= BSF_DEBUGGING
;
806 asym
->section
= bfd_und_section_ptr
;
811 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
812 asym
->value
-= asym
->section
->vma
;
817 asym
->flags
= BSF_DEBUGGING
;
820 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
821 asym
->value
-= asym
->section
->vma
;
824 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
825 asym
->value
-= asym
->section
->vma
;
831 /* Look for special constructors symbols and make relocation entries
832 in a special construction section. These are produced by the
833 -fgnu-linker argument to g++. */
834 if (ECOFF_IS_STAB (ecoff_sym
))
836 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
845 /* Mark the symbol as a constructor. */
846 asym
->flags
|= BSF_CONSTRUCTOR
;
853 /* Read an ECOFF symbol table. */
856 _bfd_ecoff_slurp_symbol_table (bfd
*abfd
)
858 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
859 const bfd_size_type external_ext_size
860 = backend
->debug_swap
.external_ext_size
;
861 const bfd_size_type external_sym_size
862 = backend
->debug_swap
.external_sym_size
;
863 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
864 = backend
->debug_swap
.swap_ext_in
;
865 void (* const swap_sym_in
) (bfd
*, void *, SYMR
*)
866 = backend
->debug_swap
.swap_sym_in
;
867 ecoff_symbol_type
*internal
;
868 ecoff_symbol_type
*internal_ptr
;
874 /* If we've already read in the symbol table, do nothing. */
875 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
878 /* Get the symbolic information. */
879 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
880 &ecoff_data (abfd
)->debug_info
))
882 if (bfd_get_symcount (abfd
) == 0)
885 internal
= (ecoff_symbol_type
*) bfd_alloc2 (abfd
, bfd_get_symcount (abfd
),
886 sizeof (ecoff_symbol_type
));
887 if (internal
== NULL
)
890 internal_ptr
= internal
;
891 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
893 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
894 * external_ext_size
));
895 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
899 (*swap_ext_in
) (abfd
, (void *) eraw_src
, &internal_esym
);
901 /* PR 17512: file: 3372-1000-0.004. */
902 if (internal_esym
.asym
.iss
>= ecoff_data (abfd
)->debug_info
.symbolic_header
.issExtMax
903 || internal_esym
.asym
.iss
< 0)
906 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
907 + internal_esym
.asym
.iss
);
909 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
910 &internal_ptr
->symbol
, 1,
911 internal_esym
.weakext
))
914 /* The alpha uses a negative ifd field for section symbols. */
915 if (internal_esym
.ifd
>= 0)
917 /* PR 17512: file: 3372-1983-0.004. */
918 if (internal_esym
.ifd
>= ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
)
919 internal_ptr
->fdr
= NULL
;
921 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
922 + internal_esym
.ifd
);
925 internal_ptr
->fdr
= NULL
;
926 internal_ptr
->local
= FALSE
;
927 internal_ptr
->native
= (void *) eraw_src
;
930 /* The local symbols must be accessed via the fdr's, because the
931 string and aux indices are relative to the fdr information. */
932 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
933 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
934 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
939 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
940 + fdr_ptr
->isymBase
* external_sym_size
);
941 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
944 lraw_src
+= external_sym_size
, internal_ptr
++)
948 (*swap_sym_in
) (abfd
, (void *) lraw_src
, &internal_sym
);
949 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
952 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
953 &internal_ptr
->symbol
, 0, 0))
955 internal_ptr
->fdr
= fdr_ptr
;
956 internal_ptr
->local
= TRUE
;
957 internal_ptr
->native
= (void *) lraw_src
;
961 /* PR 17512: file: 3372-3080-0.004.
962 A discrepancy between ecoff_data (abfd)->debug_info.symbolic_header.isymMax
963 and ecoff_data (abfd)->debug_info.symbolic_header.ifdMax can mean that
964 we have fewer symbols than we were expecting. Allow for this by updating
965 the symbol count and warning the user. */
966 if (internal_ptr
- internal
< (ptrdiff_t) bfd_get_symcount (abfd
))
968 bfd_get_symcount (abfd
) = internal_ptr
- internal
;
970 /* xgettext:c-format */
971 (_("%B: warning: isymMax (%ld) is greater than ifdMax (%ld)"),
972 abfd
, ecoff_data (abfd
)->debug_info
.symbolic_header
.isymMax
,
973 ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
);
976 ecoff_data (abfd
)->canonical_symbols
= internal
;
981 /* Return the amount of space needed for the canonical symbols. */
984 _bfd_ecoff_get_symtab_upper_bound (bfd
*abfd
)
986 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
987 &ecoff_data (abfd
)->debug_info
))
990 if (bfd_get_symcount (abfd
) == 0)
993 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
996 /* Get the canonical symbols. */
999 _bfd_ecoff_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
1001 unsigned int counter
= 0;
1002 ecoff_symbol_type
*symbase
;
1003 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1005 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1007 if (bfd_get_symcount (abfd
) == 0)
1010 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1011 while (counter
< bfd_get_symcount (abfd
))
1013 *(location
++) = symbase
++;
1017 return bfd_get_symcount (abfd
);
1020 /* Turn ECOFF type information into a printable string.
1021 ecoff_emit_aggregate and ecoff_type_to_string are from
1022 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1024 /* Write aggregate information to a string. */
1027 ecoff_emit_aggregate (bfd
*abfd
,
1034 const struct ecoff_debug_swap
* const debug_swap
=
1035 &ecoff_backend (abfd
)->debug_swap
;
1036 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1037 unsigned int ifd
= rndx
->rfd
;
1038 unsigned int indx
= rndx
->index
;
1044 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1045 struct return type of a procedure compiled without -g. */
1046 if (ifd
== 0xffffffff
1047 || (rndx
->rfd
== 0xfff && indx
== 0))
1048 name
= "<undefined>";
1049 else if (indx
== indexNil
)
1055 if (debug_info
->external_rfd
== NULL
)
1056 fdr
= debug_info
->fdr
+ ifd
;
1061 (*debug_swap
->swap_rfd_in
) (abfd
,
1062 ((char *) debug_info
->external_rfd
1063 + ((fdr
->rfdBase
+ ifd
)
1064 * debug_swap
->external_rfd_size
)),
1066 fdr
= debug_info
->fdr
+ rfd
;
1069 indx
+= fdr
->isymBase
;
1071 (*debug_swap
->swap_sym_in
) (abfd
,
1072 ((char *) debug_info
->external_sym
1073 + indx
* debug_swap
->external_sym_size
),
1076 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1080 "%s %s { ifd = %u, index = %lu }",
1082 ((unsigned long) indx
1083 + debug_info
->symbolic_header
.iextMax
));
1086 /* Convert the type information to string format. */
1089 ecoff_type_to_string (bfd
*abfd
, FDR
*fdr
, unsigned int indx
)
1091 union aux_ext
*aux_ptr
;
1101 unsigned int basic_type
;
1104 static char buffer2
[1024];
1109 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1110 bigendian
= fdr
->fBigendian
;
1112 for (i
= 0; i
< 7; i
++)
1114 qualifiers
[i
].low_bound
= 0;
1115 qualifiers
[i
].high_bound
= 0;
1116 qualifiers
[i
].stride
= 0;
1119 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1120 return "-1 (no type)";
1121 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1123 basic_type
= u
.ti
.bt
;
1124 qualifiers
[0].type
= u
.ti
.tq0
;
1125 qualifiers
[1].type
= u
.ti
.tq1
;
1126 qualifiers
[2].type
= u
.ti
.tq2
;
1127 qualifiers
[3].type
= u
.ti
.tq3
;
1128 qualifiers
[4].type
= u
.ti
.tq4
;
1129 qualifiers
[5].type
= u
.ti
.tq5
;
1130 qualifiers
[6].type
= tqNil
;
1132 /* Go get the basic type. */
1135 case btNil
: /* Undefined. */
1139 case btAdr
: /* Address - integer same size as pointer. */
1140 strcpy (p1
, "address");
1143 case btChar
: /* Character. */
1144 strcpy (p1
, "char");
1147 case btUChar
: /* Unsigned character. */
1148 strcpy (p1
, "unsigned char");
1151 case btShort
: /* Short. */
1152 strcpy (p1
, "short");
1155 case btUShort
: /* Unsigned short. */
1156 strcpy (p1
, "unsigned short");
1159 case btInt
: /* Int. */
1163 case btUInt
: /* Unsigned int. */
1164 strcpy (p1
, "unsigned int");
1167 case btLong
: /* Long. */
1168 strcpy (p1
, "long");
1171 case btULong
: /* Unsigned long. */
1172 strcpy (p1
, "unsigned long");
1175 case btFloat
: /* Float (real). */
1176 strcpy (p1
, "float");
1179 case btDouble
: /* Double (real). */
1180 strcpy (p1
, "double");
1183 /* Structures add 1-2 aux words:
1184 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1185 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1187 case btStruct
: /* Structure (Record). */
1188 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1189 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1190 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1192 indx
++; /* Skip aux words. */
1195 /* Unions add 1-2 aux words:
1196 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1197 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1199 case btUnion
: /* Union. */
1200 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1201 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1202 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1204 indx
++; /* Skip aux words. */
1207 /* Enumerations add 1-2 aux words:
1208 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1209 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1211 case btEnum
: /* Enumeration. */
1212 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1213 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1214 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1216 indx
++; /* Skip aux words. */
1219 case btTypedef
: /* Defined via a typedef, isymRef points. */
1220 strcpy (p1
, "typedef");
1223 case btRange
: /* Subrange of int. */
1224 strcpy (p1
, "subrange");
1227 case btSet
: /* Pascal sets. */
1231 case btComplex
: /* Fortran complex. */
1232 strcpy (p1
, "complex");
1235 case btDComplex
: /* Fortran double complex. */
1236 strcpy (p1
, "double complex");
1239 case btIndirect
: /* Forward or unnamed typedef. */
1240 strcpy (p1
, "forward/unamed typedef");
1243 case btFixedDec
: /* Fixed Decimal. */
1244 strcpy (p1
, "fixed decimal");
1247 case btFloatDec
: /* Float Decimal. */
1248 strcpy (p1
, "float decimal");
1251 case btString
: /* Varying Length Character String. */
1252 strcpy (p1
, "string");
1255 case btBit
: /* Aligned Bit String. */
1259 case btPicture
: /* Picture. */
1260 strcpy (p1
, "picture");
1263 case btVoid
: /* Void. */
1264 strcpy (p1
, "void");
1268 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1272 p1
+= strlen (buffer1
);
1274 /* If this is a bitfield, get the bitsize. */
1279 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1280 sprintf (p1
, " : %d", bitsize
);
1281 p1
+= strlen (buffer1
);
1284 /* Deal with any qualifiers. */
1285 if (qualifiers
[0].type
!= tqNil
)
1287 /* Snarf up any array bounds in the correct order. Arrays
1288 store 5 successive words in the aux. table:
1289 word 0 RNDXR to type of the bounds (ie, int)
1290 word 1 Current file descriptor index
1292 word 3 high bound (or -1 if [])
1293 word 4 stride size in bits. */
1294 for (i
= 0; i
< 7; i
++)
1296 if (qualifiers
[i
].type
== tqArray
)
1298 qualifiers
[i
].low_bound
=
1299 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1300 qualifiers
[i
].high_bound
=
1301 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1302 qualifiers
[i
].stride
=
1303 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1308 /* Now print out the qualifiers. */
1309 for (i
= 0; i
< 6; i
++)
1311 switch (qualifiers
[i
].type
)
1318 strcpy (p2
, "ptr to ");
1319 p2
+= sizeof ("ptr to ")-1;
1323 strcpy (p2
, "volatile ");
1324 p2
+= sizeof ("volatile ")-1;
1328 strcpy (p2
, "far ");
1329 p2
+= sizeof ("far ")-1;
1333 strcpy (p2
, "func. ret. ");
1334 p2
+= sizeof ("func. ret. ");
1339 int first_array
= i
;
1342 /* Print array bounds reversed (ie, in the order the C
1343 programmer writes them). C is such a fun language.... */
1344 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1347 for (j
= i
; j
>= first_array
; j
--)
1349 strcpy (p2
, "array [");
1350 p2
+= sizeof ("array [")-1;
1351 if (qualifiers
[j
].low_bound
!= 0)
1353 "%ld:%ld {%ld bits}",
1354 (long) qualifiers
[j
].low_bound
,
1355 (long) qualifiers
[j
].high_bound
,
1356 (long) qualifiers
[j
].stride
);
1358 else if (qualifiers
[j
].high_bound
!= -1)
1361 (long) (qualifiers
[j
].high_bound
+ 1),
1362 (long) (qualifiers
[j
].stride
));
1365 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1368 strcpy (p2
, "] of ");
1369 p2
+= sizeof ("] of ")-1;
1377 strcpy (p2
, buffer1
);
1381 /* Return information about ECOFF symbol SYMBOL in RET. */
1384 _bfd_ecoff_get_symbol_info (bfd
*abfd ATTRIBUTE_UNUSED
,
1388 bfd_symbol_info (symbol
, ret
);
1391 /* Return whether this is a local label. */
1394 _bfd_ecoff_bfd_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
,
1397 return name
[0] == '$';
1400 /* Print information about an ECOFF symbol. */
1403 _bfd_ecoff_print_symbol (bfd
*abfd
,
1406 bfd_print_symbol_type how
)
1408 const struct ecoff_debug_swap
* const debug_swap
1409 = &ecoff_backend (abfd
)->debug_swap
;
1410 FILE *file
= (FILE *)filep
;
1414 case bfd_print_symbol_name
:
1415 fprintf (file
, "%s", symbol
->name
);
1417 case bfd_print_symbol_more
:
1418 if (ecoffsymbol (symbol
)->local
)
1422 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1424 fprintf (file
, "ecoff local ");
1425 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1426 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1427 (unsigned) ecoff_sym
.sc
);
1433 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1435 fprintf (file
, "ecoff extern ");
1436 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1437 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1438 (unsigned) ecoff_ext
.asym
.sc
);
1441 case bfd_print_symbol_all
:
1442 /* Print out the symbols in a reasonable way. */
1451 if (ecoffsymbol (symbol
)->local
)
1453 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1456 pos
= ((((char *) ecoffsymbol (symbol
)->native
1457 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1458 / debug_swap
->external_sym_size
)
1459 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1466 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1469 pos
= (((char *) ecoffsymbol (symbol
)->native
1470 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1471 / debug_swap
->external_ext_size
);
1472 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1473 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1474 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1477 fprintf (file
, "[%3d] %c ",
1479 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1480 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1481 (unsigned) ecoff_ext
.asym
.st
,
1482 (unsigned) ecoff_ext
.asym
.sc
,
1483 (unsigned) ecoff_ext
.asym
.index
,
1484 jmptbl
, cobol_main
, weakext
,
1487 if (ecoffsymbol (symbol
)->fdr
!= NULL
1488 && ecoff_ext
.asym
.index
!= indexNil
)
1493 bfd_size_type sym_base
;
1494 union aux_ext
*aux_base
;
1496 fdr
= ecoffsymbol (symbol
)->fdr
;
1497 indx
= ecoff_ext
.asym
.index
;
1499 /* sym_base is used to map the fdr relative indices which
1500 appear in the file to the position number which we are
1502 sym_base
= fdr
->isymBase
;
1503 if (ecoffsymbol (symbol
)->local
)
1505 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1507 /* aux_base is the start of the aux entries for this file;
1508 asym.index is an offset from this. */
1509 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1512 /* The aux entries are stored in host byte order; the
1513 order is indicated by a bit in the fdr. */
1514 bigendian
= fdr
->fBigendian
;
1516 /* This switch is basically from gcc/mips-tdump.c. */
1517 switch (ecoff_ext
.asym
.st
)
1525 fprintf (file
, _("\n End+1 symbol: %ld"),
1526 (long) (indx
+ sym_base
));
1530 if (ecoff_ext
.asym
.sc
== scText
1531 || ecoff_ext
.asym
.sc
== scInfo
)
1532 fprintf (file
, _("\n First symbol: %ld"),
1533 (long) (indx
+ sym_base
));
1535 fprintf (file
, _("\n First symbol: %ld"),
1537 (AUX_GET_ISYM (bigendian
,
1538 &aux_base
[ecoff_ext
.asym
.index
])
1544 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1546 else if (ecoffsymbol (symbol
)->local
)
1547 /* xgettext:c-format */
1548 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1550 (AUX_GET_ISYM (bigendian
,
1551 &aux_base
[ecoff_ext
.asym
.index
])
1553 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1555 fprintf (file
, _("\n Local symbol: %ld"),
1558 + (ecoff_data (abfd
)
1559 ->debug_info
.symbolic_header
.iextMax
)));
1563 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1564 (long) (indx
+ sym_base
));
1568 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1569 (long) (indx
+ sym_base
));
1573 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1574 (long) (indx
+ sym_base
));
1578 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1579 fprintf (file
, _("\n Type: %s"),
1580 ecoff_type_to_string (abfd
, fdr
, indx
));
1589 /* Read in the relocs for a section. */
1592 ecoff_slurp_reloc_table (bfd
*abfd
,
1596 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1597 arelent
*internal_relocs
;
1598 bfd_size_type external_reloc_size
;
1600 char *external_relocs
;
1604 if (section
->relocation
!= NULL
1605 || section
->reloc_count
== 0
1606 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1609 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1612 amt
= section
->reloc_count
;
1613 amt
*= sizeof (arelent
);
1614 internal_relocs
= (arelent
*) bfd_alloc (abfd
, amt
);
1616 external_reloc_size
= backend
->external_reloc_size
;
1617 amt
= external_reloc_size
* section
->reloc_count
;
1618 external_relocs
= (char *) bfd_alloc (abfd
, amt
);
1619 if (internal_relocs
== NULL
|| external_relocs
== NULL
)
1621 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1623 if (bfd_bread (external_relocs
, amt
, abfd
) != amt
)
1626 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1628 struct internal_reloc intern
;
1630 (*backend
->swap_reloc_in
) (abfd
,
1631 external_relocs
+ i
* external_reloc_size
,
1634 if (intern
.r_extern
)
1636 /* r_symndx is an index into the external symbols. */
1637 BFD_ASSERT (intern
.r_symndx
>= 0
1639 < (ecoff_data (abfd
)
1640 ->debug_info
.symbolic_header
.iextMax
)));
1641 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1644 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1645 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1647 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1652 const char *sec_name
;
1655 /* r_symndx is a section key. */
1656 switch (intern
.r_symndx
)
1658 case RELOC_SECTION_TEXT
: sec_name
= _TEXT
; break;
1659 case RELOC_SECTION_RDATA
: sec_name
= _RDATA
; break;
1660 case RELOC_SECTION_DATA
: sec_name
= _DATA
; break;
1661 case RELOC_SECTION_SDATA
: sec_name
= _SDATA
; break;
1662 case RELOC_SECTION_SBSS
: sec_name
= _SBSS
; break;
1663 case RELOC_SECTION_BSS
: sec_name
= _BSS
; break;
1664 case RELOC_SECTION_INIT
: sec_name
= _INIT
; break;
1665 case RELOC_SECTION_LIT8
: sec_name
= _LIT8
; break;
1666 case RELOC_SECTION_LIT4
: sec_name
= _LIT4
; break;
1667 case RELOC_SECTION_XDATA
: sec_name
= _XDATA
; break;
1668 case RELOC_SECTION_PDATA
: sec_name
= _PDATA
; break;
1669 case RELOC_SECTION_FINI
: sec_name
= _FINI
; break;
1670 case RELOC_SECTION_LITA
: sec_name
= _LITA
; break;
1671 case RELOC_SECTION_RCONST
: sec_name
= _RCONST
; break;
1675 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1678 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1680 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1683 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1685 /* Let the backend select the howto field and do any other
1686 required processing. */
1687 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1690 bfd_release (abfd
, external_relocs
);
1692 section
->relocation
= internal_relocs
;
1697 /* Get a canonical list of relocs. */
1700 _bfd_ecoff_canonicalize_reloc (bfd
*abfd
,
1707 if (section
->flags
& SEC_CONSTRUCTOR
)
1709 arelent_chain
*chain
;
1711 /* This section has relocs made up by us, not the file, so take
1712 them out of their chain and place them into the data area
1714 for (count
= 0, chain
= section
->constructor_chain
;
1715 count
< section
->reloc_count
;
1716 count
++, chain
= chain
->next
)
1717 *relptr
++ = &chain
->relent
;
1723 if (! ecoff_slurp_reloc_table (abfd
, section
, symbols
))
1726 tblptr
= section
->relocation
;
1728 for (count
= 0; count
< section
->reloc_count
; count
++)
1729 *relptr
++ = tblptr
++;
1734 return section
->reloc_count
;
1737 /* Provided a BFD, a section and an offset into the section, calculate
1738 and return the name of the source file and the line nearest to the
1742 _bfd_ecoff_find_nearest_line (bfd
*abfd
,
1743 asymbol
**symbols ATTRIBUTE_UNUSED
,
1746 const char **filename_ptr
,
1747 const char **functionname_ptr
,
1748 unsigned int *retline_ptr
,
1749 unsigned int *discriminator_ptr
)
1751 const struct ecoff_debug_swap
* const debug_swap
1752 = &ecoff_backend (abfd
)->debug_swap
;
1753 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1754 struct ecoff_find_line
*line_info
;
1756 /* Make sure we have the FDR's. */
1757 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
, debug_info
)
1758 || bfd_get_symcount (abfd
) == 0)
1761 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1763 bfd_size_type amt
= sizeof (struct ecoff_find_line
);
1765 ecoff_data (abfd
)->find_line_info
=
1766 (struct ecoff_find_line
*) bfd_zalloc (abfd
, amt
);
1767 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1771 if (discriminator_ptr
)
1772 *discriminator_ptr
= 0;
1773 line_info
= ecoff_data (abfd
)->find_line_info
;
1774 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1775 debug_swap
, line_info
, filename_ptr
,
1776 functionname_ptr
, retline_ptr
);
1779 /* Copy private BFD data. This is called by objcopy and strip. We
1780 use it to copy the ECOFF debugging information from one BFD to the
1781 other. It would be theoretically possible to represent the ECOFF
1782 debugging information in the symbol table. However, it would be a
1783 lot of work, and there would be little gain (gas, gdb, and ld
1784 already access the ECOFF debugging information via the
1785 ecoff_debug_info structure, and that structure would have to be
1786 retained in order to support ECOFF debugging in MIPS ELF).
1788 The debugging information for the ECOFF external symbols comes from
1789 the symbol table, so this function only handles the other debugging
1793 _bfd_ecoff_bfd_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
1795 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1796 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1798 asymbol
**sym_ptr_ptr
;
1802 /* We only want to copy information over if both BFD's use ECOFF
1804 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1805 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1808 /* Copy the GP value and the register masks. */
1809 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1810 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1811 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1812 for (i
= 0; i
< 3; i
++)
1813 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1815 /* Copy the version stamp. */
1816 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1818 /* If there are no symbols, don't copy any debugging information. */
1819 c
= bfd_get_symcount (obfd
);
1820 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1821 if (c
== 0 || sym_ptr_ptr
== NULL
)
1824 /* See if there are any local symbols. */
1826 for (; c
> 0; c
--, sym_ptr_ptr
++)
1828 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1837 /* There are some local symbols. We just bring over all the
1838 debugging information. FIXME: This is not quite the right
1839 thing to do. If the user has asked us to discard all
1840 debugging information, then we are probably going to wind up
1841 keeping it because there will probably be some local symbol
1842 which objcopy did not discard. We should actually break
1843 apart the debugging information and only keep that which
1844 applies to the symbols we want to keep. */
1845 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1846 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1847 oinfo
->line
= iinfo
->line
;
1849 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1850 oinfo
->external_dnr
= iinfo
->external_dnr
;
1852 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1853 oinfo
->external_pdr
= iinfo
->external_pdr
;
1855 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1856 oinfo
->external_sym
= iinfo
->external_sym
;
1858 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1859 oinfo
->external_opt
= iinfo
->external_opt
;
1861 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1862 oinfo
->external_aux
= iinfo
->external_aux
;
1864 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1865 oinfo
->ss
= iinfo
->ss
;
1867 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1868 oinfo
->external_fdr
= iinfo
->external_fdr
;
1870 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1871 oinfo
->external_rfd
= iinfo
->external_rfd
;
1875 /* We are discarding all the local symbol information. Look
1876 through the external symbols and remove all references to FDR
1877 or aux information. */
1878 c
= bfd_get_symcount (obfd
);
1879 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1880 for (; c
> 0; c
--, sym_ptr_ptr
++)
1884 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1885 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1887 esym
.asym
.index
= indexNil
;
1888 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1889 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1896 /* Set the architecture. The supported architecture is stored in the
1897 backend pointer. We always set the architecture anyhow, since many
1898 callers ignore the return value. */
1901 _bfd_ecoff_set_arch_mach (bfd
*abfd
,
1902 enum bfd_architecture arch
,
1903 unsigned long machine
)
1905 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1906 return arch
== ecoff_backend (abfd
)->arch
;
1909 /* Get the size of the section headers. */
1912 _bfd_ecoff_sizeof_headers (bfd
*abfd
,
1913 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1920 for (current
= abfd
->sections
;
1922 current
= current
->next
)
1925 ret
= (bfd_coff_filhsz (abfd
)
1926 + bfd_coff_aoutsz (abfd
)
1927 + c
* bfd_coff_scnhsz (abfd
));
1928 return (int) BFD_ALIGN (ret
, 16);
1931 /* Get the contents of a section. */
1934 _bfd_ecoff_get_section_contents (bfd
*abfd
,
1938 bfd_size_type count
)
1940 return _bfd_generic_get_section_contents (abfd
, section
, location
,
1944 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1945 called via qsort. */
1948 ecoff_sort_hdrs (const void * arg1
, const void * arg2
)
1950 const asection
*hdr1
= *(const asection
**) arg1
;
1951 const asection
*hdr2
= *(const asection
**) arg2
;
1953 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
1955 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
1960 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
1963 if (hdr1
->vma
< hdr2
->vma
)
1965 else if (hdr1
->vma
> hdr2
->vma
)
1971 /* Calculate the file position for each section, and set
1975 ecoff_compute_section_file_positions (bfd
*abfd
)
1977 file_ptr sofar
, file_sofar
;
1978 asection
**sorted_hdrs
;
1982 bfd_boolean rdata_in_text
;
1983 bfd_boolean first_data
, first_nonalloc
;
1984 const bfd_vma round
= ecoff_backend (abfd
)->round
;
1987 sofar
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
1990 /* Sort the sections by VMA. */
1991 amt
= abfd
->section_count
;
1992 amt
*= sizeof (asection
*);
1993 sorted_hdrs
= (asection
**) bfd_malloc (amt
);
1994 if (sorted_hdrs
== NULL
)
1996 for (current
= abfd
->sections
, i
= 0;
1998 current
= current
->next
, i
++)
1999 sorted_hdrs
[i
] = current
;
2000 BFD_ASSERT (i
== abfd
->section_count
);
2002 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2005 /* Some versions of the OSF linker put the .rdata section in the
2006 text segment, and some do not. */
2007 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2010 for (i
= 0; i
< abfd
->section_count
; i
++)
2012 current
= sorted_hdrs
[i
];
2013 if (streq (current
->name
, _RDATA
))
2015 if ((current
->flags
& SEC_CODE
) == 0
2016 && ! streq (current
->name
, _PDATA
)
2017 && ! streq (current
->name
, _RCONST
))
2019 rdata_in_text
= FALSE
;
2024 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2027 first_nonalloc
= TRUE
;
2028 for (i
= 0; i
< abfd
->section_count
; i
++)
2030 unsigned int alignment_power
;
2032 current
= sorted_hdrs
[i
];
2034 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2035 supposed to indicate the number of .pdata entries that are
2036 really in the section. Each entry is 8 bytes. We store this
2037 away in line_filepos before increasing the section size. */
2038 if (streq (current
->name
, _PDATA
))
2039 current
->line_filepos
= current
->size
/ 8;
2041 alignment_power
= current
->alignment_power
;
2043 /* On Ultrix, the data sections in an executable file must be
2044 aligned to a page boundary within the file. This does not
2045 affect the section size, though. FIXME: Does this work for
2046 other platforms? It requires some modification for the
2047 Alpha, because .rdata on the Alpha goes with the text, not
2049 if ((abfd
->flags
& EXEC_P
) != 0
2050 && (abfd
->flags
& D_PAGED
) != 0
2052 && (current
->flags
& SEC_CODE
) == 0
2054 || ! streq (current
->name
, _RDATA
))
2055 && ! streq (current
->name
, _PDATA
)
2056 && ! streq (current
->name
, _RCONST
))
2058 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2059 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2062 else if (streq (current
->name
, _LIB
))
2064 /* On Irix 4, the location of contents of the .lib section
2065 from a shared library section is also rounded up to a
2068 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2069 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2071 else if (first_nonalloc
2072 && (current
->flags
& SEC_ALLOC
) == 0
2073 && (abfd
->flags
& D_PAGED
) != 0)
2075 /* Skip up to the next page for an unallocated section, such
2076 as the .comment section on the Alpha. This leaves room
2077 for the .bss section. */
2078 first_nonalloc
= FALSE
;
2079 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2080 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2083 /* Align the sections in the file to the same boundary on
2084 which they are aligned in virtual memory. */
2085 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2086 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2087 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2089 if ((abfd
->flags
& D_PAGED
) != 0
2090 && (current
->flags
& SEC_ALLOC
) != 0)
2092 sofar
+= (current
->vma
- sofar
) % round
;
2093 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2094 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2097 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2098 current
->filepos
= file_sofar
;
2100 sofar
+= current
->size
;
2101 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2102 file_sofar
+= current
->size
;
2104 /* Make sure that this section is of the right size too. */
2106 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2107 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2108 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2109 current
->size
+= sofar
- old_sofar
;
2115 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2120 /* Determine the location of the relocs for all the sections in the
2121 output file, as well as the location of the symbolic debugging
2124 static bfd_size_type
2125 ecoff_compute_reloc_file_positions (bfd
*abfd
)
2127 const bfd_size_type external_reloc_size
=
2128 ecoff_backend (abfd
)->external_reloc_size
;
2129 file_ptr reloc_base
;
2130 bfd_size_type reloc_size
;
2134 if (! abfd
->output_has_begun
)
2136 if (! ecoff_compute_section_file_positions (abfd
))
2138 abfd
->output_has_begun
= TRUE
;
2141 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2144 for (current
= abfd
->sections
;
2146 current
= current
->next
)
2148 if (current
->reloc_count
== 0)
2149 current
->rel_filepos
= 0;
2152 bfd_size_type relsize
;
2154 current
->rel_filepos
= reloc_base
;
2155 relsize
= current
->reloc_count
* external_reloc_size
;
2156 reloc_size
+= relsize
;
2157 reloc_base
+= relsize
;
2161 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2163 /* At least on Ultrix, the symbol table of an executable file must
2164 be aligned to a page boundary. FIXME: Is this true on other
2166 if ((abfd
->flags
& EXEC_P
) != 0
2167 && (abfd
->flags
& D_PAGED
) != 0)
2168 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2169 &~ (ecoff_backend (abfd
)->round
- 1));
2171 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2176 /* Set the contents of a section. */
2179 _bfd_ecoff_set_section_contents (bfd
*abfd
,
2181 const void * location
,
2183 bfd_size_type count
)
2187 /* This must be done first, because bfd_set_section_contents is
2188 going to set output_has_begun to TRUE. */
2189 if (! abfd
->output_has_begun
2190 && ! ecoff_compute_section_file_positions (abfd
))
2193 /* Handle the .lib section specially so that Irix 4 shared libraries
2194 work out. See coff_set_section_contents in coffcode.h. */
2195 if (streq (section
->name
, _LIB
))
2197 bfd_byte
*rec
, *recend
;
2199 rec
= (bfd_byte
*) location
;
2200 recend
= rec
+ count
;
2201 while (rec
< recend
)
2204 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2207 BFD_ASSERT (rec
== recend
);
2213 pos
= section
->filepos
+ offset
;
2214 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2215 || bfd_bwrite (location
, count
, abfd
) != count
)
2221 /* Get the GP value for an ECOFF file. This is a hook used by
2225 bfd_ecoff_get_gp_value (bfd
*abfd
)
2227 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2228 || bfd_get_format (abfd
) != bfd_object
)
2230 bfd_set_error (bfd_error_invalid_operation
);
2234 return ecoff_data (abfd
)->gp
;
2237 /* Set the GP value for an ECOFF file. This is a hook used by the
2241 bfd_ecoff_set_gp_value (bfd
*abfd
, bfd_vma gp_value
)
2243 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2244 || bfd_get_format (abfd
) != bfd_object
)
2246 bfd_set_error (bfd_error_invalid_operation
);
2250 ecoff_data (abfd
)->gp
= gp_value
;
2255 /* Set the register masks for an ECOFF file. This is a hook used by
2259 bfd_ecoff_set_regmasks (bfd
*abfd
,
2260 unsigned long gprmask
,
2261 unsigned long fprmask
,
2262 unsigned long *cprmask
)
2264 ecoff_data_type
*tdata
;
2266 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2267 || bfd_get_format (abfd
) != bfd_object
)
2269 bfd_set_error (bfd_error_invalid_operation
);
2273 tdata
= ecoff_data (abfd
);
2274 tdata
->gprmask
= gprmask
;
2275 tdata
->fprmask
= fprmask
;
2276 if (cprmask
!= NULL
)
2280 for (i
= 0; i
< 3; i
++)
2281 tdata
->cprmask
[i
] = cprmask
[i
];
2287 /* Get ECOFF EXTR information for an external symbol. This function
2288 is passed to bfd_ecoff_debug_externals. */
2291 ecoff_get_extr (asymbol
*sym
, EXTR
*esym
)
2293 ecoff_symbol_type
*ecoff_sym_ptr
;
2296 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2297 || ecoffsymbol (sym
)->native
== NULL
)
2299 /* Don't include debugging, local, or section symbols. */
2300 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2301 || (sym
->flags
& BSF_LOCAL
) != 0
2302 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2306 esym
->cobol_main
= 0;
2307 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2310 /* FIXME: we can do better than this for st and sc. */
2311 esym
->asym
.st
= stGlobal
;
2312 esym
->asym
.sc
= scAbs
;
2313 esym
->asym
.reserved
= 0;
2314 esym
->asym
.index
= indexNil
;
2318 ecoff_sym_ptr
= ecoffsymbol (sym
);
2320 if (ecoff_sym_ptr
->local
)
2323 input_bfd
= bfd_asymbol_bfd (sym
);
2324 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2325 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2327 /* If the symbol was defined by the linker, then esym will be
2328 undefined but sym will not be. Get a better class for such a
2330 if ((esym
->asym
.sc
== scUndefined
2331 || esym
->asym
.sc
== scSUndefined
)
2332 && ! bfd_is_und_section (bfd_get_section (sym
)))
2333 esym
->asym
.sc
= scAbs
;
2335 /* Adjust the FDR index for the symbol by that used for the input
2337 if (esym
->ifd
!= -1)
2339 struct ecoff_debug_info
*input_debug
;
2341 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2342 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2343 if (input_debug
->ifdmap
!= NULL
)
2344 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2350 /* Set the external symbol index. This routine is passed to
2351 bfd_ecoff_debug_externals. */
2354 ecoff_set_index (asymbol
*sym
, bfd_size_type indx
)
2356 ecoff_set_sym_index (sym
, indx
);
2359 /* Write out an ECOFF file. */
2362 _bfd_ecoff_write_object_contents (bfd
*abfd
)
2364 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2365 const bfd_vma round
= backend
->round
;
2366 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2367 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2368 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2369 const bfd_size_type external_hdr_size
2370 = backend
->debug_swap
.external_hdr_size
;
2371 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2372 void (* const adjust_reloc_out
) (bfd
*, const arelent
*, struct internal_reloc
*)
2373 = backend
->adjust_reloc_out
;
2374 void (* const swap_reloc_out
) (bfd
*, const struct internal_reloc
*, void *)
2375 = backend
->swap_reloc_out
;
2376 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2377 HDRR
* const symhdr
= &debug
->symbolic_header
;
2380 bfd_size_type reloc_size
;
2381 bfd_size_type text_size
;
2383 bfd_boolean set_text_start
;
2384 bfd_size_type data_size
;
2386 bfd_boolean set_data_start
;
2387 bfd_size_type bss_size
;
2389 void * reloc_buff
= NULL
;
2390 struct internal_filehdr internal_f
;
2391 struct internal_aouthdr internal_a
;
2394 /* Determine where the sections and relocs will go in the output
2396 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2399 for (current
= abfd
->sections
;
2401 current
= current
->next
)
2403 current
->target_index
= count
;
2407 if ((abfd
->flags
& D_PAGED
) != 0)
2408 text_size
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
2412 set_text_start
= FALSE
;
2415 set_data_start
= FALSE
;
2418 /* Write section headers to the file. */
2420 /* Allocate buff big enough to hold a section header,
2421 file header, or a.out header. */
2430 buff
= bfd_malloc (siz
);
2435 internal_f
.f_nscns
= 0;
2436 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2439 for (current
= abfd
->sections
;
2441 current
= current
->next
)
2443 struct internal_scnhdr section
;
2446 ++internal_f
.f_nscns
;
2448 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2450 /* This seems to be correct for Irix 4 shared libraries. */
2451 vma
= bfd_get_section_vma (abfd
, current
);
2452 if (streq (current
->name
, _LIB
))
2453 section
.s_vaddr
= 0;
2455 section
.s_vaddr
= vma
;
2457 section
.s_paddr
= current
->lma
;
2458 section
.s_size
= current
->size
;
2460 /* If this section is unloadable then the scnptr will be 0. */
2461 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2462 section
.s_scnptr
= 0;
2464 section
.s_scnptr
= current
->filepos
;
2465 section
.s_relptr
= current
->rel_filepos
;
2467 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2468 object file produced by the assembler is supposed to point to
2469 information about how much room is required by objects of
2470 various different sizes. I think this only matters if we
2471 want the linker to compute the best size to use, or
2472 something. I don't know what happens if the information is
2474 if (! streq (current
->name
, _PDATA
))
2475 section
.s_lnnoptr
= 0;
2478 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2479 hold the number of entries in the section (each entry is
2480 8 bytes). We stored this in the line_filepos field in
2481 ecoff_compute_section_file_positions. */
2482 section
.s_lnnoptr
= current
->line_filepos
;
2485 section
.s_nreloc
= current
->reloc_count
;
2486 section
.s_nlnno
= 0;
2487 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2490 if (bfd_coff_swap_scnhdr_out (abfd
, (void *) §ion
, buff
) == 0
2491 || bfd_bwrite (buff
, scnhsz
, abfd
) != scnhsz
)
2494 if ((section
.s_flags
& STYP_TEXT
) != 0
2495 || ((section
.s_flags
& STYP_RDATA
) != 0
2496 && ecoff_data (abfd
)->rdata_in_text
)
2497 || section
.s_flags
== STYP_PDATA
2498 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2499 || (section
.s_flags
& STYP_LIBLIST
) != 0
2500 || (section
.s_flags
& STYP_RELDYN
) != 0
2501 || section
.s_flags
== STYP_CONFLIC
2502 || (section
.s_flags
& STYP_DYNSTR
) != 0
2503 || (section
.s_flags
& STYP_DYNSYM
) != 0
2504 || (section
.s_flags
& STYP_HASH
) != 0
2505 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2506 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2507 || section
.s_flags
== STYP_RCONST
)
2509 text_size
+= current
->size
;
2510 if (! set_text_start
|| text_start
> vma
)
2513 set_text_start
= TRUE
;
2516 else if ((section
.s_flags
& STYP_RDATA
) != 0
2517 || (section
.s_flags
& STYP_DATA
) != 0
2518 || (section
.s_flags
& STYP_LITA
) != 0
2519 || (section
.s_flags
& STYP_LIT8
) != 0
2520 || (section
.s_flags
& STYP_LIT4
) != 0
2521 || (section
.s_flags
& STYP_SDATA
) != 0
2522 || section
.s_flags
== STYP_XDATA
2523 || (section
.s_flags
& STYP_GOT
) != 0)
2525 data_size
+= current
->size
;
2526 if (! set_data_start
|| data_start
> vma
)
2529 set_data_start
= TRUE
;
2532 else if ((section
.s_flags
& STYP_BSS
) != 0
2533 || (section
.s_flags
& STYP_SBSS
) != 0)
2534 bss_size
+= current
->size
;
2535 else if (section
.s_flags
== 0
2536 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2537 || section
.s_flags
== STYP_COMMENT
)
2543 /* Set up the file header. */
2544 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2546 /* We will NOT put a fucking timestamp in the header here. Every
2547 time you put it back, I will come in and take it out again. I'm
2548 sorry. This field does not belong here. We fill it with a 0 so
2549 it compares the same but is not a reasonable time. --
2551 internal_f
.f_timdat
= 0;
2553 if (bfd_get_symcount (abfd
) != 0)
2555 /* The ECOFF f_nsyms field is not actually the number of
2556 symbols, it's the size of symbolic information header. */
2557 internal_f
.f_nsyms
= external_hdr_size
;
2558 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2562 internal_f
.f_nsyms
= 0;
2563 internal_f
.f_symptr
= 0;
2566 internal_f
.f_opthdr
= aoutsz
;
2568 internal_f
.f_flags
= F_LNNO
;
2569 if (reloc_size
== 0)
2570 internal_f
.f_flags
|= F_RELFLG
;
2571 if (bfd_get_symcount (abfd
) == 0)
2572 internal_f
.f_flags
|= F_LSYMS
;
2573 if (abfd
->flags
& EXEC_P
)
2574 internal_f
.f_flags
|= F_EXEC
;
2576 if (bfd_little_endian (abfd
))
2577 internal_f
.f_flags
|= F_AR32WR
;
2579 internal_f
.f_flags
|= F_AR32W
;
2581 /* Set up the ``optional'' header. */
2582 if ((abfd
->flags
& D_PAGED
) != 0)
2583 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2585 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2587 /* FIXME: Is this really correct? */
2588 internal_a
.vstamp
= symhdr
->vstamp
;
2590 /* At least on Ultrix, these have to be rounded to page boundaries.
2591 FIXME: Is this true on other platforms? */
2592 if ((abfd
->flags
& D_PAGED
) != 0)
2594 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2595 internal_a
.text_start
= text_start
&~ (round
- 1);
2596 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2597 internal_a
.data_start
= data_start
&~ (round
- 1);
2601 internal_a
.tsize
= text_size
;
2602 internal_a
.text_start
= text_start
;
2603 internal_a
.dsize
= data_size
;
2604 internal_a
.data_start
= data_start
;
2607 /* On Ultrix, the initial portions of the .sbss and .bss segments
2608 are at the end of the data section. The bsize field in the
2609 optional header records how many bss bytes are required beyond
2610 those in the data section. The value is not rounded to a page
2612 if (bss_size
< internal_a
.dsize
- data_size
)
2615 bss_size
-= internal_a
.dsize
- data_size
;
2616 internal_a
.bsize
= bss_size
;
2617 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2619 internal_a
.entry
= bfd_get_start_address (abfd
);
2621 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2623 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2624 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2625 for (i
= 0; i
< 4; i
++)
2626 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2628 /* Let the backend adjust the headers if necessary. */
2629 if (backend
->adjust_headers
)
2631 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2635 /* Write out the file header and the optional header. */
2636 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2639 bfd_coff_swap_filehdr_out (abfd
, (void *) &internal_f
, buff
);
2640 if (bfd_bwrite (buff
, filhsz
, abfd
) != filhsz
)
2643 bfd_coff_swap_aouthdr_out (abfd
, (void *) &internal_a
, buff
);
2644 if (bfd_bwrite (buff
, aoutsz
, abfd
) != aoutsz
)
2647 /* Build the external symbol information. This must be done before
2648 writing out the relocs so that we know the symbol indices. We
2649 don't do this if this BFD was created by the backend linker,
2650 since it will have already handled the symbols and relocs. */
2651 if (! ecoff_data (abfd
)->linker
)
2653 symhdr
->iextMax
= 0;
2654 symhdr
->issExtMax
= 0;
2655 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2656 debug
->ssext
= debug
->ssext_end
= NULL
;
2657 if (! bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2658 (abfd
->flags
& EXEC_P
) == 0,
2659 ecoff_get_extr
, ecoff_set_index
))
2662 /* Write out the relocs. */
2663 for (current
= abfd
->sections
;
2665 current
= current
->next
)
2667 arelent
**reloc_ptr_ptr
;
2668 arelent
**reloc_end
;
2672 if (current
->reloc_count
== 0)
2675 amt
= current
->reloc_count
* external_reloc_size
;
2676 reloc_buff
= bfd_alloc (abfd
, amt
);
2677 if (reloc_buff
== NULL
)
2680 reloc_ptr_ptr
= current
->orelocation
;
2681 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2682 out_ptr
= (char *) reloc_buff
;
2685 reloc_ptr_ptr
< reloc_end
;
2686 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2690 struct internal_reloc in
;
2692 memset ((void *) &in
, 0, sizeof in
);
2694 reloc
= *reloc_ptr_ptr
;
2695 sym
= *reloc
->sym_ptr_ptr
;
2697 /* If the howto field has not been initialised then skip this reloc.
2698 This assumes that an error message has been issued elsewhere. */
2699 if (reloc
->howto
== NULL
)
2702 in
.r_vaddr
= (reloc
->address
2703 + bfd_get_section_vma (abfd
, current
));
2704 in
.r_type
= reloc
->howto
->type
;
2706 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2708 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2722 { _TEXT
, RELOC_SECTION_TEXT
},
2723 { _RDATA
, RELOC_SECTION_RDATA
},
2724 { _DATA
, RELOC_SECTION_DATA
},
2725 { _SDATA
, RELOC_SECTION_SDATA
},
2726 { _SBSS
, RELOC_SECTION_SBSS
},
2727 { _BSS
, RELOC_SECTION_BSS
},
2728 { _INIT
, RELOC_SECTION_INIT
},
2729 { _LIT8
, RELOC_SECTION_LIT8
},
2730 { _LIT4
, RELOC_SECTION_LIT4
},
2731 { _XDATA
, RELOC_SECTION_XDATA
},
2732 { _PDATA
, RELOC_SECTION_PDATA
},
2733 { _FINI
, RELOC_SECTION_FINI
},
2734 { _LITA
, RELOC_SECTION_LITA
},
2735 { "*ABS*", RELOC_SECTION_ABS
},
2736 { _RCONST
, RELOC_SECTION_RCONST
}
2739 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2741 for (j
= 0; j
< ARRAY_SIZE (section_symndx
); j
++)
2742 if (streq (name
, section_symndx
[j
].name
))
2744 in
.r_symndx
= section_symndx
[j
].r_symndx
;
2748 if (j
== ARRAY_SIZE (section_symndx
))
2753 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2755 (*swap_reloc_out
) (abfd
, &in
, (void *) out_ptr
);
2758 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2760 amt
= current
->reloc_count
* external_reloc_size
;
2761 if (bfd_bwrite (reloc_buff
, amt
, abfd
) != amt
)
2763 bfd_release (abfd
, reloc_buff
);
2767 /* Write out the symbolic debugging information. */
2768 if (bfd_get_symcount (abfd
) > 0)
2770 /* Write out the debugging information. */
2771 if (! bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2772 ecoff_data (abfd
)->sym_filepos
))
2777 /* The .bss section of a demand paged executable must receive an
2778 entire page. If there are symbols, the symbols will start on the
2779 next page. If there are no symbols, we must fill out the page by
2781 if (bfd_get_symcount (abfd
) == 0
2782 && (abfd
->flags
& EXEC_P
) != 0
2783 && (abfd
->flags
& D_PAGED
) != 0)
2787 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2790 if (bfd_bread (&c
, (bfd_size_type
) 1, abfd
) == 0)
2792 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2795 if (bfd_bwrite (&c
, (bfd_size_type
) 1, abfd
) != 1)
2799 if (reloc_buff
!= NULL
)
2800 bfd_release (abfd
, reloc_buff
);
2805 if (reloc_buff
!= NULL
)
2806 bfd_release (abfd
, reloc_buff
);
2812 /* Archive handling. ECOFF uses what appears to be a unique type of
2813 archive header (armap). The byte ordering of the armap and the
2814 contents are encoded in the name of the armap itself. At least for
2815 now, we only support archives with the same byte ordering in the
2816 armap and the contents.
2818 The first four bytes in the armap are the number of symbol
2819 definitions. This is always a power of two.
2821 This is followed by the symbol definitions. Each symbol definition
2822 occupies 8 bytes. The first four bytes are the offset from the
2823 start of the armap strings to the null-terminated string naming
2824 this symbol. The second four bytes are the file offset to the
2825 archive member which defines this symbol. If the second four bytes
2826 are 0, then this is not actually a symbol definition, and it should
2829 The symbols are hashed into the armap with a closed hashing scheme.
2830 See the functions below for the details of the algorithm.
2832 After the symbol definitions comes four bytes holding the size of
2833 the string table, followed by the string table itself. */
2835 /* The name of an archive headers looks like this:
2836 __________E[BL]E[BL]_ (with a trailing space).
2837 The trailing space is changed to an X if the archive is changed to
2838 indicate that the armap is out of date.
2840 The Alpha seems to use ________64E[BL]E[BL]_. */
2842 #define ARMAP_BIG_ENDIAN 'B'
2843 #define ARMAP_LITTLE_ENDIAN 'L'
2844 #define ARMAP_MARKER 'E'
2845 #define ARMAP_START_LENGTH 10
2846 #define ARMAP_HEADER_MARKER_INDEX 10
2847 #define ARMAP_HEADER_ENDIAN_INDEX 11
2848 #define ARMAP_OBJECT_MARKER_INDEX 12
2849 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2850 #define ARMAP_END_INDEX 14
2851 #define ARMAP_END "_ "
2853 /* This is a magic number used in the hashing algorithm. */
2854 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2856 /* This returns the hash value to use for a string. It also sets
2857 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2858 is the number of entries in the hash table, and HLOG is the log
2862 ecoff_armap_hash (const char *s
,
2863 unsigned int *rehash
,
2873 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2874 hash
*= ARMAP_HASH_MAGIC
;
2875 *rehash
= (hash
& (size
- 1)) | 1;
2876 return hash
>> (32 - hlog
);
2879 /* Read in the armap. */
2882 _bfd_ecoff_slurp_armap (bfd
*abfd
)
2886 struct areltdata
*mapdata
;
2887 bfd_size_type parsed_size
;
2889 struct artdata
*ardata
;
2896 /* Get the name of the first element. */
2897 i
= bfd_bread ((void *) nextname
, (bfd_size_type
) 16, abfd
);
2903 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2906 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2907 standard COFF armap. We could move the ECOFF armap stuff into
2908 bfd_slurp_armap, but that seems inappropriate since no other
2909 target uses this format. Instead, we check directly for a COFF
2911 if (CONST_STRNEQ (nextname
, "/ "))
2912 return bfd_slurp_armap (abfd
);
2914 /* See if the first element is an armap. */
2915 if (! strneq (nextname
, ecoff_backend (abfd
)->armap_start
, ARMAP_START_LENGTH
)
2916 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
2917 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2918 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2919 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
2920 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2921 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2922 || ! strneq (nextname
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1))
2924 bfd_has_map (abfd
) = FALSE
;
2928 /* Make sure we have the right byte ordering. */
2929 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2930 ^ (bfd_header_big_endian (abfd
)))
2931 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2932 ^ (bfd_big_endian (abfd
))))
2934 bfd_set_error (bfd_error_wrong_format
);
2938 /* Read in the armap. */
2939 ardata
= bfd_ardata (abfd
);
2940 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
2941 if (mapdata
== NULL
)
2943 parsed_size
= mapdata
->parsed_size
;
2946 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
2947 if (raw_armap
== NULL
)
2950 if (bfd_bread ((void *) raw_armap
, parsed_size
, abfd
) != parsed_size
)
2952 if (bfd_get_error () != bfd_error_system_call
)
2953 bfd_set_error (bfd_error_malformed_archive
);
2954 bfd_release (abfd
, (void *) raw_armap
);
2958 ardata
->tdata
= (void *) raw_armap
;
2960 count
= H_GET_32 (abfd
, raw_armap
);
2962 ardata
->symdef_count
= 0;
2963 ardata
->cache
= NULL
;
2965 /* This code used to overlay the symdefs over the raw archive data,
2966 but that doesn't work on a 64 bit host. */
2967 stringbase
= raw_armap
+ count
* 8 + 8;
2969 #ifdef CHECK_ARMAP_HASH
2973 /* Double check that I have the hashing algorithm right by making
2974 sure that every symbol can be looked up successfully. */
2976 for (i
= 1; i
< count
; i
<<= 1)
2978 BFD_ASSERT (i
== count
);
2980 raw_ptr
= raw_armap
+ 4;
2981 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2983 unsigned int name_offset
, file_offset
;
2984 unsigned int hash
, rehash
, srch
;
2986 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2987 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2988 if (file_offset
== 0)
2990 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
2995 /* See if we can rehash to this location. */
2996 for (srch
= (hash
+ rehash
) & (count
- 1);
2997 srch
!= hash
&& srch
!= i
;
2998 srch
= (srch
+ rehash
) & (count
- 1))
2999 BFD_ASSERT (H_GET_32 (abfd
, (raw_armap
+ 8 + srch
* 8)) != 0);
3000 BFD_ASSERT (srch
== i
);
3004 #endif /* CHECK_ARMAP_HASH */
3006 raw_ptr
= raw_armap
+ 4;
3007 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3008 if (H_GET_32 (abfd
, (raw_ptr
+ 4)) != 0)
3009 ++ardata
->symdef_count
;
3011 amt
= ardata
->symdef_count
;
3012 amt
*= sizeof (carsym
);
3013 symdef_ptr
= (carsym
*) bfd_alloc (abfd
, amt
);
3017 ardata
->symdefs
= symdef_ptr
;
3019 raw_ptr
= raw_armap
+ 4;
3020 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3022 unsigned int name_offset
, file_offset
;
3024 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
3025 if (file_offset
== 0)
3027 name_offset
= H_GET_32 (abfd
, raw_ptr
);
3028 symdef_ptr
->name
= stringbase
+ name_offset
;
3029 symdef_ptr
->file_offset
= file_offset
;
3033 ardata
->first_file_filepos
= bfd_tell (abfd
);
3034 /* Pad to an even boundary. */
3035 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3037 bfd_has_map (abfd
) = TRUE
;
3042 /* Write out an armap. */
3045 _bfd_ecoff_write_armap (bfd
*abfd
,
3046 unsigned int elength
,
3048 unsigned int orl_count
,
3051 unsigned int hashsize
, hashlog
;
3052 bfd_size_type symdefsize
;
3054 unsigned int stringsize
;
3055 unsigned int mapsize
;
3058 struct stat statbuf
;
3061 bfd_byte
*hashtable
;
3065 /* Ultrix appears to use as a hash table size the least power of two
3066 greater than twice the number of entries. */
3067 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3069 hashsize
= 1 << hashlog
;
3071 symdefsize
= hashsize
* 8;
3073 stringsize
= stridx
+ padit
;
3075 /* Include 8 bytes to store symdefsize and stringsize in output. */
3076 mapsize
= symdefsize
+ stringsize
+ 8;
3078 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3080 memset ((void *) &hdr
, 0, sizeof hdr
);
3082 /* Work out the ECOFF armap name. */
3083 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3084 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3085 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3086 (bfd_header_big_endian (abfd
)
3088 : ARMAP_LITTLE_ENDIAN
);
3089 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3090 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3091 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3092 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3094 /* Write the timestamp of the archive header to be just a little bit
3095 later than the timestamp of the file, otherwise the linker will
3096 complain that the index is out of date. Actually, the Ultrix
3097 linker just checks the archive name; the GNU linker may check the
3099 stat (abfd
->filename
, &statbuf
);
3100 _bfd_ar_spacepad (hdr
.ar_date
, sizeof (hdr
.ar_date
), "%ld",
3101 (long) (statbuf
.st_mtime
+ 60));
3103 /* The DECstation uses zeroes for the uid, gid and mode of the
3105 hdr
.ar_uid
[0] = '0';
3106 hdr
.ar_gid
[0] = '0';
3107 /* Building gcc ends up extracting the armap as a file - twice. */
3108 hdr
.ar_mode
[0] = '6';
3109 hdr
.ar_mode
[1] = '4';
3110 hdr
.ar_mode
[2] = '4';
3112 _bfd_ar_spacepad (hdr
.ar_size
, sizeof (hdr
.ar_size
), "%-10ld", mapsize
);
3114 hdr
.ar_fmag
[0] = '`';
3115 hdr
.ar_fmag
[1] = '\012';
3117 /* Turn all null bytes in the header into spaces. */
3118 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3119 if (((char *) (&hdr
))[i
] == '\0')
3120 (((char *) (&hdr
))[i
]) = ' ';
3122 if (bfd_bwrite ((void *) &hdr
, (bfd_size_type
) sizeof (struct ar_hdr
), abfd
)
3123 != sizeof (struct ar_hdr
))
3126 H_PUT_32 (abfd
, hashsize
, temp
);
3127 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3130 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3134 current
= abfd
->archive_head
;
3136 for (i
= 0; i
< orl_count
; i
++)
3138 unsigned int hash
, rehash
= 0;
3140 /* Advance firstreal to the file position of this archive
3142 if (map
[i
].u
.abfd
!= last_elt
)
3146 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3147 firstreal
+= firstreal
% 2;
3148 current
= current
->archive_next
;
3150 while (current
!= map
[i
].u
.abfd
);
3155 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3156 if (H_GET_32 (abfd
, (hashtable
+ (hash
* 8) + 4)) != 0)
3160 /* The desired slot is already taken. */
3161 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3163 srch
= (srch
+ rehash
) & (hashsize
- 1))
3164 if (H_GET_32 (abfd
, (hashtable
+ (srch
* 8) + 4)) == 0)
3167 BFD_ASSERT (srch
!= hash
);
3172 H_PUT_32 (abfd
, map
[i
].namidx
, (hashtable
+ hash
* 8));
3173 H_PUT_32 (abfd
, firstreal
, (hashtable
+ hash
* 8 + 4));
3176 if (bfd_bwrite ((void *) hashtable
, symdefsize
, abfd
) != symdefsize
)
3179 bfd_release (abfd
, hashtable
);
3181 /* Now write the strings. */
3182 H_PUT_32 (abfd
, stringsize
, temp
);
3183 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3185 for (i
= 0; i
< orl_count
; i
++)
3189 len
= strlen (*map
[i
].name
) + 1;
3190 if (bfd_bwrite ((void *) (*map
[i
].name
), len
, abfd
) != len
)
3194 /* The spec sez this should be a newline. But in order to be
3195 bug-compatible for DECstation ar we use a null. */
3198 if (bfd_bwrite ("", (bfd_size_type
) 1, abfd
) != 1)
3205 /* ECOFF linker code. */
3207 /* Routine to create an entry in an ECOFF link hash table. */
3209 static struct bfd_hash_entry
*
3210 ecoff_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3211 struct bfd_hash_table
*table
,
3214 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3216 /* Allocate the structure if it has not already been allocated by a
3219 ret
= ((struct ecoff_link_hash_entry
*)
3220 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3224 /* Call the allocation method of the superclass. */
3225 ret
= ((struct ecoff_link_hash_entry
*)
3226 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3231 /* Set local fields. */
3237 memset ((void *) &ret
->esym
, 0, sizeof ret
->esym
);
3239 return (struct bfd_hash_entry
*) ret
;
3242 /* Create an ECOFF link hash table. */
3244 struct bfd_link_hash_table
*
3245 _bfd_ecoff_bfd_link_hash_table_create (bfd
*abfd
)
3247 struct ecoff_link_hash_table
*ret
;
3248 bfd_size_type amt
= sizeof (struct ecoff_link_hash_table
);
3250 ret
= (struct ecoff_link_hash_table
*) bfd_malloc (amt
);
3253 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
3254 ecoff_link_hash_newfunc
,
3255 sizeof (struct ecoff_link_hash_entry
)))
3263 /* Look up an entry in an ECOFF link hash table. */
3265 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3266 ((struct ecoff_link_hash_entry *) \
3267 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3269 /* Get the ECOFF link hash table from the info structure. This is
3272 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3274 /* Add the external symbols of an object file to the global linker
3275 hash table. The external symbols and strings we are passed are
3276 just allocated on the stack, and will be discarded. We must
3277 explicitly save any information we may need later on in the link.
3278 We do not want to read the external symbol information again. */
3281 ecoff_link_add_externals (bfd
*abfd
,
3282 struct bfd_link_info
*info
,
3283 void * external_ext
,
3286 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3287 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
3288 = backend
->debug_swap
.swap_ext_in
;
3289 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3290 unsigned long ext_count
;
3291 struct bfd_link_hash_entry
**sym_hash
;
3296 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3299 amt
*= sizeof (struct bfd_link_hash_entry
*);
3300 sym_hash
= (struct bfd_link_hash_entry
**) bfd_alloc (abfd
, amt
);
3303 ecoff_data (abfd
)->sym_hashes
= (struct ecoff_link_hash_entry
**) sym_hash
;
3305 ext_ptr
= (char *) external_ext
;
3306 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3307 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3314 struct ecoff_link_hash_entry
*h
;
3318 (*swap_ext_in
) (abfd
, (void *) ext_ptr
, &esym
);
3320 /* Skip debugging symbols. */
3322 switch (esym
.asym
.st
)
3338 /* Get the information for this symbol. */
3339 value
= esym
.asym
.value
;
3340 switch (esym
.asym
.sc
)
3360 section
= bfd_make_section_old_way (abfd
, _TEXT
);
3361 value
-= section
->vma
;
3364 section
= bfd_make_section_old_way (abfd
, _DATA
);
3365 value
-= section
->vma
;
3368 section
= bfd_make_section_old_way (abfd
, _BSS
);
3369 value
-= section
->vma
;
3372 section
= bfd_abs_section_ptr
;
3375 section
= bfd_und_section_ptr
;
3378 section
= bfd_make_section_old_way (abfd
, _SDATA
);
3379 value
-= section
->vma
;
3382 section
= bfd_make_section_old_way (abfd
, _SBSS
);
3383 value
-= section
->vma
;
3386 section
= bfd_make_section_old_way (abfd
, _RDATA
);
3387 value
-= section
->vma
;
3390 if (value
> ecoff_data (abfd
)->gp_size
)
3392 section
= bfd_com_section_ptr
;
3397 if (ecoff_scom_section
.name
== NULL
)
3399 /* Initialize the small common section. */
3400 ecoff_scom_section
.name
= SCOMMON
;
3401 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3402 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3403 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3404 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3405 ecoff_scom_symbol
.name
= SCOMMON
;
3406 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3407 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3408 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3410 section
= &ecoff_scom_section
;
3413 section
= bfd_und_section_ptr
;
3416 section
= bfd_make_section_old_way (abfd
, _INIT
);
3417 value
-= section
->vma
;
3420 section
= bfd_make_section_old_way (abfd
, _FINI
);
3421 value
-= section
->vma
;
3424 section
= bfd_make_section_old_way (abfd
, _RCONST
);
3425 value
-= section
->vma
;
3429 if (section
== NULL
)
3432 name
= ssext
+ esym
.asym
.iss
;
3434 if (! (_bfd_generic_link_add_one_symbol
3436 (flagword
) (esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
),
3437 section
, value
, NULL
, TRUE
, TRUE
, sym_hash
)))
3440 h
= (struct ecoff_link_hash_entry
*) *sym_hash
;
3442 /* If we are building an ECOFF hash table, save the external
3443 symbol information. */
3444 if (bfd_get_flavour (info
->output_bfd
) == bfd_get_flavour (abfd
))
3447 || (! bfd_is_und_section (section
)
3448 && (! bfd_is_com_section (section
)
3449 || (h
->root
.type
!= bfd_link_hash_defined
3450 && h
->root
.type
!= bfd_link_hash_defweak
))))
3456 /* Remember whether this symbol was small undefined. */
3457 if (esym
.asym
.sc
== scSUndefined
)
3460 /* If this symbol was ever small undefined, it needs to wind
3461 up in a GP relative section. We can't control the
3462 section of a defined symbol, but we can control the
3463 section of a common symbol. This case is actually needed
3464 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3466 && h
->root
.type
== bfd_link_hash_common
3467 && streq (h
->root
.u
.c
.p
->section
->name
, SCOMMON
))
3469 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
3471 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
3472 if (h
->esym
.asym
.sc
== scCommon
)
3473 h
->esym
.asym
.sc
= scSCommon
;
3481 /* Add symbols from an ECOFF object file to the global linker hash
3485 ecoff_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3488 bfd_size_type external_ext_size
;
3489 void * external_ext
= NULL
;
3490 bfd_size_type esize
;
3494 if (! ecoff_slurp_symbolic_header (abfd
))
3497 /* If there are no symbols, we don't want it. */
3498 if (bfd_get_symcount (abfd
) == 0)
3501 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3503 /* Read in the external symbols and external strings. */
3504 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3505 esize
= symhdr
->iextMax
* external_ext_size
;
3506 external_ext
= bfd_malloc (esize
);
3507 if (external_ext
== NULL
&& esize
!= 0)
3510 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3511 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3514 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3515 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3518 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3519 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3520 != (bfd_size_type
) symhdr
->issExtMax
))
3523 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3527 if (external_ext
!= NULL
)
3528 free (external_ext
);
3534 if (external_ext
!= NULL
)
3535 free (external_ext
);
3539 /* This is called if we used _bfd_generic_link_add_archive_symbols
3540 because we were not dealing with an ECOFF archive. */
3543 ecoff_link_check_archive_element (bfd
*abfd
,
3544 struct bfd_link_info
*info
,
3545 struct bfd_link_hash_entry
*h
,
3547 bfd_boolean
*pneeded
)
3551 /* Unlike the generic linker, we do not pull in elements because
3552 of common symbols. */
3553 if (h
->type
!= bfd_link_hash_undefined
)
3556 /* Include this element? */
3557 if (!(*info
->callbacks
->add_archive_element
) (info
, abfd
, name
, &abfd
))
3561 return ecoff_link_add_object_symbols (abfd
, info
);
3564 /* Add the symbols from an archive file to the global hash table.
3565 This looks through the undefined symbols, looks each one up in the
3566 archive hash table, and adds any associated object file. We do not
3567 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3568 already have a hash table, so there is no reason to construct
3572 ecoff_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3574 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3575 const bfd_byte
*raw_armap
;
3576 struct bfd_link_hash_entry
**pundef
;
3577 unsigned int armap_count
;
3578 unsigned int armap_log
;
3580 const bfd_byte
*hashtable
;
3581 const char *stringbase
;
3583 if (! bfd_has_map (abfd
))
3585 /* An empty archive is a special case. */
3586 if (bfd_openr_next_archived_file (abfd
, NULL
) == NULL
)
3588 bfd_set_error (bfd_error_no_armap
);
3592 /* If we don't have any raw data for this archive, as can happen on
3593 Irix 4.0.5F, we call the generic routine.
3594 FIXME: We should be more clever about this, since someday tdata
3595 may get to something for a generic archive. */
3596 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3597 if (raw_armap
== NULL
)
3598 return (_bfd_generic_link_add_archive_symbols
3599 (abfd
, info
, ecoff_link_check_archive_element
));
3601 armap_count
= H_GET_32 (abfd
, raw_armap
);
3604 for (i
= 1; i
< armap_count
; i
<<= 1)
3606 BFD_ASSERT (i
== armap_count
);
3608 hashtable
= raw_armap
+ 4;
3609 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3611 /* Look through the list of undefined symbols. */
3612 pundef
= &info
->hash
->undefs
;
3613 while (*pundef
!= NULL
)
3615 struct bfd_link_hash_entry
*h
;
3616 unsigned int hash
, rehash
= 0;
3617 unsigned int file_offset
;
3623 /* When a symbol is defined, it is not necessarily removed from
3625 if (h
->type
!= bfd_link_hash_undefined
3626 && h
->type
!= bfd_link_hash_common
)
3628 /* Remove this entry from the list, for general cleanliness
3629 and because we are going to look through the list again
3630 if we search any more libraries. We can't remove the
3631 entry if it is the tail, because that would lose any
3632 entries we add to the list later on. */
3633 if (*pundef
!= info
->hash
->undefs_tail
)
3634 *pundef
= (*pundef
)->u
.undef
.next
;
3636 pundef
= &(*pundef
)->u
.undef
.next
;
3640 /* Native ECOFF linkers do not pull in archive elements merely
3641 to satisfy common definitions, so neither do we. We leave
3642 them on the list, though, in case we are linking against some
3643 other object format. */
3644 if (h
->type
!= bfd_link_hash_undefined
)
3646 pundef
= &(*pundef
)->u
.undef
.next
;
3650 /* Look for this symbol in the archive hash table. */
3651 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3654 file_offset
= H_GET_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3655 if (file_offset
== 0)
3657 /* Nothing in this slot. */
3658 pundef
= &(*pundef
)->u
.undef
.next
;
3662 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (hash
* 8));
3663 if (name
[0] != h
->root
.string
[0]
3664 || ! streq (name
, h
->root
.string
))
3669 /* That was the wrong symbol. Try rehashing. */
3671 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3673 srch
= (srch
+ rehash
) & (armap_count
- 1))
3675 file_offset
= H_GET_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3676 if (file_offset
== 0)
3678 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (srch
* 8));
3679 if (name
[0] == h
->root
.string
[0]
3680 && streq (name
, h
->root
.string
))
3689 pundef
= &(*pundef
)->u
.undef
.next
;
3696 element
= (*backend
->get_elt_at_filepos
) (abfd
, (file_ptr
) file_offset
);
3697 if (element
== NULL
)
3700 if (! bfd_check_format (element
, bfd_object
))
3703 /* Unlike the generic linker, we know that this element provides
3704 a definition for an undefined symbol and we know that we want
3705 to include it. We don't need to check anything. */
3706 if (!(*info
->callbacks
3707 ->add_archive_element
) (info
, element
, name
, &element
))
3709 if (! ecoff_link_add_object_symbols (element
, info
))
3712 pundef
= &(*pundef
)->u
.undef
.next
;
3718 /* Given an ECOFF BFD, add symbols to the global hash table as
3722 _bfd_ecoff_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3724 switch (bfd_get_format (abfd
))
3727 return ecoff_link_add_object_symbols (abfd
, info
);
3729 return ecoff_link_add_archive_symbols (abfd
, info
);
3731 bfd_set_error (bfd_error_wrong_format
);
3737 /* ECOFF final link routines. */
3739 /* Structure used to pass information to ecoff_link_write_external. */
3744 struct bfd_link_info
*info
;
3747 /* Accumulate the debugging information for an input BFD into the
3748 output BFD. This must read in the symbolic information of the
3752 ecoff_final_link_debug_accumulate (bfd
*output_bfd
,
3754 struct bfd_link_info
*info
,
3757 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
3758 const struct ecoff_debug_swap
* const swap
=
3759 &ecoff_backend (input_bfd
)->debug_swap
;
3760 HDRR
*symhdr
= &debug
->symbolic_header
;
3763 #define READ(ptr, offset, count, size, type) \
3764 if (symhdr->count == 0) \
3765 debug->ptr = NULL; \
3768 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
3769 debug->ptr = (type) bfd_malloc (amt); \
3770 if (debug->ptr == NULL) \
3773 goto return_something; \
3775 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
3776 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
3779 goto return_something; \
3783 /* If raw_syments is not NULL, then the data was already by read by
3784 _bfd_ecoff_slurp_symbolic_info. */
3785 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3787 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
3789 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, void *);
3790 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, void *);
3791 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, void *);
3792 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, void *);
3793 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
3795 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
3796 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, void *);
3797 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, void *);
3801 /* We do not read the external strings or the external symbols. */
3803 ret
= (bfd_ecoff_debug_accumulate
3804 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
3805 &ecoff_backend (output_bfd
)->debug_swap
,
3806 input_bfd
, debug
, swap
, info
));
3809 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3811 if (debug
->line
!= NULL
)
3813 if (debug
->external_dnr
!= NULL
)
3814 free (debug
->external_dnr
);
3815 if (debug
->external_pdr
!= NULL
)
3816 free (debug
->external_pdr
);
3817 if (debug
->external_sym
!= NULL
)
3818 free (debug
->external_sym
);
3819 if (debug
->external_opt
!= NULL
)
3820 free (debug
->external_opt
);
3821 if (debug
->external_aux
!= NULL
)
3822 free (debug
->external_aux
);
3823 if (debug
->ss
!= NULL
)
3825 if (debug
->external_fdr
!= NULL
)
3826 free (debug
->external_fdr
);
3827 if (debug
->external_rfd
!= NULL
)
3828 free (debug
->external_rfd
);
3830 /* Make sure we don't accidentally follow one of these pointers
3831 into freed memory. */
3833 debug
->external_dnr
= NULL
;
3834 debug
->external_pdr
= NULL
;
3835 debug
->external_sym
= NULL
;
3836 debug
->external_opt
= NULL
;
3837 debug
->external_aux
= NULL
;
3839 debug
->external_fdr
= NULL
;
3840 debug
->external_rfd
= NULL
;
3846 /* Relocate and write an ECOFF section into an ECOFF output file. */
3849 ecoff_indirect_link_order (bfd
*output_bfd
,
3850 struct bfd_link_info
*info
,
3851 asection
*output_section
,
3852 struct bfd_link_order
*link_order
)
3854 asection
*input_section
;
3856 bfd_byte
*contents
= NULL
;
3857 bfd_size_type external_reloc_size
;
3858 bfd_size_type external_relocs_size
;
3859 void * external_relocs
= NULL
;
3861 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
3863 input_section
= link_order
->u
.indirect
.section
;
3864 input_bfd
= input_section
->owner
;
3865 if (input_section
->size
== 0)
3868 BFD_ASSERT (input_section
->output_section
== output_section
);
3869 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
3870 BFD_ASSERT (input_section
->size
== link_order
->size
);
3872 /* Get the section contents. */
3873 if (!bfd_malloc_and_get_section (input_bfd
, input_section
, &contents
))
3876 /* Get the relocs. If we are relaxing MIPS code, they will already
3877 have been read in. Otherwise, we read them in now. */
3878 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
3879 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
3881 external_relocs
= bfd_malloc (external_relocs_size
);
3882 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
3885 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
3886 || (bfd_bread (external_relocs
, external_relocs_size
, input_bfd
)
3887 != external_relocs_size
))
3890 /* Relocate the section contents. */
3891 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
3892 (output_bfd
, info
, input_bfd
, input_section
, contents
,
3896 /* Write out the relocated section. */
3897 if (! bfd_set_section_contents (output_bfd
,
3900 input_section
->output_offset
,
3901 input_section
->size
))
3904 /* If we are producing relocatable output, the relocs were
3905 modified, and we write them out now. We use the reloc_count
3906 field of output_section to keep track of the number of relocs we
3907 have output so far. */
3908 if (bfd_link_relocatable (info
))
3910 file_ptr pos
= (output_section
->rel_filepos
3911 + output_section
->reloc_count
* external_reloc_size
);
3912 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
3913 || (bfd_bwrite (external_relocs
, external_relocs_size
, output_bfd
)
3914 != external_relocs_size
))
3916 output_section
->reloc_count
+= input_section
->reloc_count
;
3919 if (contents
!= NULL
)
3921 if (external_relocs
!= NULL
)
3922 free (external_relocs
);
3926 if (contents
!= NULL
)
3928 if (external_relocs
!= NULL
)
3929 free (external_relocs
);
3933 /* Generate a reloc when linking an ECOFF file. This is a reloc
3934 requested by the linker, and does come from any input file. This
3935 is used to build constructor and destructor tables when linking
3939 ecoff_reloc_link_order (bfd
*output_bfd
,
3940 struct bfd_link_info
*info
,
3941 asection
*output_section
,
3942 struct bfd_link_order
*link_order
)
3944 enum bfd_link_order_type type
;
3948 struct internal_reloc in
;
3949 bfd_size_type external_reloc_size
;
3954 type
= link_order
->type
;
3956 addend
= link_order
->u
.reloc
.p
->addend
;
3958 /* We set up an arelent to pass to the backend adjust_reloc_out
3960 rel
.address
= link_order
->offset
;
3962 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
3965 bfd_set_error (bfd_error_bad_value
);
3969 if (type
== bfd_section_reloc_link_order
)
3971 section
= link_order
->u
.reloc
.p
->u
.section
;
3972 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
3976 struct bfd_link_hash_entry
*h
;
3978 /* Treat a reloc against a defined symbol as though it were
3979 actually against the section. */
3980 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
3981 link_order
->u
.reloc
.p
->u
.name
,
3982 FALSE
, FALSE
, FALSE
);
3984 && (h
->type
== bfd_link_hash_defined
3985 || h
->type
== bfd_link_hash_defweak
))
3987 type
= bfd_section_reloc_link_order
;
3988 section
= h
->u
.def
.section
->output_section
;
3989 /* It seems that we ought to add the symbol value to the
3990 addend here, but in practice it has already been added
3991 because it was passed to constructor_callback. */
3992 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
3996 /* We can't set up a reloc against a symbol correctly,
3997 because we have no asymbol structure. Currently no
3998 adjust_reloc_out routine cares. */
3999 rel
.sym_ptr_ptr
= NULL
;
4003 /* All ECOFF relocs are in-place. Put the addend into the object
4006 BFD_ASSERT (rel
.howto
->partial_inplace
);
4010 bfd_reloc_status_type rstat
;
4013 size
= bfd_get_reloc_size (rel
.howto
);
4014 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4015 if (buf
== NULL
&& size
!= 0)
4017 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
,
4018 (bfd_vma
) addend
, buf
);
4024 case bfd_reloc_outofrange
:
4026 case bfd_reloc_overflow
:
4027 (*info
->callbacks
->reloc_overflow
)
4029 (link_order
->type
== bfd_section_reloc_link_order
4030 ? bfd_section_name (output_bfd
, section
)
4031 : link_order
->u
.reloc
.p
->u
.name
),
4032 rel
.howto
->name
, addend
, NULL
, NULL
, (bfd_vma
) 0);
4035 ok
= bfd_set_section_contents (output_bfd
, output_section
, (void *) buf
,
4036 (file_ptr
) link_order
->offset
, size
);
4044 /* Move the information into an internal_reloc structure. */
4045 in
.r_vaddr
= (rel
.address
4046 + bfd_get_section_vma (output_bfd
, output_section
));
4047 in
.r_type
= rel
.howto
->type
;
4049 if (type
== bfd_symbol_reloc_link_order
)
4051 struct ecoff_link_hash_entry
*h
;
4053 h
= ((struct ecoff_link_hash_entry
*)
4054 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4055 link_order
->u
.reloc
.p
->u
.name
,
4056 FALSE
, FALSE
, TRUE
));
4059 in
.r_symndx
= h
->indx
;
4062 (*info
->callbacks
->unattached_reloc
)
4063 (info
, link_order
->u
.reloc
.p
->u
.name
, NULL
, NULL
, (bfd_vma
) 0);
4079 { _TEXT
, RELOC_SECTION_TEXT
},
4080 { _RDATA
, RELOC_SECTION_RDATA
},
4081 { _DATA
, RELOC_SECTION_DATA
},
4082 { _SDATA
, RELOC_SECTION_SDATA
},
4083 { _SBSS
, RELOC_SECTION_SBSS
},
4084 { _BSS
, RELOC_SECTION_BSS
},
4085 { _INIT
, RELOC_SECTION_INIT
},
4086 { _LIT8
, RELOC_SECTION_LIT8
},
4087 { _LIT4
, RELOC_SECTION_LIT4
},
4088 { _XDATA
, RELOC_SECTION_XDATA
},
4089 { _PDATA
, RELOC_SECTION_PDATA
},
4090 { _FINI
, RELOC_SECTION_FINI
},
4091 { _LITA
, RELOC_SECTION_LITA
},
4092 { "*ABS*", RELOC_SECTION_ABS
},
4093 { _RCONST
, RELOC_SECTION_RCONST
}
4096 name
= bfd_get_section_name (output_bfd
, section
);
4098 for (i
= 0; i
< ARRAY_SIZE (section_symndx
); i
++)
4099 if (streq (name
, section_symndx
[i
].name
))
4101 in
.r_symndx
= section_symndx
[i
].r_symndx
;
4105 if (i
== ARRAY_SIZE (section_symndx
))
4111 /* Let the BFD backend adjust the reloc. */
4112 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4114 /* Get some memory and swap out the reloc. */
4115 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4116 rbuf
= (bfd_byte
*) bfd_malloc (external_reloc_size
);
4120 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (void *) rbuf
);
4122 pos
= (output_section
->rel_filepos
4123 + output_section
->reloc_count
* external_reloc_size
);
4124 ok
= (bfd_seek (output_bfd
, pos
, SEEK_SET
) == 0
4125 && (bfd_bwrite ((void *) rbuf
, external_reloc_size
, output_bfd
)
4126 == external_reloc_size
));
4129 ++output_section
->reloc_count
;
4136 /* Put out information for an external symbol. These come only from
4140 ecoff_link_write_external (struct bfd_hash_entry
*bh
, void * data
)
4142 struct ecoff_link_hash_entry
*h
= (struct ecoff_link_hash_entry
*) bh
;
4143 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4144 bfd
*output_bfd
= einfo
->abfd
;
4147 if (h
->root
.type
== bfd_link_hash_warning
)
4149 h
= (struct ecoff_link_hash_entry
*) h
->root
.u
.i
.link
;
4150 if (h
->root
.type
== bfd_link_hash_new
)
4154 /* We need to check if this symbol is being stripped. */
4155 if (h
->root
.type
== bfd_link_hash_undefined
4156 || h
->root
.type
== bfd_link_hash_undefweak
)
4158 else if (einfo
->info
->strip
== strip_all
4159 || (einfo
->info
->strip
== strip_some
4160 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4161 h
->root
.root
.string
,
4162 FALSE
, FALSE
) == NULL
))
4167 if (strip
|| h
->written
)
4170 if (h
->abfd
== NULL
)
4173 h
->esym
.cobol_main
= 0;
4174 h
->esym
.weakext
= 0;
4175 h
->esym
.reserved
= 0;
4176 h
->esym
.ifd
= ifdNil
;
4177 h
->esym
.asym
.value
= 0;
4178 h
->esym
.asym
.st
= stGlobal
;
4180 if (h
->root
.type
!= bfd_link_hash_defined
4181 && h
->root
.type
!= bfd_link_hash_defweak
)
4182 h
->esym
.asym
.sc
= scAbs
;
4185 asection
*output_section
;
4193 section_storage_classes
[] =
4197 { _SDATA
, scSData
},
4198 { _RDATA
, scRData
},
4203 { _PDATA
, scPData
},
4204 { _XDATA
, scXData
},
4205 { _RCONST
, scRConst
}
4208 output_section
= h
->root
.u
.def
.section
->output_section
;
4209 name
= bfd_section_name (output_section
->owner
, output_section
);
4211 for (i
= 0; i
< ARRAY_SIZE (section_storage_classes
); i
++)
4212 if (streq (name
, section_storage_classes
[i
].name
))
4214 h
->esym
.asym
.sc
= section_storage_classes
[i
].sc
;
4218 if (i
== ARRAY_SIZE (section_storage_classes
))
4219 h
->esym
.asym
.sc
= scAbs
;
4222 h
->esym
.asym
.reserved
= 0;
4223 h
->esym
.asym
.index
= indexNil
;
4225 else if (h
->esym
.ifd
!= -1)
4227 struct ecoff_debug_info
*debug
;
4229 /* Adjust the FDR index for the symbol by that used for the
4231 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4232 BFD_ASSERT (h
->esym
.ifd
>= 0
4233 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4234 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4237 switch (h
->root
.type
)
4240 case bfd_link_hash_warning
:
4241 case bfd_link_hash_new
:
4243 case bfd_link_hash_undefined
:
4244 case bfd_link_hash_undefweak
:
4245 if (h
->esym
.asym
.sc
!= scUndefined
4246 && h
->esym
.asym
.sc
!= scSUndefined
)
4247 h
->esym
.asym
.sc
= scUndefined
;
4249 case bfd_link_hash_defined
:
4250 case bfd_link_hash_defweak
:
4251 if (h
->esym
.asym
.sc
== scUndefined
4252 || h
->esym
.asym
.sc
== scSUndefined
)
4253 h
->esym
.asym
.sc
= scAbs
;
4254 else if (h
->esym
.asym
.sc
== scCommon
)
4255 h
->esym
.asym
.sc
= scBss
;
4256 else if (h
->esym
.asym
.sc
== scSCommon
)
4257 h
->esym
.asym
.sc
= scSBss
;
4258 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4259 + h
->root
.u
.def
.section
->output_section
->vma
4260 + h
->root
.u
.def
.section
->output_offset
);
4262 case bfd_link_hash_common
:
4263 if (h
->esym
.asym
.sc
!= scCommon
4264 && h
->esym
.asym
.sc
!= scSCommon
)
4265 h
->esym
.asym
.sc
= scCommon
;
4266 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4268 case bfd_link_hash_indirect
:
4269 /* We ignore these symbols, since the indirected symbol is
4270 already in the hash table. */
4274 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4276 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4279 return (bfd_ecoff_debug_one_external
4280 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4281 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4285 /* ECOFF final link routine. This looks through all the input BFDs
4286 and gathers together all the debugging information, and then
4287 processes all the link order information. This may cause it to
4288 close and reopen some input BFDs; I'll see how bad this is. */
4291 _bfd_ecoff_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
4293 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4294 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4299 struct bfd_link_order
*p
;
4300 struct extsym_info einfo
;
4302 /* We accumulate the debugging information counts in the symbolic
4304 symhdr
= &debug
->symbolic_header
;
4306 symhdr
->ilineMax
= 0;
4310 symhdr
->isymMax
= 0;
4311 symhdr
->ioptMax
= 0;
4312 symhdr
->iauxMax
= 0;
4314 symhdr
->issExtMax
= 0;
4317 symhdr
->iextMax
= 0;
4319 /* We accumulate the debugging information itself in the debug_info
4322 debug
->external_dnr
= NULL
;
4323 debug
->external_pdr
= NULL
;
4324 debug
->external_sym
= NULL
;
4325 debug
->external_opt
= NULL
;
4326 debug
->external_aux
= NULL
;
4328 debug
->ssext
= debug
->ssext_end
= NULL
;
4329 debug
->external_fdr
= NULL
;
4330 debug
->external_rfd
= NULL
;
4331 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4333 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4337 /* Accumulate the debugging symbols from each input BFD. */
4338 for (input_bfd
= info
->input_bfds
;
4340 input_bfd
= input_bfd
->link
.next
)
4344 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4346 /* Arbitrarily set the symbolic header vstamp to the vstamp
4347 of the first object file in the link. */
4348 if (symhdr
->vstamp
== 0)
4350 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4351 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4355 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4356 debug
, &backend
->debug_swap
,
4361 /* Combine the register masks. */
4362 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4363 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4364 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4365 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4366 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4367 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4370 /* Write out the external symbols. */
4373 bfd_hash_traverse (&info
->hash
->table
, ecoff_link_write_external
, &einfo
);
4375 if (bfd_link_relocatable (info
))
4377 /* We need to make a pass over the link_orders to count up the
4378 number of relocations we will need to output, so that we know
4379 how much space they will take up. */
4380 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4383 for (p
= o
->map_head
.link_order
;
4386 if (p
->type
== bfd_indirect_link_order
)
4387 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4388 else if (p
->type
== bfd_section_reloc_link_order
4389 || p
->type
== bfd_symbol_reloc_link_order
)
4394 /* Compute the reloc and symbol file positions. */
4395 ecoff_compute_reloc_file_positions (abfd
);
4397 /* Write out the debugging information. */
4398 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4399 &backend
->debug_swap
, info
,
4400 ecoff_data (abfd
)->sym_filepos
))
4403 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4405 if (bfd_link_relocatable (info
))
4407 /* Now reset the reloc_count field of the sections in the output
4408 BFD to 0, so that we can use them to keep track of how many
4409 relocs we have output thus far. */
4410 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4414 /* Get a value for the GP register. */
4415 if (ecoff_data (abfd
)->gp
== 0)
4417 struct bfd_link_hash_entry
*h
;
4419 h
= bfd_link_hash_lookup (info
->hash
, "_gp", FALSE
, FALSE
, TRUE
);
4421 && h
->type
== bfd_link_hash_defined
)
4422 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4423 + h
->u
.def
.section
->output_section
->vma
4424 + h
->u
.def
.section
->output_offset
);
4425 else if (bfd_link_relocatable (info
))
4429 /* Make up a value. */
4431 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4434 && (streq (o
->name
, _SBSS
)
4435 || streq (o
->name
, _SDATA
)
4436 || streq (o
->name
, _LIT4
)
4437 || streq (o
->name
, _LIT8
)
4438 || streq (o
->name
, _LITA
)))
4441 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4445 /* If the relocate_section function needs to do a reloc
4446 involving the GP value, it should make a reloc_dangerous
4447 callback to warn that GP is not defined. */
4451 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4453 for (p
= o
->map_head
.link_order
;
4457 if (p
->type
== bfd_indirect_link_order
4458 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4459 == bfd_target_ecoff_flavour
))
4461 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4464 else if (p
->type
== bfd_section_reloc_link_order
4465 || p
->type
== bfd_symbol_reloc_link_order
)
4467 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4472 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4478 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4480 ecoff_data (abfd
)->linker
= TRUE
;