1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
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. */
367 _bfd_ecoff_styp_to_sec_flags (abfd
, hdr
, name
, section
)
368 bfd
*abfd ATTRIBUTE_UNUSED
;
370 const char *name ATTRIBUTE_UNUSED
;
371 asection
*section ATTRIBUTE_UNUSED
;
373 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
374 long styp_flags
= internal_s
->s_flags
;
375 flagword sec_flags
=0;
377 if (styp_flags
& STYP_NOLOAD
)
378 sec_flags
|= SEC_NEVER_LOAD
;
380 /* For 386 COFF, at least, an unloadable text or data section is
381 actually a shared library section. */
382 if ((styp_flags
& STYP_TEXT
)
383 || (styp_flags
& STYP_ECOFF_INIT
)
384 || (styp_flags
& STYP_ECOFF_FINI
)
385 || (styp_flags
& STYP_DYNAMIC
)
386 || (styp_flags
& STYP_LIBLIST
)
387 || (styp_flags
& STYP_RELDYN
)
388 || styp_flags
== STYP_CONFLIC
389 || (styp_flags
& STYP_DYNSTR
)
390 || (styp_flags
& STYP_DYNSYM
)
391 || (styp_flags
& STYP_HASH
))
393 if (sec_flags
& SEC_NEVER_LOAD
)
394 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
396 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
398 else if ((styp_flags
& STYP_DATA
)
399 || (styp_flags
& STYP_RDATA
)
400 || (styp_flags
& STYP_SDATA
)
401 || styp_flags
== STYP_PDATA
402 || styp_flags
== STYP_XDATA
403 || (styp_flags
& STYP_GOT
)
404 || styp_flags
== STYP_RCONST
)
406 if (sec_flags
& SEC_NEVER_LOAD
)
407 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
409 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
410 if ((styp_flags
& STYP_RDATA
)
411 || styp_flags
== STYP_PDATA
412 || styp_flags
== STYP_RCONST
)
413 sec_flags
|= SEC_READONLY
;
415 else if ((styp_flags
& STYP_BSS
)
416 || (styp_flags
& STYP_SBSS
))
418 sec_flags
|= SEC_ALLOC
;
420 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
422 sec_flags
|= SEC_NEVER_LOAD
;
424 else if ((styp_flags
& STYP_LITA
)
425 || (styp_flags
& STYP_LIT8
)
426 || (styp_flags
& STYP_LIT4
))
428 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
430 else if (styp_flags
& STYP_ECOFF_LIB
)
432 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
436 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
442 /* Read in the symbolic header for an ECOFF object file. */
445 ecoff_slurp_symbolic_header (abfd
)
448 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
449 bfd_size_type external_hdr_size
;
451 HDRR
*internal_symhdr
;
453 /* See if we've already read it in. */
454 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
455 backend
->debug_swap
.sym_magic
)
458 /* See whether there is a symbolic header. */
459 if (ecoff_data (abfd
)->sym_filepos
== 0)
461 bfd_get_symcount (abfd
) = 0;
465 /* At this point bfd_get_symcount (abfd) holds the number of symbols
466 as read from the file header, but on ECOFF this is always the
467 size of the symbolic information header. It would be cleaner to
468 handle this when we first read the file in coffgen.c. */
469 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
470 if (bfd_get_symcount (abfd
) != external_hdr_size
)
472 bfd_set_error (bfd_error_bad_value
);
476 /* Read the symbolic information header. */
477 raw
= (PTR
) bfd_malloc ((size_t) external_hdr_size
);
481 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) == -1
482 || (bfd_read (raw
, external_hdr_size
, 1, abfd
)
483 != external_hdr_size
))
485 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
486 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
488 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
490 bfd_set_error (bfd_error_bad_value
);
494 /* Now we can get the correct number of symbols. */
495 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
496 + internal_symhdr
->iextMax
);
507 /* Read in and swap the important symbolic information for an ECOFF
508 object file. This is called by gdb via the read_debug_info entry
509 point in the backend structure. */
512 _bfd_ecoff_slurp_symbolic_info (abfd
, ignore
, debug
)
514 asection
*ignore ATTRIBUTE_UNUSED
;
515 struct ecoff_debug_info
*debug
;
517 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
518 HDRR
*internal_symhdr
;
519 bfd_size_type raw_base
;
520 bfd_size_type raw_size
;
522 bfd_size_type external_fdr_size
;
526 bfd_size_type raw_end
;
527 bfd_size_type cb_end
;
529 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
531 /* Check whether we've already gotten it, and whether there's any to
533 if (ecoff_data (abfd
)->raw_syments
!= (PTR
) NULL
)
535 if (ecoff_data (abfd
)->sym_filepos
== 0)
537 bfd_get_symcount (abfd
) = 0;
541 if (! ecoff_slurp_symbolic_header (abfd
))
544 internal_symhdr
= &debug
->symbolic_header
;
546 /* Read all the symbolic information at once. */
547 raw_base
= (ecoff_data (abfd
)->sym_filepos
548 + backend
->debug_swap
.external_hdr_size
);
550 /* Alpha ecoff makes the determination of raw_size difficult. It has
551 an undocumented debug data section between the symhdr and the first
552 documented section. And the ordering of the sections varies between
553 statically and dynamically linked executables.
554 If bfd supports SEEK_END someday, this code could be simplified. */
558 #define UPDATE_RAW_END(start, count, size) \
559 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
560 if (cb_end > raw_end) \
563 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
564 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
565 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
566 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
567 UPDATE_RAW_END (cbOptOffset
, ioptMax
, backend
->debug_swap
.external_opt_size
);
568 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
569 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
570 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
571 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
572 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
573 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
575 #undef UPDATE_RAW_END
577 raw_size
= raw_end
- raw_base
;
580 ecoff_data (abfd
)->sym_filepos
= 0;
583 raw
= (PTR
) bfd_alloc (abfd
, raw_size
);
587 (ecoff_data (abfd
)->sym_filepos
588 + backend
->debug_swap
.external_hdr_size
),
590 || bfd_read (raw
, raw_size
, 1, abfd
) != raw_size
)
592 bfd_release (abfd
, raw
);
596 ecoff_data (abfd
)->raw_syments
= raw
;
598 /* Get pointers for the numeric offsets in the HDRR structure. */
599 #define FIX(off1, off2, type) \
600 if (internal_symhdr->off1 == 0) \
601 debug->off2 = (type) NULL; \
603 debug->off2 = (type) ((char *) raw \
604 + (internal_symhdr->off1 \
606 FIX (cbLineOffset
, line
, unsigned char *);
607 FIX (cbDnOffset
, external_dnr
, PTR
);
608 FIX (cbPdOffset
, external_pdr
, PTR
);
609 FIX (cbSymOffset
, external_sym
, PTR
);
610 FIX (cbOptOffset
, external_opt
, PTR
);
611 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
612 FIX (cbSsOffset
, ss
, char *);
613 FIX (cbSsExtOffset
, ssext
, char *);
614 FIX (cbFdOffset
, external_fdr
, PTR
);
615 FIX (cbRfdOffset
, external_rfd
, PTR
);
616 FIX (cbExtOffset
, external_ext
, PTR
);
619 /* I don't want to always swap all the data, because it will just
620 waste time and most programs will never look at it. The only
621 time the linker needs most of the debugging information swapped
622 is when linking big-endian and little-endian MIPS object files
623 together, which is not a common occurrence.
625 We need to look at the fdr to deal with a lot of information in
626 the symbols, so we swap them here. */
627 debug
->fdr
= (struct fdr
*) bfd_alloc (abfd
,
628 (internal_symhdr
->ifdMax
*
629 sizeof (struct fdr
)));
630 if (debug
->fdr
== NULL
)
632 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
633 fdr_ptr
= debug
->fdr
;
634 fraw_src
= (char *) debug
->external_fdr
;
635 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
636 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
637 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
642 /* ECOFF symbol table routines. The ECOFF symbol table is described
643 in gcc/mips-tfile.c. */
645 /* ECOFF uses two common sections. One is the usual one, and the
646 other is for small objects. All the small objects are kept
647 together, and then referenced via the gp pointer, which yields
648 faster assembler code. This is what we use for the small common
650 static asection ecoff_scom_section
;
651 static asymbol ecoff_scom_symbol
;
652 static asymbol
*ecoff_scom_symbol_ptr
;
654 /* Create an empty symbol. */
657 _bfd_ecoff_make_empty_symbol (abfd
)
660 ecoff_symbol_type
*new;
662 new = (ecoff_symbol_type
*) bfd_alloc (abfd
, sizeof (ecoff_symbol_type
));
663 if (new == (ecoff_symbol_type
*) NULL
)
664 return (asymbol
*) NULL
;
665 memset ((PTR
) new, 0, sizeof *new);
666 new->symbol
.section
= (asection
*) NULL
;
667 new->fdr
= (FDR
*) NULL
;
670 new->symbol
.the_bfd
= abfd
;
674 /* Set the BFD flags and section for an ECOFF symbol. */
677 ecoff_set_symbol_info (abfd
, ecoff_sym
, asym
, ext
, weak
)
684 asym
->the_bfd
= abfd
;
685 asym
->value
= ecoff_sym
->value
;
686 asym
->section
= &bfd_debug_section
;
689 /* Most symbol types are just for debugging. */
690 switch (ecoff_sym
->st
)
699 if (ECOFF_IS_STAB (ecoff_sym
))
701 asym
->flags
= BSF_DEBUGGING
;
706 asym
->flags
= BSF_DEBUGGING
;
711 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
713 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
716 asym
->flags
= BSF_LOCAL
;
717 /* Normally, a local stProc symbol will have a corresponding
718 external symbol. We mark the local symbol as a debugging
719 symbol, in order to prevent nm from printing both out.
720 Similarly, we mark stLabel and stabs symbols as debugging
721 symbols. In both cases, we do want to set the value
722 correctly based on the symbol class. */
723 if (ecoff_sym
->st
== stProc
724 || ecoff_sym
->st
== stLabel
725 || ECOFF_IS_STAB (ecoff_sym
))
726 asym
->flags
|= BSF_DEBUGGING
;
728 switch (ecoff_sym
->sc
)
731 /* Used for compiler generated labels. Leave them in the
732 debugging section, and mark them as local. If BSF_DEBUGGING
733 is set, then nm does not display them for some reason. If no
734 flags are set then the linker whines about them. */
735 asym
->flags
= BSF_LOCAL
;
738 asym
->section
= bfd_make_section_old_way (abfd
, ".text");
739 asym
->value
-= asym
->section
->vma
;
742 asym
->section
= bfd_make_section_old_way (abfd
, ".data");
743 asym
->value
-= asym
->section
->vma
;
746 asym
->section
= bfd_make_section_old_way (abfd
, ".bss");
747 asym
->value
-= asym
->section
->vma
;
750 asym
->flags
= BSF_DEBUGGING
;
753 asym
->section
= bfd_abs_section_ptr
;
756 asym
->section
= bfd_und_section_ptr
;
766 asym
->flags
= BSF_DEBUGGING
;
769 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
770 asym
->value
-= asym
->section
->vma
;
773 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
774 asym
->value
-= asym
->section
->vma
;
777 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
778 asym
->value
-= asym
->section
->vma
;
781 asym
->flags
= BSF_DEBUGGING
;
784 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
786 asym
->section
= bfd_com_section_ptr
;
792 if (ecoff_scom_section
.name
== NULL
)
794 /* Initialize the small common section. */
795 ecoff_scom_section
.name
= SCOMMON
;
796 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
797 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
798 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
799 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
800 ecoff_scom_symbol
.name
= SCOMMON
;
801 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
802 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
803 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
805 asym
->section
= &ecoff_scom_section
;
810 asym
->flags
= BSF_DEBUGGING
;
813 asym
->section
= bfd_und_section_ptr
;
818 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
819 asym
->value
-= asym
->section
->vma
;
824 asym
->flags
= BSF_DEBUGGING
;
827 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
828 asym
->value
-= asym
->section
->vma
;
831 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
832 asym
->value
-= asym
->section
->vma
;
838 /* Look for special constructors symbols and make relocation entries
839 in a special construction section. These are produced by the
840 -fgnu-linker argument to g++. */
841 if (ECOFF_IS_STAB (ecoff_sym
))
843 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
853 /* This code is no longer needed. It used to be used to
854 make the linker handle set symbols, but they are now
855 handled in the add_symbols routine instead. */
859 arelent_chain
*reloc_chain
;
860 unsigned int bitsize
;
862 /* Get a section with the same name as the symbol (usually
863 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
864 name ___CTOR_LIST (three underscores). We need
865 __CTOR_LIST (two underscores), since ECOFF doesn't use
866 a leading underscore. This should be handled by gcc,
867 but instead we do it here. Actually, this should all
868 be done differently anyhow. */
869 name
= bfd_asymbol_name (asym
);
870 if (name
[0] == '_' && name
[1] == '_' && name
[2] == '_')
875 section
= bfd_get_section_by_name (abfd
, name
);
876 if (section
== (asection
*) NULL
)
880 copy
= (char *) bfd_alloc (abfd
, strlen (name
) + 1);
884 section
= bfd_make_section (abfd
, copy
);
887 /* Build a reloc pointing to this constructor. */
889 (arelent_chain
*) bfd_alloc (abfd
, sizeof (arelent_chain
));
892 reloc_chain
->relent
.sym_ptr_ptr
=
893 bfd_get_section (asym
)->symbol_ptr_ptr
;
894 reloc_chain
->relent
.address
= section
->_raw_size
;
895 reloc_chain
->relent
.addend
= asym
->value
;
896 reloc_chain
->relent
.howto
=
897 ecoff_backend (abfd
)->constructor_reloc
;
899 /* Set up the constructor section to hold the reloc. */
900 section
->flags
= SEC_CONSTRUCTOR
;
901 ++section
->reloc_count
;
903 /* Constructor sections must be rounded to a boundary
904 based on the bitsize. These are not real sections--
905 they are handled specially by the linker--so the ECOFF
906 16 byte alignment restriction does not apply. */
907 bitsize
= ecoff_backend (abfd
)->constructor_bitsize
;
908 section
->alignment_power
= 1;
909 while ((1 << section
->alignment_power
) < bitsize
/ 8)
910 ++section
->alignment_power
;
912 reloc_chain
->next
= section
->constructor_chain
;
913 section
->constructor_chain
= reloc_chain
;
914 section
->_raw_size
+= bitsize
/ 8;
918 /* Mark the symbol as a constructor. */
919 asym
->flags
|= BSF_CONSTRUCTOR
;
927 /* Read an ECOFF symbol table. */
930 _bfd_ecoff_slurp_symbol_table (abfd
)
933 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
934 const bfd_size_type external_ext_size
935 = backend
->debug_swap
.external_ext_size
;
936 const bfd_size_type external_sym_size
937 = backend
->debug_swap
.external_sym_size
;
938 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
939 = backend
->debug_swap
.swap_ext_in
;
940 void (* const swap_sym_in
) PARAMS ((bfd
*, PTR
, SYMR
*))
941 = backend
->debug_swap
.swap_sym_in
;
942 bfd_size_type internal_size
;
943 ecoff_symbol_type
*internal
;
944 ecoff_symbol_type
*internal_ptr
;
950 /* If we've already read in the symbol table, do nothing. */
951 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
954 /* Get the symbolic information. */
955 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
956 &ecoff_data (abfd
)->debug_info
))
958 if (bfd_get_symcount (abfd
) == 0)
961 internal_size
= bfd_get_symcount (abfd
) * sizeof (ecoff_symbol_type
);
962 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
963 if (internal
== NULL
)
966 internal_ptr
= internal
;
967 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
969 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
970 * external_ext_size
));
971 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
975 (*swap_ext_in
) (abfd
, (PTR
) eraw_src
, &internal_esym
);
976 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
977 + internal_esym
.asym
.iss
);
978 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
979 &internal_ptr
->symbol
, 1,
980 internal_esym
.weakext
))
982 /* The alpha uses a negative ifd field for section symbols. */
983 if (internal_esym
.ifd
>= 0)
984 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
985 + internal_esym
.ifd
);
987 internal_ptr
->fdr
= NULL
;
988 internal_ptr
->local
= false;
989 internal_ptr
->native
= (PTR
) eraw_src
;
992 /* The local symbols must be accessed via the fdr's, because the
993 string and aux indices are relative to the fdr information. */
994 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
995 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
996 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
1001 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
1002 + fdr_ptr
->isymBase
* external_sym_size
);
1003 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
1005 lraw_src
< lraw_end
;
1006 lraw_src
+= external_sym_size
, internal_ptr
++)
1010 (*swap_sym_in
) (abfd
, (PTR
) lraw_src
, &internal_sym
);
1011 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
1013 + internal_sym
.iss
);
1014 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
1015 &internal_ptr
->symbol
, 0, 0))
1017 internal_ptr
->fdr
= fdr_ptr
;
1018 internal_ptr
->local
= true;
1019 internal_ptr
->native
= (PTR
) lraw_src
;
1023 ecoff_data (abfd
)->canonical_symbols
= internal
;
1028 /* Return the amount of space needed for the canonical symbols. */
1031 _bfd_ecoff_get_symtab_upper_bound (abfd
)
1034 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
1035 &ecoff_data (abfd
)->debug_info
))
1038 if (bfd_get_symcount (abfd
) == 0)
1041 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
1044 /* Get the canonical symbols. */
1047 _bfd_ecoff_get_symtab (abfd
, alocation
)
1049 asymbol
**alocation
;
1051 unsigned int counter
= 0;
1052 ecoff_symbol_type
*symbase
;
1053 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1055 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1057 if (bfd_get_symcount (abfd
) == 0)
1060 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1061 while (counter
< bfd_get_symcount (abfd
))
1063 *(location
++) = symbase
++;
1066 *location
++ = (ecoff_symbol_type
*) NULL
;
1067 return bfd_get_symcount (abfd
);
1070 /* Turn ECOFF type information into a printable string.
1071 ecoff_emit_aggregate and ecoff_type_to_string are from
1072 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1074 /* Write aggregate information to a string. */
1077 ecoff_emit_aggregate (abfd
, fdr
, string
, rndx
, isym
, which
)
1085 const struct ecoff_debug_swap
* const debug_swap
=
1086 &ecoff_backend (abfd
)->debug_swap
;
1087 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1088 unsigned int ifd
= rndx
->rfd
;
1089 unsigned int indx
= rndx
->index
;
1095 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1096 struct return type of a procedure compiled without -g. */
1097 if (ifd
== 0xffffffff
1098 || (rndx
->rfd
== 0xfff && indx
== 0))
1099 name
= "<undefined>";
1100 else if (indx
== indexNil
)
1106 if (debug_info
->external_rfd
== NULL
)
1107 fdr
= debug_info
->fdr
+ ifd
;
1112 (*debug_swap
->swap_rfd_in
) (abfd
,
1113 ((char *) debug_info
->external_rfd
1114 + ((fdr
->rfdBase
+ ifd
)
1115 * debug_swap
->external_rfd_size
)),
1117 fdr
= debug_info
->fdr
+ rfd
;
1120 indx
+= fdr
->isymBase
;
1122 (*debug_swap
->swap_sym_in
) (abfd
,
1123 ((char *) debug_info
->external_sym
1124 + indx
* debug_swap
->external_sym_size
),
1127 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1131 "%s %s { ifd = %u, index = %lu }",
1134 + debug_info
->symbolic_header
.iextMax
));
1137 /* Convert the type information to string format. */
1140 ecoff_type_to_string (abfd
, fdr
, indx
)
1145 union aux_ext
*aux_ptr
;
1154 unsigned int basic_type
;
1157 static char buffer2
[1024];
1162 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1163 bigendian
= fdr
->fBigendian
;
1165 for (i
= 0; i
< 7; i
++)
1167 qualifiers
[i
].low_bound
= 0;
1168 qualifiers
[i
].high_bound
= 0;
1169 qualifiers
[i
].stride
= 0;
1172 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1173 return "-1 (no type)";
1174 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1176 basic_type
= u
.ti
.bt
;
1177 qualifiers
[0].type
= u
.ti
.tq0
;
1178 qualifiers
[1].type
= u
.ti
.tq1
;
1179 qualifiers
[2].type
= u
.ti
.tq2
;
1180 qualifiers
[3].type
= u
.ti
.tq3
;
1181 qualifiers
[4].type
= u
.ti
.tq4
;
1182 qualifiers
[5].type
= u
.ti
.tq5
;
1183 qualifiers
[6].type
= tqNil
;
1186 * Go get the basic type.
1190 case btNil
: /* undefined */
1194 case btAdr
: /* address - integer same size as pointer */
1195 strcpy (p1
, "address");
1198 case btChar
: /* character */
1199 strcpy (p1
, "char");
1202 case btUChar
: /* unsigned character */
1203 strcpy (p1
, "unsigned char");
1206 case btShort
: /* short */
1207 strcpy (p1
, "short");
1210 case btUShort
: /* unsigned short */
1211 strcpy (p1
, "unsigned short");
1214 case btInt
: /* int */
1218 case btUInt
: /* unsigned int */
1219 strcpy (p1
, "unsigned int");
1222 case btLong
: /* long */
1223 strcpy (p1
, "long");
1226 case btULong
: /* unsigned long */
1227 strcpy (p1
, "unsigned long");
1230 case btFloat
: /* float (real) */
1231 strcpy (p1
, "float");
1234 case btDouble
: /* Double (real) */
1235 strcpy (p1
, "double");
1238 /* Structures add 1-2 aux words:
1239 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1240 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1242 case btStruct
: /* Structure (Record) */
1243 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1244 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1245 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1247 indx
++; /* skip aux words */
1250 /* Unions add 1-2 aux words:
1251 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1252 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1254 case btUnion
: /* Union */
1255 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1256 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1257 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1259 indx
++; /* skip aux words */
1262 /* Enumerations add 1-2 aux words:
1263 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1264 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1266 case btEnum
: /* Enumeration */
1267 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1268 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1269 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1271 indx
++; /* skip aux words */
1274 case btTypedef
: /* defined via a typedef, isymRef points */
1275 strcpy (p1
, "typedef");
1278 case btRange
: /* subrange of int */
1279 strcpy (p1
, "subrange");
1282 case btSet
: /* pascal sets */
1286 case btComplex
: /* fortran complex */
1287 strcpy (p1
, "complex");
1290 case btDComplex
: /* fortran double complex */
1291 strcpy (p1
, "double complex");
1294 case btIndirect
: /* forward or unnamed typedef */
1295 strcpy (p1
, "forward/unamed typedef");
1298 case btFixedDec
: /* Fixed Decimal */
1299 strcpy (p1
, "fixed decimal");
1302 case btFloatDec
: /* Float Decimal */
1303 strcpy (p1
, "float decimal");
1306 case btString
: /* Varying Length Character String */
1307 strcpy (p1
, "string");
1310 case btBit
: /* Aligned Bit String */
1314 case btPicture
: /* Picture */
1315 strcpy (p1
, "picture");
1318 case btVoid
: /* Void */
1319 strcpy (p1
, "void");
1323 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1327 p1
+= strlen (buffer1
);
1330 * If this is a bitfield, get the bitsize.
1336 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1337 sprintf (p1
, " : %d", bitsize
);
1338 p1
+= strlen (buffer1
);
1342 * Deal with any qualifiers.
1344 if (qualifiers
[0].type
!= tqNil
)
1347 * Snarf up any array bounds in the correct order. Arrays
1348 * store 5 successive words in the aux. table:
1349 * word 0 RNDXR to type of the bounds (ie, int)
1350 * word 1 Current file descriptor index
1352 * word 3 high bound (or -1 if [])
1353 * word 4 stride size in bits
1355 for (i
= 0; i
< 7; i
++)
1357 if (qualifiers
[i
].type
== tqArray
)
1359 qualifiers
[i
].low_bound
=
1360 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1361 qualifiers
[i
].high_bound
=
1362 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1363 qualifiers
[i
].stride
=
1364 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1370 * Now print out the qualifiers.
1372 for (i
= 0; i
< 6; i
++)
1374 switch (qualifiers
[i
].type
)
1381 strcpy (p2
, "ptr to ");
1382 p2
+= sizeof ("ptr to ")-1;
1386 strcpy (p2
, "volatile ");
1387 p2
+= sizeof ("volatile ")-1;
1391 strcpy (p2
, "far ");
1392 p2
+= sizeof ("far ")-1;
1396 strcpy (p2
, "func. ret. ");
1397 p2
+= sizeof ("func. ret. ");
1402 int first_array
= i
;
1405 /* Print array bounds reversed (ie, in the order the C
1406 programmer writes them). C is such a fun language.... */
1408 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1411 for (j
= i
; j
>= first_array
; j
--)
1413 strcpy (p2
, "array [");
1414 p2
+= sizeof ("array [")-1;
1415 if (qualifiers
[j
].low_bound
!= 0)
1417 "%ld:%ld {%ld bits}",
1418 (long) qualifiers
[j
].low_bound
,
1419 (long) qualifiers
[j
].high_bound
,
1420 (long) qualifiers
[j
].stride
);
1422 else if (qualifiers
[j
].high_bound
!= -1)
1425 (long) (qualifiers
[j
].high_bound
+ 1),
1426 (long) (qualifiers
[j
].stride
));
1429 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1432 strcpy (p2
, "] of ");
1433 p2
+= sizeof ("] of ")-1;
1441 strcpy (p2
, buffer1
);
1445 /* Return information about ECOFF symbol SYMBOL in RET. */
1448 _bfd_ecoff_get_symbol_info (abfd
, symbol
, ret
)
1449 bfd
*abfd ATTRIBUTE_UNUSED
;
1453 bfd_symbol_info (symbol
, ret
);
1456 /* Return whether this is a local label. */
1459 _bfd_ecoff_bfd_is_local_label_name (abfd
, name
)
1460 bfd
*abfd ATTRIBUTE_UNUSED
;
1463 return name
[0] == '$';
1466 /* Print information about an ECOFF symbol. */
1469 _bfd_ecoff_print_symbol (abfd
, filep
, symbol
, how
)
1473 bfd_print_symbol_type how
;
1475 const struct ecoff_debug_swap
* const debug_swap
1476 = &ecoff_backend (abfd
)->debug_swap
;
1477 FILE *file
= (FILE *)filep
;
1481 case bfd_print_symbol_name
:
1482 fprintf (file
, "%s", symbol
->name
);
1484 case bfd_print_symbol_more
:
1485 if (ecoffsymbol (symbol
)->local
)
1489 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1491 fprintf (file
, "ecoff local ");
1492 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1493 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1494 (unsigned) ecoff_sym
.sc
);
1500 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1502 fprintf (file
, "ecoff extern ");
1503 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1504 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1505 (unsigned) ecoff_ext
.asym
.sc
);
1508 case bfd_print_symbol_all
:
1509 /* Print out the symbols in a reasonable way */
1518 if (ecoffsymbol (symbol
)->local
)
1520 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1523 pos
= ((((char *) ecoffsymbol (symbol
)->native
1524 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1525 / debug_swap
->external_sym_size
)
1526 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1533 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1536 pos
= (((char *) ecoffsymbol (symbol
)->native
1537 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1538 / debug_swap
->external_ext_size
);
1539 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1540 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1541 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1544 fprintf (file
, "[%3d] %c ",
1546 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1547 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1548 (unsigned) ecoff_ext
.asym
.st
,
1549 (unsigned) ecoff_ext
.asym
.sc
,
1550 (unsigned) ecoff_ext
.asym
.index
,
1551 jmptbl
, cobol_main
, weakext
,
1554 if (ecoffsymbol (symbol
)->fdr
!= NULL
1555 && ecoff_ext
.asym
.index
!= indexNil
)
1560 bfd_size_type sym_base
;
1561 union aux_ext
*aux_base
;
1563 fdr
= ecoffsymbol (symbol
)->fdr
;
1564 indx
= ecoff_ext
.asym
.index
;
1566 /* sym_base is used to map the fdr relative indices which
1567 appear in the file to the position number which we are
1569 sym_base
= fdr
->isymBase
;
1570 if (ecoffsymbol (symbol
)->local
)
1572 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1574 /* aux_base is the start of the aux entries for this file;
1575 asym.index is an offset from this. */
1576 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1579 /* The aux entries are stored in host byte order; the
1580 order is indicated by a bit in the fdr. */
1581 bigendian
= fdr
->fBigendian
;
1583 /* This switch is basically from gcc/mips-tdump.c */
1584 switch (ecoff_ext
.asym
.st
)
1592 fprintf (file
, _("\n End+1 symbol: %ld"),
1593 (long) (indx
+ sym_base
));
1597 if (ecoff_ext
.asym
.sc
== scText
1598 || ecoff_ext
.asym
.sc
== scInfo
)
1599 fprintf (file
, _("\n First symbol: %ld"),
1600 (long) (indx
+ sym_base
));
1602 fprintf (file
, _("\n First symbol: %ld"),
1604 (AUX_GET_ISYM (bigendian
,
1605 &aux_base
[ecoff_ext
.asym
.index
])
1611 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1613 else if (ecoffsymbol (symbol
)->local
)
1614 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1616 (AUX_GET_ISYM (bigendian
,
1617 &aux_base
[ecoff_ext
.asym
.index
])
1619 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1621 fprintf (file
, _("\n Local symbol: %ld"),
1624 + (ecoff_data (abfd
)
1625 ->debug_info
.symbolic_header
.iextMax
)));
1629 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1630 (long) (indx
+ sym_base
));
1634 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1635 (long) (indx
+ sym_base
));
1639 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1640 (long) (indx
+ sym_base
));
1644 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1645 fprintf (file
, _("\n Type: %s"),
1646 ecoff_type_to_string (abfd
, fdr
, indx
));
1655 /* Read in the relocs for a section. */
1658 ecoff_slurp_reloc_table (abfd
, section
, symbols
)
1663 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1664 arelent
*internal_relocs
;
1665 bfd_size_type external_reloc_size
;
1666 bfd_size_type external_relocs_size
;
1667 char *external_relocs
;
1671 if (section
->relocation
!= (arelent
*) NULL
1672 || section
->reloc_count
== 0
1673 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1676 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1679 internal_relocs
= (arelent
*) bfd_alloc (abfd
,
1681 * section
->reloc_count
));
1682 external_reloc_size
= backend
->external_reloc_size
;
1683 external_relocs_size
= external_reloc_size
* section
->reloc_count
;
1684 external_relocs
= (char *) bfd_alloc (abfd
, external_relocs_size
);
1685 if (internal_relocs
== (arelent
*) NULL
1686 || external_relocs
== (char *) NULL
)
1688 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1690 if (bfd_read (external_relocs
, 1, external_relocs_size
, abfd
)
1691 != external_relocs_size
)
1694 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1696 struct internal_reloc intern
;
1698 (*backend
->swap_reloc_in
) (abfd
,
1699 external_relocs
+ i
* external_reloc_size
,
1702 if (intern
.r_extern
)
1704 /* r_symndx is an index into the external symbols. */
1705 BFD_ASSERT (intern
.r_symndx
>= 0
1707 < (ecoff_data (abfd
)
1708 ->debug_info
.symbolic_header
.iextMax
)));
1709 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1712 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1713 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1715 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1720 CONST
char *sec_name
;
1723 /* r_symndx is a section key. */
1724 switch (intern
.r_symndx
)
1726 case RELOC_SECTION_TEXT
: sec_name
= ".text"; break;
1727 case RELOC_SECTION_RDATA
: sec_name
= ".rdata"; break;
1728 case RELOC_SECTION_DATA
: sec_name
= ".data"; break;
1729 case RELOC_SECTION_SDATA
: sec_name
= ".sdata"; break;
1730 case RELOC_SECTION_SBSS
: sec_name
= ".sbss"; break;
1731 case RELOC_SECTION_BSS
: sec_name
= ".bss"; break;
1732 case RELOC_SECTION_INIT
: sec_name
= ".init"; break;
1733 case RELOC_SECTION_LIT8
: sec_name
= ".lit8"; break;
1734 case RELOC_SECTION_LIT4
: sec_name
= ".lit4"; break;
1735 case RELOC_SECTION_XDATA
: sec_name
= ".xdata"; break;
1736 case RELOC_SECTION_PDATA
: sec_name
= ".pdata"; break;
1737 case RELOC_SECTION_FINI
: sec_name
= ".fini"; break;
1738 case RELOC_SECTION_LITA
: sec_name
= ".lita"; break;
1739 case RELOC_SECTION_RCONST
: sec_name
= ".rconst"; break;
1743 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1744 if (sec
== (asection
*) NULL
)
1746 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1748 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1751 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1753 /* Let the backend select the howto field and do any other
1754 required processing. */
1755 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1758 bfd_release (abfd
, external_relocs
);
1760 section
->relocation
= internal_relocs
;
1765 /* Get a canonical list of relocs. */
1768 _bfd_ecoff_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
1776 if (section
->flags
& SEC_CONSTRUCTOR
)
1778 arelent_chain
*chain
;
1780 /* This section has relocs made up by us, not the file, so take
1781 them out of their chain and place them into the data area
1783 for (count
= 0, chain
= section
->constructor_chain
;
1784 count
< section
->reloc_count
;
1785 count
++, chain
= chain
->next
)
1786 *relptr
++ = &chain
->relent
;
1792 if (ecoff_slurp_reloc_table (abfd
, section
, symbols
) == false)
1795 tblptr
= section
->relocation
;
1797 for (count
= 0; count
< section
->reloc_count
; count
++)
1798 *relptr
++ = tblptr
++;
1801 *relptr
= (arelent
*) NULL
;
1803 return section
->reloc_count
;
1806 /* Provided a BFD, a section and an offset into the section, calculate
1807 and return the name of the source file and the line nearest to the
1811 _bfd_ecoff_find_nearest_line (abfd
, section
, ignore_symbols
, offset
,
1812 filename_ptr
, functionname_ptr
, retline_ptr
)
1815 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
;
1817 CONST
char **filename_ptr
;
1818 CONST
char **functionname_ptr
;
1819 unsigned int *retline_ptr
;
1821 const struct ecoff_debug_swap
* const debug_swap
1822 = &ecoff_backend (abfd
)->debug_swap
;
1823 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1824 struct ecoff_find_line
*line_info
;
1826 /* Make sure we have the FDR's. */
1827 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
, debug_info
)
1828 || bfd_get_symcount (abfd
) == 0)
1831 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1833 ecoff_data (abfd
)->find_line_info
=
1834 ((struct ecoff_find_line
*)
1835 bfd_zalloc (abfd
, sizeof (struct ecoff_find_line
)));
1836 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1839 line_info
= ecoff_data (abfd
)->find_line_info
;
1841 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1842 debug_swap
, line_info
, filename_ptr
,
1843 functionname_ptr
, retline_ptr
);
1846 /* Copy private BFD data. This is called by objcopy and strip. We
1847 use it to copy the ECOFF debugging information from one BFD to the
1848 other. It would be theoretically possible to represent the ECOFF
1849 debugging information in the symbol table. However, it would be a
1850 lot of work, and there would be little gain (gas, gdb, and ld
1851 already access the ECOFF debugging information via the
1852 ecoff_debug_info structure, and that structure would have to be
1853 retained in order to support ECOFF debugging in MIPS ELF).
1855 The debugging information for the ECOFF external symbols comes from
1856 the symbol table, so this function only handles the other debugging
1860 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd
, obfd
)
1864 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1865 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1867 asymbol
**sym_ptr_ptr
;
1871 /* We only want to copy information over if both BFD's use ECOFF
1873 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1874 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1877 /* Copy the GP value and the register masks. */
1878 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1879 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1880 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1881 for (i
= 0; i
< 3; i
++)
1882 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1884 /* Copy the version stamp. */
1885 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1887 /* If there are no symbols, don't copy any debugging information. */
1888 c
= bfd_get_symcount (obfd
);
1889 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1890 if (c
== 0 || sym_ptr_ptr
== (asymbol
**) NULL
)
1893 /* See if there are any local symbols. */
1895 for (; c
> 0; c
--, sym_ptr_ptr
++)
1897 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1906 /* There are some local symbols. We just bring over all the
1907 debugging information. FIXME: This is not quite the right
1908 thing to do. If the user has asked us to discard all
1909 debugging information, then we are probably going to wind up
1910 keeping it because there will probably be some local symbol
1911 which objcopy did not discard. We should actually break
1912 apart the debugging information and only keep that which
1913 applies to the symbols we want to keep. */
1914 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1915 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1916 oinfo
->line
= iinfo
->line
;
1918 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1919 oinfo
->external_dnr
= iinfo
->external_dnr
;
1921 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1922 oinfo
->external_pdr
= iinfo
->external_pdr
;
1924 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1925 oinfo
->external_sym
= iinfo
->external_sym
;
1927 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1928 oinfo
->external_opt
= iinfo
->external_opt
;
1930 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1931 oinfo
->external_aux
= iinfo
->external_aux
;
1933 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1934 oinfo
->ss
= iinfo
->ss
;
1936 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1937 oinfo
->external_fdr
= iinfo
->external_fdr
;
1939 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1940 oinfo
->external_rfd
= iinfo
->external_rfd
;
1944 /* We are discarding all the local symbol information. Look
1945 through the external symbols and remove all references to FDR
1946 or aux information. */
1947 c
= bfd_get_symcount (obfd
);
1948 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1949 for (; c
> 0; c
--, sym_ptr_ptr
++)
1953 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1954 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1956 esym
.asym
.index
= indexNil
;
1957 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1958 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1965 /* Set the architecture. The supported architecture is stored in the
1966 backend pointer. We always set the architecture anyhow, since many
1967 callers ignore the return value. */
1970 _bfd_ecoff_set_arch_mach (abfd
, arch
, machine
)
1972 enum bfd_architecture arch
;
1973 unsigned long machine
;
1975 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1976 return arch
== ecoff_backend (abfd
)->arch
;
1979 /* Get the size of the section headers. */
1982 _bfd_ecoff_sizeof_headers (abfd
, reloc
)
1984 boolean reloc ATTRIBUTE_UNUSED
;
1991 for (current
= abfd
->sections
;
1992 current
!= (asection
*)NULL
;
1993 current
= current
->next
)
1996 ret
= (bfd_coff_filhsz (abfd
)
1997 + bfd_coff_aoutsz (abfd
)
1998 + c
* bfd_coff_scnhsz (abfd
));
1999 return BFD_ALIGN (ret
, 16);
2002 /* Get the contents of a section. */
2005 _bfd_ecoff_get_section_contents (abfd
, section
, location
, offset
, count
)
2010 bfd_size_type count
;
2012 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2016 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2017 called via qsort. */
2020 ecoff_sort_hdrs (arg1
, arg2
)
2024 const asection
*hdr1
= *(const asection
**) arg1
;
2025 const asection
*hdr2
= *(const asection
**) arg2
;
2027 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
2029 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
2034 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
2037 if (hdr1
->vma
< hdr2
->vma
)
2039 else if (hdr1
->vma
> hdr2
->vma
)
2045 /* Calculate the file position for each section, and set
2049 ecoff_compute_section_file_positions (abfd
)
2052 file_ptr sofar
, file_sofar
;
2053 asection
**sorted_hdrs
;
2057 boolean rdata_in_text
;
2058 boolean first_data
, first_nonalloc
;
2059 const bfd_vma round
= ecoff_backend (abfd
)->round
;
2061 sofar
= _bfd_ecoff_sizeof_headers (abfd
, false);
2064 /* Sort the sections by VMA. */
2065 sorted_hdrs
= (asection
**) bfd_malloc (abfd
->section_count
2066 * sizeof (asection
*));
2067 if (sorted_hdrs
== NULL
)
2069 for (current
= abfd
->sections
, i
= 0;
2071 current
= current
->next
, i
++)
2072 sorted_hdrs
[i
] = current
;
2073 BFD_ASSERT (i
== abfd
->section_count
);
2075 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2078 /* Some versions of the OSF linker put the .rdata section in the
2079 text segment, and some do not. */
2080 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2083 for (i
= 0; i
< abfd
->section_count
; i
++)
2085 current
= sorted_hdrs
[i
];
2086 if (strcmp (current
->name
, _RDATA
) == 0)
2088 if ((current
->flags
& SEC_CODE
) == 0
2089 && strcmp (current
->name
, _PDATA
) != 0
2090 && strcmp (current
->name
, _RCONST
) != 0)
2092 rdata_in_text
= false;
2097 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2100 first_nonalloc
= true;
2101 for (i
= 0; i
< abfd
->section_count
; i
++)
2103 unsigned int alignment_power
;
2105 current
= sorted_hdrs
[i
];
2107 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2108 supposed to indicate the number of .pdata entries that are
2109 really in the section. Each entry is 8 bytes. We store this
2110 away in line_filepos before increasing the section size. */
2111 if (strcmp (current
->name
, _PDATA
) == 0)
2112 current
->line_filepos
= current
->_raw_size
/ 8;
2114 alignment_power
= current
->alignment_power
;
2116 /* On Ultrix, the data sections in an executable file must be
2117 aligned to a page boundary within the file. This does not
2118 affect the section size, though. FIXME: Does this work for
2119 other platforms? It requires some modification for the
2120 Alpha, because .rdata on the Alpha goes with the text, not
2122 if ((abfd
->flags
& EXEC_P
) != 0
2123 && (abfd
->flags
& D_PAGED
) != 0
2125 && (current
->flags
& SEC_CODE
) == 0
2127 || strcmp (current
->name
, _RDATA
) != 0)
2128 && strcmp (current
->name
, _PDATA
) != 0
2129 && strcmp (current
->name
, _RCONST
) != 0)
2131 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2132 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2135 else if (strcmp (current
->name
, _LIB
) == 0)
2137 /* On Irix 4, the location of contents of the .lib section
2138 from a shared library section is also rounded up to a
2141 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2142 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2144 else if (first_nonalloc
2145 && (current
->flags
& SEC_ALLOC
) == 0
2146 && (abfd
->flags
& D_PAGED
) != 0)
2148 /* Skip up to the next page for an unallocated section, such
2149 as the .comment section on the Alpha. This leaves room
2150 for the .bss section. */
2151 first_nonalloc
= false;
2152 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2153 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2156 /* Align the sections in the file to the same boundary on
2157 which they are aligned in virtual memory. */
2158 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2159 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2160 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2162 if ((abfd
->flags
& D_PAGED
) != 0
2163 && (current
->flags
& SEC_ALLOC
) != 0)
2165 sofar
+= (current
->vma
- sofar
) % round
;
2166 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2167 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2170 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2171 current
->filepos
= file_sofar
;
2173 sofar
+= current
->_raw_size
;
2174 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2175 file_sofar
+= current
->_raw_size
;
2177 /* make sure that this section is of the right size too */
2179 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2180 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2181 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2182 current
->_raw_size
+= sofar
- old_sofar
;
2188 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2193 /* Determine the location of the relocs for all the sections in the
2194 output file, as well as the location of the symbolic debugging
2197 static bfd_size_type
2198 ecoff_compute_reloc_file_positions (abfd
)
2201 const bfd_size_type external_reloc_size
=
2202 ecoff_backend (abfd
)->external_reloc_size
;
2203 file_ptr reloc_base
;
2204 bfd_size_type reloc_size
;
2208 if (! abfd
->output_has_begun
)
2210 if (! ecoff_compute_section_file_positions (abfd
))
2212 abfd
->output_has_begun
= true;
2215 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2218 for (current
= abfd
->sections
;
2219 current
!= (asection
*)NULL
;
2220 current
= current
->next
)
2222 if (current
->reloc_count
== 0)
2223 current
->rel_filepos
= 0;
2226 bfd_size_type relsize
;
2228 current
->rel_filepos
= reloc_base
;
2229 relsize
= current
->reloc_count
* external_reloc_size
;
2230 reloc_size
+= relsize
;
2231 reloc_base
+= relsize
;
2235 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2237 /* At least on Ultrix, the symbol table of an executable file must
2238 be aligned to a page boundary. FIXME: Is this true on other
2240 if ((abfd
->flags
& EXEC_P
) != 0
2241 && (abfd
->flags
& D_PAGED
) != 0)
2242 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2243 &~ (ecoff_backend (abfd
)->round
- 1));
2245 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2250 /* Set the contents of a section. */
2253 _bfd_ecoff_set_section_contents (abfd
, section
, location
, offset
, count
)
2258 bfd_size_type count
;
2260 /* This must be done first, because bfd_set_section_contents is
2261 going to set output_has_begun to true. */
2262 if (abfd
->output_has_begun
== false)
2264 if (! ecoff_compute_section_file_positions (abfd
))
2268 /* Handle the .lib section specially so that Irix 4 shared libraries
2269 work out. See coff_set_section_contents in coffcode.h. */
2270 if (strcmp (section
->name
, _LIB
) == 0)
2272 bfd_byte
*rec
, *recend
;
2274 rec
= (bfd_byte
*) location
;
2275 recend
= rec
+ count
;
2276 while (rec
< recend
)
2279 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2282 BFD_ASSERT (rec
== recend
);
2288 if (bfd_seek (abfd
, (file_ptr
) (section
->filepos
+ offset
), SEEK_SET
) != 0
2289 || bfd_write (location
, 1, count
, abfd
) != count
)
2295 /* Get the GP value for an ECOFF file. This is a hook used by
2299 bfd_ecoff_get_gp_value (abfd
)
2302 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2303 || bfd_get_format (abfd
) != bfd_object
)
2305 bfd_set_error (bfd_error_invalid_operation
);
2309 return ecoff_data (abfd
)->gp
;
2312 /* Set the GP value for an ECOFF file. This is a hook used by the
2316 bfd_ecoff_set_gp_value (abfd
, gp_value
)
2320 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2321 || bfd_get_format (abfd
) != bfd_object
)
2323 bfd_set_error (bfd_error_invalid_operation
);
2327 ecoff_data (abfd
)->gp
= gp_value
;
2332 /* Set the register masks for an ECOFF file. This is a hook used by
2336 bfd_ecoff_set_regmasks (abfd
, gprmask
, fprmask
, cprmask
)
2338 unsigned long gprmask
;
2339 unsigned long fprmask
;
2340 unsigned long *cprmask
;
2342 ecoff_data_type
*tdata
;
2344 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2345 || bfd_get_format (abfd
) != bfd_object
)
2347 bfd_set_error (bfd_error_invalid_operation
);
2351 tdata
= ecoff_data (abfd
);
2352 tdata
->gprmask
= gprmask
;
2353 tdata
->fprmask
= fprmask
;
2354 if (cprmask
!= (unsigned long *) NULL
)
2358 for (i
= 0; i
< 3; i
++)
2359 tdata
->cprmask
[i
] = cprmask
[i
];
2365 /* Get ECOFF EXTR information for an external symbol. This function
2366 is passed to bfd_ecoff_debug_externals. */
2369 ecoff_get_extr (sym
, esym
)
2373 ecoff_symbol_type
*ecoff_sym_ptr
;
2376 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2377 || ecoffsymbol (sym
)->native
== NULL
)
2379 /* Don't include debugging, local, or section symbols. */
2380 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2381 || (sym
->flags
& BSF_LOCAL
) != 0
2382 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2386 esym
->cobol_main
= 0;
2387 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2390 /* FIXME: we can do better than this for st and sc. */
2391 esym
->asym
.st
= stGlobal
;
2392 esym
->asym
.sc
= scAbs
;
2393 esym
->asym
.reserved
= 0;
2394 esym
->asym
.index
= indexNil
;
2398 ecoff_sym_ptr
= ecoffsymbol (sym
);
2400 if (ecoff_sym_ptr
->local
)
2403 input_bfd
= bfd_asymbol_bfd (sym
);
2404 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2405 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2407 /* If the symbol was defined by the linker, then esym will be
2408 undefined but sym will not be. Get a better class for such a
2410 if ((esym
->asym
.sc
== scUndefined
2411 || esym
->asym
.sc
== scSUndefined
)
2412 && ! bfd_is_und_section (bfd_get_section (sym
)))
2413 esym
->asym
.sc
= scAbs
;
2415 /* Adjust the FDR index for the symbol by that used for the input
2417 if (esym
->ifd
!= -1)
2419 struct ecoff_debug_info
*input_debug
;
2421 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2422 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2423 if (input_debug
->ifdmap
!= (RFDT
*) NULL
)
2424 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2430 /* Set the external symbol index. This routine is passed to
2431 bfd_ecoff_debug_externals. */
2434 ecoff_set_index (sym
, indx
)
2438 ecoff_set_sym_index (sym
, indx
);
2441 /* Write out an ECOFF file. */
2444 _bfd_ecoff_write_object_contents (abfd
)
2447 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2448 const bfd_vma round
= backend
->round
;
2449 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2450 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2451 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2452 const bfd_size_type external_hdr_size
2453 = backend
->debug_swap
.external_hdr_size
;
2454 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2455 void (* const adjust_reloc_out
) PARAMS ((bfd
*,
2457 struct internal_reloc
*))
2458 = backend
->adjust_reloc_out
;
2459 void (* const swap_reloc_out
) PARAMS ((bfd
*,
2460 const struct internal_reloc
*,
2462 = backend
->swap_reloc_out
;
2463 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2464 HDRR
* const symhdr
= &debug
->symbolic_header
;
2467 bfd_size_type reloc_size
;
2468 bfd_size_type text_size
;
2470 boolean set_text_start
;
2471 bfd_size_type data_size
;
2473 boolean set_data_start
;
2474 bfd_size_type bss_size
;
2476 PTR reloc_buff
= NULL
;
2477 struct internal_filehdr internal_f
;
2478 struct internal_aouthdr internal_a
;
2481 /* Determine where the sections and relocs will go in the output
2483 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2486 for (current
= abfd
->sections
;
2487 current
!= (asection
*)NULL
;
2488 current
= current
->next
)
2490 current
->target_index
= count
;
2494 if ((abfd
->flags
& D_PAGED
) != 0)
2495 text_size
= _bfd_ecoff_sizeof_headers (abfd
, false);
2499 set_text_start
= false;
2502 set_data_start
= false;
2505 /* Write section headers to the file. */
2507 /* Allocate buff big enough to hold a section header,
2508 file header, or a.out header. */
2516 buff
= (PTR
) bfd_malloc ((size_t) siz
);
2521 internal_f
.f_nscns
= 0;
2522 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2524 for (current
= abfd
->sections
;
2525 current
!= (asection
*) NULL
;
2526 current
= current
->next
)
2528 struct internal_scnhdr section
;
2531 ++internal_f
.f_nscns
;
2533 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2535 /* This seems to be correct for Irix 4 shared libraries. */
2536 vma
= bfd_get_section_vma (abfd
, current
);
2537 if (strcmp (current
->name
, _LIB
) == 0)
2538 section
.s_vaddr
= 0;
2540 section
.s_vaddr
= vma
;
2542 section
.s_paddr
= current
->lma
;
2543 section
.s_size
= bfd_get_section_size_before_reloc (current
);
2545 /* If this section is unloadable then the scnptr will be 0. */
2546 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2547 section
.s_scnptr
= 0;
2549 section
.s_scnptr
= current
->filepos
;
2550 section
.s_relptr
= current
->rel_filepos
;
2552 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2553 object file produced by the assembler is supposed to point to
2554 information about how much room is required by objects of
2555 various different sizes. I think this only matters if we
2556 want the linker to compute the best size to use, or
2557 something. I don't know what happens if the information is
2559 if (strcmp (current
->name
, _PDATA
) != 0)
2560 section
.s_lnnoptr
= 0;
2563 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2564 hold the number of entries in the section (each entry is
2565 8 bytes). We stored this in the line_filepos field in
2566 ecoff_compute_section_file_positions. */
2567 section
.s_lnnoptr
= current
->line_filepos
;
2570 section
.s_nreloc
= current
->reloc_count
;
2571 section
.s_nlnno
= 0;
2572 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2575 if (bfd_coff_swap_scnhdr_out (abfd
, (PTR
) §ion
, buff
) == 0
2576 || bfd_write (buff
, 1, scnhsz
, abfd
) != scnhsz
)
2579 if ((section
.s_flags
& STYP_TEXT
) != 0
2580 || ((section
.s_flags
& STYP_RDATA
) != 0
2581 && ecoff_data (abfd
)->rdata_in_text
)
2582 || section
.s_flags
== STYP_PDATA
2583 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2584 || (section
.s_flags
& STYP_LIBLIST
) != 0
2585 || (section
.s_flags
& STYP_RELDYN
) != 0
2586 || section
.s_flags
== STYP_CONFLIC
2587 || (section
.s_flags
& STYP_DYNSTR
) != 0
2588 || (section
.s_flags
& STYP_DYNSYM
) != 0
2589 || (section
.s_flags
& STYP_HASH
) != 0
2590 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2591 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2592 || section
.s_flags
== STYP_RCONST
)
2594 text_size
+= bfd_get_section_size_before_reloc (current
);
2595 if (! set_text_start
|| text_start
> vma
)
2598 set_text_start
= true;
2601 else if ((section
.s_flags
& STYP_RDATA
) != 0
2602 || (section
.s_flags
& STYP_DATA
) != 0
2603 || (section
.s_flags
& STYP_LITA
) != 0
2604 || (section
.s_flags
& STYP_LIT8
) != 0
2605 || (section
.s_flags
& STYP_LIT4
) != 0
2606 || (section
.s_flags
& STYP_SDATA
) != 0
2607 || section
.s_flags
== STYP_XDATA
2608 || (section
.s_flags
& STYP_GOT
) != 0)
2610 data_size
+= bfd_get_section_size_before_reloc (current
);
2611 if (! set_data_start
|| data_start
> vma
)
2614 set_data_start
= true;
2617 else if ((section
.s_flags
& STYP_BSS
) != 0
2618 || (section
.s_flags
& STYP_SBSS
) != 0)
2619 bss_size
+= bfd_get_section_size_before_reloc (current
);
2620 else if (section
.s_flags
== 0
2621 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2622 || section
.s_flags
== STYP_COMMENT
)
2628 /* Set up the file header. */
2630 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2632 /* We will NOT put a fucking timestamp in the header here. Every
2633 time you put it back, I will come in and take it out again. I'm
2634 sorry. This field does not belong here. We fill it with a 0 so
2635 it compares the same but is not a reasonable time. --
2637 internal_f
.f_timdat
= 0;
2639 if (bfd_get_symcount (abfd
) != 0)
2641 /* The ECOFF f_nsyms field is not actually the number of
2642 symbols, it's the size of symbolic information header. */
2643 internal_f
.f_nsyms
= external_hdr_size
;
2644 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2648 internal_f
.f_nsyms
= 0;
2649 internal_f
.f_symptr
= 0;
2652 internal_f
.f_opthdr
= aoutsz
;
2654 internal_f
.f_flags
= F_LNNO
;
2655 if (reloc_size
== 0)
2656 internal_f
.f_flags
|= F_RELFLG
;
2657 if (bfd_get_symcount (abfd
) == 0)
2658 internal_f
.f_flags
|= F_LSYMS
;
2659 if (abfd
->flags
& EXEC_P
)
2660 internal_f
.f_flags
|= F_EXEC
;
2662 if (bfd_little_endian (abfd
))
2663 internal_f
.f_flags
|= F_AR32WR
;
2665 internal_f
.f_flags
|= F_AR32W
;
2667 /* Set up the ``optional'' header. */
2668 if ((abfd
->flags
& D_PAGED
) != 0)
2669 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2671 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2673 /* FIXME: Is this really correct? */
2674 internal_a
.vstamp
= symhdr
->vstamp
;
2676 /* At least on Ultrix, these have to be rounded to page boundaries.
2677 FIXME: Is this true on other platforms? */
2678 if ((abfd
->flags
& D_PAGED
) != 0)
2680 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2681 internal_a
.text_start
= text_start
&~ (round
- 1);
2682 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2683 internal_a
.data_start
= data_start
&~ (round
- 1);
2687 internal_a
.tsize
= text_size
;
2688 internal_a
.text_start
= text_start
;
2689 internal_a
.dsize
= data_size
;
2690 internal_a
.data_start
= data_start
;
2693 /* On Ultrix, the initial portions of the .sbss and .bss segments
2694 are at the end of the data section. The bsize field in the
2695 optional header records how many bss bytes are required beyond
2696 those in the data section. The value is not rounded to a page
2698 if (bss_size
< internal_a
.dsize
- data_size
)
2701 bss_size
-= internal_a
.dsize
- data_size
;
2702 internal_a
.bsize
= bss_size
;
2703 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2705 internal_a
.entry
= bfd_get_start_address (abfd
);
2707 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2709 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2710 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2711 for (i
= 0; i
< 4; i
++)
2712 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2714 /* Let the backend adjust the headers if necessary. */
2715 if (backend
->adjust_headers
)
2717 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2721 /* Write out the file header and the optional header. */
2723 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2726 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, buff
);
2727 if (bfd_write (buff
, 1, filhsz
, abfd
) != filhsz
)
2730 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) &internal_a
, buff
);
2731 if (bfd_write (buff
, 1, aoutsz
, abfd
) != aoutsz
)
2734 /* Build the external symbol information. This must be done before
2735 writing out the relocs so that we know the symbol indices. We
2736 don't do this if this BFD was created by the backend linker,
2737 since it will have already handled the symbols and relocs. */
2738 if (! ecoff_data (abfd
)->linker
)
2740 symhdr
->iextMax
= 0;
2741 symhdr
->issExtMax
= 0;
2742 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2743 debug
->ssext
= debug
->ssext_end
= NULL
;
2744 if (bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2745 (((abfd
->flags
& EXEC_P
) == 0)
2747 ecoff_get_extr
, ecoff_set_index
)
2751 /* Write out the relocs. */
2752 for (current
= abfd
->sections
;
2753 current
!= (asection
*) NULL
;
2754 current
= current
->next
)
2756 arelent
**reloc_ptr_ptr
;
2757 arelent
**reloc_end
;
2760 if (current
->reloc_count
== 0)
2764 bfd_alloc (abfd
, current
->reloc_count
* external_reloc_size
);
2765 if (reloc_buff
== NULL
)
2768 reloc_ptr_ptr
= current
->orelocation
;
2769 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2770 out_ptr
= (char *) reloc_buff
;
2772 reloc_ptr_ptr
< reloc_end
;
2773 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2777 struct internal_reloc in
;
2779 memset ((PTR
) &in
, 0, sizeof in
);
2781 reloc
= *reloc_ptr_ptr
;
2782 sym
= *reloc
->sym_ptr_ptr
;
2784 in
.r_vaddr
= (reloc
->address
2785 + bfd_get_section_vma (abfd
, current
));
2786 in
.r_type
= reloc
->howto
->type
;
2788 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2790 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2797 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2798 if (strcmp (name
, ".text") == 0)
2799 in
.r_symndx
= RELOC_SECTION_TEXT
;
2800 else if (strcmp (name
, ".rdata") == 0)
2801 in
.r_symndx
= RELOC_SECTION_RDATA
;
2802 else if (strcmp (name
, ".data") == 0)
2803 in
.r_symndx
= RELOC_SECTION_DATA
;
2804 else if (strcmp (name
, ".sdata") == 0)
2805 in
.r_symndx
= RELOC_SECTION_SDATA
;
2806 else if (strcmp (name
, ".sbss") == 0)
2807 in
.r_symndx
= RELOC_SECTION_SBSS
;
2808 else if (strcmp (name
, ".bss") == 0)
2809 in
.r_symndx
= RELOC_SECTION_BSS
;
2810 else if (strcmp (name
, ".init") == 0)
2811 in
.r_symndx
= RELOC_SECTION_INIT
;
2812 else if (strcmp (name
, ".lit8") == 0)
2813 in
.r_symndx
= RELOC_SECTION_LIT8
;
2814 else if (strcmp (name
, ".lit4") == 0)
2815 in
.r_symndx
= RELOC_SECTION_LIT4
;
2816 else if (strcmp (name
, ".xdata") == 0)
2817 in
.r_symndx
= RELOC_SECTION_XDATA
;
2818 else if (strcmp (name
, ".pdata") == 0)
2819 in
.r_symndx
= RELOC_SECTION_PDATA
;
2820 else if (strcmp (name
, ".fini") == 0)
2821 in
.r_symndx
= RELOC_SECTION_FINI
;
2822 else if (strcmp (name
, ".lita") == 0)
2823 in
.r_symndx
= RELOC_SECTION_LITA
;
2824 else if (strcmp (name
, "*ABS*") == 0)
2825 in
.r_symndx
= RELOC_SECTION_ABS
;
2826 else if (strcmp (name
, ".rconst") == 0)
2827 in
.r_symndx
= RELOC_SECTION_RCONST
;
2833 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2835 (*swap_reloc_out
) (abfd
, &in
, (PTR
) out_ptr
);
2838 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2840 if (bfd_write (reloc_buff
,
2841 external_reloc_size
, current
->reloc_count
, abfd
)
2842 != external_reloc_size
* current
->reloc_count
)
2844 bfd_release (abfd
, reloc_buff
);
2848 /* Write out the symbolic debugging information. */
2849 if (bfd_get_symcount (abfd
) > 0)
2851 /* Write out the debugging information. */
2852 if (bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2853 ecoff_data (abfd
)->sym_filepos
)
2859 /* The .bss section of a demand paged executable must receive an
2860 entire page. If there are symbols, the symbols will start on the
2861 next page. If there are no symbols, we must fill out the page by
2863 if (bfd_get_symcount (abfd
) == 0
2864 && (abfd
->flags
& EXEC_P
) != 0
2865 && (abfd
->flags
& D_PAGED
) != 0)
2869 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2872 if (bfd_read (&c
, 1, 1, abfd
) == 0)
2874 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2877 if (bfd_write (&c
, 1, 1, abfd
) != 1)
2881 if (reloc_buff
!= NULL
)
2882 bfd_release (abfd
, reloc_buff
);
2887 if (reloc_buff
!= NULL
)
2888 bfd_release (abfd
, reloc_buff
);
2894 /* Archive handling. ECOFF uses what appears to be a unique type of
2895 archive header (armap). The byte ordering of the armap and the
2896 contents are encoded in the name of the armap itself. At least for
2897 now, we only support archives with the same byte ordering in the
2898 armap and the contents.
2900 The first four bytes in the armap are the number of symbol
2901 definitions. This is always a power of two.
2903 This is followed by the symbol definitions. Each symbol definition
2904 occupies 8 bytes. The first four bytes are the offset from the
2905 start of the armap strings to the null-terminated string naming
2906 this symbol. The second four bytes are the file offset to the
2907 archive member which defines this symbol. If the second four bytes
2908 are 0, then this is not actually a symbol definition, and it should
2911 The symbols are hashed into the armap with a closed hashing scheme.
2912 See the functions below for the details of the algorithm.
2914 After the symbol definitions comes four bytes holding the size of
2915 the string table, followed by the string table itself. */
2917 /* The name of an archive headers looks like this:
2918 __________E[BL]E[BL]_ (with a trailing space).
2919 The trailing space is changed to an X if the archive is changed to
2920 indicate that the armap is out of date.
2922 The Alpha seems to use ________64E[BL]E[BL]_. */
2924 #define ARMAP_BIG_ENDIAN 'B'
2925 #define ARMAP_LITTLE_ENDIAN 'L'
2926 #define ARMAP_MARKER 'E'
2927 #define ARMAP_START_LENGTH 10
2928 #define ARMAP_HEADER_MARKER_INDEX 10
2929 #define ARMAP_HEADER_ENDIAN_INDEX 11
2930 #define ARMAP_OBJECT_MARKER_INDEX 12
2931 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2932 #define ARMAP_END_INDEX 14
2933 #define ARMAP_END "_ "
2935 /* This is a magic number used in the hashing algorithm. */
2936 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2938 /* This returns the hash value to use for a string. It also sets
2939 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2940 is the number of entries in the hash table, and HLOG is the log
2944 ecoff_armap_hash (s
, rehash
, size
, hlog
)
2946 unsigned int *rehash
;
2956 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2957 hash
*= ARMAP_HASH_MAGIC
;
2958 *rehash
= (hash
& (size
- 1)) | 1;
2959 return hash
>> (32 - hlog
);
2962 /* Read in the armap. */
2965 _bfd_ecoff_slurp_armap (abfd
)
2970 struct areltdata
*mapdata
;
2971 bfd_size_type parsed_size
;
2973 struct artdata
*ardata
;
2976 struct symdef
*symdef_ptr
;
2979 /* Get the name of the first element. */
2980 i
= bfd_read ((PTR
) nextname
, 1, 16, abfd
);
2986 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2989 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2990 standard COFF armap. We could move the ECOFF armap stuff into
2991 bfd_slurp_armap, but that seems inappropriate since no other
2992 target uses this format. Instead, we check directly for a COFF
2994 if (strncmp (nextname
, "/ ", 16) == 0)
2995 return bfd_slurp_armap (abfd
);
2997 /* See if the first element is an armap. */
2998 if (strncmp (nextname
, ecoff_backend (abfd
)->armap_start
,
2999 ARMAP_START_LENGTH
) != 0
3000 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
3001 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3002 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3003 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
3004 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3005 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3006 || strncmp (nextname
+ ARMAP_END_INDEX
,
3007 ARMAP_END
, sizeof ARMAP_END
- 1) != 0)
3009 bfd_has_map (abfd
) = false;
3013 /* Make sure we have the right byte ordering. */
3014 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3015 ^ (bfd_header_big_endian (abfd
)))
3016 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3017 ^ (bfd_big_endian (abfd
))))
3019 bfd_set_error (bfd_error_wrong_format
);
3023 /* Read in the armap. */
3024 ardata
= bfd_ardata (abfd
);
3025 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
3026 if (mapdata
== (struct areltdata
*) NULL
)
3028 parsed_size
= mapdata
->parsed_size
;
3029 bfd_release (abfd
, (PTR
) mapdata
);
3031 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
3032 if (raw_armap
== (char *) NULL
)
3035 if (bfd_read ((PTR
) raw_armap
, 1, parsed_size
, abfd
) != parsed_size
)
3037 if (bfd_get_error () != bfd_error_system_call
)
3038 bfd_set_error (bfd_error_malformed_archive
);
3039 bfd_release (abfd
, (PTR
) raw_armap
);
3043 ardata
->tdata
= (PTR
) raw_armap
;
3045 count
= bfd_h_get_32 (abfd
, (PTR
) raw_armap
);
3047 ardata
->symdef_count
= 0;
3048 ardata
->cache
= (struct ar_cache
*) NULL
;
3050 /* This code used to overlay the symdefs over the raw archive data,
3051 but that doesn't work on a 64 bit host. */
3053 stringbase
= raw_armap
+ count
* 8 + 8;
3055 #ifdef CHECK_ARMAP_HASH
3059 /* Double check that I have the hashing algorithm right by making
3060 sure that every symbol can be looked up successfully. */
3062 for (i
= 1; i
< count
; i
<<= 1)
3064 BFD_ASSERT (i
== count
);
3066 raw_ptr
= raw_armap
+ 4;
3067 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3069 unsigned int name_offset
, file_offset
;
3070 unsigned int hash
, rehash
, srch
;
3072 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3073 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3074 if (file_offset
== 0)
3076 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
3081 /* See if we can rehash to this location. */
3082 for (srch
= (hash
+ rehash
) & (count
- 1);
3083 srch
!= hash
&& srch
!= i
;
3084 srch
= (srch
+ rehash
) & (count
- 1))
3085 BFD_ASSERT (bfd_h_get_32 (abfd
, (PTR
) (raw_armap
+ 8 + srch
* 8))
3087 BFD_ASSERT (srch
== i
);
3091 #endif /* CHECK_ARMAP_HASH */
3093 raw_ptr
= raw_armap
+ 4;
3094 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3095 if (bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4)) != 0)
3096 ++ardata
->symdef_count
;
3098 symdef_ptr
= ((struct symdef
*)
3100 ardata
->symdef_count
* sizeof (struct symdef
)));
3104 ardata
->symdefs
= (carsym
*) symdef_ptr
;
3106 raw_ptr
= raw_armap
+ 4;
3107 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3109 unsigned int name_offset
, file_offset
;
3111 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3112 if (file_offset
== 0)
3114 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3115 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
3116 symdef_ptr
->file_offset
= file_offset
;
3120 ardata
->first_file_filepos
= bfd_tell (abfd
);
3121 /* Pad to an even boundary. */
3122 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3124 bfd_has_map (abfd
) = true;
3129 /* Write out an armap. */
3132 _bfd_ecoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
3134 unsigned int elength
;
3136 unsigned int orl_count
;
3139 unsigned int hashsize
, hashlog
;
3140 unsigned int symdefsize
;
3142 unsigned int stringsize
;
3143 unsigned int mapsize
;
3146 struct stat statbuf
;
3149 bfd_byte
*hashtable
;
3153 /* Ultrix appears to use as a hash table size the least power of two
3154 greater than twice the number of entries. */
3155 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3157 hashsize
= 1 << hashlog
;
3159 symdefsize
= hashsize
* 8;
3161 stringsize
= stridx
+ padit
;
3163 /* Include 8 bytes to store symdefsize and stringsize in output. */
3164 mapsize
= symdefsize
+ stringsize
+ 8;
3166 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3168 memset ((PTR
) &hdr
, 0, sizeof hdr
);
3170 /* Work out the ECOFF armap name. */
3171 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3172 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3173 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3174 (bfd_header_big_endian (abfd
)
3176 : ARMAP_LITTLE_ENDIAN
);
3177 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3178 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3179 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3180 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3182 /* Write the timestamp of the archive header to be just a little bit
3183 later than the timestamp of the file, otherwise the linker will
3184 complain that the index is out of date. Actually, the Ultrix
3185 linker just checks the archive name; the GNU linker may check the
3187 stat (abfd
->filename
, &statbuf
);
3188 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3190 /* The DECstation uses zeroes for the uid, gid and mode of the
3192 hdr
.ar_uid
[0] = '0';
3193 hdr
.ar_gid
[0] = '0';
3195 hdr
.ar_mode
[0] = '0';
3197 /* Building gcc ends up extracting the armap as a file - twice. */
3198 hdr
.ar_mode
[0] = '6';
3199 hdr
.ar_mode
[1] = '4';
3200 hdr
.ar_mode
[2] = '4';
3203 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3205 hdr
.ar_fmag
[0] = '`';
3206 hdr
.ar_fmag
[1] = '\012';
3208 /* Turn all null bytes in the header into spaces. */
3209 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3210 if (((char *) (&hdr
))[i
] == '\0')
3211 (((char *) (&hdr
))[i
]) = ' ';
3213 if (bfd_write ((PTR
) &hdr
, 1, sizeof (struct ar_hdr
), abfd
)
3214 != sizeof (struct ar_hdr
))
3217 bfd_h_put_32 (abfd
, (bfd_vma
) hashsize
, temp
);
3218 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3221 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3225 current
= abfd
->archive_head
;
3227 for (i
= 0; i
< orl_count
; i
++)
3229 unsigned int hash
, rehash
;
3231 /* Advance firstreal to the file position of this archive
3233 if (((bfd
*) map
[i
].pos
) != last_elt
)
3237 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3238 firstreal
+= firstreal
% 2;
3239 current
= current
->next
;
3241 while (current
!= (bfd
*) map
[i
].pos
);
3246 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3247 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (hash
* 8) + 4)) != 0)
3251 /* The desired slot is already taken. */
3252 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3254 srch
= (srch
+ rehash
) & (hashsize
- 1))
3255 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (srch
* 8) + 4)) == 0)
3258 BFD_ASSERT (srch
!= hash
);
3263 bfd_h_put_32 (abfd
, (bfd_vma
) map
[i
].namidx
,
3264 (PTR
) (hashtable
+ hash
* 8));
3265 bfd_h_put_32 (abfd
, (bfd_vma
) firstreal
,
3266 (PTR
) (hashtable
+ hash
* 8 + 4));
3269 if (bfd_write ((PTR
) hashtable
, 1, symdefsize
, abfd
) != symdefsize
)
3272 bfd_release (abfd
, hashtable
);
3274 /* Now write the strings. */
3275 bfd_h_put_32 (abfd
, (bfd_vma
) stringsize
, temp
);
3276 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3278 for (i
= 0; i
< orl_count
; i
++)
3282 len
= strlen (*map
[i
].name
) + 1;
3283 if (bfd_write ((PTR
) (*map
[i
].name
), 1, len
, abfd
) != len
)
3287 /* The spec sez this should be a newline. But in order to be
3288 bug-compatible for DECstation ar we use a null. */
3291 if (bfd_write ("", 1, 1, abfd
) != 1)
3298 /* See whether this BFD is an archive. If it is, read in the armap
3299 and the extended name table. */
3302 _bfd_ecoff_archive_p (abfd
)
3305 struct artdata
*tdata_hold
;
3306 char armag
[SARMAG
+ 1];
3308 tdata_hold
= abfd
->tdata
.aout_ar_data
;
3310 if (bfd_read ((PTR
) armag
, 1, SARMAG
, abfd
) != SARMAG
)
3312 if (bfd_get_error () != bfd_error_system_call
)
3313 bfd_set_error (bfd_error_wrong_format
);
3314 return (const bfd_target
*) NULL
;
3317 if (strncmp (armag
, ARMAG
, SARMAG
) != 0)
3319 bfd_set_error (bfd_error_wrong_format
);
3323 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3324 involves a cast, we can't do it as the left operand of
3326 abfd
->tdata
.aout_ar_data
=
3327 (struct artdata
*) bfd_zalloc (abfd
, sizeof (struct artdata
));
3329 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
3331 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3332 return (const bfd_target
*) NULL
;
3335 bfd_ardata (abfd
)->first_file_filepos
= SARMAG
;
3336 bfd_ardata (abfd
)->cache
= NULL
;
3337 bfd_ardata (abfd
)->archive_head
= NULL
;
3338 bfd_ardata (abfd
)->symdefs
= NULL
;
3339 bfd_ardata (abfd
)->extended_names
= NULL
;
3340 bfd_ardata (abfd
)->tdata
= NULL
;
3342 if (_bfd_ecoff_slurp_armap (abfd
) == false
3343 || _bfd_ecoff_slurp_extended_name_table (abfd
) == false)
3345 bfd_release (abfd
, bfd_ardata (abfd
));
3346 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3347 return (const bfd_target
*) NULL
;
3350 if (bfd_has_map (abfd
))
3354 /* This archive has a map, so we may presume that the contents
3355 are object files. Make sure that if the first file in the
3356 archive can be recognized as an object file, it is for this
3357 target. If not, assume that this is the wrong format. If
3358 the first file is not an object file, somebody is doing
3359 something weird, and we permit it so that ar -t will work. */
3361 first
= bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
);
3366 first
->target_defaulted
= false;
3368 if (bfd_check_format (first
, bfd_object
)
3369 && first
->xvec
!= abfd
->xvec
)
3371 (void) bfd_close (first
);
3372 bfd_release (abfd
, bfd_ardata (abfd
));
3373 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3374 bfd_set_error (bfd_error_wrong_format
);
3378 /* We ought to close first here, but we can't, because we
3379 have no way to remove it from the archive cache. FIXME. */
3386 /* ECOFF linker code. */
3388 static struct bfd_hash_entry
*ecoff_link_hash_newfunc
3389 PARAMS ((struct bfd_hash_entry
*entry
,
3390 struct bfd_hash_table
*table
,
3391 const char *string
));
3392 static boolean ecoff_link_add_archive_symbols
3393 PARAMS ((bfd
*, struct bfd_link_info
*));
3394 static boolean ecoff_link_check_archive_element
3395 PARAMS ((bfd
*, struct bfd_link_info
*, boolean
*pneeded
));
3396 static boolean ecoff_link_add_object_symbols
3397 PARAMS ((bfd
*, struct bfd_link_info
*));
3398 static boolean ecoff_link_add_externals
3399 PARAMS ((bfd
*, struct bfd_link_info
*, PTR
, char *));
3401 /* Routine to create an entry in an ECOFF link hash table. */
3403 static struct bfd_hash_entry
*
3404 ecoff_link_hash_newfunc (entry
, table
, string
)
3405 struct bfd_hash_entry
*entry
;
3406 struct bfd_hash_table
*table
;
3409 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3411 /* Allocate the structure if it has not already been allocated by a
3413 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3414 ret
= ((struct ecoff_link_hash_entry
*)
3415 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3416 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3419 /* Call the allocation method of the superclass. */
3420 ret
= ((struct ecoff_link_hash_entry
*)
3421 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3426 /* Set local fields. */
3432 memset ((PTR
) &ret
->esym
, 0, sizeof ret
->esym
);
3434 return (struct bfd_hash_entry
*) ret
;
3437 /* Create an ECOFF link hash table. */
3439 struct bfd_link_hash_table
*
3440 _bfd_ecoff_bfd_link_hash_table_create (abfd
)
3443 struct ecoff_link_hash_table
*ret
;
3445 ret
= ((struct ecoff_link_hash_table
*)
3446 bfd_alloc (abfd
, sizeof (struct ecoff_link_hash_table
)));
3449 if (! _bfd_link_hash_table_init (&ret
->root
, abfd
,
3450 ecoff_link_hash_newfunc
))
3453 return (struct bfd_link_hash_table
*) NULL
;
3458 /* Look up an entry in an ECOFF link hash table. */
3460 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3461 ((struct ecoff_link_hash_entry *) \
3462 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3464 /* Traverse an ECOFF link hash table. */
3466 #define ecoff_link_hash_traverse(table, func, info) \
3467 (bfd_link_hash_traverse \
3469 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3472 /* Get the ECOFF link hash table from the info structure. This is
3475 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3477 /* Given an ECOFF BFD, add symbols to the global hash table as
3481 _bfd_ecoff_bfd_link_add_symbols (abfd
, info
)
3483 struct bfd_link_info
*info
;
3485 switch (bfd_get_format (abfd
))
3488 return ecoff_link_add_object_symbols (abfd
, info
);
3490 return ecoff_link_add_archive_symbols (abfd
, info
);
3492 bfd_set_error (bfd_error_wrong_format
);
3497 /* Add the symbols from an archive file to the global hash table.
3498 This looks through the undefined symbols, looks each one up in the
3499 archive hash table, and adds any associated object file. We do not
3500 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3501 already have a hash table, so there is no reason to construct
3505 ecoff_link_add_archive_symbols (abfd
, info
)
3507 struct bfd_link_info
*info
;
3509 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3510 const bfd_byte
*raw_armap
;
3511 struct bfd_link_hash_entry
**pundef
;
3512 unsigned int armap_count
;
3513 unsigned int armap_log
;
3515 const bfd_byte
*hashtable
;
3516 const char *stringbase
;
3518 if (! bfd_has_map (abfd
))
3520 /* An empty archive is a special case. */
3521 if (bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
) == NULL
)
3523 bfd_set_error (bfd_error_no_armap
);
3527 /* If we don't have any raw data for this archive, as can happen on
3528 Irix 4.0.5F, we call the generic routine.
3529 FIXME: We should be more clever about this, since someday tdata
3530 may get to something for a generic archive. */
3531 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3532 if (raw_armap
== (bfd_byte
*) NULL
)
3533 return (_bfd_generic_link_add_archive_symbols
3534 (abfd
, info
, ecoff_link_check_archive_element
));
3536 armap_count
= bfd_h_get_32 (abfd
, raw_armap
);
3539 for (i
= 1; i
< armap_count
; i
<<= 1)
3541 BFD_ASSERT (i
== armap_count
);
3543 hashtable
= raw_armap
+ 4;
3544 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3546 /* Look through the list of undefined symbols. */
3547 pundef
= &info
->hash
->undefs
;
3548 while (*pundef
!= (struct bfd_link_hash_entry
*) NULL
)
3550 struct bfd_link_hash_entry
*h
;
3551 unsigned int hash
, rehash
;
3552 unsigned int file_offset
;
3558 /* When a symbol is defined, it is not necessarily removed from
3560 if (h
->type
!= bfd_link_hash_undefined
3561 && h
->type
!= bfd_link_hash_common
)
3563 /* Remove this entry from the list, for general cleanliness
3564 and because we are going to look through the list again
3565 if we search any more libraries. We can't remove the
3566 entry if it is the tail, because that would lose any
3567 entries we add to the list later on. */
3568 if (*pundef
!= info
->hash
->undefs_tail
)
3569 *pundef
= (*pundef
)->next
;
3571 pundef
= &(*pundef
)->next
;
3575 /* Native ECOFF linkers do not pull in archive elements merely
3576 to satisfy common definitions, so neither do we. We leave
3577 them on the list, though, in case we are linking against some
3578 other object format. */
3579 if (h
->type
!= bfd_link_hash_undefined
)
3581 pundef
= &(*pundef
)->next
;
3585 /* Look for this symbol in the archive hash table. */
3586 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3589 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3590 if (file_offset
== 0)
3592 /* Nothing in this slot. */
3593 pundef
= &(*pundef
)->next
;
3597 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8));
3598 if (name
[0] != h
->root
.string
[0]
3599 || strcmp (name
, h
->root
.string
) != 0)
3604 /* That was the wrong symbol. Try rehashing. */
3606 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3608 srch
= (srch
+ rehash
) & (armap_count
- 1))
3610 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3611 if (file_offset
== 0)
3613 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8));
3614 if (name
[0] == h
->root
.string
[0]
3615 && strcmp (name
, h
->root
.string
) == 0)
3624 pundef
= &(*pundef
)->next
;
3631 element
= (*backend
->get_elt_at_filepos
) (abfd
, file_offset
);
3632 if (element
== (bfd
*) NULL
)
3635 if (! bfd_check_format (element
, bfd_object
))
3638 /* Unlike the generic linker, we know that this element provides
3639 a definition for an undefined symbol and we know that we want
3640 to include it. We don't need to check anything. */
3641 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3643 if (! ecoff_link_add_object_symbols (element
, info
))
3646 pundef
= &(*pundef
)->next
;
3652 /* This is called if we used _bfd_generic_link_add_archive_symbols
3653 because we were not dealing with an ECOFF archive. */
3656 ecoff_link_check_archive_element (abfd
, info
, pneeded
)
3658 struct bfd_link_info
*info
;
3661 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3662 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3663 = backend
->debug_swap
.swap_ext_in
;
3665 bfd_size_type external_ext_size
;
3666 PTR external_ext
= NULL
;
3674 if (! ecoff_slurp_symbolic_header (abfd
))
3677 /* If there are no symbols, we don't want it. */
3678 if (bfd_get_symcount (abfd
) == 0)
3679 goto successful_return
;
3681 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3683 /* Read in the external symbols and external strings. */
3684 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3685 esize
= symhdr
->iextMax
* external_ext_size
;
3686 external_ext
= (PTR
) bfd_malloc (esize
);
3687 if (external_ext
== NULL
&& esize
!= 0)
3690 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3691 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3694 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3695 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3698 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3699 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
) !=
3700 (bfd_size_type
) symhdr
->issExtMax
))
3703 /* Look through the external symbols to see if they define some
3704 symbol that is currently undefined. */
3705 ext_ptr
= (char *) external_ext
;
3706 ext_end
= ext_ptr
+ esize
;
3707 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3712 struct bfd_link_hash_entry
*h
;
3714 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3716 /* See if this symbol defines something. */
3717 if (esym
.asym
.st
!= stGlobal
3718 && esym
.asym
.st
!= stLabel
3719 && esym
.asym
.st
!= stProc
)
3722 switch (esym
.asym
.sc
)
3746 name
= ssext
+ esym
.asym
.iss
;
3747 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
3749 /* Unlike the generic linker, we do not pull in elements because
3750 of common symbols. */
3751 if (h
== (struct bfd_link_hash_entry
*) NULL
3752 || h
->type
!= bfd_link_hash_undefined
)
3755 /* Include this element. */
3756 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3758 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3762 goto successful_return
;
3766 if (external_ext
!= NULL
)
3767 free (external_ext
);
3772 if (external_ext
!= NULL
)
3773 free (external_ext
);
3779 /* Add symbols from an ECOFF object file to the global linker hash
3783 ecoff_link_add_object_symbols (abfd
, info
)
3785 struct bfd_link_info
*info
;
3788 bfd_size_type external_ext_size
;
3789 PTR external_ext
= NULL
;
3794 if (! ecoff_slurp_symbolic_header (abfd
))
3797 /* If there are no symbols, we don't want it. */
3798 if (bfd_get_symcount (abfd
) == 0)
3801 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3803 /* Read in the external symbols and external strings. */
3804 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3805 esize
= symhdr
->iextMax
* external_ext_size
;
3806 external_ext
= (PTR
) bfd_malloc (esize
);
3807 if (external_ext
== NULL
&& esize
!= 0)
3810 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3811 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3814 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3815 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3818 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3819 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
)
3820 != (bfd_size_type
) symhdr
->issExtMax
))
3823 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3827 if (external_ext
!= NULL
)
3828 free (external_ext
);
3834 if (external_ext
!= NULL
)
3835 free (external_ext
);
3839 /* Add the external symbols of an object file to the global linker
3840 hash table. The external symbols and strings we are passed are
3841 just allocated on the stack, and will be discarded. We must
3842 explicitly save any information we may need later on in the link.
3843 We do not want to read the external symbol information again. */
3846 ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
)
3848 struct bfd_link_info
*info
;
3852 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3853 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3854 = backend
->debug_swap
.swap_ext_in
;
3855 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3856 unsigned long ext_count
;
3857 struct ecoff_link_hash_entry
**sym_hash
;
3861 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3863 sym_hash
= ((struct ecoff_link_hash_entry
**)
3865 ext_count
* sizeof (struct bfd_link_hash_entry
*)));
3868 ecoff_data (abfd
)->sym_hashes
= sym_hash
;
3870 ext_ptr
= (char *) external_ext
;
3871 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3872 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3879 struct ecoff_link_hash_entry
*h
;
3883 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3885 /* Skip debugging symbols. */
3887 switch (esym
.asym
.st
)
3903 /* Get the information for this symbol. */
3904 value
= esym
.asym
.value
;
3905 switch (esym
.asym
.sc
)
3925 section
= bfd_make_section_old_way (abfd
, ".text");
3926 value
-= section
->vma
;
3929 section
= bfd_make_section_old_way (abfd
, ".data");
3930 value
-= section
->vma
;
3933 section
= bfd_make_section_old_way (abfd
, ".bss");
3934 value
-= section
->vma
;
3937 section
= bfd_abs_section_ptr
;
3940 section
= bfd_und_section_ptr
;
3943 section
= bfd_make_section_old_way (abfd
, ".sdata");
3944 value
-= section
->vma
;
3947 section
= bfd_make_section_old_way (abfd
, ".sbss");
3948 value
-= section
->vma
;
3951 section
= bfd_make_section_old_way (abfd
, ".rdata");
3952 value
-= section
->vma
;
3955 if (value
> ecoff_data (abfd
)->gp_size
)
3957 section
= bfd_com_section_ptr
;
3962 if (ecoff_scom_section
.name
== NULL
)
3964 /* Initialize the small common section. */
3965 ecoff_scom_section
.name
= SCOMMON
;
3966 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3967 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3968 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3969 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3970 ecoff_scom_symbol
.name
= SCOMMON
;
3971 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3972 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3973 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3975 section
= &ecoff_scom_section
;
3978 section
= bfd_und_section_ptr
;
3981 section
= bfd_make_section_old_way (abfd
, ".init");
3982 value
-= section
->vma
;
3985 section
= bfd_make_section_old_way (abfd
, ".fini");
3986 value
-= section
->vma
;
3989 section
= bfd_make_section_old_way (abfd
, ".rconst");
3990 value
-= section
->vma
;
3994 if (section
== (asection
*) NULL
)
3997 name
= ssext
+ esym
.asym
.iss
;
4000 if (! (_bfd_generic_link_add_one_symbol
4002 esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
,
4003 section
, value
, (const char *) NULL
, true, true,
4004 (struct bfd_link_hash_entry
**) &h
)))
4009 /* If we are building an ECOFF hash table, save the external
4010 symbol information. */
4011 if (info
->hash
->creator
->flavour
== bfd_get_flavour (abfd
))
4013 if (h
->abfd
== (bfd
*) NULL
4014 || (! bfd_is_und_section (section
)
4015 && (! bfd_is_com_section (section
)
4016 || (h
->root
.type
!= bfd_link_hash_defined
4017 && h
->root
.type
!= bfd_link_hash_defweak
))))
4023 /* Remember whether this symbol was small undefined. */
4024 if (esym
.asym
.sc
== scSUndefined
)
4027 /* If this symbol was ever small undefined, it needs to wind
4028 up in a GP relative section. We can't control the
4029 section of a defined symbol, but we can control the
4030 section of a common symbol. This case is actually needed
4031 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4033 && h
->root
.type
== bfd_link_hash_common
4034 && strcmp (h
->root
.u
.c
.p
->section
->name
, SCOMMON
) != 0)
4036 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
4038 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
4039 if (h
->esym
.asym
.sc
== scCommon
)
4040 h
->esym
.asym
.sc
= scSCommon
;
4048 /* ECOFF final link routines. */
4050 static boolean ecoff_final_link_debug_accumulate
4051 PARAMS ((bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*,
4053 static boolean ecoff_link_write_external
4054 PARAMS ((struct ecoff_link_hash_entry
*, PTR
));
4055 static boolean ecoff_indirect_link_order
4056 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4057 struct bfd_link_order
*));
4058 static boolean ecoff_reloc_link_order
4059 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4060 struct bfd_link_order
*));
4062 /* Structure used to pass information to ecoff_link_write_external. */
4067 struct bfd_link_info
*info
;
4070 /* ECOFF final link routine. This looks through all the input BFDs
4071 and gathers together all the debugging information, and then
4072 processes all the link order information. This may cause it to
4073 close and reopen some input BFDs; I'll see how bad this is. */
4076 _bfd_ecoff_bfd_final_link (abfd
, info
)
4078 struct bfd_link_info
*info
;
4080 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4081 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4084 register bfd
*input_bfd
;
4086 struct bfd_link_order
*p
;
4087 struct extsym_info einfo
;
4089 /* We accumulate the debugging information counts in the symbolic
4091 symhdr
= &debug
->symbolic_header
;
4093 symhdr
->ilineMax
= 0;
4097 symhdr
->isymMax
= 0;
4098 symhdr
->ioptMax
= 0;
4099 symhdr
->iauxMax
= 0;
4101 symhdr
->issExtMax
= 0;
4104 symhdr
->iextMax
= 0;
4106 /* We accumulate the debugging information itself in the debug_info
4109 debug
->external_dnr
= NULL
;
4110 debug
->external_pdr
= NULL
;
4111 debug
->external_sym
= NULL
;
4112 debug
->external_opt
= NULL
;
4113 debug
->external_aux
= NULL
;
4115 debug
->ssext
= debug
->ssext_end
= NULL
;
4116 debug
->external_fdr
= NULL
;
4117 debug
->external_rfd
= NULL
;
4118 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4120 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4121 if (handle
== (PTR
) NULL
)
4124 /* Accumulate the debugging symbols from each input BFD. */
4125 for (input_bfd
= info
->input_bfds
;
4126 input_bfd
!= (bfd
*) NULL
;
4127 input_bfd
= input_bfd
->link_next
)
4131 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4133 /* Abitrarily set the symbolic header vstamp to the vstamp
4134 of the first object file in the link. */
4135 if (symhdr
->vstamp
== 0)
4137 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4138 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4142 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4143 debug
, &backend
->debug_swap
,
4148 /* Combine the register masks. */
4149 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4150 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4151 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4152 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4153 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4154 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4157 /* Write out the external symbols. */
4160 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4161 ecoff_link_write_external
,
4164 if (info
->relocateable
)
4166 /* We need to make a pass over the link_orders to count up the
4167 number of relocations we will need to output, so that we know
4168 how much space they will take up. */
4169 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4172 for (p
= o
->link_order_head
;
4173 p
!= (struct bfd_link_order
*) NULL
;
4175 if (p
->type
== bfd_indirect_link_order
)
4176 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4177 else if (p
->type
== bfd_section_reloc_link_order
4178 || p
->type
== bfd_symbol_reloc_link_order
)
4183 /* Compute the reloc and symbol file positions. */
4184 ecoff_compute_reloc_file_positions (abfd
);
4186 /* Write out the debugging information. */
4187 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4188 &backend
->debug_swap
, info
,
4189 ecoff_data (abfd
)->sym_filepos
))
4192 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4194 if (info
->relocateable
)
4196 /* Now reset the reloc_count field of the sections in the output
4197 BFD to 0, so that we can use them to keep track of how many
4198 relocs we have output thus far. */
4199 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4203 /* Get a value for the GP register. */
4204 if (ecoff_data (abfd
)->gp
== 0)
4206 struct bfd_link_hash_entry
*h
;
4208 h
= bfd_link_hash_lookup (info
->hash
, "_gp", false, false, true);
4209 if (h
!= (struct bfd_link_hash_entry
*) NULL
4210 && h
->type
== bfd_link_hash_defined
)
4211 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4212 + h
->u
.def
.section
->output_section
->vma
4213 + h
->u
.def
.section
->output_offset
);
4214 else if (info
->relocateable
)
4218 /* Make up a value. */
4220 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4223 && (strcmp (o
->name
, _SBSS
) == 0
4224 || strcmp (o
->name
, _SDATA
) == 0
4225 || strcmp (o
->name
, _LIT4
) == 0
4226 || strcmp (o
->name
, _LIT8
) == 0
4227 || strcmp (o
->name
, _LITA
) == 0))
4230 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4234 /* If the relocate_section function needs to do a reloc
4235 involving the GP value, it should make a reloc_dangerous
4236 callback to warn that GP is not defined. */
4240 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4242 for (p
= o
->link_order_head
;
4243 p
!= (struct bfd_link_order
*) NULL
;
4246 if (p
->type
== bfd_indirect_link_order
4247 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4248 == bfd_target_ecoff_flavour
))
4250 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4253 else if (p
->type
== bfd_section_reloc_link_order
4254 || p
->type
== bfd_symbol_reloc_link_order
)
4256 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4261 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4267 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4269 ecoff_data (abfd
)->linker
= true;
4274 /* Accumulate the debugging information for an input BFD into the
4275 output BFD. This must read in the symbolic information of the
4279 ecoff_final_link_debug_accumulate (output_bfd
, input_bfd
, info
, handle
)
4282 struct bfd_link_info
*info
;
4285 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
4286 const struct ecoff_debug_swap
* const swap
=
4287 &ecoff_backend (input_bfd
)->debug_swap
;
4288 HDRR
*symhdr
= &debug
->symbolic_header
;
4291 #define READ(ptr, offset, count, size, type) \
4292 if (symhdr->count == 0) \
4293 debug->ptr = NULL; \
4296 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
4297 if (debug->ptr == NULL) \
4300 goto return_something; \
4302 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4304 || (bfd_read (debug->ptr, size, symhdr->count, \
4305 input_bfd) != size * symhdr->count)) \
4308 goto return_something; \
4312 /* If raw_syments is not NULL, then the data was already by read by
4313 _bfd_ecoff_slurp_symbolic_info. */
4314 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4316 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
4318 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
4319 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
4320 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
4321 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
4322 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
4324 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
4325 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
4326 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
4330 /* We do not read the external strings or the external symbols. */
4332 ret
= (bfd_ecoff_debug_accumulate
4333 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4334 &ecoff_backend (output_bfd
)->debug_swap
,
4335 input_bfd
, debug
, swap
, info
));
4338 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4340 if (debug
->line
!= NULL
)
4342 if (debug
->external_dnr
!= NULL
)
4343 free (debug
->external_dnr
);
4344 if (debug
->external_pdr
!= NULL
)
4345 free (debug
->external_pdr
);
4346 if (debug
->external_sym
!= NULL
)
4347 free (debug
->external_sym
);
4348 if (debug
->external_opt
!= NULL
)
4349 free (debug
->external_opt
);
4350 if (debug
->external_aux
!= NULL
)
4351 free (debug
->external_aux
);
4352 if (debug
->ss
!= NULL
)
4354 if (debug
->external_fdr
!= NULL
)
4355 free (debug
->external_fdr
);
4356 if (debug
->external_rfd
!= NULL
)
4357 free (debug
->external_rfd
);
4359 /* Make sure we don't accidentally follow one of these pointers
4360 into freed memory. */
4362 debug
->external_dnr
= NULL
;
4363 debug
->external_pdr
= NULL
;
4364 debug
->external_sym
= NULL
;
4365 debug
->external_opt
= NULL
;
4366 debug
->external_aux
= NULL
;
4368 debug
->external_fdr
= NULL
;
4369 debug
->external_rfd
= NULL
;
4375 /* Put out information for an external symbol. These come only from
4379 ecoff_link_write_external (h
, data
)
4380 struct ecoff_link_hash_entry
*h
;
4383 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4384 bfd
*output_bfd
= einfo
->abfd
;
4387 /* We need to check if this symbol is being stripped. */
4388 if (h
->root
.type
== bfd_link_hash_undefined
4389 || h
->root
.type
== bfd_link_hash_undefweak
)
4391 else if (einfo
->info
->strip
== strip_all
4392 || (einfo
->info
->strip
== strip_some
4393 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4394 h
->root
.root
.string
,
4395 false, false) == NULL
))
4400 if (strip
|| h
->written
)
4403 if (h
->abfd
== (bfd
*) NULL
)
4406 h
->esym
.cobol_main
= 0;
4407 h
->esym
.weakext
= 0;
4408 h
->esym
.reserved
= 0;
4409 h
->esym
.ifd
= ifdNil
;
4410 h
->esym
.asym
.value
= 0;
4411 h
->esym
.asym
.st
= stGlobal
;
4413 if (h
->root
.type
!= bfd_link_hash_defined
4414 && h
->root
.type
!= bfd_link_hash_defweak
)
4415 h
->esym
.asym
.sc
= scAbs
;
4418 asection
*output_section
;
4421 output_section
= h
->root
.u
.def
.section
->output_section
;
4422 name
= bfd_section_name (output_section
->owner
, output_section
);
4424 if (strcmp (name
, _TEXT
) == 0)
4425 h
->esym
.asym
.sc
= scText
;
4426 else if (strcmp (name
, _DATA
) == 0)
4427 h
->esym
.asym
.sc
= scData
;
4428 else if (strcmp (name
, _SDATA
) == 0)
4429 h
->esym
.asym
.sc
= scSData
;
4430 else if (strcmp (name
, _RDATA
) == 0)
4431 h
->esym
.asym
.sc
= scRData
;
4432 else if (strcmp (name
, _BSS
) == 0)
4433 h
->esym
.asym
.sc
= scBss
;
4434 else if (strcmp (name
, _SBSS
) == 0)
4435 h
->esym
.asym
.sc
= scSBss
;
4436 else if (strcmp (name
, _INIT
) == 0)
4437 h
->esym
.asym
.sc
= scInit
;
4438 else if (strcmp (name
, _FINI
) == 0)
4439 h
->esym
.asym
.sc
= scFini
;
4440 else if (strcmp (name
, _PDATA
) == 0)
4441 h
->esym
.asym
.sc
= scPData
;
4442 else if (strcmp (name
, _XDATA
) == 0)
4443 h
->esym
.asym
.sc
= scXData
;
4444 else if (strcmp (name
, _RCONST
) == 0)
4445 h
->esym
.asym
.sc
= scRConst
;
4447 h
->esym
.asym
.sc
= scAbs
;
4450 h
->esym
.asym
.reserved
= 0;
4451 h
->esym
.asym
.index
= indexNil
;
4453 else if (h
->esym
.ifd
!= -1)
4455 struct ecoff_debug_info
*debug
;
4457 /* Adjust the FDR index for the symbol by that used for the
4459 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4460 BFD_ASSERT (h
->esym
.ifd
>= 0
4461 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4462 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4465 switch (h
->root
.type
)
4468 case bfd_link_hash_new
:
4470 case bfd_link_hash_undefined
:
4471 case bfd_link_hash_undefweak
:
4472 if (h
->esym
.asym
.sc
!= scUndefined
4473 && h
->esym
.asym
.sc
!= scSUndefined
)
4474 h
->esym
.asym
.sc
= scUndefined
;
4476 case bfd_link_hash_defined
:
4477 case bfd_link_hash_defweak
:
4478 if (h
->esym
.asym
.sc
== scUndefined
4479 || h
->esym
.asym
.sc
== scSUndefined
)
4480 h
->esym
.asym
.sc
= scAbs
;
4481 else if (h
->esym
.asym
.sc
== scCommon
)
4482 h
->esym
.asym
.sc
= scBss
;
4483 else if (h
->esym
.asym
.sc
== scSCommon
)
4484 h
->esym
.asym
.sc
= scSBss
;
4485 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4486 + h
->root
.u
.def
.section
->output_section
->vma
4487 + h
->root
.u
.def
.section
->output_offset
);
4489 case bfd_link_hash_common
:
4490 if (h
->esym
.asym
.sc
!= scCommon
4491 && h
->esym
.asym
.sc
!= scSCommon
)
4492 h
->esym
.asym
.sc
= scCommon
;
4493 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4495 case bfd_link_hash_indirect
:
4496 case bfd_link_hash_warning
:
4497 /* FIXME: Ignore these for now. The circumstances under which
4498 they should be written out are not clear to me. */
4502 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4504 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4507 return (bfd_ecoff_debug_one_external
4508 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4509 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4513 /* Relocate and write an ECOFF section into an ECOFF output file. */
4516 ecoff_indirect_link_order (output_bfd
, info
, output_section
, link_order
)
4518 struct bfd_link_info
*info
;
4519 asection
*output_section
;
4520 struct bfd_link_order
*link_order
;
4522 asection
*input_section
;
4524 struct ecoff_section_tdata
*section_tdata
;
4525 bfd_size_type raw_size
;
4526 bfd_size_type cooked_size
;
4527 bfd_byte
*contents
= NULL
;
4528 bfd_size_type external_reloc_size
;
4529 bfd_size_type external_relocs_size
;
4530 PTR external_relocs
= NULL
;
4532 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
4534 if (link_order
->size
== 0)
4537 input_section
= link_order
->u
.indirect
.section
;
4538 input_bfd
= input_section
->owner
;
4539 section_tdata
= ecoff_section_data (input_bfd
, input_section
);
4541 raw_size
= input_section
->_raw_size
;
4542 cooked_size
= input_section
->_cooked_size
;
4543 if (cooked_size
== 0)
4544 cooked_size
= raw_size
;
4546 BFD_ASSERT (input_section
->output_section
== output_section
);
4547 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
4548 BFD_ASSERT (cooked_size
== link_order
->size
);
4550 /* Get the section contents. We allocate memory for the larger of
4551 the size before relocating and the size after relocating. */
4552 contents
= (bfd_byte
*) bfd_malloc (raw_size
>= cooked_size
4554 : (size_t) cooked_size
);
4555 if (contents
== NULL
&& raw_size
!= 0)
4558 /* If we are relaxing, the contents may have already been read into
4559 memory, in which case we copy them into our new buffer. We don't
4560 simply reuse the old buffer in case cooked_size > raw_size. */
4561 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4562 && section_tdata
->contents
!= (bfd_byte
*) NULL
)
4563 memcpy (contents
, section_tdata
->contents
, (size_t) raw_size
);
4566 if (! bfd_get_section_contents (input_bfd
, input_section
,
4568 (file_ptr
) 0, raw_size
))
4572 /* Get the relocs. If we are relaxing MIPS code, they will already
4573 have been read in. Otherwise, we read them in now. */
4574 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
4575 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
4577 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4578 && section_tdata
->external_relocs
!= NULL
)
4579 external_relocs
= section_tdata
->external_relocs
;
4582 external_relocs
= (PTR
) bfd_malloc ((size_t) external_relocs_size
);
4583 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
4586 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
4587 || (bfd_read (external_relocs
, 1, external_relocs_size
, input_bfd
)
4588 != external_relocs_size
))
4592 /* Relocate the section contents. */
4593 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4594 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4598 /* Write out the relocated section. */
4599 if (! bfd_set_section_contents (output_bfd
,
4602 input_section
->output_offset
,
4606 /* If we are producing relocateable output, the relocs were
4607 modified, and we write them out now. We use the reloc_count
4608 field of output_section to keep track of the number of relocs we
4609 have output so far. */
4610 if (info
->relocateable
)
4612 if (bfd_seek (output_bfd
,
4613 (output_section
->rel_filepos
+
4614 output_section
->reloc_count
* external_reloc_size
),
4616 || (bfd_write (external_relocs
, 1, external_relocs_size
, output_bfd
)
4617 != external_relocs_size
))
4619 output_section
->reloc_count
+= input_section
->reloc_count
;
4622 if (contents
!= NULL
)
4624 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4625 free (external_relocs
);
4629 if (contents
!= NULL
)
4631 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4632 free (external_relocs
);
4636 /* Generate a reloc when linking an ECOFF file. This is a reloc
4637 requested by the linker, and does come from any input file. This
4638 is used to build constructor and destructor tables when linking
4642 ecoff_reloc_link_order (output_bfd
, info
, output_section
, link_order
)
4644 struct bfd_link_info
*info
;
4645 asection
*output_section
;
4646 struct bfd_link_order
*link_order
;
4648 enum bfd_link_order_type type
;
4652 struct internal_reloc in
;
4653 bfd_size_type external_reloc_size
;
4657 type
= link_order
->type
;
4659 addend
= link_order
->u
.reloc
.p
->addend
;
4661 /* We set up an arelent to pass to the backend adjust_reloc_out
4663 rel
.address
= link_order
->offset
;
4665 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4668 bfd_set_error (bfd_error_bad_value
);
4672 if (type
== bfd_section_reloc_link_order
)
4674 section
= link_order
->u
.reloc
.p
->u
.section
;
4675 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4679 struct bfd_link_hash_entry
*h
;
4681 /* Treat a reloc against a defined symbol as though it were
4682 actually against the section. */
4683 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4684 link_order
->u
.reloc
.p
->u
.name
,
4685 false, false, false);
4687 && (h
->type
== bfd_link_hash_defined
4688 || h
->type
== bfd_link_hash_defweak
))
4690 type
= bfd_section_reloc_link_order
;
4691 section
= h
->u
.def
.section
->output_section
;
4692 /* It seems that we ought to add the symbol value to the
4693 addend here, but in practice it has already been added
4694 because it was passed to constructor_callback. */
4695 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4699 /* We can't set up a reloc against a symbol correctly,
4700 because we have no asymbol structure. Currently no
4701 adjust_reloc_out routine cares. */
4702 rel
.sym_ptr_ptr
= (asymbol
**) NULL
;
4706 /* All ECOFF relocs are in-place. Put the addend into the object
4709 BFD_ASSERT (rel
.howto
->partial_inplace
);
4713 bfd_reloc_status_type rstat
;
4717 size
= bfd_get_reloc_size (rel
.howto
);
4718 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4719 if (buf
== (bfd_byte
*) NULL
)
4721 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
, addend
, buf
);
4727 case bfd_reloc_outofrange
:
4729 case bfd_reloc_overflow
:
4730 if (! ((*info
->callbacks
->reloc_overflow
)
4732 (link_order
->type
== bfd_section_reloc_link_order
4733 ? bfd_section_name (output_bfd
, section
)
4734 : link_order
->u
.reloc
.p
->u
.name
),
4735 rel
.howto
->name
, addend
, (bfd
*) NULL
,
4736 (asection
*) NULL
, (bfd_vma
) 0)))
4743 ok
= bfd_set_section_contents (output_bfd
, output_section
, (PTR
) buf
,
4744 (file_ptr
) link_order
->offset
, size
);
4752 /* Move the information into a internal_reloc structure. */
4753 in
.r_vaddr
= (rel
.address
4754 + bfd_get_section_vma (output_bfd
, output_section
));
4755 in
.r_type
= rel
.howto
->type
;
4757 if (type
== bfd_symbol_reloc_link_order
)
4759 struct ecoff_link_hash_entry
*h
;
4761 h
= ((struct ecoff_link_hash_entry
*)
4762 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4763 link_order
->u
.reloc
.p
->u
.name
,
4764 false, false, true));
4765 if (h
!= (struct ecoff_link_hash_entry
*) NULL
4767 in
.r_symndx
= h
->indx
;
4770 if (! ((*info
->callbacks
->unattached_reloc
)
4771 (info
, link_order
->u
.reloc
.p
->u
.name
, (bfd
*) NULL
,
4772 (asection
*) NULL
, (bfd_vma
) 0)))
4782 name
= bfd_get_section_name (output_bfd
, section
);
4783 if (strcmp (name
, ".text") == 0)
4784 in
.r_symndx
= RELOC_SECTION_TEXT
;
4785 else if (strcmp (name
, ".rdata") == 0)
4786 in
.r_symndx
= RELOC_SECTION_RDATA
;
4787 else if (strcmp (name
, ".data") == 0)
4788 in
.r_symndx
= RELOC_SECTION_DATA
;
4789 else if (strcmp (name
, ".sdata") == 0)
4790 in
.r_symndx
= RELOC_SECTION_SDATA
;
4791 else if (strcmp (name
, ".sbss") == 0)
4792 in
.r_symndx
= RELOC_SECTION_SBSS
;
4793 else if (strcmp (name
, ".bss") == 0)
4794 in
.r_symndx
= RELOC_SECTION_BSS
;
4795 else if (strcmp (name
, ".init") == 0)
4796 in
.r_symndx
= RELOC_SECTION_INIT
;
4797 else if (strcmp (name
, ".lit8") == 0)
4798 in
.r_symndx
= RELOC_SECTION_LIT8
;
4799 else if (strcmp (name
, ".lit4") == 0)
4800 in
.r_symndx
= RELOC_SECTION_LIT4
;
4801 else if (strcmp (name
, ".xdata") == 0)
4802 in
.r_symndx
= RELOC_SECTION_XDATA
;
4803 else if (strcmp (name
, ".pdata") == 0)
4804 in
.r_symndx
= RELOC_SECTION_PDATA
;
4805 else if (strcmp (name
, ".fini") == 0)
4806 in
.r_symndx
= RELOC_SECTION_FINI
;
4807 else if (strcmp (name
, ".lita") == 0)
4808 in
.r_symndx
= RELOC_SECTION_LITA
;
4809 else if (strcmp (name
, "*ABS*") == 0)
4810 in
.r_symndx
= RELOC_SECTION_ABS
;
4811 else if (strcmp (name
, ".rconst") == 0)
4812 in
.r_symndx
= RELOC_SECTION_RCONST
;
4818 /* Let the BFD backend adjust the reloc. */
4819 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4821 /* Get some memory and swap out the reloc. */
4822 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4823 rbuf
= (bfd_byte
*) bfd_malloc ((size_t) external_reloc_size
);
4824 if (rbuf
== (bfd_byte
*) NULL
)
4827 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (PTR
) rbuf
);
4829 ok
= (bfd_seek (output_bfd
,
4830 (output_section
->rel_filepos
+
4831 output_section
->reloc_count
* external_reloc_size
),
4833 && (bfd_write ((PTR
) rbuf
, 1, external_reloc_size
, output_bfd
)
4834 == external_reloc_size
));
4837 ++output_section
->reloc_count
;