1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
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, id, index, next, flags, user_set_vma, reloc_done, */
78 "*DEBUG*", 0, 0, NULL
, 0, 0, 0,
79 /* linker_mark, linker_has_input, gc_mark, segment_mark, */
81 /* vma, lma, _cooked_size, _raw_size, */
83 /* output_offset, output_section, alignment_power, */
85 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
87 /* line_filepos, userdata, contents, lineno, lineno_count, */
88 0, NULL
, NULL
, NULL
, 0,
89 /* entsize, comdat, kept_section, moving_line_filepos, */
91 /* target_index, used_by_bfd, constructor_chain, owner, */
94 (struct symbol_cache_entry
*) NULL
,
96 (struct symbol_cache_entry
**) NULL
,
97 /* link_order_head, link_order_tail */
101 /* Create an ECOFF object. */
104 _bfd_ecoff_mkobject (abfd
)
107 abfd
->tdata
.ecoff_obj_data
= ((struct ecoff_tdata
*)
108 bfd_zalloc (abfd
, sizeof (ecoff_data_type
)));
109 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
115 /* This is a hook called by coff_real_object_p to create any backend
116 specific information. */
119 _bfd_ecoff_mkobject_hook (abfd
, filehdr
, aouthdr
)
124 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
125 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
126 ecoff_data_type
*ecoff
;
128 if (_bfd_ecoff_mkobject (abfd
) == false)
131 ecoff
= ecoff_data (abfd
);
133 ecoff
->sym_filepos
= internal_f
->f_symptr
;
135 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
139 ecoff
->text_start
= internal_a
->text_start
;
140 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
141 ecoff
->gp
= internal_a
->gp_value
;
142 ecoff
->gprmask
= internal_a
->gprmask
;
143 for (i
= 0; i
< 4; i
++)
144 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
145 ecoff
->fprmask
= internal_a
->fprmask
;
146 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
147 abfd
->flags
|= D_PAGED
;
149 abfd
->flags
&=~ D_PAGED
;
152 /* It turns out that no special action is required by the MIPS or
153 Alpha ECOFF backends. They have different information in the
154 a.out header, but we just copy it all (e.g., gprmask, cprmask and
155 fprmask) and let the swapping routines ensure that only relevant
156 information is written out. */
161 /* Initialize a new section. */
164 _bfd_ecoff_new_section_hook (abfd
, section
)
165 bfd
*abfd ATTRIBUTE_UNUSED
;
168 section
->alignment_power
= 4;
170 if (strcmp (section
->name
, _TEXT
) == 0
171 || strcmp (section
->name
, _INIT
) == 0
172 || strcmp (section
->name
, _FINI
) == 0)
173 section
->flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
174 else if (strcmp (section
->name
, _DATA
) == 0
175 || strcmp (section
->name
, _SDATA
) == 0)
176 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
177 else if (strcmp (section
->name
, _RDATA
) == 0
178 || strcmp (section
->name
, _LIT8
) == 0
179 || strcmp (section
->name
, _LIT4
) == 0
180 || strcmp (section
->name
, _RCONST
) == 0
181 || strcmp (section
->name
, _PDATA
) == 0)
182 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
183 else if (strcmp (section
->name
, _BSS
) == 0
184 || strcmp (section
->name
, _SBSS
) == 0)
185 section
->flags
|= SEC_ALLOC
;
186 else if (strcmp (section
->name
, _LIB
) == 0)
188 /* An Irix 4 shared libary. */
189 section
->flags
|= SEC_COFF_SHARED_LIBRARY
;
192 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
193 uncertain about .init on some systems and I don't know how shared
199 /* Determine the machine architecture and type. This is called from
200 the generic COFF routines. It is the inverse of ecoff_get_magic,
201 below. This could be an ECOFF backend routine, with one version
202 for each target, but there aren't all that many ECOFF targets. */
205 _bfd_ecoff_set_arch_mach_hook (abfd
, filehdr
)
209 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
210 enum bfd_architecture arch
;
213 switch (internal_f
->f_magic
)
216 case MIPS_MAGIC_LITTLE
:
218 arch
= bfd_arch_mips
;
222 case MIPS_MAGIC_LITTLE2
:
223 case MIPS_MAGIC_BIG2
:
224 /* MIPS ISA level 2: the r6000 */
225 arch
= bfd_arch_mips
;
229 case MIPS_MAGIC_LITTLE3
:
230 case MIPS_MAGIC_BIG3
:
231 /* MIPS ISA level 3: the r4000 */
232 arch
= bfd_arch_mips
;
237 arch
= bfd_arch_alpha
;
242 arch
= bfd_arch_obscure
;
247 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
250 /* Get the magic number to use based on the architecture and machine.
251 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
254 ecoff_get_magic (abfd
)
259 switch (bfd_get_arch (abfd
))
262 switch (bfd_get_mach (abfd
))
267 big
= MIPS_MAGIC_BIG
;
268 little
= MIPS_MAGIC_LITTLE
;
272 big
= MIPS_MAGIC_BIG2
;
273 little
= MIPS_MAGIC_LITTLE2
;
277 big
= MIPS_MAGIC_BIG3
;
278 little
= MIPS_MAGIC_LITTLE3
;
282 return bfd_big_endian (abfd
) ? big
: little
;
293 /* Get the section s_flags to use for a section. */
296 ecoff_sec_to_styp_flags (name
, flags
)
304 if (strcmp (name
, _TEXT
) == 0)
306 else if (strcmp (name
, _DATA
) == 0)
308 else if (strcmp (name
, _SDATA
) == 0)
310 else if (strcmp (name
, _RDATA
) == 0)
312 else if (strcmp (name
, _LITA
) == 0)
314 else if (strcmp (name
, _LIT8
) == 0)
316 else if (strcmp (name
, _LIT4
) == 0)
318 else if (strcmp (name
, _BSS
) == 0)
320 else if (strcmp (name
, _SBSS
) == 0)
322 else if (strcmp (name
, _INIT
) == 0)
323 styp
= STYP_ECOFF_INIT
;
324 else if (strcmp (name
, _FINI
) == 0)
325 styp
= STYP_ECOFF_FINI
;
326 else if (strcmp (name
, _PDATA
) == 0)
328 else if (strcmp (name
, _XDATA
) == 0)
330 else if (strcmp (name
, _LIB
) == 0)
331 styp
= STYP_ECOFF_LIB
;
332 else if (strcmp (name
, _GOT
) == 0)
334 else if (strcmp (name
, _HASH
) == 0)
336 else if (strcmp (name
, _DYNAMIC
) == 0)
338 else if (strcmp (name
, _LIBLIST
) == 0)
340 else if (strcmp (name
, _RELDYN
) == 0)
342 else if (strcmp (name
, _CONFLIC
) == 0)
344 else if (strcmp (name
, _DYNSTR
) == 0)
346 else if (strcmp (name
, _DYNSYM
) == 0)
348 else if (strcmp (name
, _COMMENT
) == 0)
351 flags
&=~ SEC_NEVER_LOAD
;
353 else if (strcmp (name
, _RCONST
) == 0)
355 else if (flags
& SEC_CODE
)
357 else if (flags
& SEC_DATA
)
359 else if (flags
& SEC_READONLY
)
361 else if (flags
& SEC_LOAD
)
366 if (flags
& SEC_NEVER_LOAD
)
372 /* Get the BFD flags to use for a section. */
375 _bfd_ecoff_styp_to_sec_flags (abfd
, hdr
, name
, section
)
376 bfd
*abfd ATTRIBUTE_UNUSED
;
378 const char *name ATTRIBUTE_UNUSED
;
379 asection
*section ATTRIBUTE_UNUSED
;
381 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
382 long styp_flags
= internal_s
->s_flags
;
383 flagword sec_flags
=0;
385 if (styp_flags
& STYP_NOLOAD
)
386 sec_flags
|= SEC_NEVER_LOAD
;
388 /* For 386 COFF, at least, an unloadable text or data section is
389 actually a shared library section. */
390 if ((styp_flags
& STYP_TEXT
)
391 || (styp_flags
& STYP_ECOFF_INIT
)
392 || (styp_flags
& STYP_ECOFF_FINI
)
393 || (styp_flags
& STYP_DYNAMIC
)
394 || (styp_flags
& STYP_LIBLIST
)
395 || (styp_flags
& STYP_RELDYN
)
396 || styp_flags
== STYP_CONFLIC
397 || (styp_flags
& STYP_DYNSTR
)
398 || (styp_flags
& STYP_DYNSYM
)
399 || (styp_flags
& STYP_HASH
))
401 if (sec_flags
& SEC_NEVER_LOAD
)
402 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
404 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
406 else if ((styp_flags
& STYP_DATA
)
407 || (styp_flags
& STYP_RDATA
)
408 || (styp_flags
& STYP_SDATA
)
409 || styp_flags
== STYP_PDATA
410 || styp_flags
== STYP_XDATA
411 || (styp_flags
& STYP_GOT
)
412 || styp_flags
== STYP_RCONST
)
414 if (sec_flags
& SEC_NEVER_LOAD
)
415 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
417 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
418 if ((styp_flags
& STYP_RDATA
)
419 || styp_flags
== STYP_PDATA
420 || styp_flags
== STYP_RCONST
)
421 sec_flags
|= SEC_READONLY
;
423 else if ((styp_flags
& STYP_BSS
)
424 || (styp_flags
& STYP_SBSS
))
426 sec_flags
|= SEC_ALLOC
;
428 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
430 sec_flags
|= SEC_NEVER_LOAD
;
432 else if ((styp_flags
& STYP_LITA
)
433 || (styp_flags
& STYP_LIT8
)
434 || (styp_flags
& STYP_LIT4
))
436 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
438 else if (styp_flags
& STYP_ECOFF_LIB
)
440 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
444 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
450 /* Read in the symbolic header for an ECOFF object file. */
453 ecoff_slurp_symbolic_header (abfd
)
456 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
457 bfd_size_type external_hdr_size
;
459 HDRR
*internal_symhdr
;
461 /* See if we've already read it in. */
462 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
463 backend
->debug_swap
.sym_magic
)
466 /* See whether there is a symbolic header. */
467 if (ecoff_data (abfd
)->sym_filepos
== 0)
469 bfd_get_symcount (abfd
) = 0;
473 /* At this point bfd_get_symcount (abfd) holds the number of symbols
474 as read from the file header, but on ECOFF this is always the
475 size of the symbolic information header. It would be cleaner to
476 handle this when we first read the file in coffgen.c. */
477 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
478 if (bfd_get_symcount (abfd
) != external_hdr_size
)
480 bfd_set_error (bfd_error_bad_value
);
484 /* Read the symbolic information header. */
485 raw
= (PTR
) bfd_malloc ((size_t) external_hdr_size
);
489 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) == -1
490 || (bfd_read (raw
, external_hdr_size
, 1, abfd
)
491 != external_hdr_size
))
493 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
494 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
496 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
498 bfd_set_error (bfd_error_bad_value
);
502 /* Now we can get the correct number of symbols. */
503 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
504 + internal_symhdr
->iextMax
);
515 /* Read in and swap the important symbolic information for an ECOFF
516 object file. This is called by gdb via the read_debug_info entry
517 point in the backend structure. */
520 _bfd_ecoff_slurp_symbolic_info (abfd
, ignore
, debug
)
522 asection
*ignore ATTRIBUTE_UNUSED
;
523 struct ecoff_debug_info
*debug
;
525 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
526 HDRR
*internal_symhdr
;
527 bfd_size_type raw_base
;
528 bfd_size_type raw_size
;
530 bfd_size_type external_fdr_size
;
534 bfd_size_type raw_end
;
535 bfd_size_type cb_end
;
537 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
539 /* Check whether we've already gotten it, and whether there's any to
541 if (ecoff_data (abfd
)->raw_syments
!= (PTR
) NULL
)
543 if (ecoff_data (abfd
)->sym_filepos
== 0)
545 bfd_get_symcount (abfd
) = 0;
549 if (! ecoff_slurp_symbolic_header (abfd
))
552 internal_symhdr
= &debug
->symbolic_header
;
554 /* Read all the symbolic information at once. */
555 raw_base
= (ecoff_data (abfd
)->sym_filepos
556 + backend
->debug_swap
.external_hdr_size
);
558 /* Alpha ecoff makes the determination of raw_size difficult. It has
559 an undocumented debug data section between the symhdr and the first
560 documented section. And the ordering of the sections varies between
561 statically and dynamically linked executables.
562 If bfd supports SEEK_END someday, this code could be simplified. */
566 #define UPDATE_RAW_END(start, count, size) \
567 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
568 if (cb_end > raw_end) \
571 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
572 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
573 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
574 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
575 UPDATE_RAW_END (cbOptOffset
, ioptMax
, backend
->debug_swap
.external_opt_size
);
576 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
577 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
578 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
579 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
580 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
581 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
583 #undef UPDATE_RAW_END
585 raw_size
= raw_end
- raw_base
;
588 ecoff_data (abfd
)->sym_filepos
= 0;
591 raw
= (PTR
) bfd_alloc (abfd
, raw_size
);
595 (ecoff_data (abfd
)->sym_filepos
596 + backend
->debug_swap
.external_hdr_size
),
598 || bfd_read (raw
, raw_size
, 1, abfd
) != raw_size
)
600 bfd_release (abfd
, raw
);
604 ecoff_data (abfd
)->raw_syments
= raw
;
606 /* Get pointers for the numeric offsets in the HDRR structure. */
607 #define FIX(off1, off2, type) \
608 if (internal_symhdr->off1 == 0) \
609 debug->off2 = (type) NULL; \
611 debug->off2 = (type) ((char *) raw \
612 + (internal_symhdr->off1 \
614 FIX (cbLineOffset
, line
, unsigned char *);
615 FIX (cbDnOffset
, external_dnr
, PTR
);
616 FIX (cbPdOffset
, external_pdr
, PTR
);
617 FIX (cbSymOffset
, external_sym
, PTR
);
618 FIX (cbOptOffset
, external_opt
, PTR
);
619 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
620 FIX (cbSsOffset
, ss
, char *);
621 FIX (cbSsExtOffset
, ssext
, char *);
622 FIX (cbFdOffset
, external_fdr
, PTR
);
623 FIX (cbRfdOffset
, external_rfd
, PTR
);
624 FIX (cbExtOffset
, external_ext
, PTR
);
627 /* I don't want to always swap all the data, because it will just
628 waste time and most programs will never look at it. The only
629 time the linker needs most of the debugging information swapped
630 is when linking big-endian and little-endian MIPS object files
631 together, which is not a common occurrence.
633 We need to look at the fdr to deal with a lot of information in
634 the symbols, so we swap them here. */
635 debug
->fdr
= (struct fdr
*) bfd_alloc (abfd
,
636 (internal_symhdr
->ifdMax
*
637 sizeof (struct fdr
)));
638 if (debug
->fdr
== NULL
)
640 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
641 fdr_ptr
= debug
->fdr
;
642 fraw_src
= (char *) debug
->external_fdr
;
643 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
644 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
645 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
650 /* ECOFF symbol table routines. The ECOFF symbol table is described
651 in gcc/mips-tfile.c. */
653 /* ECOFF uses two common sections. One is the usual one, and the
654 other is for small objects. All the small objects are kept
655 together, and then referenced via the gp pointer, which yields
656 faster assembler code. This is what we use for the small common
658 static asection ecoff_scom_section
;
659 static asymbol ecoff_scom_symbol
;
660 static asymbol
*ecoff_scom_symbol_ptr
;
662 /* Create an empty symbol. */
665 _bfd_ecoff_make_empty_symbol (abfd
)
668 ecoff_symbol_type
*new;
670 new = (ecoff_symbol_type
*) bfd_alloc (abfd
, sizeof (ecoff_symbol_type
));
671 if (new == (ecoff_symbol_type
*) NULL
)
672 return (asymbol
*) NULL
;
673 memset ((PTR
) new, 0, sizeof *new);
674 new->symbol
.section
= (asection
*) NULL
;
675 new->fdr
= (FDR
*) NULL
;
678 new->symbol
.the_bfd
= abfd
;
682 /* Set the BFD flags and section for an ECOFF symbol. */
685 ecoff_set_symbol_info (abfd
, ecoff_sym
, asym
, ext
, weak
)
692 asym
->the_bfd
= abfd
;
693 asym
->value
= ecoff_sym
->value
;
694 asym
->section
= &bfd_debug_section
;
697 /* Most symbol types are just for debugging. */
698 switch (ecoff_sym
->st
)
707 if (ECOFF_IS_STAB (ecoff_sym
))
709 asym
->flags
= BSF_DEBUGGING
;
714 asym
->flags
= BSF_DEBUGGING
;
719 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
721 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
724 asym
->flags
= BSF_LOCAL
;
725 /* Normally, a local stProc symbol will have a corresponding
726 external symbol. We mark the local symbol as a debugging
727 symbol, in order to prevent nm from printing both out.
728 Similarly, we mark stLabel and stabs symbols as debugging
729 symbols. In both cases, we do want to set the value
730 correctly based on the symbol class. */
731 if (ecoff_sym
->st
== stProc
732 || ecoff_sym
->st
== stLabel
733 || ECOFF_IS_STAB (ecoff_sym
))
734 asym
->flags
|= BSF_DEBUGGING
;
736 switch (ecoff_sym
->sc
)
739 /* Used for compiler generated labels. Leave them in the
740 debugging section, and mark them as local. If BSF_DEBUGGING
741 is set, then nm does not display them for some reason. If no
742 flags are set then the linker whines about them. */
743 asym
->flags
= BSF_LOCAL
;
746 asym
->section
= bfd_make_section_old_way (abfd
, ".text");
747 asym
->value
-= asym
->section
->vma
;
750 asym
->section
= bfd_make_section_old_way (abfd
, ".data");
751 asym
->value
-= asym
->section
->vma
;
754 asym
->section
= bfd_make_section_old_way (abfd
, ".bss");
755 asym
->value
-= asym
->section
->vma
;
758 asym
->flags
= BSF_DEBUGGING
;
761 asym
->section
= bfd_abs_section_ptr
;
764 asym
->section
= bfd_und_section_ptr
;
774 asym
->flags
= BSF_DEBUGGING
;
777 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
778 asym
->value
-= asym
->section
->vma
;
781 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
782 asym
->value
-= asym
->section
->vma
;
785 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
786 asym
->value
-= asym
->section
->vma
;
789 asym
->flags
= BSF_DEBUGGING
;
792 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
794 asym
->section
= bfd_com_section_ptr
;
800 if (ecoff_scom_section
.name
== NULL
)
802 /* Initialize the small common section. */
803 ecoff_scom_section
.name
= SCOMMON
;
804 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
805 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
806 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
807 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
808 ecoff_scom_symbol
.name
= SCOMMON
;
809 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
810 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
811 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
813 asym
->section
= &ecoff_scom_section
;
818 asym
->flags
= BSF_DEBUGGING
;
821 asym
->section
= bfd_und_section_ptr
;
826 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
827 asym
->value
-= asym
->section
->vma
;
832 asym
->flags
= BSF_DEBUGGING
;
835 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
836 asym
->value
-= asym
->section
->vma
;
839 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
840 asym
->value
-= asym
->section
->vma
;
846 /* Look for special constructors symbols and make relocation entries
847 in a special construction section. These are produced by the
848 -fgnu-linker argument to g++. */
849 if (ECOFF_IS_STAB (ecoff_sym
))
851 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
861 /* This code is no longer needed. It used to be used to
862 make the linker handle set symbols, but they are now
863 handled in the add_symbols routine instead. */
867 arelent_chain
*reloc_chain
;
868 unsigned int bitsize
;
870 /* Get a section with the same name as the symbol (usually
871 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
872 name ___CTOR_LIST (three underscores). We need
873 __CTOR_LIST (two underscores), since ECOFF doesn't use
874 a leading underscore. This should be handled by gcc,
875 but instead we do it here. Actually, this should all
876 be done differently anyhow. */
877 name
= bfd_asymbol_name (asym
);
878 if (name
[0] == '_' && name
[1] == '_' && name
[2] == '_')
883 section
= bfd_get_section_by_name (abfd
, name
);
884 if (section
== (asection
*) NULL
)
888 copy
= (char *) bfd_alloc (abfd
, strlen (name
) + 1);
892 section
= bfd_make_section (abfd
, copy
);
895 /* Build a reloc pointing to this constructor. */
897 (arelent_chain
*) bfd_alloc (abfd
, sizeof (arelent_chain
));
900 reloc_chain
->relent
.sym_ptr_ptr
=
901 bfd_get_section (asym
)->symbol_ptr_ptr
;
902 reloc_chain
->relent
.address
= section
->_raw_size
;
903 reloc_chain
->relent
.addend
= asym
->value
;
904 reloc_chain
->relent
.howto
=
905 ecoff_backend (abfd
)->constructor_reloc
;
907 /* Set up the constructor section to hold the reloc. */
908 section
->flags
= SEC_CONSTRUCTOR
;
909 ++section
->reloc_count
;
911 /* Constructor sections must be rounded to a boundary
912 based on the bitsize. These are not real sections--
913 they are handled specially by the linker--so the ECOFF
914 16 byte alignment restriction does not apply. */
915 bitsize
= ecoff_backend (abfd
)->constructor_bitsize
;
916 section
->alignment_power
= 1;
917 while ((1 << section
->alignment_power
) < bitsize
/ 8)
918 ++section
->alignment_power
;
920 reloc_chain
->next
= section
->constructor_chain
;
921 section
->constructor_chain
= reloc_chain
;
922 section
->_raw_size
+= bitsize
/ 8;
926 /* Mark the symbol as a constructor. */
927 asym
->flags
|= BSF_CONSTRUCTOR
;
935 /* Read an ECOFF symbol table. */
938 _bfd_ecoff_slurp_symbol_table (abfd
)
941 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
942 const bfd_size_type external_ext_size
943 = backend
->debug_swap
.external_ext_size
;
944 const bfd_size_type external_sym_size
945 = backend
->debug_swap
.external_sym_size
;
946 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
947 = backend
->debug_swap
.swap_ext_in
;
948 void (* const swap_sym_in
) PARAMS ((bfd
*, PTR
, SYMR
*))
949 = backend
->debug_swap
.swap_sym_in
;
950 bfd_size_type internal_size
;
951 ecoff_symbol_type
*internal
;
952 ecoff_symbol_type
*internal_ptr
;
958 /* If we've already read in the symbol table, do nothing. */
959 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
962 /* Get the symbolic information. */
963 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
964 &ecoff_data (abfd
)->debug_info
))
966 if (bfd_get_symcount (abfd
) == 0)
969 internal_size
= bfd_get_symcount (abfd
) * sizeof (ecoff_symbol_type
);
970 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
971 if (internal
== NULL
)
974 internal_ptr
= internal
;
975 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
977 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
978 * external_ext_size
));
979 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
983 (*swap_ext_in
) (abfd
, (PTR
) eraw_src
, &internal_esym
);
984 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
985 + internal_esym
.asym
.iss
);
986 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
987 &internal_ptr
->symbol
, 1,
988 internal_esym
.weakext
))
990 /* The alpha uses a negative ifd field for section symbols. */
991 if (internal_esym
.ifd
>= 0)
992 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
993 + internal_esym
.ifd
);
995 internal_ptr
->fdr
= NULL
;
996 internal_ptr
->local
= false;
997 internal_ptr
->native
= (PTR
) eraw_src
;
1000 /* The local symbols must be accessed via the fdr's, because the
1001 string and aux indices are relative to the fdr information. */
1002 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
1003 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
1004 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
1009 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
1010 + fdr_ptr
->isymBase
* external_sym_size
);
1011 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
1013 lraw_src
< lraw_end
;
1014 lraw_src
+= external_sym_size
, internal_ptr
++)
1018 (*swap_sym_in
) (abfd
, (PTR
) lraw_src
, &internal_sym
);
1019 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
1021 + internal_sym
.iss
);
1022 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
1023 &internal_ptr
->symbol
, 0, 0))
1025 internal_ptr
->fdr
= fdr_ptr
;
1026 internal_ptr
->local
= true;
1027 internal_ptr
->native
= (PTR
) lraw_src
;
1031 ecoff_data (abfd
)->canonical_symbols
= internal
;
1036 /* Return the amount of space needed for the canonical symbols. */
1039 _bfd_ecoff_get_symtab_upper_bound (abfd
)
1042 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
1043 &ecoff_data (abfd
)->debug_info
))
1046 if (bfd_get_symcount (abfd
) == 0)
1049 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
1052 /* Get the canonical symbols. */
1055 _bfd_ecoff_get_symtab (abfd
, alocation
)
1057 asymbol
**alocation
;
1059 unsigned int counter
= 0;
1060 ecoff_symbol_type
*symbase
;
1061 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1063 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1065 if (bfd_get_symcount (abfd
) == 0)
1068 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1069 while (counter
< bfd_get_symcount (abfd
))
1071 *(location
++) = symbase
++;
1074 *location
++ = (ecoff_symbol_type
*) NULL
;
1075 return bfd_get_symcount (abfd
);
1078 /* Turn ECOFF type information into a printable string.
1079 ecoff_emit_aggregate and ecoff_type_to_string are from
1080 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1082 /* Write aggregate information to a string. */
1085 ecoff_emit_aggregate (abfd
, fdr
, string
, rndx
, isym
, which
)
1093 const struct ecoff_debug_swap
* const debug_swap
=
1094 &ecoff_backend (abfd
)->debug_swap
;
1095 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1096 unsigned int ifd
= rndx
->rfd
;
1097 unsigned int indx
= rndx
->index
;
1103 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1104 struct return type of a procedure compiled without -g. */
1105 if (ifd
== 0xffffffff
1106 || (rndx
->rfd
== 0xfff && indx
== 0))
1107 name
= "<undefined>";
1108 else if (indx
== indexNil
)
1114 if (debug_info
->external_rfd
== NULL
)
1115 fdr
= debug_info
->fdr
+ ifd
;
1120 (*debug_swap
->swap_rfd_in
) (abfd
,
1121 ((char *) debug_info
->external_rfd
1122 + ((fdr
->rfdBase
+ ifd
)
1123 * debug_swap
->external_rfd_size
)),
1125 fdr
= debug_info
->fdr
+ rfd
;
1128 indx
+= fdr
->isymBase
;
1130 (*debug_swap
->swap_sym_in
) (abfd
,
1131 ((char *) debug_info
->external_sym
1132 + indx
* debug_swap
->external_sym_size
),
1135 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1139 "%s %s { ifd = %u, index = %lu }",
1142 + debug_info
->symbolic_header
.iextMax
));
1145 /* Convert the type information to string format. */
1148 ecoff_type_to_string (abfd
, fdr
, indx
)
1153 union aux_ext
*aux_ptr
;
1162 unsigned int basic_type
;
1165 static char buffer2
[1024];
1170 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1171 bigendian
= fdr
->fBigendian
;
1173 for (i
= 0; i
< 7; i
++)
1175 qualifiers
[i
].low_bound
= 0;
1176 qualifiers
[i
].high_bound
= 0;
1177 qualifiers
[i
].stride
= 0;
1180 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1181 return "-1 (no type)";
1182 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1184 basic_type
= u
.ti
.bt
;
1185 qualifiers
[0].type
= u
.ti
.tq0
;
1186 qualifiers
[1].type
= u
.ti
.tq1
;
1187 qualifiers
[2].type
= u
.ti
.tq2
;
1188 qualifiers
[3].type
= u
.ti
.tq3
;
1189 qualifiers
[4].type
= u
.ti
.tq4
;
1190 qualifiers
[5].type
= u
.ti
.tq5
;
1191 qualifiers
[6].type
= tqNil
;
1194 * Go get the basic type.
1198 case btNil
: /* undefined */
1202 case btAdr
: /* address - integer same size as pointer */
1203 strcpy (p1
, "address");
1206 case btChar
: /* character */
1207 strcpy (p1
, "char");
1210 case btUChar
: /* unsigned character */
1211 strcpy (p1
, "unsigned char");
1214 case btShort
: /* short */
1215 strcpy (p1
, "short");
1218 case btUShort
: /* unsigned short */
1219 strcpy (p1
, "unsigned short");
1222 case btInt
: /* int */
1226 case btUInt
: /* unsigned int */
1227 strcpy (p1
, "unsigned int");
1230 case btLong
: /* long */
1231 strcpy (p1
, "long");
1234 case btULong
: /* unsigned long */
1235 strcpy (p1
, "unsigned long");
1238 case btFloat
: /* float (real) */
1239 strcpy (p1
, "float");
1242 case btDouble
: /* Double (real) */
1243 strcpy (p1
, "double");
1246 /* Structures add 1-2 aux words:
1247 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1248 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1250 case btStruct
: /* Structure (Record) */
1251 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1252 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1253 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1255 indx
++; /* skip aux words */
1258 /* Unions add 1-2 aux words:
1259 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1260 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1262 case btUnion
: /* Union */
1263 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1264 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1265 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1267 indx
++; /* skip aux words */
1270 /* Enumerations add 1-2 aux words:
1271 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1272 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1274 case btEnum
: /* Enumeration */
1275 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1276 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1277 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1279 indx
++; /* skip aux words */
1282 case btTypedef
: /* defined via a typedef, isymRef points */
1283 strcpy (p1
, "typedef");
1286 case btRange
: /* subrange of int */
1287 strcpy (p1
, "subrange");
1290 case btSet
: /* pascal sets */
1294 case btComplex
: /* fortran complex */
1295 strcpy (p1
, "complex");
1298 case btDComplex
: /* fortran double complex */
1299 strcpy (p1
, "double complex");
1302 case btIndirect
: /* forward or unnamed typedef */
1303 strcpy (p1
, "forward/unamed typedef");
1306 case btFixedDec
: /* Fixed Decimal */
1307 strcpy (p1
, "fixed decimal");
1310 case btFloatDec
: /* Float Decimal */
1311 strcpy (p1
, "float decimal");
1314 case btString
: /* Varying Length Character String */
1315 strcpy (p1
, "string");
1318 case btBit
: /* Aligned Bit String */
1322 case btPicture
: /* Picture */
1323 strcpy (p1
, "picture");
1326 case btVoid
: /* Void */
1327 strcpy (p1
, "void");
1331 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1335 p1
+= strlen (buffer1
);
1338 * If this is a bitfield, get the bitsize.
1344 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1345 sprintf (p1
, " : %d", bitsize
);
1346 p1
+= strlen (buffer1
);
1350 * Deal with any qualifiers.
1352 if (qualifiers
[0].type
!= tqNil
)
1355 * Snarf up any array bounds in the correct order. Arrays
1356 * store 5 successive words in the aux. table:
1357 * word 0 RNDXR to type of the bounds (ie, int)
1358 * word 1 Current file descriptor index
1360 * word 3 high bound (or -1 if [])
1361 * word 4 stride size in bits
1363 for (i
= 0; i
< 7; i
++)
1365 if (qualifiers
[i
].type
== tqArray
)
1367 qualifiers
[i
].low_bound
=
1368 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1369 qualifiers
[i
].high_bound
=
1370 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1371 qualifiers
[i
].stride
=
1372 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1378 * Now print out the qualifiers.
1380 for (i
= 0; i
< 6; i
++)
1382 switch (qualifiers
[i
].type
)
1389 strcpy (p2
, "ptr to ");
1390 p2
+= sizeof ("ptr to ")-1;
1394 strcpy (p2
, "volatile ");
1395 p2
+= sizeof ("volatile ")-1;
1399 strcpy (p2
, "far ");
1400 p2
+= sizeof ("far ")-1;
1404 strcpy (p2
, "func. ret. ");
1405 p2
+= sizeof ("func. ret. ");
1410 int first_array
= i
;
1413 /* Print array bounds reversed (ie, in the order the C
1414 programmer writes them). C is such a fun language.... */
1416 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1419 for (j
= i
; j
>= first_array
; j
--)
1421 strcpy (p2
, "array [");
1422 p2
+= sizeof ("array [")-1;
1423 if (qualifiers
[j
].low_bound
!= 0)
1425 "%ld:%ld {%ld bits}",
1426 (long) qualifiers
[j
].low_bound
,
1427 (long) qualifiers
[j
].high_bound
,
1428 (long) qualifiers
[j
].stride
);
1430 else if (qualifiers
[j
].high_bound
!= -1)
1433 (long) (qualifiers
[j
].high_bound
+ 1),
1434 (long) (qualifiers
[j
].stride
));
1437 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1440 strcpy (p2
, "] of ");
1441 p2
+= sizeof ("] of ")-1;
1449 strcpy (p2
, buffer1
);
1453 /* Return information about ECOFF symbol SYMBOL in RET. */
1456 _bfd_ecoff_get_symbol_info (abfd
, symbol
, ret
)
1457 bfd
*abfd ATTRIBUTE_UNUSED
;
1461 bfd_symbol_info (symbol
, ret
);
1464 /* Return whether this is a local label. */
1467 _bfd_ecoff_bfd_is_local_label_name (abfd
, name
)
1468 bfd
*abfd ATTRIBUTE_UNUSED
;
1471 return name
[0] == '$';
1474 /* Print information about an ECOFF symbol. */
1477 _bfd_ecoff_print_symbol (abfd
, filep
, symbol
, how
)
1481 bfd_print_symbol_type how
;
1483 const struct ecoff_debug_swap
* const debug_swap
1484 = &ecoff_backend (abfd
)->debug_swap
;
1485 FILE *file
= (FILE *)filep
;
1489 case bfd_print_symbol_name
:
1490 fprintf (file
, "%s", symbol
->name
);
1492 case bfd_print_symbol_more
:
1493 if (ecoffsymbol (symbol
)->local
)
1497 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1499 fprintf (file
, "ecoff local ");
1500 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1501 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1502 (unsigned) ecoff_sym
.sc
);
1508 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1510 fprintf (file
, "ecoff extern ");
1511 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1512 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1513 (unsigned) ecoff_ext
.asym
.sc
);
1516 case bfd_print_symbol_all
:
1517 /* Print out the symbols in a reasonable way */
1526 if (ecoffsymbol (symbol
)->local
)
1528 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1531 pos
= ((((char *) ecoffsymbol (symbol
)->native
1532 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1533 / debug_swap
->external_sym_size
)
1534 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1541 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1544 pos
= (((char *) ecoffsymbol (symbol
)->native
1545 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1546 / debug_swap
->external_ext_size
);
1547 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1548 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1549 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1552 fprintf (file
, "[%3d] %c ",
1554 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1555 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1556 (unsigned) ecoff_ext
.asym
.st
,
1557 (unsigned) ecoff_ext
.asym
.sc
,
1558 (unsigned) ecoff_ext
.asym
.index
,
1559 jmptbl
, cobol_main
, weakext
,
1562 if (ecoffsymbol (symbol
)->fdr
!= NULL
1563 && ecoff_ext
.asym
.index
!= indexNil
)
1568 bfd_size_type sym_base
;
1569 union aux_ext
*aux_base
;
1571 fdr
= ecoffsymbol (symbol
)->fdr
;
1572 indx
= ecoff_ext
.asym
.index
;
1574 /* sym_base is used to map the fdr relative indices which
1575 appear in the file to the position number which we are
1577 sym_base
= fdr
->isymBase
;
1578 if (ecoffsymbol (symbol
)->local
)
1580 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1582 /* aux_base is the start of the aux entries for this file;
1583 asym.index is an offset from this. */
1584 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1587 /* The aux entries are stored in host byte order; the
1588 order is indicated by a bit in the fdr. */
1589 bigendian
= fdr
->fBigendian
;
1591 /* This switch is basically from gcc/mips-tdump.c */
1592 switch (ecoff_ext
.asym
.st
)
1600 fprintf (file
, _("\n End+1 symbol: %ld"),
1601 (long) (indx
+ sym_base
));
1605 if (ecoff_ext
.asym
.sc
== scText
1606 || ecoff_ext
.asym
.sc
== scInfo
)
1607 fprintf (file
, _("\n First symbol: %ld"),
1608 (long) (indx
+ sym_base
));
1610 fprintf (file
, _("\n First symbol: %ld"),
1612 (AUX_GET_ISYM (bigendian
,
1613 &aux_base
[ecoff_ext
.asym
.index
])
1619 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1621 else if (ecoffsymbol (symbol
)->local
)
1622 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1624 (AUX_GET_ISYM (bigendian
,
1625 &aux_base
[ecoff_ext
.asym
.index
])
1627 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1629 fprintf (file
, _("\n Local symbol: %ld"),
1632 + (ecoff_data (abfd
)
1633 ->debug_info
.symbolic_header
.iextMax
)));
1637 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1638 (long) (indx
+ sym_base
));
1642 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1643 (long) (indx
+ sym_base
));
1647 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1648 (long) (indx
+ sym_base
));
1652 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1653 fprintf (file
, _("\n Type: %s"),
1654 ecoff_type_to_string (abfd
, fdr
, indx
));
1663 /* Read in the relocs for a section. */
1666 ecoff_slurp_reloc_table (abfd
, section
, symbols
)
1671 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1672 arelent
*internal_relocs
;
1673 bfd_size_type external_reloc_size
;
1674 bfd_size_type external_relocs_size
;
1675 char *external_relocs
;
1679 if (section
->relocation
!= (arelent
*) NULL
1680 || section
->reloc_count
== 0
1681 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1684 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1687 internal_relocs
= (arelent
*) bfd_alloc (abfd
,
1689 * section
->reloc_count
));
1690 external_reloc_size
= backend
->external_reloc_size
;
1691 external_relocs_size
= external_reloc_size
* section
->reloc_count
;
1692 external_relocs
= (char *) bfd_alloc (abfd
, external_relocs_size
);
1693 if (internal_relocs
== (arelent
*) NULL
1694 || external_relocs
== (char *) NULL
)
1696 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1698 if (bfd_read (external_relocs
, 1, external_relocs_size
, abfd
)
1699 != external_relocs_size
)
1702 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1704 struct internal_reloc intern
;
1706 (*backend
->swap_reloc_in
) (abfd
,
1707 external_relocs
+ i
* external_reloc_size
,
1710 if (intern
.r_extern
)
1712 /* r_symndx is an index into the external symbols. */
1713 BFD_ASSERT (intern
.r_symndx
>= 0
1715 < (ecoff_data (abfd
)
1716 ->debug_info
.symbolic_header
.iextMax
)));
1717 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1720 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1721 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1723 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1728 CONST
char *sec_name
;
1731 /* r_symndx is a section key. */
1732 switch (intern
.r_symndx
)
1734 case RELOC_SECTION_TEXT
: sec_name
= ".text"; break;
1735 case RELOC_SECTION_RDATA
: sec_name
= ".rdata"; break;
1736 case RELOC_SECTION_DATA
: sec_name
= ".data"; break;
1737 case RELOC_SECTION_SDATA
: sec_name
= ".sdata"; break;
1738 case RELOC_SECTION_SBSS
: sec_name
= ".sbss"; break;
1739 case RELOC_SECTION_BSS
: sec_name
= ".bss"; break;
1740 case RELOC_SECTION_INIT
: sec_name
= ".init"; break;
1741 case RELOC_SECTION_LIT8
: sec_name
= ".lit8"; break;
1742 case RELOC_SECTION_LIT4
: sec_name
= ".lit4"; break;
1743 case RELOC_SECTION_XDATA
: sec_name
= ".xdata"; break;
1744 case RELOC_SECTION_PDATA
: sec_name
= ".pdata"; break;
1745 case RELOC_SECTION_FINI
: sec_name
= ".fini"; break;
1746 case RELOC_SECTION_LITA
: sec_name
= ".lita"; break;
1747 case RELOC_SECTION_RCONST
: sec_name
= ".rconst"; break;
1751 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1752 if (sec
== (asection
*) NULL
)
1754 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1756 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1759 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1761 /* Let the backend select the howto field and do any other
1762 required processing. */
1763 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1766 bfd_release (abfd
, external_relocs
);
1768 section
->relocation
= internal_relocs
;
1773 /* Get a canonical list of relocs. */
1776 _bfd_ecoff_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
1784 if (section
->flags
& SEC_CONSTRUCTOR
)
1786 arelent_chain
*chain
;
1788 /* This section has relocs made up by us, not the file, so take
1789 them out of their chain and place them into the data area
1791 for (count
= 0, chain
= section
->constructor_chain
;
1792 count
< section
->reloc_count
;
1793 count
++, chain
= chain
->next
)
1794 *relptr
++ = &chain
->relent
;
1800 if (ecoff_slurp_reloc_table (abfd
, section
, symbols
) == false)
1803 tblptr
= section
->relocation
;
1805 for (count
= 0; count
< section
->reloc_count
; count
++)
1806 *relptr
++ = tblptr
++;
1809 *relptr
= (arelent
*) NULL
;
1811 return section
->reloc_count
;
1814 /* Provided a BFD, a section and an offset into the section, calculate
1815 and return the name of the source file and the line nearest to the
1819 _bfd_ecoff_find_nearest_line (abfd
, section
, ignore_symbols
, offset
,
1820 filename_ptr
, functionname_ptr
, retline_ptr
)
1823 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
;
1825 CONST
char **filename_ptr
;
1826 CONST
char **functionname_ptr
;
1827 unsigned int *retline_ptr
;
1829 const struct ecoff_debug_swap
* const debug_swap
1830 = &ecoff_backend (abfd
)->debug_swap
;
1831 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1832 struct ecoff_find_line
*line_info
;
1834 /* Make sure we have the FDR's. */
1835 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
, debug_info
)
1836 || bfd_get_symcount (abfd
) == 0)
1839 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1841 ecoff_data (abfd
)->find_line_info
=
1842 ((struct ecoff_find_line
*)
1843 bfd_zalloc (abfd
, sizeof (struct ecoff_find_line
)));
1844 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1847 line_info
= ecoff_data (abfd
)->find_line_info
;
1849 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1850 debug_swap
, line_info
, filename_ptr
,
1851 functionname_ptr
, retline_ptr
);
1854 /* Copy private BFD data. This is called by objcopy and strip. We
1855 use it to copy the ECOFF debugging information from one BFD to the
1856 other. It would be theoretically possible to represent the ECOFF
1857 debugging information in the symbol table. However, it would be a
1858 lot of work, and there would be little gain (gas, gdb, and ld
1859 already access the ECOFF debugging information via the
1860 ecoff_debug_info structure, and that structure would have to be
1861 retained in order to support ECOFF debugging in MIPS ELF).
1863 The debugging information for the ECOFF external symbols comes from
1864 the symbol table, so this function only handles the other debugging
1868 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd
, obfd
)
1872 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1873 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1875 asymbol
**sym_ptr_ptr
;
1879 /* We only want to copy information over if both BFD's use ECOFF
1881 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1882 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1885 /* Copy the GP value and the register masks. */
1886 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1887 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1888 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1889 for (i
= 0; i
< 3; i
++)
1890 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1892 /* Copy the version stamp. */
1893 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1895 /* If there are no symbols, don't copy any debugging information. */
1896 c
= bfd_get_symcount (obfd
);
1897 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1898 if (c
== 0 || sym_ptr_ptr
== (asymbol
**) NULL
)
1901 /* See if there are any local symbols. */
1903 for (; c
> 0; c
--, sym_ptr_ptr
++)
1905 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1914 /* There are some local symbols. We just bring over all the
1915 debugging information. FIXME: This is not quite the right
1916 thing to do. If the user has asked us to discard all
1917 debugging information, then we are probably going to wind up
1918 keeping it because there will probably be some local symbol
1919 which objcopy did not discard. We should actually break
1920 apart the debugging information and only keep that which
1921 applies to the symbols we want to keep. */
1922 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1923 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1924 oinfo
->line
= iinfo
->line
;
1926 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1927 oinfo
->external_dnr
= iinfo
->external_dnr
;
1929 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1930 oinfo
->external_pdr
= iinfo
->external_pdr
;
1932 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1933 oinfo
->external_sym
= iinfo
->external_sym
;
1935 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1936 oinfo
->external_opt
= iinfo
->external_opt
;
1938 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1939 oinfo
->external_aux
= iinfo
->external_aux
;
1941 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1942 oinfo
->ss
= iinfo
->ss
;
1944 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1945 oinfo
->external_fdr
= iinfo
->external_fdr
;
1947 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1948 oinfo
->external_rfd
= iinfo
->external_rfd
;
1952 /* We are discarding all the local symbol information. Look
1953 through the external symbols and remove all references to FDR
1954 or aux information. */
1955 c
= bfd_get_symcount (obfd
);
1956 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1957 for (; c
> 0; c
--, sym_ptr_ptr
++)
1961 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1962 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1964 esym
.asym
.index
= indexNil
;
1965 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1966 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1973 /* Set the architecture. The supported architecture is stored in the
1974 backend pointer. We always set the architecture anyhow, since many
1975 callers ignore the return value. */
1978 _bfd_ecoff_set_arch_mach (abfd
, arch
, machine
)
1980 enum bfd_architecture arch
;
1981 unsigned long machine
;
1983 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1984 return arch
== ecoff_backend (abfd
)->arch
;
1987 /* Get the size of the section headers. */
1990 _bfd_ecoff_sizeof_headers (abfd
, reloc
)
1992 boolean reloc ATTRIBUTE_UNUSED
;
1999 for (current
= abfd
->sections
;
2000 current
!= (asection
*)NULL
;
2001 current
= current
->next
)
2004 ret
= (bfd_coff_filhsz (abfd
)
2005 + bfd_coff_aoutsz (abfd
)
2006 + c
* bfd_coff_scnhsz (abfd
));
2007 return BFD_ALIGN (ret
, 16);
2010 /* Get the contents of a section. */
2013 _bfd_ecoff_get_section_contents (abfd
, section
, location
, offset
, count
)
2018 bfd_size_type count
;
2020 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2024 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2025 called via qsort. */
2028 ecoff_sort_hdrs (arg1
, arg2
)
2032 const asection
*hdr1
= *(const asection
**) arg1
;
2033 const asection
*hdr2
= *(const asection
**) arg2
;
2035 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
2037 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
2042 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
2045 if (hdr1
->vma
< hdr2
->vma
)
2047 else if (hdr1
->vma
> hdr2
->vma
)
2053 /* Calculate the file position for each section, and set
2057 ecoff_compute_section_file_positions (abfd
)
2060 file_ptr sofar
, file_sofar
;
2061 asection
**sorted_hdrs
;
2065 boolean rdata_in_text
;
2066 boolean first_data
, first_nonalloc
;
2067 const bfd_vma round
= ecoff_backend (abfd
)->round
;
2069 sofar
= _bfd_ecoff_sizeof_headers (abfd
, false);
2072 /* Sort the sections by VMA. */
2073 sorted_hdrs
= (asection
**) bfd_malloc (abfd
->section_count
2074 * sizeof (asection
*));
2075 if (sorted_hdrs
== NULL
)
2077 for (current
= abfd
->sections
, i
= 0;
2079 current
= current
->next
, i
++)
2080 sorted_hdrs
[i
] = current
;
2081 BFD_ASSERT (i
== abfd
->section_count
);
2083 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2086 /* Some versions of the OSF linker put the .rdata section in the
2087 text segment, and some do not. */
2088 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2091 for (i
= 0; i
< abfd
->section_count
; i
++)
2093 current
= sorted_hdrs
[i
];
2094 if (strcmp (current
->name
, _RDATA
) == 0)
2096 if ((current
->flags
& SEC_CODE
) == 0
2097 && strcmp (current
->name
, _PDATA
) != 0
2098 && strcmp (current
->name
, _RCONST
) != 0)
2100 rdata_in_text
= false;
2105 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2108 first_nonalloc
= true;
2109 for (i
= 0; i
< abfd
->section_count
; i
++)
2111 unsigned int alignment_power
;
2113 current
= sorted_hdrs
[i
];
2115 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2116 supposed to indicate the number of .pdata entries that are
2117 really in the section. Each entry is 8 bytes. We store this
2118 away in line_filepos before increasing the section size. */
2119 if (strcmp (current
->name
, _PDATA
) == 0)
2120 current
->line_filepos
= current
->_raw_size
/ 8;
2122 alignment_power
= current
->alignment_power
;
2124 /* On Ultrix, the data sections in an executable file must be
2125 aligned to a page boundary within the file. This does not
2126 affect the section size, though. FIXME: Does this work for
2127 other platforms? It requires some modification for the
2128 Alpha, because .rdata on the Alpha goes with the text, not
2130 if ((abfd
->flags
& EXEC_P
) != 0
2131 && (abfd
->flags
& D_PAGED
) != 0
2133 && (current
->flags
& SEC_CODE
) == 0
2135 || strcmp (current
->name
, _RDATA
) != 0)
2136 && strcmp (current
->name
, _PDATA
) != 0
2137 && strcmp (current
->name
, _RCONST
) != 0)
2139 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2140 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2143 else if (strcmp (current
->name
, _LIB
) == 0)
2145 /* On Irix 4, the location of contents of the .lib section
2146 from a shared library section is also rounded up to a
2149 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2150 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2152 else if (first_nonalloc
2153 && (current
->flags
& SEC_ALLOC
) == 0
2154 && (abfd
->flags
& D_PAGED
) != 0)
2156 /* Skip up to the next page for an unallocated section, such
2157 as the .comment section on the Alpha. This leaves room
2158 for the .bss section. */
2159 first_nonalloc
= false;
2160 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2161 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2164 /* Align the sections in the file to the same boundary on
2165 which they are aligned in virtual memory. */
2166 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2167 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2168 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2170 if ((abfd
->flags
& D_PAGED
) != 0
2171 && (current
->flags
& SEC_ALLOC
) != 0)
2173 sofar
+= (current
->vma
- sofar
) % round
;
2174 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2175 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2178 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2179 current
->filepos
= file_sofar
;
2181 sofar
+= current
->_raw_size
;
2182 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2183 file_sofar
+= current
->_raw_size
;
2185 /* make sure that this section is of the right size too */
2187 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2188 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2189 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2190 current
->_raw_size
+= sofar
- old_sofar
;
2196 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2201 /* Determine the location of the relocs for all the sections in the
2202 output file, as well as the location of the symbolic debugging
2205 static bfd_size_type
2206 ecoff_compute_reloc_file_positions (abfd
)
2209 const bfd_size_type external_reloc_size
=
2210 ecoff_backend (abfd
)->external_reloc_size
;
2211 file_ptr reloc_base
;
2212 bfd_size_type reloc_size
;
2216 if (! abfd
->output_has_begun
)
2218 if (! ecoff_compute_section_file_positions (abfd
))
2220 abfd
->output_has_begun
= true;
2223 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2226 for (current
= abfd
->sections
;
2227 current
!= (asection
*)NULL
;
2228 current
= current
->next
)
2230 if (current
->reloc_count
== 0)
2231 current
->rel_filepos
= 0;
2234 bfd_size_type relsize
;
2236 current
->rel_filepos
= reloc_base
;
2237 relsize
= current
->reloc_count
* external_reloc_size
;
2238 reloc_size
+= relsize
;
2239 reloc_base
+= relsize
;
2243 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2245 /* At least on Ultrix, the symbol table of an executable file must
2246 be aligned to a page boundary. FIXME: Is this true on other
2248 if ((abfd
->flags
& EXEC_P
) != 0
2249 && (abfd
->flags
& D_PAGED
) != 0)
2250 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2251 &~ (ecoff_backend (abfd
)->round
- 1));
2253 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2258 /* Set the contents of a section. */
2261 _bfd_ecoff_set_section_contents (abfd
, section
, location
, offset
, count
)
2266 bfd_size_type count
;
2268 /* This must be done first, because bfd_set_section_contents is
2269 going to set output_has_begun to true. */
2270 if (abfd
->output_has_begun
== false)
2272 if (! ecoff_compute_section_file_positions (abfd
))
2276 /* Handle the .lib section specially so that Irix 4 shared libraries
2277 work out. See coff_set_section_contents in coffcode.h. */
2278 if (strcmp (section
->name
, _LIB
) == 0)
2280 bfd_byte
*rec
, *recend
;
2282 rec
= (bfd_byte
*) location
;
2283 recend
= rec
+ count
;
2284 while (rec
< recend
)
2287 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2290 BFD_ASSERT (rec
== recend
);
2296 if (bfd_seek (abfd
, (file_ptr
) (section
->filepos
+ offset
), SEEK_SET
) != 0
2297 || bfd_write (location
, 1, count
, abfd
) != count
)
2303 /* Get the GP value for an ECOFF file. This is a hook used by
2307 bfd_ecoff_get_gp_value (abfd
)
2310 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2311 || bfd_get_format (abfd
) != bfd_object
)
2313 bfd_set_error (bfd_error_invalid_operation
);
2317 return ecoff_data (abfd
)->gp
;
2320 /* Set the GP value for an ECOFF file. This is a hook used by the
2324 bfd_ecoff_set_gp_value (abfd
, gp_value
)
2328 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2329 || bfd_get_format (abfd
) != bfd_object
)
2331 bfd_set_error (bfd_error_invalid_operation
);
2335 ecoff_data (abfd
)->gp
= gp_value
;
2340 /* Set the register masks for an ECOFF file. This is a hook used by
2344 bfd_ecoff_set_regmasks (abfd
, gprmask
, fprmask
, cprmask
)
2346 unsigned long gprmask
;
2347 unsigned long fprmask
;
2348 unsigned long *cprmask
;
2350 ecoff_data_type
*tdata
;
2352 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2353 || bfd_get_format (abfd
) != bfd_object
)
2355 bfd_set_error (bfd_error_invalid_operation
);
2359 tdata
= ecoff_data (abfd
);
2360 tdata
->gprmask
= gprmask
;
2361 tdata
->fprmask
= fprmask
;
2362 if (cprmask
!= (unsigned long *) NULL
)
2366 for (i
= 0; i
< 3; i
++)
2367 tdata
->cprmask
[i
] = cprmask
[i
];
2373 /* Get ECOFF EXTR information for an external symbol. This function
2374 is passed to bfd_ecoff_debug_externals. */
2377 ecoff_get_extr (sym
, esym
)
2381 ecoff_symbol_type
*ecoff_sym_ptr
;
2384 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2385 || ecoffsymbol (sym
)->native
== NULL
)
2387 /* Don't include debugging, local, or section symbols. */
2388 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2389 || (sym
->flags
& BSF_LOCAL
) != 0
2390 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2394 esym
->cobol_main
= 0;
2395 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2398 /* FIXME: we can do better than this for st and sc. */
2399 esym
->asym
.st
= stGlobal
;
2400 esym
->asym
.sc
= scAbs
;
2401 esym
->asym
.reserved
= 0;
2402 esym
->asym
.index
= indexNil
;
2406 ecoff_sym_ptr
= ecoffsymbol (sym
);
2408 if (ecoff_sym_ptr
->local
)
2411 input_bfd
= bfd_asymbol_bfd (sym
);
2412 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2413 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2415 /* If the symbol was defined by the linker, then esym will be
2416 undefined but sym will not be. Get a better class for such a
2418 if ((esym
->asym
.sc
== scUndefined
2419 || esym
->asym
.sc
== scSUndefined
)
2420 && ! bfd_is_und_section (bfd_get_section (sym
)))
2421 esym
->asym
.sc
= scAbs
;
2423 /* Adjust the FDR index for the symbol by that used for the input
2425 if (esym
->ifd
!= -1)
2427 struct ecoff_debug_info
*input_debug
;
2429 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2430 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2431 if (input_debug
->ifdmap
!= (RFDT
*) NULL
)
2432 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2438 /* Set the external symbol index. This routine is passed to
2439 bfd_ecoff_debug_externals. */
2442 ecoff_set_index (sym
, indx
)
2446 ecoff_set_sym_index (sym
, indx
);
2449 /* Write out an ECOFF file. */
2452 _bfd_ecoff_write_object_contents (abfd
)
2455 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2456 const bfd_vma round
= backend
->round
;
2457 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2458 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2459 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2460 const bfd_size_type external_hdr_size
2461 = backend
->debug_swap
.external_hdr_size
;
2462 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2463 void (* const adjust_reloc_out
) PARAMS ((bfd
*,
2465 struct internal_reloc
*))
2466 = backend
->adjust_reloc_out
;
2467 void (* const swap_reloc_out
) PARAMS ((bfd
*,
2468 const struct internal_reloc
*,
2470 = backend
->swap_reloc_out
;
2471 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2472 HDRR
* const symhdr
= &debug
->symbolic_header
;
2475 bfd_size_type reloc_size
;
2476 bfd_size_type text_size
;
2478 boolean set_text_start
;
2479 bfd_size_type data_size
;
2481 boolean set_data_start
;
2482 bfd_size_type bss_size
;
2484 PTR reloc_buff
= NULL
;
2485 struct internal_filehdr internal_f
;
2486 struct internal_aouthdr internal_a
;
2489 /* Determine where the sections and relocs will go in the output
2491 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2494 for (current
= abfd
->sections
;
2495 current
!= (asection
*)NULL
;
2496 current
= current
->next
)
2498 current
->target_index
= count
;
2502 if ((abfd
->flags
& D_PAGED
) != 0)
2503 text_size
= _bfd_ecoff_sizeof_headers (abfd
, false);
2507 set_text_start
= false;
2510 set_data_start
= false;
2513 /* Write section headers to the file. */
2515 /* Allocate buff big enough to hold a section header,
2516 file header, or a.out header. */
2524 buff
= (PTR
) bfd_malloc ((size_t) siz
);
2529 internal_f
.f_nscns
= 0;
2530 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2532 for (current
= abfd
->sections
;
2533 current
!= (asection
*) NULL
;
2534 current
= current
->next
)
2536 struct internal_scnhdr section
;
2539 ++internal_f
.f_nscns
;
2541 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2543 /* This seems to be correct for Irix 4 shared libraries. */
2544 vma
= bfd_get_section_vma (abfd
, current
);
2545 if (strcmp (current
->name
, _LIB
) == 0)
2546 section
.s_vaddr
= 0;
2548 section
.s_vaddr
= vma
;
2550 section
.s_paddr
= current
->lma
;
2551 section
.s_size
= bfd_get_section_size_before_reloc (current
);
2553 /* If this section is unloadable then the scnptr will be 0. */
2554 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2555 section
.s_scnptr
= 0;
2557 section
.s_scnptr
= current
->filepos
;
2558 section
.s_relptr
= current
->rel_filepos
;
2560 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2561 object file produced by the assembler is supposed to point to
2562 information about how much room is required by objects of
2563 various different sizes. I think this only matters if we
2564 want the linker to compute the best size to use, or
2565 something. I don't know what happens if the information is
2567 if (strcmp (current
->name
, _PDATA
) != 0)
2568 section
.s_lnnoptr
= 0;
2571 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2572 hold the number of entries in the section (each entry is
2573 8 bytes). We stored this in the line_filepos field in
2574 ecoff_compute_section_file_positions. */
2575 section
.s_lnnoptr
= current
->line_filepos
;
2578 section
.s_nreloc
= current
->reloc_count
;
2579 section
.s_nlnno
= 0;
2580 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2583 if (bfd_coff_swap_scnhdr_out (abfd
, (PTR
) §ion
, buff
) == 0
2584 || bfd_write (buff
, 1, scnhsz
, abfd
) != scnhsz
)
2587 if ((section
.s_flags
& STYP_TEXT
) != 0
2588 || ((section
.s_flags
& STYP_RDATA
) != 0
2589 && ecoff_data (abfd
)->rdata_in_text
)
2590 || section
.s_flags
== STYP_PDATA
2591 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2592 || (section
.s_flags
& STYP_LIBLIST
) != 0
2593 || (section
.s_flags
& STYP_RELDYN
) != 0
2594 || section
.s_flags
== STYP_CONFLIC
2595 || (section
.s_flags
& STYP_DYNSTR
) != 0
2596 || (section
.s_flags
& STYP_DYNSYM
) != 0
2597 || (section
.s_flags
& STYP_HASH
) != 0
2598 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2599 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2600 || section
.s_flags
== STYP_RCONST
)
2602 text_size
+= bfd_get_section_size_before_reloc (current
);
2603 if (! set_text_start
|| text_start
> vma
)
2606 set_text_start
= true;
2609 else if ((section
.s_flags
& STYP_RDATA
) != 0
2610 || (section
.s_flags
& STYP_DATA
) != 0
2611 || (section
.s_flags
& STYP_LITA
) != 0
2612 || (section
.s_flags
& STYP_LIT8
) != 0
2613 || (section
.s_flags
& STYP_LIT4
) != 0
2614 || (section
.s_flags
& STYP_SDATA
) != 0
2615 || section
.s_flags
== STYP_XDATA
2616 || (section
.s_flags
& STYP_GOT
) != 0)
2618 data_size
+= bfd_get_section_size_before_reloc (current
);
2619 if (! set_data_start
|| data_start
> vma
)
2622 set_data_start
= true;
2625 else if ((section
.s_flags
& STYP_BSS
) != 0
2626 || (section
.s_flags
& STYP_SBSS
) != 0)
2627 bss_size
+= bfd_get_section_size_before_reloc (current
);
2628 else if (section
.s_flags
== 0
2629 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2630 || section
.s_flags
== STYP_COMMENT
)
2636 /* Set up the file header. */
2638 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2640 /* We will NOT put a fucking timestamp in the header here. Every
2641 time you put it back, I will come in and take it out again. I'm
2642 sorry. This field does not belong here. We fill it with a 0 so
2643 it compares the same but is not a reasonable time. --
2645 internal_f
.f_timdat
= 0;
2647 if (bfd_get_symcount (abfd
) != 0)
2649 /* The ECOFF f_nsyms field is not actually the number of
2650 symbols, it's the size of symbolic information header. */
2651 internal_f
.f_nsyms
= external_hdr_size
;
2652 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2656 internal_f
.f_nsyms
= 0;
2657 internal_f
.f_symptr
= 0;
2660 internal_f
.f_opthdr
= aoutsz
;
2662 internal_f
.f_flags
= F_LNNO
;
2663 if (reloc_size
== 0)
2664 internal_f
.f_flags
|= F_RELFLG
;
2665 if (bfd_get_symcount (abfd
) == 0)
2666 internal_f
.f_flags
|= F_LSYMS
;
2667 if (abfd
->flags
& EXEC_P
)
2668 internal_f
.f_flags
|= F_EXEC
;
2670 if (bfd_little_endian (abfd
))
2671 internal_f
.f_flags
|= F_AR32WR
;
2673 internal_f
.f_flags
|= F_AR32W
;
2675 /* Set up the ``optional'' header. */
2676 if ((abfd
->flags
& D_PAGED
) != 0)
2677 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2679 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2681 /* FIXME: Is this really correct? */
2682 internal_a
.vstamp
= symhdr
->vstamp
;
2684 /* At least on Ultrix, these have to be rounded to page boundaries.
2685 FIXME: Is this true on other platforms? */
2686 if ((abfd
->flags
& D_PAGED
) != 0)
2688 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2689 internal_a
.text_start
= text_start
&~ (round
- 1);
2690 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2691 internal_a
.data_start
= data_start
&~ (round
- 1);
2695 internal_a
.tsize
= text_size
;
2696 internal_a
.text_start
= text_start
;
2697 internal_a
.dsize
= data_size
;
2698 internal_a
.data_start
= data_start
;
2701 /* On Ultrix, the initial portions of the .sbss and .bss segments
2702 are at the end of the data section. The bsize field in the
2703 optional header records how many bss bytes are required beyond
2704 those in the data section. The value is not rounded to a page
2706 if (bss_size
< internal_a
.dsize
- data_size
)
2709 bss_size
-= internal_a
.dsize
- data_size
;
2710 internal_a
.bsize
= bss_size
;
2711 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2713 internal_a
.entry
= bfd_get_start_address (abfd
);
2715 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2717 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2718 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2719 for (i
= 0; i
< 4; i
++)
2720 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2722 /* Let the backend adjust the headers if necessary. */
2723 if (backend
->adjust_headers
)
2725 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2729 /* Write out the file header and the optional header. */
2731 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2734 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, buff
);
2735 if (bfd_write (buff
, 1, filhsz
, abfd
) != filhsz
)
2738 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) &internal_a
, buff
);
2739 if (bfd_write (buff
, 1, aoutsz
, abfd
) != aoutsz
)
2742 /* Build the external symbol information. This must be done before
2743 writing out the relocs so that we know the symbol indices. We
2744 don't do this if this BFD was created by the backend linker,
2745 since it will have already handled the symbols and relocs. */
2746 if (! ecoff_data (abfd
)->linker
)
2748 symhdr
->iextMax
= 0;
2749 symhdr
->issExtMax
= 0;
2750 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2751 debug
->ssext
= debug
->ssext_end
= NULL
;
2752 if (bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2753 (((abfd
->flags
& EXEC_P
) == 0)
2755 ecoff_get_extr
, ecoff_set_index
)
2759 /* Write out the relocs. */
2760 for (current
= abfd
->sections
;
2761 current
!= (asection
*) NULL
;
2762 current
= current
->next
)
2764 arelent
**reloc_ptr_ptr
;
2765 arelent
**reloc_end
;
2768 if (current
->reloc_count
== 0)
2772 bfd_alloc (abfd
, current
->reloc_count
* external_reloc_size
);
2773 if (reloc_buff
== NULL
)
2776 reloc_ptr_ptr
= current
->orelocation
;
2777 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2778 out_ptr
= (char *) reloc_buff
;
2780 reloc_ptr_ptr
< reloc_end
;
2781 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2785 struct internal_reloc in
;
2787 memset ((PTR
) &in
, 0, sizeof in
);
2789 reloc
= *reloc_ptr_ptr
;
2790 sym
= *reloc
->sym_ptr_ptr
;
2792 in
.r_vaddr
= (reloc
->address
2793 + bfd_get_section_vma (abfd
, current
));
2794 in
.r_type
= reloc
->howto
->type
;
2796 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2798 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2805 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2806 if (strcmp (name
, ".text") == 0)
2807 in
.r_symndx
= RELOC_SECTION_TEXT
;
2808 else if (strcmp (name
, ".rdata") == 0)
2809 in
.r_symndx
= RELOC_SECTION_RDATA
;
2810 else if (strcmp (name
, ".data") == 0)
2811 in
.r_symndx
= RELOC_SECTION_DATA
;
2812 else if (strcmp (name
, ".sdata") == 0)
2813 in
.r_symndx
= RELOC_SECTION_SDATA
;
2814 else if (strcmp (name
, ".sbss") == 0)
2815 in
.r_symndx
= RELOC_SECTION_SBSS
;
2816 else if (strcmp (name
, ".bss") == 0)
2817 in
.r_symndx
= RELOC_SECTION_BSS
;
2818 else if (strcmp (name
, ".init") == 0)
2819 in
.r_symndx
= RELOC_SECTION_INIT
;
2820 else if (strcmp (name
, ".lit8") == 0)
2821 in
.r_symndx
= RELOC_SECTION_LIT8
;
2822 else if (strcmp (name
, ".lit4") == 0)
2823 in
.r_symndx
= RELOC_SECTION_LIT4
;
2824 else if (strcmp (name
, ".xdata") == 0)
2825 in
.r_symndx
= RELOC_SECTION_XDATA
;
2826 else if (strcmp (name
, ".pdata") == 0)
2827 in
.r_symndx
= RELOC_SECTION_PDATA
;
2828 else if (strcmp (name
, ".fini") == 0)
2829 in
.r_symndx
= RELOC_SECTION_FINI
;
2830 else if (strcmp (name
, ".lita") == 0)
2831 in
.r_symndx
= RELOC_SECTION_LITA
;
2832 else if (strcmp (name
, "*ABS*") == 0)
2833 in
.r_symndx
= RELOC_SECTION_ABS
;
2834 else if (strcmp (name
, ".rconst") == 0)
2835 in
.r_symndx
= RELOC_SECTION_RCONST
;
2841 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2843 (*swap_reloc_out
) (abfd
, &in
, (PTR
) out_ptr
);
2846 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2848 if (bfd_write (reloc_buff
,
2849 external_reloc_size
, current
->reloc_count
, abfd
)
2850 != external_reloc_size
* current
->reloc_count
)
2852 bfd_release (abfd
, reloc_buff
);
2856 /* Write out the symbolic debugging information. */
2857 if (bfd_get_symcount (abfd
) > 0)
2859 /* Write out the debugging information. */
2860 if (bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2861 ecoff_data (abfd
)->sym_filepos
)
2867 /* The .bss section of a demand paged executable must receive an
2868 entire page. If there are symbols, the symbols will start on the
2869 next page. If there are no symbols, we must fill out the page by
2871 if (bfd_get_symcount (abfd
) == 0
2872 && (abfd
->flags
& EXEC_P
) != 0
2873 && (abfd
->flags
& D_PAGED
) != 0)
2877 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2880 if (bfd_read (&c
, 1, 1, abfd
) == 0)
2882 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2885 if (bfd_write (&c
, 1, 1, abfd
) != 1)
2889 if (reloc_buff
!= NULL
)
2890 bfd_release (abfd
, reloc_buff
);
2895 if (reloc_buff
!= NULL
)
2896 bfd_release (abfd
, reloc_buff
);
2902 /* Archive handling. ECOFF uses what appears to be a unique type of
2903 archive header (armap). The byte ordering of the armap and the
2904 contents are encoded in the name of the armap itself. At least for
2905 now, we only support archives with the same byte ordering in the
2906 armap and the contents.
2908 The first four bytes in the armap are the number of symbol
2909 definitions. This is always a power of two.
2911 This is followed by the symbol definitions. Each symbol definition
2912 occupies 8 bytes. The first four bytes are the offset from the
2913 start of the armap strings to the null-terminated string naming
2914 this symbol. The second four bytes are the file offset to the
2915 archive member which defines this symbol. If the second four bytes
2916 are 0, then this is not actually a symbol definition, and it should
2919 The symbols are hashed into the armap with a closed hashing scheme.
2920 See the functions below for the details of the algorithm.
2922 After the symbol definitions comes four bytes holding the size of
2923 the string table, followed by the string table itself. */
2925 /* The name of an archive headers looks like this:
2926 __________E[BL]E[BL]_ (with a trailing space).
2927 The trailing space is changed to an X if the archive is changed to
2928 indicate that the armap is out of date.
2930 The Alpha seems to use ________64E[BL]E[BL]_. */
2932 #define ARMAP_BIG_ENDIAN 'B'
2933 #define ARMAP_LITTLE_ENDIAN 'L'
2934 #define ARMAP_MARKER 'E'
2935 #define ARMAP_START_LENGTH 10
2936 #define ARMAP_HEADER_MARKER_INDEX 10
2937 #define ARMAP_HEADER_ENDIAN_INDEX 11
2938 #define ARMAP_OBJECT_MARKER_INDEX 12
2939 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2940 #define ARMAP_END_INDEX 14
2941 #define ARMAP_END "_ "
2943 /* This is a magic number used in the hashing algorithm. */
2944 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2946 /* This returns the hash value to use for a string. It also sets
2947 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2948 is the number of entries in the hash table, and HLOG is the log
2952 ecoff_armap_hash (s
, rehash
, size
, hlog
)
2954 unsigned int *rehash
;
2964 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2965 hash
*= ARMAP_HASH_MAGIC
;
2966 *rehash
= (hash
& (size
- 1)) | 1;
2967 return hash
>> (32 - hlog
);
2970 /* Read in the armap. */
2973 _bfd_ecoff_slurp_armap (abfd
)
2978 struct areltdata
*mapdata
;
2979 bfd_size_type parsed_size
;
2981 struct artdata
*ardata
;
2984 struct symdef
*symdef_ptr
;
2987 /* Get the name of the first element. */
2988 i
= bfd_read ((PTR
) nextname
, 1, 16, abfd
);
2994 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2997 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2998 standard COFF armap. We could move the ECOFF armap stuff into
2999 bfd_slurp_armap, but that seems inappropriate since no other
3000 target uses this format. Instead, we check directly for a COFF
3002 if (strncmp (nextname
, "/ ", 16) == 0)
3003 return bfd_slurp_armap (abfd
);
3005 /* See if the first element is an armap. */
3006 if (strncmp (nextname
, ecoff_backend (abfd
)->armap_start
,
3007 ARMAP_START_LENGTH
) != 0
3008 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
3009 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3010 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3011 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
3012 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3013 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3014 || strncmp (nextname
+ ARMAP_END_INDEX
,
3015 ARMAP_END
, sizeof ARMAP_END
- 1) != 0)
3017 bfd_has_map (abfd
) = false;
3021 /* Make sure we have the right byte ordering. */
3022 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3023 ^ (bfd_header_big_endian (abfd
)))
3024 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3025 ^ (bfd_big_endian (abfd
))))
3027 bfd_set_error (bfd_error_wrong_format
);
3031 /* Read in the armap. */
3032 ardata
= bfd_ardata (abfd
);
3033 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
3034 if (mapdata
== (struct areltdata
*) NULL
)
3036 parsed_size
= mapdata
->parsed_size
;
3037 bfd_release (abfd
, (PTR
) mapdata
);
3039 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
3040 if (raw_armap
== (char *) NULL
)
3043 if (bfd_read ((PTR
) raw_armap
, 1, parsed_size
, abfd
) != parsed_size
)
3045 if (bfd_get_error () != bfd_error_system_call
)
3046 bfd_set_error (bfd_error_malformed_archive
);
3047 bfd_release (abfd
, (PTR
) raw_armap
);
3051 ardata
->tdata
= (PTR
) raw_armap
;
3053 count
= bfd_h_get_32 (abfd
, (PTR
) raw_armap
);
3055 ardata
->symdef_count
= 0;
3056 ardata
->cache
= (struct ar_cache
*) NULL
;
3058 /* This code used to overlay the symdefs over the raw archive data,
3059 but that doesn't work on a 64 bit host. */
3061 stringbase
= raw_armap
+ count
* 8 + 8;
3063 #ifdef CHECK_ARMAP_HASH
3067 /* Double check that I have the hashing algorithm right by making
3068 sure that every symbol can be looked up successfully. */
3070 for (i
= 1; i
< count
; i
<<= 1)
3072 BFD_ASSERT (i
== count
);
3074 raw_ptr
= raw_armap
+ 4;
3075 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3077 unsigned int name_offset
, file_offset
;
3078 unsigned int hash
, rehash
, srch
;
3080 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3081 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3082 if (file_offset
== 0)
3084 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
3089 /* See if we can rehash to this location. */
3090 for (srch
= (hash
+ rehash
) & (count
- 1);
3091 srch
!= hash
&& srch
!= i
;
3092 srch
= (srch
+ rehash
) & (count
- 1))
3093 BFD_ASSERT (bfd_h_get_32 (abfd
, (PTR
) (raw_armap
+ 8 + srch
* 8))
3095 BFD_ASSERT (srch
== i
);
3099 #endif /* CHECK_ARMAP_HASH */
3101 raw_ptr
= raw_armap
+ 4;
3102 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3103 if (bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4)) != 0)
3104 ++ardata
->symdef_count
;
3106 symdef_ptr
= ((struct symdef
*)
3108 ardata
->symdef_count
* sizeof (struct symdef
)));
3112 ardata
->symdefs
= (carsym
*) symdef_ptr
;
3114 raw_ptr
= raw_armap
+ 4;
3115 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3117 unsigned int name_offset
, file_offset
;
3119 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3120 if (file_offset
== 0)
3122 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3123 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
3124 symdef_ptr
->file_offset
= file_offset
;
3128 ardata
->first_file_filepos
= bfd_tell (abfd
);
3129 /* Pad to an even boundary. */
3130 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3132 bfd_has_map (abfd
) = true;
3137 /* Write out an armap. */
3140 _bfd_ecoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
3142 unsigned int elength
;
3144 unsigned int orl_count
;
3147 unsigned int hashsize
, hashlog
;
3148 unsigned int symdefsize
;
3150 unsigned int stringsize
;
3151 unsigned int mapsize
;
3154 struct stat statbuf
;
3157 bfd_byte
*hashtable
;
3161 /* Ultrix appears to use as a hash table size the least power of two
3162 greater than twice the number of entries. */
3163 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3165 hashsize
= 1 << hashlog
;
3167 symdefsize
= hashsize
* 8;
3169 stringsize
= stridx
+ padit
;
3171 /* Include 8 bytes to store symdefsize and stringsize in output. */
3172 mapsize
= symdefsize
+ stringsize
+ 8;
3174 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3176 memset ((PTR
) &hdr
, 0, sizeof hdr
);
3178 /* Work out the ECOFF armap name. */
3179 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3180 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3181 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3182 (bfd_header_big_endian (abfd
)
3184 : ARMAP_LITTLE_ENDIAN
);
3185 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3186 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3187 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3188 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3190 /* Write the timestamp of the archive header to be just a little bit
3191 later than the timestamp of the file, otherwise the linker will
3192 complain that the index is out of date. Actually, the Ultrix
3193 linker just checks the archive name; the GNU linker may check the
3195 stat (abfd
->filename
, &statbuf
);
3196 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3198 /* The DECstation uses zeroes for the uid, gid and mode of the
3200 hdr
.ar_uid
[0] = '0';
3201 hdr
.ar_gid
[0] = '0';
3203 hdr
.ar_mode
[0] = '0';
3205 /* Building gcc ends up extracting the armap as a file - twice. */
3206 hdr
.ar_mode
[0] = '6';
3207 hdr
.ar_mode
[1] = '4';
3208 hdr
.ar_mode
[2] = '4';
3211 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3213 hdr
.ar_fmag
[0] = '`';
3214 hdr
.ar_fmag
[1] = '\012';
3216 /* Turn all null bytes in the header into spaces. */
3217 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3218 if (((char *) (&hdr
))[i
] == '\0')
3219 (((char *) (&hdr
))[i
]) = ' ';
3221 if (bfd_write ((PTR
) &hdr
, 1, sizeof (struct ar_hdr
), abfd
)
3222 != sizeof (struct ar_hdr
))
3225 bfd_h_put_32 (abfd
, (bfd_vma
) hashsize
, temp
);
3226 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3229 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3233 current
= abfd
->archive_head
;
3235 for (i
= 0; i
< orl_count
; i
++)
3237 unsigned int hash
, rehash
;
3239 /* Advance firstreal to the file position of this archive
3241 if (((bfd
*) map
[i
].pos
) != last_elt
)
3245 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3246 firstreal
+= firstreal
% 2;
3247 current
= current
->next
;
3249 while (current
!= (bfd
*) map
[i
].pos
);
3254 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3255 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (hash
* 8) + 4)) != 0)
3259 /* The desired slot is already taken. */
3260 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3262 srch
= (srch
+ rehash
) & (hashsize
- 1))
3263 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (srch
* 8) + 4)) == 0)
3266 BFD_ASSERT (srch
!= hash
);
3271 bfd_h_put_32 (abfd
, (bfd_vma
) map
[i
].namidx
,
3272 (PTR
) (hashtable
+ hash
* 8));
3273 bfd_h_put_32 (abfd
, (bfd_vma
) firstreal
,
3274 (PTR
) (hashtable
+ hash
* 8 + 4));
3277 if (bfd_write ((PTR
) hashtable
, 1, symdefsize
, abfd
) != symdefsize
)
3280 bfd_release (abfd
, hashtable
);
3282 /* Now write the strings. */
3283 bfd_h_put_32 (abfd
, (bfd_vma
) stringsize
, temp
);
3284 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3286 for (i
= 0; i
< orl_count
; i
++)
3290 len
= strlen (*map
[i
].name
) + 1;
3291 if (bfd_write ((PTR
) (*map
[i
].name
), 1, len
, abfd
) != len
)
3295 /* The spec sez this should be a newline. But in order to be
3296 bug-compatible for DECstation ar we use a null. */
3299 if (bfd_write ("", 1, 1, abfd
) != 1)
3306 /* See whether this BFD is an archive. If it is, read in the armap
3307 and the extended name table. */
3310 _bfd_ecoff_archive_p (abfd
)
3313 struct artdata
*tdata_hold
;
3314 char armag
[SARMAG
+ 1];
3316 tdata_hold
= abfd
->tdata
.aout_ar_data
;
3318 if (bfd_read ((PTR
) armag
, 1, SARMAG
, abfd
) != SARMAG
)
3320 if (bfd_get_error () != bfd_error_system_call
)
3321 bfd_set_error (bfd_error_wrong_format
);
3322 return (const bfd_target
*) NULL
;
3325 if (strncmp (armag
, ARMAG
, SARMAG
) != 0)
3327 bfd_set_error (bfd_error_wrong_format
);
3331 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3332 involves a cast, we can't do it as the left operand of
3334 abfd
->tdata
.aout_ar_data
=
3335 (struct artdata
*) bfd_zalloc (abfd
, sizeof (struct artdata
));
3337 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
3339 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3340 return (const bfd_target
*) NULL
;
3343 bfd_ardata (abfd
)->first_file_filepos
= SARMAG
;
3344 bfd_ardata (abfd
)->cache
= NULL
;
3345 bfd_ardata (abfd
)->archive_head
= NULL
;
3346 bfd_ardata (abfd
)->symdefs
= NULL
;
3347 bfd_ardata (abfd
)->extended_names
= NULL
;
3348 bfd_ardata (abfd
)->tdata
= NULL
;
3350 if (_bfd_ecoff_slurp_armap (abfd
) == false
3351 || _bfd_ecoff_slurp_extended_name_table (abfd
) == false)
3353 bfd_release (abfd
, bfd_ardata (abfd
));
3354 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3355 return (const bfd_target
*) NULL
;
3358 if (bfd_has_map (abfd
))
3362 /* This archive has a map, so we may presume that the contents
3363 are object files. Make sure that if the first file in the
3364 archive can be recognized as an object file, it is for this
3365 target. If not, assume that this is the wrong format. If
3366 the first file is not an object file, somebody is doing
3367 something weird, and we permit it so that ar -t will work. */
3369 first
= bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
);
3374 first
->target_defaulted
= false;
3376 if (bfd_check_format (first
, bfd_object
)
3377 && first
->xvec
!= abfd
->xvec
)
3379 (void) bfd_close (first
);
3380 bfd_release (abfd
, bfd_ardata (abfd
));
3381 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3382 bfd_set_error (bfd_error_wrong_format
);
3386 /* We ought to close first here, but we can't, because we
3387 have no way to remove it from the archive cache. FIXME. */
3394 /* ECOFF linker code. */
3396 static struct bfd_hash_entry
*ecoff_link_hash_newfunc
3397 PARAMS ((struct bfd_hash_entry
*entry
,
3398 struct bfd_hash_table
*table
,
3399 const char *string
));
3400 static boolean ecoff_link_add_archive_symbols
3401 PARAMS ((bfd
*, struct bfd_link_info
*));
3402 static boolean ecoff_link_check_archive_element
3403 PARAMS ((bfd
*, struct bfd_link_info
*, boolean
*pneeded
));
3404 static boolean ecoff_link_add_object_symbols
3405 PARAMS ((bfd
*, struct bfd_link_info
*));
3406 static boolean ecoff_link_add_externals
3407 PARAMS ((bfd
*, struct bfd_link_info
*, PTR
, char *));
3409 /* Routine to create an entry in an ECOFF link hash table. */
3411 static struct bfd_hash_entry
*
3412 ecoff_link_hash_newfunc (entry
, table
, string
)
3413 struct bfd_hash_entry
*entry
;
3414 struct bfd_hash_table
*table
;
3417 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3419 /* Allocate the structure if it has not already been allocated by a
3421 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3422 ret
= ((struct ecoff_link_hash_entry
*)
3423 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3424 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3427 /* Call the allocation method of the superclass. */
3428 ret
= ((struct ecoff_link_hash_entry
*)
3429 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3434 /* Set local fields. */
3440 memset ((PTR
) &ret
->esym
, 0, sizeof ret
->esym
);
3442 return (struct bfd_hash_entry
*) ret
;
3445 /* Create an ECOFF link hash table. */
3447 struct bfd_link_hash_table
*
3448 _bfd_ecoff_bfd_link_hash_table_create (abfd
)
3451 struct ecoff_link_hash_table
*ret
;
3453 ret
= ((struct ecoff_link_hash_table
*)
3454 bfd_alloc (abfd
, sizeof (struct ecoff_link_hash_table
)));
3457 if (! _bfd_link_hash_table_init (&ret
->root
, abfd
,
3458 ecoff_link_hash_newfunc
))
3461 return (struct bfd_link_hash_table
*) NULL
;
3466 /* Look up an entry in an ECOFF link hash table. */
3468 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3469 ((struct ecoff_link_hash_entry *) \
3470 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3472 /* Traverse an ECOFF link hash table. */
3474 #define ecoff_link_hash_traverse(table, func, info) \
3475 (bfd_link_hash_traverse \
3477 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3480 /* Get the ECOFF link hash table from the info structure. This is
3483 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3485 /* Given an ECOFF BFD, add symbols to the global hash table as
3489 _bfd_ecoff_bfd_link_add_symbols (abfd
, info
)
3491 struct bfd_link_info
*info
;
3493 switch (bfd_get_format (abfd
))
3496 return ecoff_link_add_object_symbols (abfd
, info
);
3498 return ecoff_link_add_archive_symbols (abfd
, info
);
3500 bfd_set_error (bfd_error_wrong_format
);
3505 /* Add the symbols from an archive file to the global hash table.
3506 This looks through the undefined symbols, looks each one up in the
3507 archive hash table, and adds any associated object file. We do not
3508 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3509 already have a hash table, so there is no reason to construct
3513 ecoff_link_add_archive_symbols (abfd
, info
)
3515 struct bfd_link_info
*info
;
3517 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3518 const bfd_byte
*raw_armap
;
3519 struct bfd_link_hash_entry
**pundef
;
3520 unsigned int armap_count
;
3521 unsigned int armap_log
;
3523 const bfd_byte
*hashtable
;
3524 const char *stringbase
;
3526 if (! bfd_has_map (abfd
))
3528 /* An empty archive is a special case. */
3529 if (bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
) == NULL
)
3531 bfd_set_error (bfd_error_no_armap
);
3535 /* If we don't have any raw data for this archive, as can happen on
3536 Irix 4.0.5F, we call the generic routine.
3537 FIXME: We should be more clever about this, since someday tdata
3538 may get to something for a generic archive. */
3539 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3540 if (raw_armap
== (bfd_byte
*) NULL
)
3541 return (_bfd_generic_link_add_archive_symbols
3542 (abfd
, info
, ecoff_link_check_archive_element
));
3544 armap_count
= bfd_h_get_32 (abfd
, raw_armap
);
3547 for (i
= 1; i
< armap_count
; i
<<= 1)
3549 BFD_ASSERT (i
== armap_count
);
3551 hashtable
= raw_armap
+ 4;
3552 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3554 /* Look through the list of undefined symbols. */
3555 pundef
= &info
->hash
->undefs
;
3556 while (*pundef
!= (struct bfd_link_hash_entry
*) NULL
)
3558 struct bfd_link_hash_entry
*h
;
3559 unsigned int hash
, rehash
;
3560 unsigned int file_offset
;
3566 /* When a symbol is defined, it is not necessarily removed from
3568 if (h
->type
!= bfd_link_hash_undefined
3569 && h
->type
!= bfd_link_hash_common
)
3571 /* Remove this entry from the list, for general cleanliness
3572 and because we are going to look through the list again
3573 if we search any more libraries. We can't remove the
3574 entry if it is the tail, because that would lose any
3575 entries we add to the list later on. */
3576 if (*pundef
!= info
->hash
->undefs_tail
)
3577 *pundef
= (*pundef
)->next
;
3579 pundef
= &(*pundef
)->next
;
3583 /* Native ECOFF linkers do not pull in archive elements merely
3584 to satisfy common definitions, so neither do we. We leave
3585 them on the list, though, in case we are linking against some
3586 other object format. */
3587 if (h
->type
!= bfd_link_hash_undefined
)
3589 pundef
= &(*pundef
)->next
;
3593 /* Look for this symbol in the archive hash table. */
3594 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3597 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3598 if (file_offset
== 0)
3600 /* Nothing in this slot. */
3601 pundef
= &(*pundef
)->next
;
3605 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8));
3606 if (name
[0] != h
->root
.string
[0]
3607 || strcmp (name
, h
->root
.string
) != 0)
3612 /* That was the wrong symbol. Try rehashing. */
3614 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3616 srch
= (srch
+ rehash
) & (armap_count
- 1))
3618 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3619 if (file_offset
== 0)
3621 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8));
3622 if (name
[0] == h
->root
.string
[0]
3623 && strcmp (name
, h
->root
.string
) == 0)
3632 pundef
= &(*pundef
)->next
;
3639 element
= (*backend
->get_elt_at_filepos
) (abfd
, file_offset
);
3640 if (element
== (bfd
*) NULL
)
3643 if (! bfd_check_format (element
, bfd_object
))
3646 /* Unlike the generic linker, we know that this element provides
3647 a definition for an undefined symbol and we know that we want
3648 to include it. We don't need to check anything. */
3649 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3651 if (! ecoff_link_add_object_symbols (element
, info
))
3654 pundef
= &(*pundef
)->next
;
3660 /* This is called if we used _bfd_generic_link_add_archive_symbols
3661 because we were not dealing with an ECOFF archive. */
3664 ecoff_link_check_archive_element (abfd
, info
, pneeded
)
3666 struct bfd_link_info
*info
;
3669 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3670 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3671 = backend
->debug_swap
.swap_ext_in
;
3673 bfd_size_type external_ext_size
;
3674 PTR external_ext
= NULL
;
3682 if (! ecoff_slurp_symbolic_header (abfd
))
3685 /* If there are no symbols, we don't want it. */
3686 if (bfd_get_symcount (abfd
) == 0)
3687 goto successful_return
;
3689 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3691 /* Read in the external symbols and external strings. */
3692 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3693 esize
= symhdr
->iextMax
* external_ext_size
;
3694 external_ext
= (PTR
) bfd_malloc (esize
);
3695 if (external_ext
== NULL
&& esize
!= 0)
3698 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3699 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3702 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3703 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3706 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3707 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
) !=
3708 (bfd_size_type
) symhdr
->issExtMax
))
3711 /* Look through the external symbols to see if they define some
3712 symbol that is currently undefined. */
3713 ext_ptr
= (char *) external_ext
;
3714 ext_end
= ext_ptr
+ esize
;
3715 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3720 struct bfd_link_hash_entry
*h
;
3722 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3724 /* See if this symbol defines something. */
3725 if (esym
.asym
.st
!= stGlobal
3726 && esym
.asym
.st
!= stLabel
3727 && esym
.asym
.st
!= stProc
)
3730 switch (esym
.asym
.sc
)
3754 name
= ssext
+ esym
.asym
.iss
;
3755 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
3757 /* Unlike the generic linker, we do not pull in elements because
3758 of common symbols. */
3759 if (h
== (struct bfd_link_hash_entry
*) NULL
3760 || h
->type
!= bfd_link_hash_undefined
)
3763 /* Include this element. */
3764 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3766 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3770 goto successful_return
;
3774 if (external_ext
!= NULL
)
3775 free (external_ext
);
3780 if (external_ext
!= NULL
)
3781 free (external_ext
);
3787 /* Add symbols from an ECOFF object file to the global linker hash
3791 ecoff_link_add_object_symbols (abfd
, info
)
3793 struct bfd_link_info
*info
;
3796 bfd_size_type external_ext_size
;
3797 PTR external_ext
= NULL
;
3802 if (! ecoff_slurp_symbolic_header (abfd
))
3805 /* If there are no symbols, we don't want it. */
3806 if (bfd_get_symcount (abfd
) == 0)
3809 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3811 /* Read in the external symbols and external strings. */
3812 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3813 esize
= symhdr
->iextMax
* external_ext_size
;
3814 external_ext
= (PTR
) bfd_malloc (esize
);
3815 if (external_ext
== NULL
&& esize
!= 0)
3818 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3819 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3822 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3823 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3826 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3827 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
)
3828 != (bfd_size_type
) symhdr
->issExtMax
))
3831 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3835 if (external_ext
!= NULL
)
3836 free (external_ext
);
3842 if (external_ext
!= NULL
)
3843 free (external_ext
);
3847 /* Add the external symbols of an object file to the global linker
3848 hash table. The external symbols and strings we are passed are
3849 just allocated on the stack, and will be discarded. We must
3850 explicitly save any information we may need later on in the link.
3851 We do not want to read the external symbol information again. */
3854 ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
)
3856 struct bfd_link_info
*info
;
3860 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3861 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3862 = backend
->debug_swap
.swap_ext_in
;
3863 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3864 unsigned long ext_count
;
3865 struct ecoff_link_hash_entry
**sym_hash
;
3869 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3871 sym_hash
= ((struct ecoff_link_hash_entry
**)
3873 ext_count
* sizeof (struct bfd_link_hash_entry
*)));
3876 ecoff_data (abfd
)->sym_hashes
= sym_hash
;
3878 ext_ptr
= (char *) external_ext
;
3879 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3880 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3887 struct ecoff_link_hash_entry
*h
;
3891 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3893 /* Skip debugging symbols. */
3895 switch (esym
.asym
.st
)
3911 /* Get the information for this symbol. */
3912 value
= esym
.asym
.value
;
3913 switch (esym
.asym
.sc
)
3933 section
= bfd_make_section_old_way (abfd
, ".text");
3934 value
-= section
->vma
;
3937 section
= bfd_make_section_old_way (abfd
, ".data");
3938 value
-= section
->vma
;
3941 section
= bfd_make_section_old_way (abfd
, ".bss");
3942 value
-= section
->vma
;
3945 section
= bfd_abs_section_ptr
;
3948 section
= bfd_und_section_ptr
;
3951 section
= bfd_make_section_old_way (abfd
, ".sdata");
3952 value
-= section
->vma
;
3955 section
= bfd_make_section_old_way (abfd
, ".sbss");
3956 value
-= section
->vma
;
3959 section
= bfd_make_section_old_way (abfd
, ".rdata");
3960 value
-= section
->vma
;
3963 if (value
> ecoff_data (abfd
)->gp_size
)
3965 section
= bfd_com_section_ptr
;
3970 if (ecoff_scom_section
.name
== NULL
)
3972 /* Initialize the small common section. */
3973 ecoff_scom_section
.name
= SCOMMON
;
3974 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3975 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3976 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3977 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3978 ecoff_scom_symbol
.name
= SCOMMON
;
3979 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3980 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3981 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3983 section
= &ecoff_scom_section
;
3986 section
= bfd_und_section_ptr
;
3989 section
= bfd_make_section_old_way (abfd
, ".init");
3990 value
-= section
->vma
;
3993 section
= bfd_make_section_old_way (abfd
, ".fini");
3994 value
-= section
->vma
;
3997 section
= bfd_make_section_old_way (abfd
, ".rconst");
3998 value
-= section
->vma
;
4002 if (section
== (asection
*) NULL
)
4005 name
= ssext
+ esym
.asym
.iss
;
4008 if (! (_bfd_generic_link_add_one_symbol
4010 esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
,
4011 section
, value
, (const char *) NULL
, true, true,
4012 (struct bfd_link_hash_entry
**) &h
)))
4017 /* If we are building an ECOFF hash table, save the external
4018 symbol information. */
4019 if (info
->hash
->creator
->flavour
== bfd_get_flavour (abfd
))
4021 if (h
->abfd
== (bfd
*) NULL
4022 || (! bfd_is_und_section (section
)
4023 && (! bfd_is_com_section (section
)
4024 || (h
->root
.type
!= bfd_link_hash_defined
4025 && h
->root
.type
!= bfd_link_hash_defweak
))))
4031 /* Remember whether this symbol was small undefined. */
4032 if (esym
.asym
.sc
== scSUndefined
)
4035 /* If this symbol was ever small undefined, it needs to wind
4036 up in a GP relative section. We can't control the
4037 section of a defined symbol, but we can control the
4038 section of a common symbol. This case is actually needed
4039 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4041 && h
->root
.type
== bfd_link_hash_common
4042 && strcmp (h
->root
.u
.c
.p
->section
->name
, SCOMMON
) != 0)
4044 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
4046 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
4047 if (h
->esym
.asym
.sc
== scCommon
)
4048 h
->esym
.asym
.sc
= scSCommon
;
4056 /* ECOFF final link routines. */
4058 static boolean ecoff_final_link_debug_accumulate
4059 PARAMS ((bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*,
4061 static boolean ecoff_link_write_external
4062 PARAMS ((struct ecoff_link_hash_entry
*, PTR
));
4063 static boolean ecoff_indirect_link_order
4064 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4065 struct bfd_link_order
*));
4066 static boolean ecoff_reloc_link_order
4067 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4068 struct bfd_link_order
*));
4070 /* Structure used to pass information to ecoff_link_write_external. */
4075 struct bfd_link_info
*info
;
4078 /* ECOFF final link routine. This looks through all the input BFDs
4079 and gathers together all the debugging information, and then
4080 processes all the link order information. This may cause it to
4081 close and reopen some input BFDs; I'll see how bad this is. */
4084 _bfd_ecoff_bfd_final_link (abfd
, info
)
4086 struct bfd_link_info
*info
;
4088 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4089 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4092 register bfd
*input_bfd
;
4094 struct bfd_link_order
*p
;
4095 struct extsym_info einfo
;
4097 /* We accumulate the debugging information counts in the symbolic
4099 symhdr
= &debug
->symbolic_header
;
4101 symhdr
->ilineMax
= 0;
4105 symhdr
->isymMax
= 0;
4106 symhdr
->ioptMax
= 0;
4107 symhdr
->iauxMax
= 0;
4109 symhdr
->issExtMax
= 0;
4112 symhdr
->iextMax
= 0;
4114 /* We accumulate the debugging information itself in the debug_info
4117 debug
->external_dnr
= NULL
;
4118 debug
->external_pdr
= NULL
;
4119 debug
->external_sym
= NULL
;
4120 debug
->external_opt
= NULL
;
4121 debug
->external_aux
= NULL
;
4123 debug
->ssext
= debug
->ssext_end
= NULL
;
4124 debug
->external_fdr
= NULL
;
4125 debug
->external_rfd
= NULL
;
4126 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4128 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4129 if (handle
== (PTR
) NULL
)
4132 /* Accumulate the debugging symbols from each input BFD. */
4133 for (input_bfd
= info
->input_bfds
;
4134 input_bfd
!= (bfd
*) NULL
;
4135 input_bfd
= input_bfd
->link_next
)
4139 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4141 /* Abitrarily set the symbolic header vstamp to the vstamp
4142 of the first object file in the link. */
4143 if (symhdr
->vstamp
== 0)
4145 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4146 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4150 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4151 debug
, &backend
->debug_swap
,
4156 /* Combine the register masks. */
4157 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4158 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4159 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4160 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4161 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4162 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4165 /* Write out the external symbols. */
4168 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4169 ecoff_link_write_external
,
4172 if (info
->relocateable
)
4174 /* We need to make a pass over the link_orders to count up the
4175 number of relocations we will need to output, so that we know
4176 how much space they will take up. */
4177 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4180 for (p
= o
->link_order_head
;
4181 p
!= (struct bfd_link_order
*) NULL
;
4183 if (p
->type
== bfd_indirect_link_order
)
4184 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4185 else if (p
->type
== bfd_section_reloc_link_order
4186 || p
->type
== bfd_symbol_reloc_link_order
)
4191 /* Compute the reloc and symbol file positions. */
4192 ecoff_compute_reloc_file_positions (abfd
);
4194 /* Write out the debugging information. */
4195 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4196 &backend
->debug_swap
, info
,
4197 ecoff_data (abfd
)->sym_filepos
))
4200 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4202 if (info
->relocateable
)
4204 /* Now reset the reloc_count field of the sections in the output
4205 BFD to 0, so that we can use them to keep track of how many
4206 relocs we have output thus far. */
4207 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4211 /* Get a value for the GP register. */
4212 if (ecoff_data (abfd
)->gp
== 0)
4214 struct bfd_link_hash_entry
*h
;
4216 h
= bfd_link_hash_lookup (info
->hash
, "_gp", false, false, true);
4217 if (h
!= (struct bfd_link_hash_entry
*) NULL
4218 && h
->type
== bfd_link_hash_defined
)
4219 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4220 + h
->u
.def
.section
->output_section
->vma
4221 + h
->u
.def
.section
->output_offset
);
4222 else if (info
->relocateable
)
4226 /* Make up a value. */
4228 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4231 && (strcmp (o
->name
, _SBSS
) == 0
4232 || strcmp (o
->name
, _SDATA
) == 0
4233 || strcmp (o
->name
, _LIT4
) == 0
4234 || strcmp (o
->name
, _LIT8
) == 0
4235 || strcmp (o
->name
, _LITA
) == 0))
4238 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4242 /* If the relocate_section function needs to do a reloc
4243 involving the GP value, it should make a reloc_dangerous
4244 callback to warn that GP is not defined. */
4248 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4250 for (p
= o
->link_order_head
;
4251 p
!= (struct bfd_link_order
*) NULL
;
4254 if (p
->type
== bfd_indirect_link_order
4255 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4256 == bfd_target_ecoff_flavour
))
4258 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4261 else if (p
->type
== bfd_section_reloc_link_order
4262 || p
->type
== bfd_symbol_reloc_link_order
)
4264 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4269 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4275 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4277 ecoff_data (abfd
)->linker
= true;
4282 /* Accumulate the debugging information for an input BFD into the
4283 output BFD. This must read in the symbolic information of the
4287 ecoff_final_link_debug_accumulate (output_bfd
, input_bfd
, info
, handle
)
4290 struct bfd_link_info
*info
;
4293 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
4294 const struct ecoff_debug_swap
* const swap
=
4295 &ecoff_backend (input_bfd
)->debug_swap
;
4296 HDRR
*symhdr
= &debug
->symbolic_header
;
4299 #define READ(ptr, offset, count, size, type) \
4300 if (symhdr->count == 0) \
4301 debug->ptr = NULL; \
4304 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
4305 if (debug->ptr == NULL) \
4308 goto return_something; \
4310 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4312 || (bfd_read (debug->ptr, size, symhdr->count, \
4313 input_bfd) != size * symhdr->count)) \
4316 goto return_something; \
4320 /* If raw_syments is not NULL, then the data was already by read by
4321 _bfd_ecoff_slurp_symbolic_info. */
4322 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4324 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
4326 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
4327 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
4328 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
4329 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
4330 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
4332 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
4333 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
4334 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
4338 /* We do not read the external strings or the external symbols. */
4340 ret
= (bfd_ecoff_debug_accumulate
4341 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4342 &ecoff_backend (output_bfd
)->debug_swap
,
4343 input_bfd
, debug
, swap
, info
));
4346 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4348 if (debug
->line
!= NULL
)
4350 if (debug
->external_dnr
!= NULL
)
4351 free (debug
->external_dnr
);
4352 if (debug
->external_pdr
!= NULL
)
4353 free (debug
->external_pdr
);
4354 if (debug
->external_sym
!= NULL
)
4355 free (debug
->external_sym
);
4356 if (debug
->external_opt
!= NULL
)
4357 free (debug
->external_opt
);
4358 if (debug
->external_aux
!= NULL
)
4359 free (debug
->external_aux
);
4360 if (debug
->ss
!= NULL
)
4362 if (debug
->external_fdr
!= NULL
)
4363 free (debug
->external_fdr
);
4364 if (debug
->external_rfd
!= NULL
)
4365 free (debug
->external_rfd
);
4367 /* Make sure we don't accidentally follow one of these pointers
4368 into freed memory. */
4370 debug
->external_dnr
= NULL
;
4371 debug
->external_pdr
= NULL
;
4372 debug
->external_sym
= NULL
;
4373 debug
->external_opt
= NULL
;
4374 debug
->external_aux
= NULL
;
4376 debug
->external_fdr
= NULL
;
4377 debug
->external_rfd
= NULL
;
4383 /* Put out information for an external symbol. These come only from
4387 ecoff_link_write_external (h
, data
)
4388 struct ecoff_link_hash_entry
*h
;
4391 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4392 bfd
*output_bfd
= einfo
->abfd
;
4395 /* We need to check if this symbol is being stripped. */
4396 if (h
->root
.type
== bfd_link_hash_undefined
4397 || h
->root
.type
== bfd_link_hash_undefweak
)
4399 else if (einfo
->info
->strip
== strip_all
4400 || (einfo
->info
->strip
== strip_some
4401 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4402 h
->root
.root
.string
,
4403 false, false) == NULL
))
4408 if (strip
|| h
->written
)
4411 if (h
->abfd
== (bfd
*) NULL
)
4414 h
->esym
.cobol_main
= 0;
4415 h
->esym
.weakext
= 0;
4416 h
->esym
.reserved
= 0;
4417 h
->esym
.ifd
= ifdNil
;
4418 h
->esym
.asym
.value
= 0;
4419 h
->esym
.asym
.st
= stGlobal
;
4421 if (h
->root
.type
!= bfd_link_hash_defined
4422 && h
->root
.type
!= bfd_link_hash_defweak
)
4423 h
->esym
.asym
.sc
= scAbs
;
4426 asection
*output_section
;
4429 output_section
= h
->root
.u
.def
.section
->output_section
;
4430 name
= bfd_section_name (output_section
->owner
, output_section
);
4432 if (strcmp (name
, _TEXT
) == 0)
4433 h
->esym
.asym
.sc
= scText
;
4434 else if (strcmp (name
, _DATA
) == 0)
4435 h
->esym
.asym
.sc
= scData
;
4436 else if (strcmp (name
, _SDATA
) == 0)
4437 h
->esym
.asym
.sc
= scSData
;
4438 else if (strcmp (name
, _RDATA
) == 0)
4439 h
->esym
.asym
.sc
= scRData
;
4440 else if (strcmp (name
, _BSS
) == 0)
4441 h
->esym
.asym
.sc
= scBss
;
4442 else if (strcmp (name
, _SBSS
) == 0)
4443 h
->esym
.asym
.sc
= scSBss
;
4444 else if (strcmp (name
, _INIT
) == 0)
4445 h
->esym
.asym
.sc
= scInit
;
4446 else if (strcmp (name
, _FINI
) == 0)
4447 h
->esym
.asym
.sc
= scFini
;
4448 else if (strcmp (name
, _PDATA
) == 0)
4449 h
->esym
.asym
.sc
= scPData
;
4450 else if (strcmp (name
, _XDATA
) == 0)
4451 h
->esym
.asym
.sc
= scXData
;
4452 else if (strcmp (name
, _RCONST
) == 0)
4453 h
->esym
.asym
.sc
= scRConst
;
4455 h
->esym
.asym
.sc
= scAbs
;
4458 h
->esym
.asym
.reserved
= 0;
4459 h
->esym
.asym
.index
= indexNil
;
4461 else if (h
->esym
.ifd
!= -1)
4463 struct ecoff_debug_info
*debug
;
4465 /* Adjust the FDR index for the symbol by that used for the
4467 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4468 BFD_ASSERT (h
->esym
.ifd
>= 0
4469 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4470 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4473 switch (h
->root
.type
)
4476 case bfd_link_hash_new
:
4478 case bfd_link_hash_undefined
:
4479 case bfd_link_hash_undefweak
:
4480 if (h
->esym
.asym
.sc
!= scUndefined
4481 && h
->esym
.asym
.sc
!= scSUndefined
)
4482 h
->esym
.asym
.sc
= scUndefined
;
4484 case bfd_link_hash_defined
:
4485 case bfd_link_hash_defweak
:
4486 if (h
->esym
.asym
.sc
== scUndefined
4487 || h
->esym
.asym
.sc
== scSUndefined
)
4488 h
->esym
.asym
.sc
= scAbs
;
4489 else if (h
->esym
.asym
.sc
== scCommon
)
4490 h
->esym
.asym
.sc
= scBss
;
4491 else if (h
->esym
.asym
.sc
== scSCommon
)
4492 h
->esym
.asym
.sc
= scSBss
;
4493 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4494 + h
->root
.u
.def
.section
->output_section
->vma
4495 + h
->root
.u
.def
.section
->output_offset
);
4497 case bfd_link_hash_common
:
4498 if (h
->esym
.asym
.sc
!= scCommon
4499 && h
->esym
.asym
.sc
!= scSCommon
)
4500 h
->esym
.asym
.sc
= scCommon
;
4501 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4503 case bfd_link_hash_indirect
:
4504 case bfd_link_hash_warning
:
4505 /* FIXME: Ignore these for now. The circumstances under which
4506 they should be written out are not clear to me. */
4510 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4512 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4515 return (bfd_ecoff_debug_one_external
4516 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4517 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4521 /* Relocate and write an ECOFF section into an ECOFF output file. */
4524 ecoff_indirect_link_order (output_bfd
, info
, output_section
, link_order
)
4526 struct bfd_link_info
*info
;
4527 asection
*output_section
;
4528 struct bfd_link_order
*link_order
;
4530 asection
*input_section
;
4532 struct ecoff_section_tdata
*section_tdata
;
4533 bfd_size_type raw_size
;
4534 bfd_size_type cooked_size
;
4535 bfd_byte
*contents
= NULL
;
4536 bfd_size_type external_reloc_size
;
4537 bfd_size_type external_relocs_size
;
4538 PTR external_relocs
= NULL
;
4540 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
4542 if (link_order
->size
== 0)
4545 input_section
= link_order
->u
.indirect
.section
;
4546 input_bfd
= input_section
->owner
;
4547 section_tdata
= ecoff_section_data (input_bfd
, input_section
);
4549 raw_size
= input_section
->_raw_size
;
4550 cooked_size
= input_section
->_cooked_size
;
4551 if (cooked_size
== 0)
4552 cooked_size
= raw_size
;
4554 BFD_ASSERT (input_section
->output_section
== output_section
);
4555 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
4556 BFD_ASSERT (cooked_size
== link_order
->size
);
4558 /* Get the section contents. We allocate memory for the larger of
4559 the size before relocating and the size after relocating. */
4560 contents
= (bfd_byte
*) bfd_malloc (raw_size
>= cooked_size
4562 : (size_t) cooked_size
);
4563 if (contents
== NULL
&& raw_size
!= 0)
4566 /* If we are relaxing, the contents may have already been read into
4567 memory, in which case we copy them into our new buffer. We don't
4568 simply reuse the old buffer in case cooked_size > raw_size. */
4569 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4570 && section_tdata
->contents
!= (bfd_byte
*) NULL
)
4571 memcpy (contents
, section_tdata
->contents
, (size_t) raw_size
);
4574 if (! bfd_get_section_contents (input_bfd
, input_section
,
4576 (file_ptr
) 0, raw_size
))
4580 /* Get the relocs. If we are relaxing MIPS code, they will already
4581 have been read in. Otherwise, we read them in now. */
4582 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
4583 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
4585 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4586 && section_tdata
->external_relocs
!= NULL
)
4587 external_relocs
= section_tdata
->external_relocs
;
4590 external_relocs
= (PTR
) bfd_malloc ((size_t) external_relocs_size
);
4591 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
4594 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
4595 || (bfd_read (external_relocs
, 1, external_relocs_size
, input_bfd
)
4596 != external_relocs_size
))
4600 /* Relocate the section contents. */
4601 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4602 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4606 /* Write out the relocated section. */
4607 if (! bfd_set_section_contents (output_bfd
,
4610 input_section
->output_offset
,
4614 /* If we are producing relocateable output, the relocs were
4615 modified, and we write them out now. We use the reloc_count
4616 field of output_section to keep track of the number of relocs we
4617 have output so far. */
4618 if (info
->relocateable
)
4620 if (bfd_seek (output_bfd
,
4621 (output_section
->rel_filepos
+
4622 output_section
->reloc_count
* external_reloc_size
),
4624 || (bfd_write (external_relocs
, 1, external_relocs_size
, output_bfd
)
4625 != external_relocs_size
))
4627 output_section
->reloc_count
+= input_section
->reloc_count
;
4630 if (contents
!= NULL
)
4632 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4633 free (external_relocs
);
4637 if (contents
!= NULL
)
4639 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4640 free (external_relocs
);
4644 /* Generate a reloc when linking an ECOFF file. This is a reloc
4645 requested by the linker, and does come from any input file. This
4646 is used to build constructor and destructor tables when linking
4650 ecoff_reloc_link_order (output_bfd
, info
, output_section
, link_order
)
4652 struct bfd_link_info
*info
;
4653 asection
*output_section
;
4654 struct bfd_link_order
*link_order
;
4656 enum bfd_link_order_type type
;
4660 struct internal_reloc in
;
4661 bfd_size_type external_reloc_size
;
4665 type
= link_order
->type
;
4667 addend
= link_order
->u
.reloc
.p
->addend
;
4669 /* We set up an arelent to pass to the backend adjust_reloc_out
4671 rel
.address
= link_order
->offset
;
4673 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4676 bfd_set_error (bfd_error_bad_value
);
4680 if (type
== bfd_section_reloc_link_order
)
4682 section
= link_order
->u
.reloc
.p
->u
.section
;
4683 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4687 struct bfd_link_hash_entry
*h
;
4689 /* Treat a reloc against a defined symbol as though it were
4690 actually against the section. */
4691 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4692 link_order
->u
.reloc
.p
->u
.name
,
4693 false, false, false);
4695 && (h
->type
== bfd_link_hash_defined
4696 || h
->type
== bfd_link_hash_defweak
))
4698 type
= bfd_section_reloc_link_order
;
4699 section
= h
->u
.def
.section
->output_section
;
4700 /* It seems that we ought to add the symbol value to the
4701 addend here, but in practice it has already been added
4702 because it was passed to constructor_callback. */
4703 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4707 /* We can't set up a reloc against a symbol correctly,
4708 because we have no asymbol structure. Currently no
4709 adjust_reloc_out routine cares. */
4710 rel
.sym_ptr_ptr
= (asymbol
**) NULL
;
4714 /* All ECOFF relocs are in-place. Put the addend into the object
4717 BFD_ASSERT (rel
.howto
->partial_inplace
);
4721 bfd_reloc_status_type rstat
;
4725 size
= bfd_get_reloc_size (rel
.howto
);
4726 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4727 if (buf
== (bfd_byte
*) NULL
)
4729 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
, addend
, buf
);
4735 case bfd_reloc_outofrange
:
4737 case bfd_reloc_overflow
:
4738 if (! ((*info
->callbacks
->reloc_overflow
)
4740 (link_order
->type
== bfd_section_reloc_link_order
4741 ? bfd_section_name (output_bfd
, section
)
4742 : link_order
->u
.reloc
.p
->u
.name
),
4743 rel
.howto
->name
, addend
, (bfd
*) NULL
,
4744 (asection
*) NULL
, (bfd_vma
) 0)))
4751 ok
= bfd_set_section_contents (output_bfd
, output_section
, (PTR
) buf
,
4752 (file_ptr
) link_order
->offset
, size
);
4760 /* Move the information into a internal_reloc structure. */
4761 in
.r_vaddr
= (rel
.address
4762 + bfd_get_section_vma (output_bfd
, output_section
));
4763 in
.r_type
= rel
.howto
->type
;
4765 if (type
== bfd_symbol_reloc_link_order
)
4767 struct ecoff_link_hash_entry
*h
;
4769 h
= ((struct ecoff_link_hash_entry
*)
4770 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4771 link_order
->u
.reloc
.p
->u
.name
,
4772 false, false, true));
4773 if (h
!= (struct ecoff_link_hash_entry
*) NULL
4775 in
.r_symndx
= h
->indx
;
4778 if (! ((*info
->callbacks
->unattached_reloc
)
4779 (info
, link_order
->u
.reloc
.p
->u
.name
, (bfd
*) NULL
,
4780 (asection
*) NULL
, (bfd_vma
) 0)))
4790 name
= bfd_get_section_name (output_bfd
, section
);
4791 if (strcmp (name
, ".text") == 0)
4792 in
.r_symndx
= RELOC_SECTION_TEXT
;
4793 else if (strcmp (name
, ".rdata") == 0)
4794 in
.r_symndx
= RELOC_SECTION_RDATA
;
4795 else if (strcmp (name
, ".data") == 0)
4796 in
.r_symndx
= RELOC_SECTION_DATA
;
4797 else if (strcmp (name
, ".sdata") == 0)
4798 in
.r_symndx
= RELOC_SECTION_SDATA
;
4799 else if (strcmp (name
, ".sbss") == 0)
4800 in
.r_symndx
= RELOC_SECTION_SBSS
;
4801 else if (strcmp (name
, ".bss") == 0)
4802 in
.r_symndx
= RELOC_SECTION_BSS
;
4803 else if (strcmp (name
, ".init") == 0)
4804 in
.r_symndx
= RELOC_SECTION_INIT
;
4805 else if (strcmp (name
, ".lit8") == 0)
4806 in
.r_symndx
= RELOC_SECTION_LIT8
;
4807 else if (strcmp (name
, ".lit4") == 0)
4808 in
.r_symndx
= RELOC_SECTION_LIT4
;
4809 else if (strcmp (name
, ".xdata") == 0)
4810 in
.r_symndx
= RELOC_SECTION_XDATA
;
4811 else if (strcmp (name
, ".pdata") == 0)
4812 in
.r_symndx
= RELOC_SECTION_PDATA
;
4813 else if (strcmp (name
, ".fini") == 0)
4814 in
.r_symndx
= RELOC_SECTION_FINI
;
4815 else if (strcmp (name
, ".lita") == 0)
4816 in
.r_symndx
= RELOC_SECTION_LITA
;
4817 else if (strcmp (name
, "*ABS*") == 0)
4818 in
.r_symndx
= RELOC_SECTION_ABS
;
4819 else if (strcmp (name
, ".rconst") == 0)
4820 in
.r_symndx
= RELOC_SECTION_RCONST
;
4826 /* Let the BFD backend adjust the reloc. */
4827 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4829 /* Get some memory and swap out the reloc. */
4830 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4831 rbuf
= (bfd_byte
*) bfd_malloc ((size_t) external_reloc_size
);
4832 if (rbuf
== (bfd_byte
*) NULL
)
4835 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (PTR
) rbuf
);
4837 ok
= (bfd_seek (output_bfd
,
4838 (output_section
->rel_filepos
+
4839 output_section
->reloc_count
* external_reloc_size
),
4841 && (bfd_write ((PTR
) rbuf
, 1, external_reloc_size
, output_bfd
)
4842 == external_reloc_size
));
4845 ++output_section
->reloc_count
;