1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
4 Original version by Per Bothner.
5 Full support added by Ian Lance Taylor, ian@cygnus.com.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #include "aout/ranlib.h"
29 #include "aout/stab_gnu.h"
31 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
32 some other stuff which we don't want and which conflicts with stuff
35 #include "aout/aout64.h"
38 #undef obj_sym_filepos
40 #include "coff/internal.h"
42 #include "coff/symconst.h"
43 #include "coff/ecoff.h"
47 /* Prototypes for static functions. */
49 static int ecoff_get_magic
PARAMS ((bfd
*abfd
));
50 static long ecoff_sec_to_styp_flags
PARAMS ((const char *name
,
52 static boolean ecoff_slurp_symbolic_header
PARAMS ((bfd
*abfd
));
53 static boolean ecoff_set_symbol_info
PARAMS ((bfd
*abfd
, SYMR
*ecoff_sym
,
54 asymbol
*asym
, int ext
, int weak
));
55 static void ecoff_emit_aggregate
PARAMS ((bfd
*abfd
, FDR
*fdr
,
57 RNDXR
*rndx
, long isym
,
59 static char *ecoff_type_to_string
PARAMS ((bfd
*abfd
, FDR
*fdr
,
61 static boolean ecoff_slurp_reloc_table
PARAMS ((bfd
*abfd
, asection
*section
,
63 static int ecoff_sort_hdrs
PARAMS ((const PTR
, const PTR
));
64 static boolean ecoff_compute_section_file_positions
PARAMS ((bfd
*abfd
));
65 static bfd_size_type ecoff_compute_reloc_file_positions
PARAMS ((bfd
*abfd
));
66 static boolean ecoff_get_extr
PARAMS ((asymbol
*, EXTR
*));
67 static void ecoff_set_index
PARAMS ((asymbol
*, bfd_size_type
));
68 static unsigned int ecoff_armap_hash
PARAMS ((CONST
char *s
,
73 /* This stuff is somewhat copied from coffcode.h. */
75 static asection bfd_debug_section
=
77 /* name, index, next, flags, set_vma, reloc_done, linker_mark, gc_mark */
78 "*DEBUG*", 0, 0, 0, 0, 0, 0, 0,
79 /* vma, lma, _cooked_size, _raw_size, output_offset, output_section, */
81 /* alig, reloc..., orel..., reloc_count, filepos, rel_..., line_... */
83 /* userdata, contents, lineno, lineno_count */
85 /* comdat_info, moving_line_filepos, target_index, used_by_bfd, */
87 /* cons, owner, symbol */
88 0, 0, (struct symbol_cache_entry
*) NULL
,
89 /* symbol_ptr_ptr, link_order_head, ..._tail */
90 (struct symbol_cache_entry
**) NULL
, NULL
, NULL
93 /* Create an ECOFF object. */
96 _bfd_ecoff_mkobject (abfd
)
99 abfd
->tdata
.ecoff_obj_data
= ((struct ecoff_tdata
*)
100 bfd_zalloc (abfd
, sizeof (ecoff_data_type
)));
101 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
107 /* This is a hook called by coff_real_object_p to create any backend
108 specific information. */
111 _bfd_ecoff_mkobject_hook (abfd
, filehdr
, aouthdr
)
116 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
117 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
118 ecoff_data_type
*ecoff
;
120 if (_bfd_ecoff_mkobject (abfd
) == false)
123 ecoff
= ecoff_data (abfd
);
125 ecoff
->sym_filepos
= internal_f
->f_symptr
;
127 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
131 ecoff
->text_start
= internal_a
->text_start
;
132 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
133 ecoff
->gp
= internal_a
->gp_value
;
134 ecoff
->gprmask
= internal_a
->gprmask
;
135 for (i
= 0; i
< 4; i
++)
136 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
137 ecoff
->fprmask
= internal_a
->fprmask
;
138 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
139 abfd
->flags
|= D_PAGED
;
141 abfd
->flags
&=~ D_PAGED
;
144 /* It turns out that no special action is required by the MIPS or
145 Alpha ECOFF backends. They have different information in the
146 a.out header, but we just copy it all (e.g., gprmask, cprmask and
147 fprmask) and let the swapping routines ensure that only relevant
148 information is written out. */
153 /* Initialize a new section. */
156 _bfd_ecoff_new_section_hook (abfd
, section
)
157 bfd
*abfd ATTRIBUTE_UNUSED
;
160 section
->alignment_power
= 4;
162 if (strcmp (section
->name
, _TEXT
) == 0
163 || strcmp (section
->name
, _INIT
) == 0
164 || strcmp (section
->name
, _FINI
) == 0)
165 section
->flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
166 else if (strcmp (section
->name
, _DATA
) == 0
167 || strcmp (section
->name
, _SDATA
) == 0)
168 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
169 else if (strcmp (section
->name
, _RDATA
) == 0
170 || strcmp (section
->name
, _LIT8
) == 0
171 || strcmp (section
->name
, _LIT4
) == 0
172 || strcmp (section
->name
, _RCONST
) == 0
173 || strcmp (section
->name
, _PDATA
) == 0)
174 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
175 else if (strcmp (section
->name
, _BSS
) == 0
176 || strcmp (section
->name
, _SBSS
) == 0)
177 section
->flags
|= SEC_ALLOC
;
178 else if (strcmp (section
->name
, _LIB
) == 0)
180 /* An Irix 4 shared libary. */
181 section
->flags
|= SEC_COFF_SHARED_LIBRARY
;
184 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
185 uncertain about .init on some systems and I don't know how shared
191 /* Determine the machine architecture and type. This is called from
192 the generic COFF routines. It is the inverse of ecoff_get_magic,
193 below. This could be an ECOFF backend routine, with one version
194 for each target, but there aren't all that many ECOFF targets. */
197 _bfd_ecoff_set_arch_mach_hook (abfd
, filehdr
)
201 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
202 enum bfd_architecture arch
;
205 switch (internal_f
->f_magic
)
208 case MIPS_MAGIC_LITTLE
:
210 arch
= bfd_arch_mips
;
214 case MIPS_MAGIC_LITTLE2
:
215 case MIPS_MAGIC_BIG2
:
216 /* MIPS ISA level 2: the r6000 */
217 arch
= bfd_arch_mips
;
221 case MIPS_MAGIC_LITTLE3
:
222 case MIPS_MAGIC_BIG3
:
223 /* MIPS ISA level 3: the r4000 */
224 arch
= bfd_arch_mips
;
229 arch
= bfd_arch_alpha
;
234 arch
= bfd_arch_obscure
;
239 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
242 /* Get the magic number to use based on the architecture and machine.
243 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
246 ecoff_get_magic (abfd
)
251 switch (bfd_get_arch (abfd
))
254 switch (bfd_get_mach (abfd
))
259 big
= MIPS_MAGIC_BIG
;
260 little
= MIPS_MAGIC_LITTLE
;
264 big
= MIPS_MAGIC_BIG2
;
265 little
= MIPS_MAGIC_LITTLE2
;
269 big
= MIPS_MAGIC_BIG3
;
270 little
= MIPS_MAGIC_LITTLE3
;
274 return bfd_big_endian (abfd
) ? big
: little
;
285 /* Get the section s_flags to use for a section. */
288 ecoff_sec_to_styp_flags (name
, flags
)
296 if (strcmp (name
, _TEXT
) == 0)
298 else if (strcmp (name
, _DATA
) == 0)
300 else if (strcmp (name
, _SDATA
) == 0)
302 else if (strcmp (name
, _RDATA
) == 0)
304 else if (strcmp (name
, _LITA
) == 0)
306 else if (strcmp (name
, _LIT8
) == 0)
308 else if (strcmp (name
, _LIT4
) == 0)
310 else if (strcmp (name
, _BSS
) == 0)
312 else if (strcmp (name
, _SBSS
) == 0)
314 else if (strcmp (name
, _INIT
) == 0)
315 styp
= STYP_ECOFF_INIT
;
316 else if (strcmp (name
, _FINI
) == 0)
317 styp
= STYP_ECOFF_FINI
;
318 else if (strcmp (name
, _PDATA
) == 0)
320 else if (strcmp (name
, _XDATA
) == 0)
322 else if (strcmp (name
, _LIB
) == 0)
323 styp
= STYP_ECOFF_LIB
;
324 else if (strcmp (name
, _GOT
) == 0)
326 else if (strcmp (name
, _HASH
) == 0)
328 else if (strcmp (name
, _DYNAMIC
) == 0)
330 else if (strcmp (name
, _LIBLIST
) == 0)
332 else if (strcmp (name
, _RELDYN
) == 0)
334 else if (strcmp (name
, _CONFLIC
) == 0)
336 else if (strcmp (name
, _DYNSTR
) == 0)
338 else if (strcmp (name
, _DYNSYM
) == 0)
340 else if (strcmp (name
, _COMMENT
) == 0)
343 flags
&=~ SEC_NEVER_LOAD
;
345 else if (strcmp (name
, _RCONST
) == 0)
347 else if (flags
& SEC_CODE
)
349 else if (flags
& SEC_DATA
)
351 else if (flags
& SEC_READONLY
)
353 else if (flags
& SEC_LOAD
)
358 if (flags
& SEC_NEVER_LOAD
)
364 /* Get the BFD flags to use for a section. */
368 _bfd_ecoff_styp_to_sec_flags (abfd
, hdr
, name
, section
)
369 bfd
*abfd ATTRIBUTE_UNUSED
;
371 const char *name ATTRIBUTE_UNUSED
;
372 asection
*section ATTRIBUTE_UNUSED
;
374 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
375 long styp_flags
= internal_s
->s_flags
;
376 flagword sec_flags
=0;
378 if (styp_flags
& STYP_NOLOAD
)
379 sec_flags
|= SEC_NEVER_LOAD
;
381 /* For 386 COFF, at least, an unloadable text or data section is
382 actually a shared library section. */
383 if ((styp_flags
& STYP_TEXT
)
384 || (styp_flags
& STYP_ECOFF_INIT
)
385 || (styp_flags
& STYP_ECOFF_FINI
)
386 || (styp_flags
& STYP_DYNAMIC
)
387 || (styp_flags
& STYP_LIBLIST
)
388 || (styp_flags
& STYP_RELDYN
)
389 || styp_flags
== STYP_CONFLIC
390 || (styp_flags
& STYP_DYNSTR
)
391 || (styp_flags
& STYP_DYNSYM
)
392 || (styp_flags
& STYP_HASH
))
394 if (sec_flags
& SEC_NEVER_LOAD
)
395 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
397 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
399 else if ((styp_flags
& STYP_DATA
)
400 || (styp_flags
& STYP_RDATA
)
401 || (styp_flags
& STYP_SDATA
)
402 || styp_flags
== STYP_PDATA
403 || styp_flags
== STYP_XDATA
404 || (styp_flags
& STYP_GOT
)
405 || styp_flags
== STYP_RCONST
)
407 if (sec_flags
& SEC_NEVER_LOAD
)
408 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
410 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
411 if ((styp_flags
& STYP_RDATA
)
412 || styp_flags
== STYP_PDATA
413 || styp_flags
== STYP_RCONST
)
414 sec_flags
|= SEC_READONLY
;
416 else if ((styp_flags
& STYP_BSS
)
417 || (styp_flags
& STYP_SBSS
))
419 sec_flags
|= SEC_ALLOC
;
421 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
423 sec_flags
|= SEC_NEVER_LOAD
;
425 else if ((styp_flags
& STYP_LITA
)
426 || (styp_flags
& STYP_LIT8
)
427 || (styp_flags
& STYP_LIT4
))
429 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
431 else if (styp_flags
& STYP_ECOFF_LIB
)
433 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
437 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
443 /* Read in the symbolic header for an ECOFF object file. */
446 ecoff_slurp_symbolic_header (abfd
)
449 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
450 bfd_size_type external_hdr_size
;
452 HDRR
*internal_symhdr
;
454 /* See if we've already read it in. */
455 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
456 backend
->debug_swap
.sym_magic
)
459 /* See whether there is a symbolic header. */
460 if (ecoff_data (abfd
)->sym_filepos
== 0)
462 bfd_get_symcount (abfd
) = 0;
466 /* At this point bfd_get_symcount (abfd) holds the number of symbols
467 as read from the file header, but on ECOFF this is always the
468 size of the symbolic information header. It would be cleaner to
469 handle this when we first read the file in coffgen.c. */
470 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
471 if (bfd_get_symcount (abfd
) != external_hdr_size
)
473 bfd_set_error (bfd_error_bad_value
);
477 /* Read the symbolic information header. */
478 raw
= (PTR
) bfd_malloc ((size_t) external_hdr_size
);
482 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) == -1
483 || (bfd_read (raw
, external_hdr_size
, 1, abfd
)
484 != external_hdr_size
))
486 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
487 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
489 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
491 bfd_set_error (bfd_error_bad_value
);
495 /* Now we can get the correct number of symbols. */
496 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
497 + internal_symhdr
->iextMax
);
508 /* Read in and swap the important symbolic information for an ECOFF
509 object file. This is called by gdb via the read_debug_info entry
510 point in the backend structure. */
514 _bfd_ecoff_slurp_symbolic_info (abfd
, ignore
, debug
)
516 asection
*ignore ATTRIBUTE_UNUSED
;
517 struct ecoff_debug_info
*debug
;
519 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
520 HDRR
*internal_symhdr
;
521 bfd_size_type raw_base
;
522 bfd_size_type raw_size
;
524 bfd_size_type external_fdr_size
;
528 bfd_size_type raw_end
;
529 bfd_size_type cb_end
;
531 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
533 /* Check whether we've already gotten it, and whether there's any to
535 if (ecoff_data (abfd
)->raw_syments
!= (PTR
) NULL
)
537 if (ecoff_data (abfd
)->sym_filepos
== 0)
539 bfd_get_symcount (abfd
) = 0;
543 if (! ecoff_slurp_symbolic_header (abfd
))
546 internal_symhdr
= &debug
->symbolic_header
;
548 /* Read all the symbolic information at once. */
549 raw_base
= (ecoff_data (abfd
)->sym_filepos
550 + backend
->debug_swap
.external_hdr_size
);
552 /* Alpha ecoff makes the determination of raw_size difficult. It has
553 an undocumented debug data section between the symhdr and the first
554 documented section. And the ordering of the sections varies between
555 statically and dynamically linked executables.
556 If bfd supports SEEK_END someday, this code could be simplified. */
560 #define UPDATE_RAW_END(start, count, size) \
561 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
562 if (cb_end > raw_end) \
565 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
566 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
567 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
568 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
569 UPDATE_RAW_END (cbOptOffset
, ioptMax
, backend
->debug_swap
.external_opt_size
);
570 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
571 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
572 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
573 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
574 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
575 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
577 #undef UPDATE_RAW_END
579 raw_size
= raw_end
- raw_base
;
582 ecoff_data (abfd
)->sym_filepos
= 0;
585 raw
= (PTR
) bfd_alloc (abfd
, raw_size
);
589 (ecoff_data (abfd
)->sym_filepos
590 + backend
->debug_swap
.external_hdr_size
),
592 || bfd_read (raw
, raw_size
, 1, abfd
) != raw_size
)
594 bfd_release (abfd
, raw
);
598 ecoff_data (abfd
)->raw_syments
= raw
;
600 /* Get pointers for the numeric offsets in the HDRR structure. */
601 #define FIX(off1, off2, type) \
602 if (internal_symhdr->off1 == 0) \
603 debug->off2 = (type) NULL; \
605 debug->off2 = (type) ((char *) raw \
606 + (internal_symhdr->off1 \
608 FIX (cbLineOffset
, line
, unsigned char *);
609 FIX (cbDnOffset
, external_dnr
, PTR
);
610 FIX (cbPdOffset
, external_pdr
, PTR
);
611 FIX (cbSymOffset
, external_sym
, PTR
);
612 FIX (cbOptOffset
, external_opt
, PTR
);
613 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
614 FIX (cbSsOffset
, ss
, char *);
615 FIX (cbSsExtOffset
, ssext
, char *);
616 FIX (cbFdOffset
, external_fdr
, PTR
);
617 FIX (cbRfdOffset
, external_rfd
, PTR
);
618 FIX (cbExtOffset
, external_ext
, PTR
);
621 /* I don't want to always swap all the data, because it will just
622 waste time and most programs will never look at it. The only
623 time the linker needs most of the debugging information swapped
624 is when linking big-endian and little-endian MIPS object files
625 together, which is not a common occurrence.
627 We need to look at the fdr to deal with a lot of information in
628 the symbols, so we swap them here. */
629 debug
->fdr
= (struct fdr
*) bfd_alloc (abfd
,
630 (internal_symhdr
->ifdMax
*
631 sizeof (struct fdr
)));
632 if (debug
->fdr
== NULL
)
634 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
635 fdr_ptr
= debug
->fdr
;
636 fraw_src
= (char *) debug
->external_fdr
;
637 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
638 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
639 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
644 /* ECOFF symbol table routines. The ECOFF symbol table is described
645 in gcc/mips-tfile.c. */
647 /* ECOFF uses two common sections. One is the usual one, and the
648 other is for small objects. All the small objects are kept
649 together, and then referenced via the gp pointer, which yields
650 faster assembler code. This is what we use for the small common
652 static asection ecoff_scom_section
;
653 static asymbol ecoff_scom_symbol
;
654 static asymbol
*ecoff_scom_symbol_ptr
;
656 /* Create an empty symbol. */
659 _bfd_ecoff_make_empty_symbol (abfd
)
662 ecoff_symbol_type
*new;
664 new = (ecoff_symbol_type
*) bfd_alloc (abfd
, sizeof (ecoff_symbol_type
));
665 if (new == (ecoff_symbol_type
*) NULL
)
666 return (asymbol
*) NULL
;
667 memset ((PTR
) new, 0, sizeof *new);
668 new->symbol
.section
= (asection
*) NULL
;
669 new->fdr
= (FDR
*) NULL
;
672 new->symbol
.the_bfd
= abfd
;
676 /* Set the BFD flags and section for an ECOFF symbol. */
679 ecoff_set_symbol_info (abfd
, ecoff_sym
, asym
, ext
, weak
)
686 asym
->the_bfd
= abfd
;
687 asym
->value
= ecoff_sym
->value
;
688 asym
->section
= &bfd_debug_section
;
691 /* Most symbol types are just for debugging. */
692 switch (ecoff_sym
->st
)
701 if (ECOFF_IS_STAB (ecoff_sym
))
703 asym
->flags
= BSF_DEBUGGING
;
708 asym
->flags
= BSF_DEBUGGING
;
713 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
715 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
718 asym
->flags
= BSF_LOCAL
;
719 /* Normally, a local stProc symbol will have a corresponding
720 external symbol. We mark the local symbol as a debugging
721 symbol, in order to prevent nm from printing both out.
722 Similarly, we mark stLabel and stabs symbols as debugging
723 symbols. In both cases, we do want to set the value
724 correctly based on the symbol class. */
725 if (ecoff_sym
->st
== stProc
726 || ecoff_sym
->st
== stLabel
727 || ECOFF_IS_STAB (ecoff_sym
))
728 asym
->flags
|= BSF_DEBUGGING
;
730 switch (ecoff_sym
->sc
)
733 /* Used for compiler generated labels. Leave them in the
734 debugging section, and mark them as local. If BSF_DEBUGGING
735 is set, then nm does not display them for some reason. If no
736 flags are set then the linker whines about them. */
737 asym
->flags
= BSF_LOCAL
;
740 asym
->section
= bfd_make_section_old_way (abfd
, ".text");
741 asym
->value
-= asym
->section
->vma
;
744 asym
->section
= bfd_make_section_old_way (abfd
, ".data");
745 asym
->value
-= asym
->section
->vma
;
748 asym
->section
= bfd_make_section_old_way (abfd
, ".bss");
749 asym
->value
-= asym
->section
->vma
;
752 asym
->flags
= BSF_DEBUGGING
;
755 asym
->section
= bfd_abs_section_ptr
;
758 asym
->section
= bfd_und_section_ptr
;
768 asym
->flags
= BSF_DEBUGGING
;
771 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
772 asym
->value
-= asym
->section
->vma
;
775 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
776 asym
->value
-= asym
->section
->vma
;
779 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
780 asym
->value
-= asym
->section
->vma
;
783 asym
->flags
= BSF_DEBUGGING
;
786 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
788 asym
->section
= bfd_com_section_ptr
;
794 if (ecoff_scom_section
.name
== NULL
)
796 /* Initialize the small common section. */
797 ecoff_scom_section
.name
= SCOMMON
;
798 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
799 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
800 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
801 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
802 ecoff_scom_symbol
.name
= SCOMMON
;
803 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
804 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
805 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
807 asym
->section
= &ecoff_scom_section
;
812 asym
->flags
= BSF_DEBUGGING
;
815 asym
->section
= bfd_und_section_ptr
;
820 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
821 asym
->value
-= asym
->section
->vma
;
826 asym
->flags
= BSF_DEBUGGING
;
829 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
830 asym
->value
-= asym
->section
->vma
;
833 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
834 asym
->value
-= asym
->section
->vma
;
840 /* Look for special constructors symbols and make relocation entries
841 in a special construction section. These are produced by the
842 -fgnu-linker argument to g++. */
843 if (ECOFF_IS_STAB (ecoff_sym
))
845 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
855 /* This code is no longer needed. It used to be used to
856 make the linker handle set symbols, but they are now
857 handled in the add_symbols routine instead. */
861 arelent_chain
*reloc_chain
;
862 unsigned int bitsize
;
864 /* Get a section with the same name as the symbol (usually
865 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
866 name ___CTOR_LIST (three underscores). We need
867 __CTOR_LIST (two underscores), since ECOFF doesn't use
868 a leading underscore. This should be handled by gcc,
869 but instead we do it here. Actually, this should all
870 be done differently anyhow. */
871 name
= bfd_asymbol_name (asym
);
872 if (name
[0] == '_' && name
[1] == '_' && name
[2] == '_')
877 section
= bfd_get_section_by_name (abfd
, name
);
878 if (section
== (asection
*) NULL
)
882 copy
= (char *) bfd_alloc (abfd
, strlen (name
) + 1);
886 section
= bfd_make_section (abfd
, copy
);
889 /* Build a reloc pointing to this constructor. */
891 (arelent_chain
*) bfd_alloc (abfd
, sizeof (arelent_chain
));
894 reloc_chain
->relent
.sym_ptr_ptr
=
895 bfd_get_section (asym
)->symbol_ptr_ptr
;
896 reloc_chain
->relent
.address
= section
->_raw_size
;
897 reloc_chain
->relent
.addend
= asym
->value
;
898 reloc_chain
->relent
.howto
=
899 ecoff_backend (abfd
)->constructor_reloc
;
901 /* Set up the constructor section to hold the reloc. */
902 section
->flags
= SEC_CONSTRUCTOR
;
903 ++section
->reloc_count
;
905 /* Constructor sections must be rounded to a boundary
906 based on the bitsize. These are not real sections--
907 they are handled specially by the linker--so the ECOFF
908 16 byte alignment restriction does not apply. */
909 bitsize
= ecoff_backend (abfd
)->constructor_bitsize
;
910 section
->alignment_power
= 1;
911 while ((1 << section
->alignment_power
) < bitsize
/ 8)
912 ++section
->alignment_power
;
914 reloc_chain
->next
= section
->constructor_chain
;
915 section
->constructor_chain
= reloc_chain
;
916 section
->_raw_size
+= bitsize
/ 8;
920 /* Mark the symbol as a constructor. */
921 asym
->flags
|= BSF_CONSTRUCTOR
;
929 /* Read an ECOFF symbol table. */
932 _bfd_ecoff_slurp_symbol_table (abfd
)
935 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
936 const bfd_size_type external_ext_size
937 = backend
->debug_swap
.external_ext_size
;
938 const bfd_size_type external_sym_size
939 = backend
->debug_swap
.external_sym_size
;
940 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
941 = backend
->debug_swap
.swap_ext_in
;
942 void (* const swap_sym_in
) PARAMS ((bfd
*, PTR
, SYMR
*))
943 = backend
->debug_swap
.swap_sym_in
;
944 bfd_size_type internal_size
;
945 ecoff_symbol_type
*internal
;
946 ecoff_symbol_type
*internal_ptr
;
952 /* If we've already read in the symbol table, do nothing. */
953 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
956 /* Get the symbolic information. */
957 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
958 &ecoff_data (abfd
)->debug_info
))
960 if (bfd_get_symcount (abfd
) == 0)
963 internal_size
= bfd_get_symcount (abfd
) * sizeof (ecoff_symbol_type
);
964 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
965 if (internal
== NULL
)
968 internal_ptr
= internal
;
969 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
971 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
972 * external_ext_size
));
973 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
977 (*swap_ext_in
) (abfd
, (PTR
) eraw_src
, &internal_esym
);
978 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
979 + internal_esym
.asym
.iss
);
980 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
981 &internal_ptr
->symbol
, 1,
982 internal_esym
.weakext
))
984 /* The alpha uses a negative ifd field for section symbols. */
985 if (internal_esym
.ifd
>= 0)
986 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
987 + internal_esym
.ifd
);
989 internal_ptr
->fdr
= NULL
;
990 internal_ptr
->local
= false;
991 internal_ptr
->native
= (PTR
) eraw_src
;
994 /* The local symbols must be accessed via the fdr's, because the
995 string and aux indices are relative to the fdr information. */
996 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
997 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
998 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
1003 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
1004 + fdr_ptr
->isymBase
* external_sym_size
);
1005 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
1007 lraw_src
< lraw_end
;
1008 lraw_src
+= external_sym_size
, internal_ptr
++)
1012 (*swap_sym_in
) (abfd
, (PTR
) lraw_src
, &internal_sym
);
1013 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
1015 + internal_sym
.iss
);
1016 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
1017 &internal_ptr
->symbol
, 0, 0))
1019 internal_ptr
->fdr
= fdr_ptr
;
1020 internal_ptr
->local
= true;
1021 internal_ptr
->native
= (PTR
) lraw_src
;
1025 ecoff_data (abfd
)->canonical_symbols
= internal
;
1030 /* Return the amount of space needed for the canonical symbols. */
1033 _bfd_ecoff_get_symtab_upper_bound (abfd
)
1036 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
1037 &ecoff_data (abfd
)->debug_info
))
1040 if (bfd_get_symcount (abfd
) == 0)
1043 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
1046 /* Get the canonical symbols. */
1049 _bfd_ecoff_get_symtab (abfd
, alocation
)
1051 asymbol
**alocation
;
1053 unsigned int counter
= 0;
1054 ecoff_symbol_type
*symbase
;
1055 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1057 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1059 if (bfd_get_symcount (abfd
) == 0)
1062 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1063 while (counter
< bfd_get_symcount (abfd
))
1065 *(location
++) = symbase
++;
1068 *location
++ = (ecoff_symbol_type
*) NULL
;
1069 return bfd_get_symcount (abfd
);
1072 /* Turn ECOFF type information into a printable string.
1073 ecoff_emit_aggregate and ecoff_type_to_string are from
1074 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1076 /* Write aggregate information to a string. */
1079 ecoff_emit_aggregate (abfd
, fdr
, string
, rndx
, isym
, which
)
1087 const struct ecoff_debug_swap
* const debug_swap
=
1088 &ecoff_backend (abfd
)->debug_swap
;
1089 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1090 unsigned int ifd
= rndx
->rfd
;
1091 unsigned int indx
= rndx
->index
;
1097 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1098 struct return type of a procedure compiled without -g. */
1099 if (ifd
== 0xffffffff
1100 || (rndx
->rfd
== 0xfff && indx
== 0))
1101 name
= "<undefined>";
1102 else if (indx
== indexNil
)
1108 if (debug_info
->external_rfd
== NULL
)
1109 fdr
= debug_info
->fdr
+ ifd
;
1114 (*debug_swap
->swap_rfd_in
) (abfd
,
1115 ((char *) debug_info
->external_rfd
1116 + ((fdr
->rfdBase
+ ifd
)
1117 * debug_swap
->external_rfd_size
)),
1119 fdr
= debug_info
->fdr
+ rfd
;
1122 indx
+= fdr
->isymBase
;
1124 (*debug_swap
->swap_sym_in
) (abfd
,
1125 ((char *) debug_info
->external_sym
1126 + indx
* debug_swap
->external_sym_size
),
1129 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1133 "%s %s { ifd = %u, index = %lu }",
1136 + debug_info
->symbolic_header
.iextMax
));
1139 /* Convert the type information to string format. */
1142 ecoff_type_to_string (abfd
, fdr
, indx
)
1147 union aux_ext
*aux_ptr
;
1156 unsigned int basic_type
;
1159 static char buffer2
[1024];
1164 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1165 bigendian
= fdr
->fBigendian
;
1167 for (i
= 0; i
< 7; i
++)
1169 qualifiers
[i
].low_bound
= 0;
1170 qualifiers
[i
].high_bound
= 0;
1171 qualifiers
[i
].stride
= 0;
1174 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1175 return "-1 (no type)";
1176 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1178 basic_type
= u
.ti
.bt
;
1179 qualifiers
[0].type
= u
.ti
.tq0
;
1180 qualifiers
[1].type
= u
.ti
.tq1
;
1181 qualifiers
[2].type
= u
.ti
.tq2
;
1182 qualifiers
[3].type
= u
.ti
.tq3
;
1183 qualifiers
[4].type
= u
.ti
.tq4
;
1184 qualifiers
[5].type
= u
.ti
.tq5
;
1185 qualifiers
[6].type
= tqNil
;
1188 * Go get the basic type.
1192 case btNil
: /* undefined */
1196 case btAdr
: /* address - integer same size as pointer */
1197 strcpy (p1
, "address");
1200 case btChar
: /* character */
1201 strcpy (p1
, "char");
1204 case btUChar
: /* unsigned character */
1205 strcpy (p1
, "unsigned char");
1208 case btShort
: /* short */
1209 strcpy (p1
, "short");
1212 case btUShort
: /* unsigned short */
1213 strcpy (p1
, "unsigned short");
1216 case btInt
: /* int */
1220 case btUInt
: /* unsigned int */
1221 strcpy (p1
, "unsigned int");
1224 case btLong
: /* long */
1225 strcpy (p1
, "long");
1228 case btULong
: /* unsigned long */
1229 strcpy (p1
, "unsigned long");
1232 case btFloat
: /* float (real) */
1233 strcpy (p1
, "float");
1236 case btDouble
: /* Double (real) */
1237 strcpy (p1
, "double");
1240 /* Structures add 1-2 aux words:
1241 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1242 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1244 case btStruct
: /* Structure (Record) */
1245 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1246 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1247 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1249 indx
++; /* skip aux words */
1252 /* Unions add 1-2 aux words:
1253 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1254 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1256 case btUnion
: /* Union */
1257 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1258 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1259 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1261 indx
++; /* skip aux words */
1264 /* Enumerations add 1-2 aux words:
1265 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1266 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1268 case btEnum
: /* Enumeration */
1269 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1270 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1271 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1273 indx
++; /* skip aux words */
1276 case btTypedef
: /* defined via a typedef, isymRef points */
1277 strcpy (p1
, "typedef");
1280 case btRange
: /* subrange of int */
1281 strcpy (p1
, "subrange");
1284 case btSet
: /* pascal sets */
1288 case btComplex
: /* fortran complex */
1289 strcpy (p1
, "complex");
1292 case btDComplex
: /* fortran double complex */
1293 strcpy (p1
, "double complex");
1296 case btIndirect
: /* forward or unnamed typedef */
1297 strcpy (p1
, "forward/unamed typedef");
1300 case btFixedDec
: /* Fixed Decimal */
1301 strcpy (p1
, "fixed decimal");
1304 case btFloatDec
: /* Float Decimal */
1305 strcpy (p1
, "float decimal");
1308 case btString
: /* Varying Length Character String */
1309 strcpy (p1
, "string");
1312 case btBit
: /* Aligned Bit String */
1316 case btPicture
: /* Picture */
1317 strcpy (p1
, "picture");
1320 case btVoid
: /* Void */
1321 strcpy (p1
, "void");
1325 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1329 p1
+= strlen (buffer1
);
1332 * If this is a bitfield, get the bitsize.
1338 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1339 sprintf (p1
, " : %d", bitsize
);
1340 p1
+= strlen (buffer1
);
1345 * Deal with any qualifiers.
1347 if (qualifiers
[0].type
!= tqNil
)
1350 * Snarf up any array bounds in the correct order. Arrays
1351 * store 5 successive words in the aux. table:
1352 * word 0 RNDXR to type of the bounds (ie, int)
1353 * word 1 Current file descriptor index
1355 * word 3 high bound (or -1 if [])
1356 * word 4 stride size in bits
1358 for (i
= 0; i
< 7; i
++)
1360 if (qualifiers
[i
].type
== tqArray
)
1362 qualifiers
[i
].low_bound
=
1363 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1364 qualifiers
[i
].high_bound
=
1365 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1366 qualifiers
[i
].stride
=
1367 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1373 * Now print out the qualifiers.
1375 for (i
= 0; i
< 6; i
++)
1377 switch (qualifiers
[i
].type
)
1384 strcpy (p2
, "ptr to ");
1385 p2
+= sizeof ("ptr to ")-1;
1389 strcpy (p2
, "volatile ");
1390 p2
+= sizeof ("volatile ")-1;
1394 strcpy (p2
, "far ");
1395 p2
+= sizeof ("far ")-1;
1399 strcpy (p2
, "func. ret. ");
1400 p2
+= sizeof ("func. ret. ");
1405 int first_array
= i
;
1408 /* Print array bounds reversed (ie, in the order the C
1409 programmer writes them). C is such a fun language.... */
1411 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1414 for (j
= i
; j
>= first_array
; j
--)
1416 strcpy (p2
, "array [");
1417 p2
+= sizeof ("array [")-1;
1418 if (qualifiers
[j
].low_bound
!= 0)
1420 "%ld:%ld {%ld bits}",
1421 (long) qualifiers
[j
].low_bound
,
1422 (long) qualifiers
[j
].high_bound
,
1423 (long) qualifiers
[j
].stride
);
1425 else if (qualifiers
[j
].high_bound
!= -1)
1428 (long) (qualifiers
[j
].high_bound
+ 1),
1429 (long) (qualifiers
[j
].stride
));
1432 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1435 strcpy (p2
, "] of ");
1436 p2
+= sizeof ("] of ")-1;
1444 strcpy (p2
, buffer1
);
1448 /* Return information about ECOFF symbol SYMBOL in RET. */
1452 _bfd_ecoff_get_symbol_info (abfd
, symbol
, ret
)
1453 bfd
*abfd ATTRIBUTE_UNUSED
;
1457 bfd_symbol_info (symbol
, ret
);
1460 /* Return whether this is a local label. */
1464 _bfd_ecoff_bfd_is_local_label_name (abfd
, name
)
1465 bfd
*abfd ATTRIBUTE_UNUSED
;
1468 return name
[0] == '$';
1471 /* Print information about an ECOFF symbol. */
1474 _bfd_ecoff_print_symbol (abfd
, filep
, symbol
, how
)
1478 bfd_print_symbol_type how
;
1480 const struct ecoff_debug_swap
* const debug_swap
1481 = &ecoff_backend (abfd
)->debug_swap
;
1482 FILE *file
= (FILE *)filep
;
1486 case bfd_print_symbol_name
:
1487 fprintf (file
, "%s", symbol
->name
);
1489 case bfd_print_symbol_more
:
1490 if (ecoffsymbol (symbol
)->local
)
1494 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1496 fprintf (file
, "ecoff local ");
1497 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1498 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1499 (unsigned) ecoff_sym
.sc
);
1505 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1507 fprintf (file
, "ecoff extern ");
1508 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1509 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1510 (unsigned) ecoff_ext
.asym
.sc
);
1513 case bfd_print_symbol_all
:
1514 /* Print out the symbols in a reasonable way */
1523 if (ecoffsymbol (symbol
)->local
)
1525 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1528 pos
= ((((char *) ecoffsymbol (symbol
)->native
1529 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1530 / debug_swap
->external_sym_size
)
1531 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1538 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1541 pos
= (((char *) ecoffsymbol (symbol
)->native
1542 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1543 / debug_swap
->external_ext_size
);
1544 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1545 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1546 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1549 fprintf (file
, "[%3d] %c ",
1551 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1552 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1553 (unsigned) ecoff_ext
.asym
.st
,
1554 (unsigned) ecoff_ext
.asym
.sc
,
1555 (unsigned) ecoff_ext
.asym
.index
,
1556 jmptbl
, cobol_main
, weakext
,
1559 if (ecoffsymbol (symbol
)->fdr
!= NULL
1560 && ecoff_ext
.asym
.index
!= indexNil
)
1565 bfd_size_type sym_base
;
1566 union aux_ext
*aux_base
;
1568 fdr
= ecoffsymbol (symbol
)->fdr
;
1569 indx
= ecoff_ext
.asym
.index
;
1571 /* sym_base is used to map the fdr relative indices which
1572 appear in the file to the position number which we are
1574 sym_base
= fdr
->isymBase
;
1575 if (ecoffsymbol (symbol
)->local
)
1577 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1579 /* aux_base is the start of the aux entries for this file;
1580 asym.index is an offset from this. */
1581 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1584 /* The aux entries are stored in host byte order; the
1585 order is indicated by a bit in the fdr. */
1586 bigendian
= fdr
->fBigendian
;
1588 /* This switch is basically from gcc/mips-tdump.c */
1589 switch (ecoff_ext
.asym
.st
)
1597 fprintf (file
, _("\n End+1 symbol: %ld"),
1598 (long) (indx
+ sym_base
));
1602 if (ecoff_ext
.asym
.sc
== scText
1603 || ecoff_ext
.asym
.sc
== scInfo
)
1604 fprintf (file
, _("\n First symbol: %ld"),
1605 (long) (indx
+ sym_base
));
1607 fprintf (file
, _("\n First symbol: %ld"),
1609 (AUX_GET_ISYM (bigendian
,
1610 &aux_base
[ecoff_ext
.asym
.index
])
1616 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1618 else if (ecoffsymbol (symbol
)->local
)
1619 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1621 (AUX_GET_ISYM (bigendian
,
1622 &aux_base
[ecoff_ext
.asym
.index
])
1624 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1626 fprintf (file
, _("\n Local symbol: %ld"),
1629 + (ecoff_data (abfd
)
1630 ->debug_info
.symbolic_header
.iextMax
)));
1634 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1635 (long) (indx
+ sym_base
));
1639 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1640 (long) (indx
+ sym_base
));
1644 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1645 (long) (indx
+ sym_base
));
1649 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1650 fprintf (file
, _("\n Type: %s"),
1651 ecoff_type_to_string (abfd
, fdr
, indx
));
1660 /* Read in the relocs for a section. */
1663 ecoff_slurp_reloc_table (abfd
, section
, symbols
)
1668 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1669 arelent
*internal_relocs
;
1670 bfd_size_type external_reloc_size
;
1671 bfd_size_type external_relocs_size
;
1672 char *external_relocs
;
1676 if (section
->relocation
!= (arelent
*) NULL
1677 || section
->reloc_count
== 0
1678 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1681 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1684 internal_relocs
= (arelent
*) bfd_alloc (abfd
,
1686 * section
->reloc_count
));
1687 external_reloc_size
= backend
->external_reloc_size
;
1688 external_relocs_size
= external_reloc_size
* section
->reloc_count
;
1689 external_relocs
= (char *) bfd_alloc (abfd
, external_relocs_size
);
1690 if (internal_relocs
== (arelent
*) NULL
1691 || external_relocs
== (char *) NULL
)
1693 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1695 if (bfd_read (external_relocs
, 1, external_relocs_size
, abfd
)
1696 != external_relocs_size
)
1699 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1701 struct internal_reloc intern
;
1703 (*backend
->swap_reloc_in
) (abfd
,
1704 external_relocs
+ i
* external_reloc_size
,
1707 if (intern
.r_extern
)
1709 /* r_symndx is an index into the external symbols. */
1710 BFD_ASSERT (intern
.r_symndx
>= 0
1712 < (ecoff_data (abfd
)
1713 ->debug_info
.symbolic_header
.iextMax
)));
1714 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1717 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1718 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1720 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1725 CONST
char *sec_name
;
1728 /* r_symndx is a section key. */
1729 switch (intern
.r_symndx
)
1731 case RELOC_SECTION_TEXT
: sec_name
= ".text"; break;
1732 case RELOC_SECTION_RDATA
: sec_name
= ".rdata"; break;
1733 case RELOC_SECTION_DATA
: sec_name
= ".data"; break;
1734 case RELOC_SECTION_SDATA
: sec_name
= ".sdata"; break;
1735 case RELOC_SECTION_SBSS
: sec_name
= ".sbss"; break;
1736 case RELOC_SECTION_BSS
: sec_name
= ".bss"; break;
1737 case RELOC_SECTION_INIT
: sec_name
= ".init"; break;
1738 case RELOC_SECTION_LIT8
: sec_name
= ".lit8"; break;
1739 case RELOC_SECTION_LIT4
: sec_name
= ".lit4"; break;
1740 case RELOC_SECTION_XDATA
: sec_name
= ".xdata"; break;
1741 case RELOC_SECTION_PDATA
: sec_name
= ".pdata"; break;
1742 case RELOC_SECTION_FINI
: sec_name
= ".fini"; break;
1743 case RELOC_SECTION_LITA
: sec_name
= ".lita"; break;
1744 case RELOC_SECTION_RCONST
: sec_name
= ".rconst"; break;
1748 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1749 if (sec
== (asection
*) NULL
)
1751 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1753 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1756 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1758 /* Let the backend select the howto field and do any other
1759 required processing. */
1760 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1763 bfd_release (abfd
, external_relocs
);
1765 section
->relocation
= internal_relocs
;
1770 /* Get a canonical list of relocs. */
1773 _bfd_ecoff_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
1781 if (section
->flags
& SEC_CONSTRUCTOR
)
1783 arelent_chain
*chain
;
1785 /* This section has relocs made up by us, not the file, so take
1786 them out of their chain and place them into the data area
1788 for (count
= 0, chain
= section
->constructor_chain
;
1789 count
< section
->reloc_count
;
1790 count
++, chain
= chain
->next
)
1791 *relptr
++ = &chain
->relent
;
1797 if (ecoff_slurp_reloc_table (abfd
, section
, symbols
) == false)
1800 tblptr
= section
->relocation
;
1802 for (count
= 0; count
< section
->reloc_count
; count
++)
1803 *relptr
++ = tblptr
++;
1806 *relptr
= (arelent
*) NULL
;
1808 return section
->reloc_count
;
1811 /* Provided a BFD, a section and an offset into the section, calculate
1812 and return the name of the source file and the line nearest to the
1817 _bfd_ecoff_find_nearest_line (abfd
, section
, ignore_symbols
, offset
,
1818 filename_ptr
, functionname_ptr
, retline_ptr
)
1821 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
;
1823 CONST
char **filename_ptr
;
1824 CONST
char **functionname_ptr
;
1825 unsigned int *retline_ptr
;
1827 const struct ecoff_debug_swap
* const debug_swap
1828 = &ecoff_backend (abfd
)->debug_swap
;
1829 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1830 struct ecoff_find_line
*line_info
;
1832 /* Make sure we have the FDR's. */
1833 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
, debug_info
)
1834 || bfd_get_symcount (abfd
) == 0)
1837 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1839 ecoff_data (abfd
)->find_line_info
=
1840 ((struct ecoff_find_line
*)
1841 bfd_zalloc (abfd
, sizeof (struct ecoff_find_line
)));
1842 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1845 line_info
= ecoff_data (abfd
)->find_line_info
;
1847 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1848 debug_swap
, line_info
, filename_ptr
,
1849 functionname_ptr
, retline_ptr
);
1852 /* Copy private BFD data. This is called by objcopy and strip. We
1853 use it to copy the ECOFF debugging information from one BFD to the
1854 other. It would be theoretically possible to represent the ECOFF
1855 debugging information in the symbol table. However, it would be a
1856 lot of work, and there would be little gain (gas, gdb, and ld
1857 already access the ECOFF debugging information via the
1858 ecoff_debug_info structure, and that structure would have to be
1859 retained in order to support ECOFF debugging in MIPS ELF).
1861 The debugging information for the ECOFF external symbols comes from
1862 the symbol table, so this function only handles the other debugging
1866 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd
, obfd
)
1870 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1871 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1873 asymbol
**sym_ptr_ptr
;
1877 /* We only want to copy information over if both BFD's use ECOFF
1879 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1880 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1883 /* Copy the GP value and the register masks. */
1884 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1885 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1886 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1887 for (i
= 0; i
< 3; i
++)
1888 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1890 /* Copy the version stamp. */
1891 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1893 /* If there are no symbols, don't copy any debugging information. */
1894 c
= bfd_get_symcount (obfd
);
1895 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1896 if (c
== 0 || sym_ptr_ptr
== (asymbol
**) NULL
)
1899 /* See if there are any local symbols. */
1901 for (; c
> 0; c
--, sym_ptr_ptr
++)
1903 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1912 /* There are some local symbols. We just bring over all the
1913 debugging information. FIXME: This is not quite the right
1914 thing to do. If the user has asked us to discard all
1915 debugging information, then we are probably going to wind up
1916 keeping it because there will probably be some local symbol
1917 which objcopy did not discard. We should actually break
1918 apart the debugging information and only keep that which
1919 applies to the symbols we want to keep. */
1920 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1921 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1922 oinfo
->line
= iinfo
->line
;
1924 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1925 oinfo
->external_dnr
= iinfo
->external_dnr
;
1927 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1928 oinfo
->external_pdr
= iinfo
->external_pdr
;
1930 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1931 oinfo
->external_sym
= iinfo
->external_sym
;
1933 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1934 oinfo
->external_opt
= iinfo
->external_opt
;
1936 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1937 oinfo
->external_aux
= iinfo
->external_aux
;
1939 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1940 oinfo
->ss
= iinfo
->ss
;
1942 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1943 oinfo
->external_fdr
= iinfo
->external_fdr
;
1945 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1946 oinfo
->external_rfd
= iinfo
->external_rfd
;
1950 /* We are discarding all the local symbol information. Look
1951 through the external symbols and remove all references to FDR
1952 or aux information. */
1953 c
= bfd_get_symcount (obfd
);
1954 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1955 for (; c
> 0; c
--, sym_ptr_ptr
++)
1959 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1960 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1962 esym
.asym
.index
= indexNil
;
1963 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1964 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1971 /* Set the architecture. The supported architecture is stored in the
1972 backend pointer. We always set the architecture anyhow, since many
1973 callers ignore the return value. */
1976 _bfd_ecoff_set_arch_mach (abfd
, arch
, machine
)
1978 enum bfd_architecture arch
;
1979 unsigned long machine
;
1981 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1982 return arch
== ecoff_backend (abfd
)->arch
;
1985 /* Get the size of the section headers. */
1989 _bfd_ecoff_sizeof_headers (abfd
, reloc
)
1991 boolean reloc ATTRIBUTE_UNUSED
;
1998 for (current
= abfd
->sections
;
1999 current
!= (asection
*)NULL
;
2000 current
= current
->next
)
2003 ret
= (bfd_coff_filhsz (abfd
)
2004 + bfd_coff_aoutsz (abfd
)
2005 + c
* bfd_coff_scnhsz (abfd
));
2006 return BFD_ALIGN (ret
, 16);
2009 /* Get the contents of a section. */
2012 _bfd_ecoff_get_section_contents (abfd
, section
, location
, offset
, count
)
2017 bfd_size_type count
;
2019 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2023 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2024 called via qsort. */
2027 ecoff_sort_hdrs (arg1
, arg2
)
2031 const asection
*hdr1
= *(const asection
**) arg1
;
2032 const asection
*hdr2
= *(const asection
**) arg2
;
2034 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
2036 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
2041 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
2044 if (hdr1
->vma
< hdr2
->vma
)
2046 else if (hdr1
->vma
> hdr2
->vma
)
2052 /* Calculate the file position for each section, and set
2056 ecoff_compute_section_file_positions (abfd
)
2059 file_ptr sofar
, file_sofar
;
2060 asection
**sorted_hdrs
;
2064 boolean rdata_in_text
;
2065 boolean first_data
, first_nonalloc
;
2066 const bfd_vma round
= ecoff_backend (abfd
)->round
;
2068 sofar
= _bfd_ecoff_sizeof_headers (abfd
, false);
2071 /* Sort the sections by VMA. */
2072 sorted_hdrs
= (asection
**) bfd_malloc (abfd
->section_count
2073 * sizeof (asection
*));
2074 if (sorted_hdrs
== NULL
)
2076 for (current
= abfd
->sections
, i
= 0;
2078 current
= current
->next
, i
++)
2079 sorted_hdrs
[i
] = current
;
2080 BFD_ASSERT (i
== abfd
->section_count
);
2082 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2085 /* Some versions of the OSF linker put the .rdata section in the
2086 text segment, and some do not. */
2087 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2090 for (i
= 0; i
< abfd
->section_count
; i
++)
2092 current
= sorted_hdrs
[i
];
2093 if (strcmp (current
->name
, _RDATA
) == 0)
2095 if ((current
->flags
& SEC_CODE
) == 0
2096 && strcmp (current
->name
, _PDATA
) != 0
2097 && strcmp (current
->name
, _RCONST
) != 0)
2099 rdata_in_text
= false;
2104 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2107 first_nonalloc
= true;
2108 for (i
= 0; i
< abfd
->section_count
; i
++)
2110 unsigned int alignment_power
;
2112 current
= sorted_hdrs
[i
];
2114 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2115 supposed to indicate the number of .pdata entries that are
2116 really in the section. Each entry is 8 bytes. We store this
2117 away in line_filepos before increasing the section size. */
2118 if (strcmp (current
->name
, _PDATA
) == 0)
2119 current
->line_filepos
= current
->_raw_size
/ 8;
2121 alignment_power
= current
->alignment_power
;
2123 /* On Ultrix, the data sections in an executable file must be
2124 aligned to a page boundary within the file. This does not
2125 affect the section size, though. FIXME: Does this work for
2126 other platforms? It requires some modification for the
2127 Alpha, because .rdata on the Alpha goes with the text, not
2129 if ((abfd
->flags
& EXEC_P
) != 0
2130 && (abfd
->flags
& D_PAGED
) != 0
2132 && (current
->flags
& SEC_CODE
) == 0
2134 || strcmp (current
->name
, _RDATA
) != 0)
2135 && strcmp (current
->name
, _PDATA
) != 0
2136 && strcmp (current
->name
, _RCONST
) != 0)
2138 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2139 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2142 else if (strcmp (current
->name
, _LIB
) == 0)
2144 /* On Irix 4, the location of contents of the .lib section
2145 from a shared library section is also rounded up to a
2148 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2149 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2151 else if (first_nonalloc
2152 && (current
->flags
& SEC_ALLOC
) == 0
2153 && (abfd
->flags
& D_PAGED
) != 0)
2155 /* Skip up to the next page for an unallocated section, such
2156 as the .comment section on the Alpha. This leaves room
2157 for the .bss section. */
2158 first_nonalloc
= false;
2159 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2160 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2163 /* Align the sections in the file to the same boundary on
2164 which they are aligned in virtual memory. */
2165 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2166 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2167 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2169 if ((abfd
->flags
& D_PAGED
) != 0
2170 && (current
->flags
& SEC_ALLOC
) != 0)
2172 sofar
+= (current
->vma
- sofar
) % round
;
2173 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2174 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2177 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2178 current
->filepos
= file_sofar
;
2180 sofar
+= current
->_raw_size
;
2181 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2182 file_sofar
+= current
->_raw_size
;
2184 /* make sure that this section is of the right size too */
2186 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2187 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2188 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2189 current
->_raw_size
+= sofar
- old_sofar
;
2195 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2200 /* Determine the location of the relocs for all the sections in the
2201 output file, as well as the location of the symbolic debugging
2204 static bfd_size_type
2205 ecoff_compute_reloc_file_positions (abfd
)
2208 const bfd_size_type external_reloc_size
=
2209 ecoff_backend (abfd
)->external_reloc_size
;
2210 file_ptr reloc_base
;
2211 bfd_size_type reloc_size
;
2215 if (! abfd
->output_has_begun
)
2217 if (! ecoff_compute_section_file_positions (abfd
))
2219 abfd
->output_has_begun
= true;
2222 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2225 for (current
= abfd
->sections
;
2226 current
!= (asection
*)NULL
;
2227 current
= current
->next
)
2229 if (current
->reloc_count
== 0)
2230 current
->rel_filepos
= 0;
2233 bfd_size_type relsize
;
2235 current
->rel_filepos
= reloc_base
;
2236 relsize
= current
->reloc_count
* external_reloc_size
;
2237 reloc_size
+= relsize
;
2238 reloc_base
+= relsize
;
2242 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2244 /* At least on Ultrix, the symbol table of an executable file must
2245 be aligned to a page boundary. FIXME: Is this true on other
2247 if ((abfd
->flags
& EXEC_P
) != 0
2248 && (abfd
->flags
& D_PAGED
) != 0)
2249 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2250 &~ (ecoff_backend (abfd
)->round
- 1));
2252 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2257 /* Set the contents of a section. */
2260 _bfd_ecoff_set_section_contents (abfd
, section
, location
, offset
, count
)
2265 bfd_size_type count
;
2267 /* This must be done first, because bfd_set_section_contents is
2268 going to set output_has_begun to true. */
2269 if (abfd
->output_has_begun
== false)
2271 if (! ecoff_compute_section_file_positions (abfd
))
2275 /* Handle the .lib section specially so that Irix 4 shared libraries
2276 work out. See coff_set_section_contents in coffcode.h. */
2277 if (strcmp (section
->name
, _LIB
) == 0)
2279 bfd_byte
*rec
, *recend
;
2281 rec
= (bfd_byte
*) location
;
2282 recend
= rec
+ count
;
2283 while (rec
< recend
)
2286 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2289 BFD_ASSERT (rec
== recend
);
2295 if (bfd_seek (abfd
, (file_ptr
) (section
->filepos
+ offset
), SEEK_SET
) != 0
2296 || bfd_write (location
, 1, count
, abfd
) != count
)
2302 /* Get the GP value for an ECOFF file. This is a hook used by
2306 bfd_ecoff_get_gp_value (abfd
)
2309 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2310 || bfd_get_format (abfd
) != bfd_object
)
2312 bfd_set_error (bfd_error_invalid_operation
);
2316 return ecoff_data (abfd
)->gp
;
2319 /* Set the GP value for an ECOFF file. This is a hook used by the
2323 bfd_ecoff_set_gp_value (abfd
, gp_value
)
2327 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2328 || bfd_get_format (abfd
) != bfd_object
)
2330 bfd_set_error (bfd_error_invalid_operation
);
2334 ecoff_data (abfd
)->gp
= gp_value
;
2339 /* Set the register masks for an ECOFF file. This is a hook used by
2343 bfd_ecoff_set_regmasks (abfd
, gprmask
, fprmask
, cprmask
)
2345 unsigned long gprmask
;
2346 unsigned long fprmask
;
2347 unsigned long *cprmask
;
2349 ecoff_data_type
*tdata
;
2351 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2352 || bfd_get_format (abfd
) != bfd_object
)
2354 bfd_set_error (bfd_error_invalid_operation
);
2358 tdata
= ecoff_data (abfd
);
2359 tdata
->gprmask
= gprmask
;
2360 tdata
->fprmask
= fprmask
;
2361 if (cprmask
!= (unsigned long *) NULL
)
2365 for (i
= 0; i
< 3; i
++)
2366 tdata
->cprmask
[i
] = cprmask
[i
];
2372 /* Get ECOFF EXTR information for an external symbol. This function
2373 is passed to bfd_ecoff_debug_externals. */
2376 ecoff_get_extr (sym
, esym
)
2380 ecoff_symbol_type
*ecoff_sym_ptr
;
2383 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2384 || ecoffsymbol (sym
)->native
== NULL
)
2386 /* Don't include debugging, local, or section symbols. */
2387 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2388 || (sym
->flags
& BSF_LOCAL
) != 0
2389 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2393 esym
->cobol_main
= 0;
2394 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2397 /* FIXME: we can do better than this for st and sc. */
2398 esym
->asym
.st
= stGlobal
;
2399 esym
->asym
.sc
= scAbs
;
2400 esym
->asym
.reserved
= 0;
2401 esym
->asym
.index
= indexNil
;
2405 ecoff_sym_ptr
= ecoffsymbol (sym
);
2407 if (ecoff_sym_ptr
->local
)
2410 input_bfd
= bfd_asymbol_bfd (sym
);
2411 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2412 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2414 /* If the symbol was defined by the linker, then esym will be
2415 undefined but sym will not be. Get a better class for such a
2417 if ((esym
->asym
.sc
== scUndefined
2418 || esym
->asym
.sc
== scSUndefined
)
2419 && ! bfd_is_und_section (bfd_get_section (sym
)))
2420 esym
->asym
.sc
= scAbs
;
2422 /* Adjust the FDR index for the symbol by that used for the input
2424 if (esym
->ifd
!= -1)
2426 struct ecoff_debug_info
*input_debug
;
2428 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2429 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2430 if (input_debug
->ifdmap
!= (RFDT
*) NULL
)
2431 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2437 /* Set the external symbol index. This routine is passed to
2438 bfd_ecoff_debug_externals. */
2441 ecoff_set_index (sym
, indx
)
2445 ecoff_set_sym_index (sym
, indx
);
2448 /* Write out an ECOFF file. */
2451 _bfd_ecoff_write_object_contents (abfd
)
2454 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2455 const bfd_vma round
= backend
->round
;
2456 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2457 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2458 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2459 const bfd_size_type external_hdr_size
2460 = backend
->debug_swap
.external_hdr_size
;
2461 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2462 void (* const adjust_reloc_out
) PARAMS ((bfd
*,
2464 struct internal_reloc
*))
2465 = backend
->adjust_reloc_out
;
2466 void (* const swap_reloc_out
) PARAMS ((bfd
*,
2467 const struct internal_reloc
*,
2469 = backend
->swap_reloc_out
;
2470 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2471 HDRR
* const symhdr
= &debug
->symbolic_header
;
2474 bfd_size_type reloc_size
;
2475 bfd_size_type text_size
;
2477 boolean set_text_start
;
2478 bfd_size_type data_size
;
2480 boolean set_data_start
;
2481 bfd_size_type bss_size
;
2483 PTR reloc_buff
= NULL
;
2484 struct internal_filehdr internal_f
;
2485 struct internal_aouthdr internal_a
;
2488 /* Determine where the sections and relocs will go in the output
2490 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2493 for (current
= abfd
->sections
;
2494 current
!= (asection
*)NULL
;
2495 current
= current
->next
)
2497 current
->target_index
= count
;
2501 if ((abfd
->flags
& D_PAGED
) != 0)
2502 text_size
= _bfd_ecoff_sizeof_headers (abfd
, false);
2506 set_text_start
= false;
2509 set_data_start
= false;
2512 /* Write section headers to the file. */
2514 /* Allocate buff big enough to hold a section header,
2515 file header, or a.out header. */
2523 buff
= (PTR
) bfd_malloc ((size_t) siz
);
2528 internal_f
.f_nscns
= 0;
2529 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2531 for (current
= abfd
->sections
;
2532 current
!= (asection
*) NULL
;
2533 current
= current
->next
)
2535 struct internal_scnhdr section
;
2538 ++internal_f
.f_nscns
;
2540 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2542 /* This seems to be correct for Irix 4 shared libraries. */
2543 vma
= bfd_get_section_vma (abfd
, current
);
2544 if (strcmp (current
->name
, _LIB
) == 0)
2545 section
.s_vaddr
= 0;
2547 section
.s_vaddr
= vma
;
2549 section
.s_paddr
= current
->lma
;
2550 section
.s_size
= bfd_get_section_size_before_reloc (current
);
2552 /* If this section is unloadable then the scnptr will be 0. */
2553 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2554 section
.s_scnptr
= 0;
2556 section
.s_scnptr
= current
->filepos
;
2557 section
.s_relptr
= current
->rel_filepos
;
2559 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2560 object file produced by the assembler is supposed to point to
2561 information about how much room is required by objects of
2562 various different sizes. I think this only matters if we
2563 want the linker to compute the best size to use, or
2564 something. I don't know what happens if the information is
2566 if (strcmp (current
->name
, _PDATA
) != 0)
2567 section
.s_lnnoptr
= 0;
2570 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2571 hold the number of entries in the section (each entry is
2572 8 bytes). We stored this in the line_filepos field in
2573 ecoff_compute_section_file_positions. */
2574 section
.s_lnnoptr
= current
->line_filepos
;
2577 section
.s_nreloc
= current
->reloc_count
;
2578 section
.s_nlnno
= 0;
2579 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2582 if (bfd_coff_swap_scnhdr_out (abfd
, (PTR
) §ion
, buff
) == 0
2583 || bfd_write (buff
, 1, scnhsz
, abfd
) != scnhsz
)
2586 if ((section
.s_flags
& STYP_TEXT
) != 0
2587 || ((section
.s_flags
& STYP_RDATA
) != 0
2588 && ecoff_data (abfd
)->rdata_in_text
)
2589 || section
.s_flags
== STYP_PDATA
2590 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2591 || (section
.s_flags
& STYP_LIBLIST
) != 0
2592 || (section
.s_flags
& STYP_RELDYN
) != 0
2593 || section
.s_flags
== STYP_CONFLIC
2594 || (section
.s_flags
& STYP_DYNSTR
) != 0
2595 || (section
.s_flags
& STYP_DYNSYM
) != 0
2596 || (section
.s_flags
& STYP_HASH
) != 0
2597 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2598 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2599 || section
.s_flags
== STYP_RCONST
)
2601 text_size
+= bfd_get_section_size_before_reloc (current
);
2602 if (! set_text_start
|| text_start
> vma
)
2605 set_text_start
= true;
2608 else if ((section
.s_flags
& STYP_RDATA
) != 0
2609 || (section
.s_flags
& STYP_DATA
) != 0
2610 || (section
.s_flags
& STYP_LITA
) != 0
2611 || (section
.s_flags
& STYP_LIT8
) != 0
2612 || (section
.s_flags
& STYP_LIT4
) != 0
2613 || (section
.s_flags
& STYP_SDATA
) != 0
2614 || section
.s_flags
== STYP_XDATA
2615 || (section
.s_flags
& STYP_GOT
) != 0)
2617 data_size
+= bfd_get_section_size_before_reloc (current
);
2618 if (! set_data_start
|| data_start
> vma
)
2621 set_data_start
= true;
2624 else if ((section
.s_flags
& STYP_BSS
) != 0
2625 || (section
.s_flags
& STYP_SBSS
) != 0)
2626 bss_size
+= bfd_get_section_size_before_reloc (current
);
2627 else if (section
.s_flags
== 0
2628 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2629 || section
.s_flags
== STYP_COMMENT
)
2635 /* Set up the file header. */
2637 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2639 /* We will NOT put a fucking timestamp in the header here. Every
2640 time you put it back, I will come in and take it out again. I'm
2641 sorry. This field does not belong here. We fill it with a 0 so
2642 it compares the same but is not a reasonable time. --
2644 internal_f
.f_timdat
= 0;
2646 if (bfd_get_symcount (abfd
) != 0)
2648 /* The ECOFF f_nsyms field is not actually the number of
2649 symbols, it's the size of symbolic information header. */
2650 internal_f
.f_nsyms
= external_hdr_size
;
2651 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2655 internal_f
.f_nsyms
= 0;
2656 internal_f
.f_symptr
= 0;
2659 internal_f
.f_opthdr
= aoutsz
;
2661 internal_f
.f_flags
= F_LNNO
;
2662 if (reloc_size
== 0)
2663 internal_f
.f_flags
|= F_RELFLG
;
2664 if (bfd_get_symcount (abfd
) == 0)
2665 internal_f
.f_flags
|= F_LSYMS
;
2666 if (abfd
->flags
& EXEC_P
)
2667 internal_f
.f_flags
|= F_EXEC
;
2669 if (bfd_little_endian (abfd
))
2670 internal_f
.f_flags
|= F_AR32WR
;
2672 internal_f
.f_flags
|= F_AR32W
;
2674 /* Set up the ``optional'' header. */
2675 if ((abfd
->flags
& D_PAGED
) != 0)
2676 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2678 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2680 /* FIXME: Is this really correct? */
2681 internal_a
.vstamp
= symhdr
->vstamp
;
2683 /* At least on Ultrix, these have to be rounded to page boundaries.
2684 FIXME: Is this true on other platforms? */
2685 if ((abfd
->flags
& D_PAGED
) != 0)
2687 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2688 internal_a
.text_start
= text_start
&~ (round
- 1);
2689 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2690 internal_a
.data_start
= data_start
&~ (round
- 1);
2694 internal_a
.tsize
= text_size
;
2695 internal_a
.text_start
= text_start
;
2696 internal_a
.dsize
= data_size
;
2697 internal_a
.data_start
= data_start
;
2700 /* On Ultrix, the initial portions of the .sbss and .bss segments
2701 are at the end of the data section. The bsize field in the
2702 optional header records how many bss bytes are required beyond
2703 those in the data section. The value is not rounded to a page
2705 if (bss_size
< internal_a
.dsize
- data_size
)
2708 bss_size
-= internal_a
.dsize
- data_size
;
2709 internal_a
.bsize
= bss_size
;
2710 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2712 internal_a
.entry
= bfd_get_start_address (abfd
);
2714 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2716 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2717 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2718 for (i
= 0; i
< 4; i
++)
2719 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2721 /* Let the backend adjust the headers if necessary. */
2722 if (backend
->adjust_headers
)
2724 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2728 /* Write out the file header and the optional header. */
2730 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2733 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, buff
);
2734 if (bfd_write (buff
, 1, filhsz
, abfd
) != filhsz
)
2737 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) &internal_a
, buff
);
2738 if (bfd_write (buff
, 1, aoutsz
, abfd
) != aoutsz
)
2741 /* Build the external symbol information. This must be done before
2742 writing out the relocs so that we know the symbol indices. We
2743 don't do this if this BFD was created by the backend linker,
2744 since it will have already handled the symbols and relocs. */
2745 if (! ecoff_data (abfd
)->linker
)
2747 symhdr
->iextMax
= 0;
2748 symhdr
->issExtMax
= 0;
2749 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2750 debug
->ssext
= debug
->ssext_end
= NULL
;
2751 if (bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2752 (((abfd
->flags
& EXEC_P
) == 0)
2754 ecoff_get_extr
, ecoff_set_index
)
2758 /* Write out the relocs. */
2759 for (current
= abfd
->sections
;
2760 current
!= (asection
*) NULL
;
2761 current
= current
->next
)
2763 arelent
**reloc_ptr_ptr
;
2764 arelent
**reloc_end
;
2767 if (current
->reloc_count
== 0)
2771 bfd_alloc (abfd
, current
->reloc_count
* external_reloc_size
);
2772 if (reloc_buff
== NULL
)
2775 reloc_ptr_ptr
= current
->orelocation
;
2776 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2777 out_ptr
= (char *) reloc_buff
;
2779 reloc_ptr_ptr
< reloc_end
;
2780 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2784 struct internal_reloc in
;
2786 memset ((PTR
) &in
, 0, sizeof in
);
2788 reloc
= *reloc_ptr_ptr
;
2789 sym
= *reloc
->sym_ptr_ptr
;
2791 in
.r_vaddr
= (reloc
->address
2792 + bfd_get_section_vma (abfd
, current
));
2793 in
.r_type
= reloc
->howto
->type
;
2795 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2797 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2804 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2805 if (strcmp (name
, ".text") == 0)
2806 in
.r_symndx
= RELOC_SECTION_TEXT
;
2807 else if (strcmp (name
, ".rdata") == 0)
2808 in
.r_symndx
= RELOC_SECTION_RDATA
;
2809 else if (strcmp (name
, ".data") == 0)
2810 in
.r_symndx
= RELOC_SECTION_DATA
;
2811 else if (strcmp (name
, ".sdata") == 0)
2812 in
.r_symndx
= RELOC_SECTION_SDATA
;
2813 else if (strcmp (name
, ".sbss") == 0)
2814 in
.r_symndx
= RELOC_SECTION_SBSS
;
2815 else if (strcmp (name
, ".bss") == 0)
2816 in
.r_symndx
= RELOC_SECTION_BSS
;
2817 else if (strcmp (name
, ".init") == 0)
2818 in
.r_symndx
= RELOC_SECTION_INIT
;
2819 else if (strcmp (name
, ".lit8") == 0)
2820 in
.r_symndx
= RELOC_SECTION_LIT8
;
2821 else if (strcmp (name
, ".lit4") == 0)
2822 in
.r_symndx
= RELOC_SECTION_LIT4
;
2823 else if (strcmp (name
, ".xdata") == 0)
2824 in
.r_symndx
= RELOC_SECTION_XDATA
;
2825 else if (strcmp (name
, ".pdata") == 0)
2826 in
.r_symndx
= RELOC_SECTION_PDATA
;
2827 else if (strcmp (name
, ".fini") == 0)
2828 in
.r_symndx
= RELOC_SECTION_FINI
;
2829 else if (strcmp (name
, ".lita") == 0)
2830 in
.r_symndx
= RELOC_SECTION_LITA
;
2831 else if (strcmp (name
, "*ABS*") == 0)
2832 in
.r_symndx
= RELOC_SECTION_ABS
;
2833 else if (strcmp (name
, ".rconst") == 0)
2834 in
.r_symndx
= RELOC_SECTION_RCONST
;
2840 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2842 (*swap_reloc_out
) (abfd
, &in
, (PTR
) out_ptr
);
2845 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2847 if (bfd_write (reloc_buff
,
2848 external_reloc_size
, current
->reloc_count
, abfd
)
2849 != external_reloc_size
* current
->reloc_count
)
2851 bfd_release (abfd
, reloc_buff
);
2855 /* Write out the symbolic debugging information. */
2856 if (bfd_get_symcount (abfd
) > 0)
2858 /* Write out the debugging information. */
2859 if (bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2860 ecoff_data (abfd
)->sym_filepos
)
2866 /* The .bss section of a demand paged executable must receive an
2867 entire page. If there are symbols, the symbols will start on the
2868 next page. If there are no symbols, we must fill out the page by
2870 if (bfd_get_symcount (abfd
) == 0
2871 && (abfd
->flags
& EXEC_P
) != 0
2872 && (abfd
->flags
& D_PAGED
) != 0)
2876 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2879 if (bfd_read (&c
, 1, 1, abfd
) == 0)
2881 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2884 if (bfd_write (&c
, 1, 1, abfd
) != 1)
2888 if (reloc_buff
!= NULL
)
2889 bfd_release (abfd
, reloc_buff
);
2894 if (reloc_buff
!= NULL
)
2895 bfd_release (abfd
, reloc_buff
);
2901 /* Archive handling. ECOFF uses what appears to be a unique type of
2902 archive header (armap). The byte ordering of the armap and the
2903 contents are encoded in the name of the armap itself. At least for
2904 now, we only support archives with the same byte ordering in the
2905 armap and the contents.
2907 The first four bytes in the armap are the number of symbol
2908 definitions. This is always a power of two.
2910 This is followed by the symbol definitions. Each symbol definition
2911 occupies 8 bytes. The first four bytes are the offset from the
2912 start of the armap strings to the null-terminated string naming
2913 this symbol. The second four bytes are the file offset to the
2914 archive member which defines this symbol. If the second four bytes
2915 are 0, then this is not actually a symbol definition, and it should
2918 The symbols are hashed into the armap with a closed hashing scheme.
2919 See the functions below for the details of the algorithm.
2921 After the symbol definitions comes four bytes holding the size of
2922 the string table, followed by the string table itself. */
2924 /* The name of an archive headers looks like this:
2925 __________E[BL]E[BL]_ (with a trailing space).
2926 The trailing space is changed to an X if the archive is changed to
2927 indicate that the armap is out of date.
2929 The Alpha seems to use ________64E[BL]E[BL]_. */
2931 #define ARMAP_BIG_ENDIAN 'B'
2932 #define ARMAP_LITTLE_ENDIAN 'L'
2933 #define ARMAP_MARKER 'E'
2934 #define ARMAP_START_LENGTH 10
2935 #define ARMAP_HEADER_MARKER_INDEX 10
2936 #define ARMAP_HEADER_ENDIAN_INDEX 11
2937 #define ARMAP_OBJECT_MARKER_INDEX 12
2938 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2939 #define ARMAP_END_INDEX 14
2940 #define ARMAP_END "_ "
2942 /* This is a magic number used in the hashing algorithm. */
2943 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2945 /* This returns the hash value to use for a string. It also sets
2946 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2947 is the number of entries in the hash table, and HLOG is the log
2951 ecoff_armap_hash (s
, rehash
, size
, hlog
)
2953 unsigned int *rehash
;
2963 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2964 hash
*= ARMAP_HASH_MAGIC
;
2965 *rehash
= (hash
& (size
- 1)) | 1;
2966 return hash
>> (32 - hlog
);
2969 /* Read in the armap. */
2972 _bfd_ecoff_slurp_armap (abfd
)
2977 struct areltdata
*mapdata
;
2978 bfd_size_type parsed_size
;
2980 struct artdata
*ardata
;
2983 struct symdef
*symdef_ptr
;
2986 /* Get the name of the first element. */
2987 i
= bfd_read ((PTR
) nextname
, 1, 16, abfd
);
2993 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2996 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2997 standard COFF armap. We could move the ECOFF armap stuff into
2998 bfd_slurp_armap, but that seems inappropriate since no other
2999 target uses this format. Instead, we check directly for a COFF
3001 if (strncmp (nextname
, "/ ", 16) == 0)
3002 return bfd_slurp_armap (abfd
);
3004 /* See if the first element is an armap. */
3005 if (strncmp (nextname
, ecoff_backend (abfd
)->armap_start
,
3006 ARMAP_START_LENGTH
) != 0
3007 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
3008 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3009 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3010 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
3011 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3012 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3013 || strncmp (nextname
+ ARMAP_END_INDEX
,
3014 ARMAP_END
, sizeof ARMAP_END
- 1) != 0)
3016 bfd_has_map (abfd
) = false;
3020 /* Make sure we have the right byte ordering. */
3021 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3022 ^ (bfd_header_big_endian (abfd
)))
3023 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3024 ^ (bfd_big_endian (abfd
))))
3026 bfd_set_error (bfd_error_wrong_format
);
3030 /* Read in the armap. */
3031 ardata
= bfd_ardata (abfd
);
3032 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
3033 if (mapdata
== (struct areltdata
*) NULL
)
3035 parsed_size
= mapdata
->parsed_size
;
3036 bfd_release (abfd
, (PTR
) mapdata
);
3038 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
3039 if (raw_armap
== (char *) NULL
)
3042 if (bfd_read ((PTR
) raw_armap
, 1, parsed_size
, abfd
) != parsed_size
)
3044 if (bfd_get_error () != bfd_error_system_call
)
3045 bfd_set_error (bfd_error_malformed_archive
);
3046 bfd_release (abfd
, (PTR
) raw_armap
);
3050 ardata
->tdata
= (PTR
) raw_armap
;
3052 count
= bfd_h_get_32 (abfd
, (PTR
) raw_armap
);
3054 ardata
->symdef_count
= 0;
3055 ardata
->cache
= (struct ar_cache
*) NULL
;
3057 /* This code used to overlay the symdefs over the raw archive data,
3058 but that doesn't work on a 64 bit host. */
3060 stringbase
= raw_armap
+ count
* 8 + 8;
3062 #ifdef CHECK_ARMAP_HASH
3066 /* Double check that I have the hashing algorithm right by making
3067 sure that every symbol can be looked up successfully. */
3069 for (i
= 1; i
< count
; i
<<= 1)
3071 BFD_ASSERT (i
== count
);
3073 raw_ptr
= raw_armap
+ 4;
3074 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3076 unsigned int name_offset
, file_offset
;
3077 unsigned int hash
, rehash
, srch
;
3079 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3080 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3081 if (file_offset
== 0)
3083 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
3088 /* See if we can rehash to this location. */
3089 for (srch
= (hash
+ rehash
) & (count
- 1);
3090 srch
!= hash
&& srch
!= i
;
3091 srch
= (srch
+ rehash
) & (count
- 1))
3092 BFD_ASSERT (bfd_h_get_32 (abfd
, (PTR
) (raw_armap
+ 8 + srch
* 8))
3094 BFD_ASSERT (srch
== i
);
3098 #endif /* CHECK_ARMAP_HASH */
3100 raw_ptr
= raw_armap
+ 4;
3101 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3102 if (bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4)) != 0)
3103 ++ardata
->symdef_count
;
3105 symdef_ptr
= ((struct symdef
*)
3107 ardata
->symdef_count
* sizeof (struct symdef
)));
3111 ardata
->symdefs
= (carsym
*) symdef_ptr
;
3113 raw_ptr
= raw_armap
+ 4;
3114 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3116 unsigned int name_offset
, file_offset
;
3118 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3119 if (file_offset
== 0)
3121 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3122 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
3123 symdef_ptr
->file_offset
= file_offset
;
3127 ardata
->first_file_filepos
= bfd_tell (abfd
);
3128 /* Pad to an even boundary. */
3129 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3131 bfd_has_map (abfd
) = true;
3136 /* Write out an armap. */
3139 _bfd_ecoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
3141 unsigned int elength
;
3143 unsigned int orl_count
;
3146 unsigned int hashsize
, hashlog
;
3147 unsigned int symdefsize
;
3149 unsigned int stringsize
;
3150 unsigned int mapsize
;
3153 struct stat statbuf
;
3156 bfd_byte
*hashtable
;
3160 /* Ultrix appears to use as a hash table size the least power of two
3161 greater than twice the number of entries. */
3162 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3164 hashsize
= 1 << hashlog
;
3166 symdefsize
= hashsize
* 8;
3168 stringsize
= stridx
+ padit
;
3170 /* Include 8 bytes to store symdefsize and stringsize in output. */
3171 mapsize
= symdefsize
+ stringsize
+ 8;
3173 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3175 memset ((PTR
) &hdr
, 0, sizeof hdr
);
3177 /* Work out the ECOFF armap name. */
3178 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3179 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3180 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3181 (bfd_header_big_endian (abfd
)
3183 : ARMAP_LITTLE_ENDIAN
);
3184 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3185 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3186 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3187 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3189 /* Write the timestamp of the archive header to be just a little bit
3190 later than the timestamp of the file, otherwise the linker will
3191 complain that the index is out of date. Actually, the Ultrix
3192 linker just checks the archive name; the GNU linker may check the
3194 stat (abfd
->filename
, &statbuf
);
3195 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3197 /* The DECstation uses zeroes for the uid, gid and mode of the
3199 hdr
.ar_uid
[0] = '0';
3200 hdr
.ar_gid
[0] = '0';
3202 hdr
.ar_mode
[0] = '0';
3204 /* Building gcc ends up extracting the armap as a file - twice. */
3205 hdr
.ar_mode
[0] = '6';
3206 hdr
.ar_mode
[1] = '4';
3207 hdr
.ar_mode
[2] = '4';
3210 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3212 hdr
.ar_fmag
[0] = '`';
3213 hdr
.ar_fmag
[1] = '\012';
3215 /* Turn all null bytes in the header into spaces. */
3216 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3217 if (((char *)(&hdr
))[i
] == '\0')
3218 (((char *)(&hdr
))[i
]) = ' ';
3220 if (bfd_write ((PTR
) &hdr
, 1, sizeof (struct ar_hdr
), abfd
)
3221 != sizeof (struct ar_hdr
))
3224 bfd_h_put_32 (abfd
, (bfd_vma
) hashsize
, temp
);
3225 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3228 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3232 current
= abfd
->archive_head
;
3234 for (i
= 0; i
< orl_count
; i
++)
3236 unsigned int hash
, rehash
;
3238 /* Advance firstreal to the file position of this archive
3240 if (((bfd
*) map
[i
].pos
) != last_elt
)
3244 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3245 firstreal
+= firstreal
% 2;
3246 current
= current
->next
;
3248 while (current
!= (bfd
*) map
[i
].pos
);
3253 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3254 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (hash
* 8) + 4)) != 0)
3258 /* The desired slot is already taken. */
3259 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3261 srch
= (srch
+ rehash
) & (hashsize
- 1))
3262 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (srch
* 8) + 4)) == 0)
3265 BFD_ASSERT (srch
!= hash
);
3270 bfd_h_put_32 (abfd
, (bfd_vma
) map
[i
].namidx
,
3271 (PTR
) (hashtable
+ hash
* 8));
3272 bfd_h_put_32 (abfd
, (bfd_vma
) firstreal
,
3273 (PTR
) (hashtable
+ hash
* 8 + 4));
3276 if (bfd_write ((PTR
) hashtable
, 1, symdefsize
, abfd
) != symdefsize
)
3279 bfd_release (abfd
, hashtable
);
3281 /* Now write the strings. */
3282 bfd_h_put_32 (abfd
, (bfd_vma
) stringsize
, temp
);
3283 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3285 for (i
= 0; i
< orl_count
; i
++)
3289 len
= strlen (*map
[i
].name
) + 1;
3290 if (bfd_write ((PTR
) (*map
[i
].name
), 1, len
, abfd
) != len
)
3294 /* The spec sez this should be a newline. But in order to be
3295 bug-compatible for DECstation ar we use a null. */
3298 if (bfd_write ("", 1, 1, abfd
) != 1)
3305 /* See whether this BFD is an archive. If it is, read in the armap
3306 and the extended name table. */
3309 _bfd_ecoff_archive_p (abfd
)
3312 struct artdata
*tdata_hold
;
3313 char armag
[SARMAG
+ 1];
3315 tdata_hold
= abfd
->tdata
.aout_ar_data
;
3317 if (bfd_read ((PTR
) armag
, 1, SARMAG
, abfd
) != SARMAG
)
3319 if (bfd_get_error () != bfd_error_system_call
)
3320 bfd_set_error (bfd_error_wrong_format
);
3321 return (const bfd_target
*) NULL
;
3324 if (strncmp (armag
, ARMAG
, SARMAG
) != 0)
3326 bfd_set_error (bfd_error_wrong_format
);
3330 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3331 involves a cast, we can't do it as the left operand of
3333 abfd
->tdata
.aout_ar_data
=
3334 (struct artdata
*) bfd_zalloc (abfd
, sizeof (struct artdata
));
3336 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
3338 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3339 return (const bfd_target
*) NULL
;
3342 bfd_ardata (abfd
)->first_file_filepos
= SARMAG
;
3343 bfd_ardata (abfd
)->cache
= NULL
;
3344 bfd_ardata (abfd
)->archive_head
= NULL
;
3345 bfd_ardata (abfd
)->symdefs
= NULL
;
3346 bfd_ardata (abfd
)->extended_names
= NULL
;
3347 bfd_ardata (abfd
)->tdata
= NULL
;
3349 if (_bfd_ecoff_slurp_armap (abfd
) == false
3350 || _bfd_ecoff_slurp_extended_name_table (abfd
) == false)
3352 bfd_release (abfd
, bfd_ardata (abfd
));
3353 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3354 return (const bfd_target
*) NULL
;
3357 if (bfd_has_map (abfd
))
3361 /* This archive has a map, so we may presume that the contents
3362 are object files. Make sure that if the first file in the
3363 archive can be recognized as an object file, it is for this
3364 target. If not, assume that this is the wrong format. If
3365 the first file is not an object file, somebody is doing
3366 something weird, and we permit it so that ar -t will work. */
3368 first
= bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
);
3373 first
->target_defaulted
= false;
3375 if (bfd_check_format (first
, bfd_object
)
3376 && first
->xvec
!= abfd
->xvec
)
3378 (void) bfd_close (first
);
3379 bfd_release (abfd
, bfd_ardata (abfd
));
3380 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3381 bfd_set_error (bfd_error_wrong_format
);
3385 /* We ought to close first here, but we can't, because we
3386 have no way to remove it from the archive cache. FIXME. */
3393 /* ECOFF linker code. */
3395 static struct bfd_hash_entry
*ecoff_link_hash_newfunc
3396 PARAMS ((struct bfd_hash_entry
*entry
,
3397 struct bfd_hash_table
*table
,
3398 const char *string
));
3399 static boolean ecoff_link_add_archive_symbols
3400 PARAMS ((bfd
*, struct bfd_link_info
*));
3401 static boolean ecoff_link_check_archive_element
3402 PARAMS ((bfd
*, struct bfd_link_info
*, boolean
*pneeded
));
3403 static boolean ecoff_link_add_object_symbols
3404 PARAMS ((bfd
*, struct bfd_link_info
*));
3405 static boolean ecoff_link_add_externals
3406 PARAMS ((bfd
*, struct bfd_link_info
*, PTR
, char *));
3408 /* Routine to create an entry in an ECOFF link hash table. */
3410 static struct bfd_hash_entry
*
3411 ecoff_link_hash_newfunc (entry
, table
, string
)
3412 struct bfd_hash_entry
*entry
;
3413 struct bfd_hash_table
*table
;
3416 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3418 /* Allocate the structure if it has not already been allocated by a
3420 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3421 ret
= ((struct ecoff_link_hash_entry
*)
3422 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3423 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3426 /* Call the allocation method of the superclass. */
3427 ret
= ((struct ecoff_link_hash_entry
*)
3428 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3433 /* Set local fields. */
3439 memset ((PTR
) &ret
->esym
, 0, sizeof ret
->esym
);
3441 return (struct bfd_hash_entry
*) ret
;
3444 /* Create an ECOFF link hash table. */
3446 struct bfd_link_hash_table
*
3447 _bfd_ecoff_bfd_link_hash_table_create (abfd
)
3450 struct ecoff_link_hash_table
*ret
;
3452 ret
= ((struct ecoff_link_hash_table
*)
3453 bfd_alloc (abfd
, sizeof (struct ecoff_link_hash_table
)));
3456 if (! _bfd_link_hash_table_init (&ret
->root
, abfd
,
3457 ecoff_link_hash_newfunc
))
3460 return (struct bfd_link_hash_table
*) NULL
;
3465 /* Look up an entry in an ECOFF link hash table. */
3467 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3468 ((struct ecoff_link_hash_entry *) \
3469 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3471 /* Traverse an ECOFF link hash table. */
3473 #define ecoff_link_hash_traverse(table, func, info) \
3474 (bfd_link_hash_traverse \
3476 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3479 /* Get the ECOFF link hash table from the info structure. This is
3482 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3484 /* Given an ECOFF BFD, add symbols to the global hash table as
3488 _bfd_ecoff_bfd_link_add_symbols (abfd
, info
)
3490 struct bfd_link_info
*info
;
3492 switch (bfd_get_format (abfd
))
3495 return ecoff_link_add_object_symbols (abfd
, info
);
3497 return ecoff_link_add_archive_symbols (abfd
, info
);
3499 bfd_set_error (bfd_error_wrong_format
);
3504 /* Add the symbols from an archive file to the global hash table.
3505 This looks through the undefined symbols, looks each one up in the
3506 archive hash table, and adds any associated object file. We do not
3507 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3508 already have a hash table, so there is no reason to construct
3512 ecoff_link_add_archive_symbols (abfd
, info
)
3514 struct bfd_link_info
*info
;
3516 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3517 const bfd_byte
*raw_armap
;
3518 struct bfd_link_hash_entry
**pundef
;
3519 unsigned int armap_count
;
3520 unsigned int armap_log
;
3522 const bfd_byte
*hashtable
;
3523 const char *stringbase
;
3525 if (! bfd_has_map (abfd
))
3527 /* An empty archive is a special case. */
3528 if (bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
) == NULL
)
3530 bfd_set_error (bfd_error_no_armap
);
3534 /* If we don't have any raw data for this archive, as can happen on
3535 Irix 4.0.5F, we call the generic routine.
3536 FIXME: We should be more clever about this, since someday tdata
3537 may get to something for a generic archive. */
3538 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3539 if (raw_armap
== (bfd_byte
*) NULL
)
3540 return (_bfd_generic_link_add_archive_symbols
3541 (abfd
, info
, ecoff_link_check_archive_element
));
3543 armap_count
= bfd_h_get_32 (abfd
, raw_armap
);
3546 for (i
= 1; i
< armap_count
; i
<<= 1)
3548 BFD_ASSERT (i
== armap_count
);
3550 hashtable
= raw_armap
+ 4;
3551 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3553 /* Look through the list of undefined symbols. */
3554 pundef
= &info
->hash
->undefs
;
3555 while (*pundef
!= (struct bfd_link_hash_entry
*) NULL
)
3557 struct bfd_link_hash_entry
*h
;
3558 unsigned int hash
, rehash
;
3559 unsigned int file_offset
;
3565 /* When a symbol is defined, it is not necessarily removed from
3567 if (h
->type
!= bfd_link_hash_undefined
3568 && h
->type
!= bfd_link_hash_common
)
3570 /* Remove this entry from the list, for general cleanliness
3571 and because we are going to look through the list again
3572 if we search any more libraries. We can't remove the
3573 entry if it is the tail, because that would lose any
3574 entries we add to the list later on. */
3575 if (*pundef
!= info
->hash
->undefs_tail
)
3576 *pundef
= (*pundef
)->next
;
3578 pundef
= &(*pundef
)->next
;
3582 /* Native ECOFF linkers do not pull in archive elements merely
3583 to satisfy common definitions, so neither do we. We leave
3584 them on the list, though, in case we are linking against some
3585 other object format. */
3586 if (h
->type
!= bfd_link_hash_undefined
)
3588 pundef
= &(*pundef
)->next
;
3592 /* Look for this symbol in the archive hash table. */
3593 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3596 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3597 if (file_offset
== 0)
3599 /* Nothing in this slot. */
3600 pundef
= &(*pundef
)->next
;
3604 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8));
3605 if (name
[0] != h
->root
.string
[0]
3606 || strcmp (name
, h
->root
.string
) != 0)
3611 /* That was the wrong symbol. Try rehashing. */
3613 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3615 srch
= (srch
+ rehash
) & (armap_count
- 1))
3617 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3618 if (file_offset
== 0)
3620 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8));
3621 if (name
[0] == h
->root
.string
[0]
3622 && strcmp (name
, h
->root
.string
) == 0)
3631 pundef
= &(*pundef
)->next
;
3638 element
= (*backend
->get_elt_at_filepos
) (abfd
, file_offset
);
3639 if (element
== (bfd
*) NULL
)
3642 if (! bfd_check_format (element
, bfd_object
))
3645 /* Unlike the generic linker, we know that this element provides
3646 a definition for an undefined symbol and we know that we want
3647 to include it. We don't need to check anything. */
3648 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3650 if (! ecoff_link_add_object_symbols (element
, info
))
3653 pundef
= &(*pundef
)->next
;
3659 /* This is called if we used _bfd_generic_link_add_archive_symbols
3660 because we were not dealing with an ECOFF archive. */
3663 ecoff_link_check_archive_element (abfd
, info
, pneeded
)
3665 struct bfd_link_info
*info
;
3668 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3669 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3670 = backend
->debug_swap
.swap_ext_in
;
3672 bfd_size_type external_ext_size
;
3673 PTR external_ext
= NULL
;
3681 if (! ecoff_slurp_symbolic_header (abfd
))
3684 /* If there are no symbols, we don't want it. */
3685 if (bfd_get_symcount (abfd
) == 0)
3686 goto successful_return
;
3688 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3690 /* Read in the external symbols and external strings. */
3691 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3692 esize
= symhdr
->iextMax
* external_ext_size
;
3693 external_ext
= (PTR
) bfd_malloc (esize
);
3694 if (external_ext
== NULL
&& esize
!= 0)
3697 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3698 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3701 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3702 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3705 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3706 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
) !=
3707 (bfd_size_type
) symhdr
->issExtMax
))
3710 /* Look through the external symbols to see if they define some
3711 symbol that is currently undefined. */
3712 ext_ptr
= (char *) external_ext
;
3713 ext_end
= ext_ptr
+ esize
;
3714 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3719 struct bfd_link_hash_entry
*h
;
3721 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3723 /* See if this symbol defines something. */
3724 if (esym
.asym
.st
!= stGlobal
3725 && esym
.asym
.st
!= stLabel
3726 && esym
.asym
.st
!= stProc
)
3729 switch (esym
.asym
.sc
)
3753 name
= ssext
+ esym
.asym
.iss
;
3754 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
3756 /* Unlike the generic linker, we do not pull in elements because
3757 of common symbols. */
3758 if (h
== (struct bfd_link_hash_entry
*) NULL
3759 || h
->type
!= bfd_link_hash_undefined
)
3762 /* Include this element. */
3763 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3765 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3769 goto successful_return
;
3773 if (external_ext
!= NULL
)
3774 free (external_ext
);
3779 if (external_ext
!= NULL
)
3780 free (external_ext
);
3786 /* Add symbols from an ECOFF object file to the global linker hash
3790 ecoff_link_add_object_symbols (abfd
, info
)
3792 struct bfd_link_info
*info
;
3795 bfd_size_type external_ext_size
;
3796 PTR external_ext
= NULL
;
3801 if (! ecoff_slurp_symbolic_header (abfd
))
3804 /* If there are no symbols, we don't want it. */
3805 if (bfd_get_symcount (abfd
) == 0)
3808 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3810 /* Read in the external symbols and external strings. */
3811 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3812 esize
= symhdr
->iextMax
* external_ext_size
;
3813 external_ext
= (PTR
) bfd_malloc (esize
);
3814 if (external_ext
== NULL
&& esize
!= 0)
3817 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3818 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3821 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3822 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3825 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3826 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
)
3827 != (bfd_size_type
) symhdr
->issExtMax
))
3830 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3834 if (external_ext
!= NULL
)
3835 free (external_ext
);
3841 if (external_ext
!= NULL
)
3842 free (external_ext
);
3846 /* Add the external symbols of an object file to the global linker
3847 hash table. The external symbols and strings we are passed are
3848 just allocated on the stack, and will be discarded. We must
3849 explicitly save any information we may need later on in the link.
3850 We do not want to read the external symbol information again. */
3853 ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
)
3855 struct bfd_link_info
*info
;
3859 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3860 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3861 = backend
->debug_swap
.swap_ext_in
;
3862 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3863 unsigned long ext_count
;
3864 struct ecoff_link_hash_entry
**sym_hash
;
3868 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3870 sym_hash
= ((struct ecoff_link_hash_entry
**)
3872 ext_count
* sizeof (struct bfd_link_hash_entry
*)));
3875 ecoff_data (abfd
)->sym_hashes
= sym_hash
;
3877 ext_ptr
= (char *) external_ext
;
3878 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3879 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3886 struct ecoff_link_hash_entry
*h
;
3890 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3892 /* Skip debugging symbols. */
3894 switch (esym
.asym
.st
)
3910 /* Get the information for this symbol. */
3911 value
= esym
.asym
.value
;
3912 switch (esym
.asym
.sc
)
3932 section
= bfd_make_section_old_way (abfd
, ".text");
3933 value
-= section
->vma
;
3936 section
= bfd_make_section_old_way (abfd
, ".data");
3937 value
-= section
->vma
;
3940 section
= bfd_make_section_old_way (abfd
, ".bss");
3941 value
-= section
->vma
;
3944 section
= bfd_abs_section_ptr
;
3947 section
= bfd_und_section_ptr
;
3950 section
= bfd_make_section_old_way (abfd
, ".sdata");
3951 value
-= section
->vma
;
3954 section
= bfd_make_section_old_way (abfd
, ".sbss");
3955 value
-= section
->vma
;
3958 section
= bfd_make_section_old_way (abfd
, ".rdata");
3959 value
-= section
->vma
;
3962 if (value
> ecoff_data (abfd
)->gp_size
)
3964 section
= bfd_com_section_ptr
;
3969 if (ecoff_scom_section
.name
== NULL
)
3971 /* Initialize the small common section. */
3972 ecoff_scom_section
.name
= SCOMMON
;
3973 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3974 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3975 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3976 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3977 ecoff_scom_symbol
.name
= SCOMMON
;
3978 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3979 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3980 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3982 section
= &ecoff_scom_section
;
3985 section
= bfd_und_section_ptr
;
3988 section
= bfd_make_section_old_way (abfd
, ".init");
3989 value
-= section
->vma
;
3992 section
= bfd_make_section_old_way (abfd
, ".fini");
3993 value
-= section
->vma
;
3996 section
= bfd_make_section_old_way (abfd
, ".rconst");
3997 value
-= section
->vma
;
4001 if (section
== (asection
*) NULL
)
4004 name
= ssext
+ esym
.asym
.iss
;
4007 if (! (_bfd_generic_link_add_one_symbol
4009 esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
,
4010 section
, value
, (const char *) NULL
, true, true,
4011 (struct bfd_link_hash_entry
**) &h
)))
4016 /* If we are building an ECOFF hash table, save the external
4017 symbol information. */
4018 if (info
->hash
->creator
->flavour
== bfd_get_flavour (abfd
))
4020 if (h
->abfd
== (bfd
*) NULL
4021 || (! bfd_is_und_section (section
)
4022 && (! bfd_is_com_section (section
)
4023 || (h
->root
.type
!= bfd_link_hash_defined
4024 && h
->root
.type
!= bfd_link_hash_defweak
))))
4030 /* Remember whether this symbol was small undefined. */
4031 if (esym
.asym
.sc
== scSUndefined
)
4034 /* If this symbol was ever small undefined, it needs to wind
4035 up in a GP relative section. We can't control the
4036 section of a defined symbol, but we can control the
4037 section of a common symbol. This case is actually needed
4038 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4040 && h
->root
.type
== bfd_link_hash_common
4041 && strcmp (h
->root
.u
.c
.p
->section
->name
, SCOMMON
) != 0)
4043 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
4045 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
4046 if (h
->esym
.asym
.sc
== scCommon
)
4047 h
->esym
.asym
.sc
= scSCommon
;
4055 /* ECOFF final link routines. */
4057 static boolean ecoff_final_link_debug_accumulate
4058 PARAMS ((bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*,
4060 static boolean ecoff_link_write_external
4061 PARAMS ((struct ecoff_link_hash_entry
*, PTR
));
4062 static boolean ecoff_indirect_link_order
4063 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4064 struct bfd_link_order
*));
4065 static boolean ecoff_reloc_link_order
4066 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4067 struct bfd_link_order
*));
4069 /* Structure used to pass information to ecoff_link_write_external. */
4074 struct bfd_link_info
*info
;
4077 /* ECOFF final link routine. This looks through all the input BFDs
4078 and gathers together all the debugging information, and then
4079 processes all the link order information. This may cause it to
4080 close and reopen some input BFDs; I'll see how bad this is. */
4083 _bfd_ecoff_bfd_final_link (abfd
, info
)
4085 struct bfd_link_info
*info
;
4087 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4088 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4091 register bfd
*input_bfd
;
4093 struct bfd_link_order
*p
;
4094 struct extsym_info einfo
;
4096 /* We accumulate the debugging information counts in the symbolic
4098 symhdr
= &debug
->symbolic_header
;
4100 symhdr
->ilineMax
= 0;
4104 symhdr
->isymMax
= 0;
4105 symhdr
->ioptMax
= 0;
4106 symhdr
->iauxMax
= 0;
4108 symhdr
->issExtMax
= 0;
4111 symhdr
->iextMax
= 0;
4113 /* We accumulate the debugging information itself in the debug_info
4116 debug
->external_dnr
= NULL
;
4117 debug
->external_pdr
= NULL
;
4118 debug
->external_sym
= NULL
;
4119 debug
->external_opt
= NULL
;
4120 debug
->external_aux
= NULL
;
4122 debug
->ssext
= debug
->ssext_end
= NULL
;
4123 debug
->external_fdr
= NULL
;
4124 debug
->external_rfd
= NULL
;
4125 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4127 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4128 if (handle
== (PTR
) NULL
)
4131 /* Accumulate the debugging symbols from each input BFD. */
4132 for (input_bfd
= info
->input_bfds
;
4133 input_bfd
!= (bfd
*) NULL
;
4134 input_bfd
= input_bfd
->link_next
)
4138 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4140 /* Abitrarily set the symbolic header vstamp to the vstamp
4141 of the first object file in the link. */
4142 if (symhdr
->vstamp
== 0)
4144 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4145 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4149 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4150 debug
, &backend
->debug_swap
,
4155 /* Combine the register masks. */
4156 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4157 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4158 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4159 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4160 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4161 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4164 /* Write out the external symbols. */
4167 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4168 ecoff_link_write_external
,
4171 if (info
->relocateable
)
4173 /* We need to make a pass over the link_orders to count up the
4174 number of relocations we will need to output, so that we know
4175 how much space they will take up. */
4176 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4179 for (p
= o
->link_order_head
;
4180 p
!= (struct bfd_link_order
*) NULL
;
4182 if (p
->type
== bfd_indirect_link_order
)
4183 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4184 else if (p
->type
== bfd_section_reloc_link_order
4185 || p
->type
== bfd_symbol_reloc_link_order
)
4190 /* Compute the reloc and symbol file positions. */
4191 ecoff_compute_reloc_file_positions (abfd
);
4193 /* Write out the debugging information. */
4194 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4195 &backend
->debug_swap
, info
,
4196 ecoff_data (abfd
)->sym_filepos
))
4199 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4201 if (info
->relocateable
)
4203 /* Now reset the reloc_count field of the sections in the output
4204 BFD to 0, so that we can use them to keep track of how many
4205 relocs we have output thus far. */
4206 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4210 /* Get a value for the GP register. */
4211 if (ecoff_data (abfd
)->gp
== 0)
4213 struct bfd_link_hash_entry
*h
;
4215 h
= bfd_link_hash_lookup (info
->hash
, "_gp", false, false, true);
4216 if (h
!= (struct bfd_link_hash_entry
*) NULL
4217 && h
->type
== bfd_link_hash_defined
)
4218 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4219 + h
->u
.def
.section
->output_section
->vma
4220 + h
->u
.def
.section
->output_offset
);
4221 else if (info
->relocateable
)
4225 /* Make up a value. */
4227 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4230 && (strcmp (o
->name
, _SBSS
) == 0
4231 || strcmp (o
->name
, _SDATA
) == 0
4232 || strcmp (o
->name
, _LIT4
) == 0
4233 || strcmp (o
->name
, _LIT8
) == 0
4234 || strcmp (o
->name
, _LITA
) == 0))
4237 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4241 /* If the relocate_section function needs to do a reloc
4242 involving the GP value, it should make a reloc_dangerous
4243 callback to warn that GP is not defined. */
4247 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4249 for (p
= o
->link_order_head
;
4250 p
!= (struct bfd_link_order
*) NULL
;
4253 if (p
->type
== bfd_indirect_link_order
4254 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4255 == bfd_target_ecoff_flavour
))
4257 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4260 else if (p
->type
== bfd_section_reloc_link_order
4261 || p
->type
== bfd_symbol_reloc_link_order
)
4263 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4268 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4274 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4276 ecoff_data (abfd
)->linker
= true;
4281 /* Accumulate the debugging information for an input BFD into the
4282 output BFD. This must read in the symbolic information of the
4286 ecoff_final_link_debug_accumulate (output_bfd
, input_bfd
, info
, handle
)
4289 struct bfd_link_info
*info
;
4292 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
4293 const struct ecoff_debug_swap
* const swap
=
4294 &ecoff_backend (input_bfd
)->debug_swap
;
4295 HDRR
*symhdr
= &debug
->symbolic_header
;
4298 #define READ(ptr, offset, count, size, type) \
4299 if (symhdr->count == 0) \
4300 debug->ptr = NULL; \
4303 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
4304 if (debug->ptr == NULL) \
4307 goto return_something; \
4309 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4311 || (bfd_read (debug->ptr, size, symhdr->count, \
4312 input_bfd) != size * symhdr->count)) \
4315 goto return_something; \
4319 /* If raw_syments is not NULL, then the data was already by read by
4320 _bfd_ecoff_slurp_symbolic_info. */
4321 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4323 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
4325 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
4326 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
4327 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
4328 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
4329 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
4331 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
4332 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
4333 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
4337 /* We do not read the external strings or the external symbols. */
4339 ret
= (bfd_ecoff_debug_accumulate
4340 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4341 &ecoff_backend (output_bfd
)->debug_swap
,
4342 input_bfd
, debug
, swap
, info
));
4345 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4347 if (debug
->line
!= NULL
)
4349 if (debug
->external_dnr
!= NULL
)
4350 free (debug
->external_dnr
);
4351 if (debug
->external_pdr
!= NULL
)
4352 free (debug
->external_pdr
);
4353 if (debug
->external_sym
!= NULL
)
4354 free (debug
->external_sym
);
4355 if (debug
->external_opt
!= NULL
)
4356 free (debug
->external_opt
);
4357 if (debug
->external_aux
!= NULL
)
4358 free (debug
->external_aux
);
4359 if (debug
->ss
!= NULL
)
4361 if (debug
->external_fdr
!= NULL
)
4362 free (debug
->external_fdr
);
4363 if (debug
->external_rfd
!= NULL
)
4364 free (debug
->external_rfd
);
4366 /* Make sure we don't accidentally follow one of these pointers
4367 into freed memory. */
4369 debug
->external_dnr
= NULL
;
4370 debug
->external_pdr
= NULL
;
4371 debug
->external_sym
= NULL
;
4372 debug
->external_opt
= NULL
;
4373 debug
->external_aux
= NULL
;
4375 debug
->external_fdr
= NULL
;
4376 debug
->external_rfd
= NULL
;
4382 /* Put out information for an external symbol. These come only from
4386 ecoff_link_write_external (h
, data
)
4387 struct ecoff_link_hash_entry
*h
;
4390 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4391 bfd
*output_bfd
= einfo
->abfd
;
4394 /* We need to check if this symbol is being stripped. */
4395 if (h
->root
.type
== bfd_link_hash_undefined
4396 || h
->root
.type
== bfd_link_hash_undefweak
)
4398 else if (einfo
->info
->strip
== strip_all
4399 || (einfo
->info
->strip
== strip_some
4400 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4401 h
->root
.root
.string
,
4402 false, false) == NULL
))
4407 if (strip
|| h
->written
)
4410 if (h
->abfd
== (bfd
*) NULL
)
4413 h
->esym
.cobol_main
= 0;
4414 h
->esym
.weakext
= 0;
4415 h
->esym
.reserved
= 0;
4416 h
->esym
.ifd
= ifdNil
;
4417 h
->esym
.asym
.value
= 0;
4418 h
->esym
.asym
.st
= stGlobal
;
4420 if (h
->root
.type
!= bfd_link_hash_defined
4421 && h
->root
.type
!= bfd_link_hash_defweak
)
4422 h
->esym
.asym
.sc
= scAbs
;
4425 asection
*output_section
;
4428 output_section
= h
->root
.u
.def
.section
->output_section
;
4429 name
= bfd_section_name (output_section
->owner
, output_section
);
4431 if (strcmp (name
, _TEXT
) == 0)
4432 h
->esym
.asym
.sc
= scText
;
4433 else if (strcmp (name
, _DATA
) == 0)
4434 h
->esym
.asym
.sc
= scData
;
4435 else if (strcmp (name
, _SDATA
) == 0)
4436 h
->esym
.asym
.sc
= scSData
;
4437 else if (strcmp (name
, _RDATA
) == 0)
4438 h
->esym
.asym
.sc
= scRData
;
4439 else if (strcmp (name
, _BSS
) == 0)
4440 h
->esym
.asym
.sc
= scBss
;
4441 else if (strcmp (name
, _SBSS
) == 0)
4442 h
->esym
.asym
.sc
= scSBss
;
4443 else if (strcmp (name
, _INIT
) == 0)
4444 h
->esym
.asym
.sc
= scInit
;
4445 else if (strcmp (name
, _FINI
) == 0)
4446 h
->esym
.asym
.sc
= scFini
;
4447 else if (strcmp (name
, _PDATA
) == 0)
4448 h
->esym
.asym
.sc
= scPData
;
4449 else if (strcmp (name
, _XDATA
) == 0)
4450 h
->esym
.asym
.sc
= scXData
;
4451 else if (strcmp (name
, _RCONST
) == 0)
4452 h
->esym
.asym
.sc
= scRConst
;
4454 h
->esym
.asym
.sc
= scAbs
;
4457 h
->esym
.asym
.reserved
= 0;
4458 h
->esym
.asym
.index
= indexNil
;
4460 else if (h
->esym
.ifd
!= -1)
4462 struct ecoff_debug_info
*debug
;
4464 /* Adjust the FDR index for the symbol by that used for the
4466 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4467 BFD_ASSERT (h
->esym
.ifd
>= 0
4468 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4469 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4472 switch (h
->root
.type
)
4475 case bfd_link_hash_new
:
4477 case bfd_link_hash_undefined
:
4478 case bfd_link_hash_undefweak
:
4479 if (h
->esym
.asym
.sc
!= scUndefined
4480 && h
->esym
.asym
.sc
!= scSUndefined
)
4481 h
->esym
.asym
.sc
= scUndefined
;
4483 case bfd_link_hash_defined
:
4484 case bfd_link_hash_defweak
:
4485 if (h
->esym
.asym
.sc
== scUndefined
4486 || h
->esym
.asym
.sc
== scSUndefined
)
4487 h
->esym
.asym
.sc
= scAbs
;
4488 else if (h
->esym
.asym
.sc
== scCommon
)
4489 h
->esym
.asym
.sc
= scBss
;
4490 else if (h
->esym
.asym
.sc
== scSCommon
)
4491 h
->esym
.asym
.sc
= scSBss
;
4492 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4493 + h
->root
.u
.def
.section
->output_section
->vma
4494 + h
->root
.u
.def
.section
->output_offset
);
4496 case bfd_link_hash_common
:
4497 if (h
->esym
.asym
.sc
!= scCommon
4498 && h
->esym
.asym
.sc
!= scSCommon
)
4499 h
->esym
.asym
.sc
= scCommon
;
4500 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4502 case bfd_link_hash_indirect
:
4503 case bfd_link_hash_warning
:
4504 /* FIXME: Ignore these for now. The circumstances under which
4505 they should be written out are not clear to me. */
4509 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4511 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4514 return (bfd_ecoff_debug_one_external
4515 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4516 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4520 /* Relocate and write an ECOFF section into an ECOFF output file. */
4523 ecoff_indirect_link_order (output_bfd
, info
, output_section
, link_order
)
4525 struct bfd_link_info
*info
;
4526 asection
*output_section
;
4527 struct bfd_link_order
*link_order
;
4529 asection
*input_section
;
4531 struct ecoff_section_tdata
*section_tdata
;
4532 bfd_size_type raw_size
;
4533 bfd_size_type cooked_size
;
4534 bfd_byte
*contents
= NULL
;
4535 bfd_size_type external_reloc_size
;
4536 bfd_size_type external_relocs_size
;
4537 PTR external_relocs
= NULL
;
4539 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
4541 if (link_order
->size
== 0)
4544 input_section
= link_order
->u
.indirect
.section
;
4545 input_bfd
= input_section
->owner
;
4546 section_tdata
= ecoff_section_data (input_bfd
, input_section
);
4548 raw_size
= input_section
->_raw_size
;
4549 cooked_size
= input_section
->_cooked_size
;
4550 if (cooked_size
== 0)
4551 cooked_size
= raw_size
;
4553 BFD_ASSERT (input_section
->output_section
== output_section
);
4554 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
4555 BFD_ASSERT (cooked_size
== link_order
->size
);
4557 /* Get the section contents. We allocate memory for the larger of
4558 the size before relocating and the size after relocating. */
4559 contents
= (bfd_byte
*) bfd_malloc (raw_size
>= cooked_size
4561 : (size_t) cooked_size
);
4562 if (contents
== NULL
&& raw_size
!= 0)
4565 /* If we are relaxing, the contents may have already been read into
4566 memory, in which case we copy them into our new buffer. We don't
4567 simply reuse the old buffer in case cooked_size > raw_size. */
4568 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4569 && section_tdata
->contents
!= (bfd_byte
*) NULL
)
4570 memcpy (contents
, section_tdata
->contents
, (size_t) raw_size
);
4573 if (! bfd_get_section_contents (input_bfd
, input_section
,
4575 (file_ptr
) 0, raw_size
))
4579 /* Get the relocs. If we are relaxing MIPS code, they will already
4580 have been read in. Otherwise, we read them in now. */
4581 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
4582 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
4584 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4585 && section_tdata
->external_relocs
!= NULL
)
4586 external_relocs
= section_tdata
->external_relocs
;
4589 external_relocs
= (PTR
) bfd_malloc ((size_t) external_relocs_size
);
4590 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
4593 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
4594 || (bfd_read (external_relocs
, 1, external_relocs_size
, input_bfd
)
4595 != external_relocs_size
))
4599 /* Relocate the section contents. */
4600 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4601 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4605 /* Write out the relocated section. */
4606 if (! bfd_set_section_contents (output_bfd
,
4609 input_section
->output_offset
,
4613 /* If we are producing relocateable output, the relocs were
4614 modified, and we write them out now. We use the reloc_count
4615 field of output_section to keep track of the number of relocs we
4616 have output so far. */
4617 if (info
->relocateable
)
4619 if (bfd_seek (output_bfd
,
4620 (output_section
->rel_filepos
+
4621 output_section
->reloc_count
* external_reloc_size
),
4623 || (bfd_write (external_relocs
, 1, external_relocs_size
, output_bfd
)
4624 != external_relocs_size
))
4626 output_section
->reloc_count
+= input_section
->reloc_count
;
4629 if (contents
!= NULL
)
4631 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4632 free (external_relocs
);
4636 if (contents
!= NULL
)
4638 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4639 free (external_relocs
);
4643 /* Generate a reloc when linking an ECOFF file. This is a reloc
4644 requested by the linker, and does come from any input file. This
4645 is used to build constructor and destructor tables when linking
4649 ecoff_reloc_link_order (output_bfd
, info
, output_section
, link_order
)
4651 struct bfd_link_info
*info
;
4652 asection
*output_section
;
4653 struct bfd_link_order
*link_order
;
4655 enum bfd_link_order_type type
;
4659 struct internal_reloc in
;
4660 bfd_size_type external_reloc_size
;
4664 type
= link_order
->type
;
4666 addend
= link_order
->u
.reloc
.p
->addend
;
4668 /* We set up an arelent to pass to the backend adjust_reloc_out
4670 rel
.address
= link_order
->offset
;
4672 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4675 bfd_set_error (bfd_error_bad_value
);
4679 if (type
== bfd_section_reloc_link_order
)
4681 section
= link_order
->u
.reloc
.p
->u
.section
;
4682 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4686 struct bfd_link_hash_entry
*h
;
4688 /* Treat a reloc against a defined symbol as though it were
4689 actually against the section. */
4690 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4691 link_order
->u
.reloc
.p
->u
.name
,
4692 false, false, false);
4694 && (h
->type
== bfd_link_hash_defined
4695 || h
->type
== bfd_link_hash_defweak
))
4697 type
= bfd_section_reloc_link_order
;
4698 section
= h
->u
.def
.section
->output_section
;
4699 /* It seems that we ought to add the symbol value to the
4700 addend here, but in practice it has already been added
4701 because it was passed to constructor_callback. */
4702 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4706 /* We can't set up a reloc against a symbol correctly,
4707 because we have no asymbol structure. Currently no
4708 adjust_reloc_out routine cares. */
4709 rel
.sym_ptr_ptr
= (asymbol
**) NULL
;
4713 /* All ECOFF relocs are in-place. Put the addend into the object
4716 BFD_ASSERT (rel
.howto
->partial_inplace
);
4720 bfd_reloc_status_type rstat
;
4724 size
= bfd_get_reloc_size (rel
.howto
);
4725 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4726 if (buf
== (bfd_byte
*) NULL
)
4728 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
, addend
, buf
);
4734 case bfd_reloc_outofrange
:
4736 case bfd_reloc_overflow
:
4737 if (! ((*info
->callbacks
->reloc_overflow
)
4739 (link_order
->type
== bfd_section_reloc_link_order
4740 ? bfd_section_name (output_bfd
, section
)
4741 : link_order
->u
.reloc
.p
->u
.name
),
4742 rel
.howto
->name
, addend
, (bfd
*) NULL
,
4743 (asection
*) NULL
, (bfd_vma
) 0)))
4750 ok
= bfd_set_section_contents (output_bfd
, output_section
, (PTR
) buf
,
4751 (file_ptr
) link_order
->offset
, size
);
4759 /* Move the information into a internal_reloc structure. */
4760 in
.r_vaddr
= (rel
.address
4761 + bfd_get_section_vma (output_bfd
, output_section
));
4762 in
.r_type
= rel
.howto
->type
;
4764 if (type
== bfd_symbol_reloc_link_order
)
4766 struct ecoff_link_hash_entry
*h
;
4768 h
= ((struct ecoff_link_hash_entry
*)
4769 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4770 link_order
->u
.reloc
.p
->u
.name
,
4771 false, false, true));
4772 if (h
!= (struct ecoff_link_hash_entry
*) NULL
4774 in
.r_symndx
= h
->indx
;
4777 if (! ((*info
->callbacks
->unattached_reloc
)
4778 (info
, link_order
->u
.reloc
.p
->u
.name
, (bfd
*) NULL
,
4779 (asection
*) NULL
, (bfd_vma
) 0)))
4789 name
= bfd_get_section_name (output_bfd
, section
);
4790 if (strcmp (name
, ".text") == 0)
4791 in
.r_symndx
= RELOC_SECTION_TEXT
;
4792 else if (strcmp (name
, ".rdata") == 0)
4793 in
.r_symndx
= RELOC_SECTION_RDATA
;
4794 else if (strcmp (name
, ".data") == 0)
4795 in
.r_symndx
= RELOC_SECTION_DATA
;
4796 else if (strcmp (name
, ".sdata") == 0)
4797 in
.r_symndx
= RELOC_SECTION_SDATA
;
4798 else if (strcmp (name
, ".sbss") == 0)
4799 in
.r_symndx
= RELOC_SECTION_SBSS
;
4800 else if (strcmp (name
, ".bss") == 0)
4801 in
.r_symndx
= RELOC_SECTION_BSS
;
4802 else if (strcmp (name
, ".init") == 0)
4803 in
.r_symndx
= RELOC_SECTION_INIT
;
4804 else if (strcmp (name
, ".lit8") == 0)
4805 in
.r_symndx
= RELOC_SECTION_LIT8
;
4806 else if (strcmp (name
, ".lit4") == 0)
4807 in
.r_symndx
= RELOC_SECTION_LIT4
;
4808 else if (strcmp (name
, ".xdata") == 0)
4809 in
.r_symndx
= RELOC_SECTION_XDATA
;
4810 else if (strcmp (name
, ".pdata") == 0)
4811 in
.r_symndx
= RELOC_SECTION_PDATA
;
4812 else if (strcmp (name
, ".fini") == 0)
4813 in
.r_symndx
= RELOC_SECTION_FINI
;
4814 else if (strcmp (name
, ".lita") == 0)
4815 in
.r_symndx
= RELOC_SECTION_LITA
;
4816 else if (strcmp (name
, "*ABS*") == 0)
4817 in
.r_symndx
= RELOC_SECTION_ABS
;
4818 else if (strcmp (name
, ".rconst") == 0)
4819 in
.r_symndx
= RELOC_SECTION_RCONST
;
4825 /* Let the BFD backend adjust the reloc. */
4826 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4828 /* Get some memory and swap out the reloc. */
4829 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4830 rbuf
= (bfd_byte
*) bfd_malloc ((size_t) external_reloc_size
);
4831 if (rbuf
== (bfd_byte
*) NULL
)
4834 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (PTR
) rbuf
);
4836 ok
= (bfd_seek (output_bfd
,
4837 (output_section
->rel_filepos
+
4838 output_section
->reloc_count
* external_reloc_size
),
4840 && (bfd_write ((PTR
) rbuf
, 1, external_reloc_size
, output_bfd
)
4841 == external_reloc_size
));
4844 ++output_section
->reloc_count
;