1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004 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
51 static long ecoff_sec_to_styp_flags
52 PARAMS ((const char *, flagword
));
53 static bfd_boolean ecoff_slurp_symbolic_header
55 static bfd_boolean ecoff_set_symbol_info
56 PARAMS ((bfd
*, SYMR
*, asymbol
*, int, int));
57 static void ecoff_emit_aggregate
58 PARAMS ((bfd
*, FDR
*, char *, RNDXR
*, long, const char *));
59 static char *ecoff_type_to_string
60 PARAMS ((bfd
*, FDR
*, unsigned int));
61 static bfd_boolean ecoff_slurp_reloc_table
62 PARAMS ((bfd
*, asection
*, asymbol
**));
63 static int ecoff_sort_hdrs
64 PARAMS ((const PTR
, const PTR
));
65 static bfd_boolean ecoff_compute_section_file_positions
67 static bfd_size_type ecoff_compute_reloc_file_positions
69 static bfd_boolean ecoff_get_extr
70 PARAMS ((asymbol
*, EXTR
*));
71 static void ecoff_set_index
72 PARAMS ((asymbol
*, bfd_size_type
));
73 static unsigned int ecoff_armap_hash
74 PARAMS ((const char *, unsigned int *, unsigned int, unsigned int));
76 /* This stuff is somewhat copied from coffcode.h. */
77 static asection bfd_debug_section
=
79 /* name, id, index, next, flags, user_set_vma, */
80 "*DEBUG*", 0, 0, NULL
, 0, 0,
81 /* linker_mark, linker_has_input, gc_mark, segment_mark, */
83 /* sec_info_type, use_rela_p, has_tls_reloc, has_gp_reloc, */
85 /* need_finalize_relax, reloc_done, */
87 /* vma, lma, size, rawsize, */
89 /* output_offset, output_section, alignment_power, */
91 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
93 /* line_filepos, userdata, contents, lineno, lineno_count, */
94 0, NULL
, NULL
, NULL
, 0,
95 /* entsize, kept_section, moving_line_filepos, */
97 /* target_index, used_by_bfd, constructor_chain, owner, */
100 (struct bfd_symbol
*) NULL
,
101 /* symbol_ptr_ptr, */
102 (struct bfd_symbol
**) NULL
,
103 /* link_order_head, link_order_tail */
107 /* Create an ECOFF object. */
110 _bfd_ecoff_mkobject (abfd
)
113 bfd_size_type amt
= sizeof (ecoff_data_type
);
115 abfd
->tdata
.ecoff_obj_data
= (struct ecoff_tdata
*) bfd_zalloc (abfd
, amt
);
116 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
122 /* This is a hook called by coff_real_object_p to create any backend
123 specific information. */
126 _bfd_ecoff_mkobject_hook (abfd
, filehdr
, aouthdr
)
131 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
132 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
133 ecoff_data_type
*ecoff
;
135 if (! _bfd_ecoff_mkobject (abfd
))
138 ecoff
= ecoff_data (abfd
);
140 ecoff
->sym_filepos
= internal_f
->f_symptr
;
142 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
146 ecoff
->text_start
= internal_a
->text_start
;
147 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
148 ecoff
->gp
= internal_a
->gp_value
;
149 ecoff
->gprmask
= internal_a
->gprmask
;
150 for (i
= 0; i
< 4; i
++)
151 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
152 ecoff
->fprmask
= internal_a
->fprmask
;
153 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
154 abfd
->flags
|= D_PAGED
;
156 abfd
->flags
&=~ D_PAGED
;
159 /* It turns out that no special action is required by the MIPS or
160 Alpha ECOFF backends. They have different information in the
161 a.out header, but we just copy it all (e.g., gprmask, cprmask and
162 fprmask) and let the swapping routines ensure that only relevant
163 information is written out. */
168 /* Initialize a new section. */
171 _bfd_ecoff_new_section_hook (abfd
, section
)
172 bfd
*abfd ATTRIBUTE_UNUSED
;
175 section
->alignment_power
= 4;
177 if (strcmp (section
->name
, _TEXT
) == 0
178 || strcmp (section
->name
, _INIT
) == 0
179 || strcmp (section
->name
, _FINI
) == 0)
180 section
->flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
181 else if (strcmp (section
->name
, _DATA
) == 0
182 || strcmp (section
->name
, _SDATA
) == 0)
183 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
184 else if (strcmp (section
->name
, _RDATA
) == 0
185 || strcmp (section
->name
, _LIT8
) == 0
186 || strcmp (section
->name
, _LIT4
) == 0
187 || strcmp (section
->name
, _RCONST
) == 0
188 || strcmp (section
->name
, _PDATA
) == 0)
189 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
190 else if (strcmp (section
->name
, _BSS
) == 0
191 || strcmp (section
->name
, _SBSS
) == 0)
192 section
->flags
|= SEC_ALLOC
;
193 else if (strcmp (section
->name
, _LIB
) == 0)
194 /* An Irix 4 shared libary. */
195 section
->flags
|= SEC_COFF_SHARED_LIBRARY
;
197 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
198 uncertain about .init on some systems and I don't know how shared
204 /* Determine the machine architecture and type. This is called from
205 the generic COFF routines. It is the inverse of ecoff_get_magic,
206 below. This could be an ECOFF backend routine, with one version
207 for each target, but there aren't all that many ECOFF targets. */
210 _bfd_ecoff_set_arch_mach_hook (abfd
, filehdr
)
214 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
215 enum bfd_architecture arch
;
218 switch (internal_f
->f_magic
)
221 case MIPS_MAGIC_LITTLE
:
223 arch
= bfd_arch_mips
;
224 mach
= bfd_mach_mips3000
;
227 case MIPS_MAGIC_LITTLE2
:
228 case MIPS_MAGIC_BIG2
:
229 /* MIPS ISA level 2: the r6000. */
230 arch
= bfd_arch_mips
;
231 mach
= bfd_mach_mips6000
;
234 case MIPS_MAGIC_LITTLE3
:
235 case MIPS_MAGIC_BIG3
:
236 /* MIPS ISA level 3: the r4000. */
237 arch
= bfd_arch_mips
;
238 mach
= bfd_mach_mips4000
;
242 arch
= bfd_arch_alpha
;
247 arch
= bfd_arch_obscure
;
252 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
255 /* Get the magic number to use based on the architecture and machine.
256 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
259 ecoff_get_magic (abfd
)
264 switch (bfd_get_arch (abfd
))
267 switch (bfd_get_mach (abfd
))
271 case bfd_mach_mips3000
:
272 big
= MIPS_MAGIC_BIG
;
273 little
= MIPS_MAGIC_LITTLE
;
276 case bfd_mach_mips6000
:
277 big
= MIPS_MAGIC_BIG2
;
278 little
= MIPS_MAGIC_LITTLE2
;
281 case bfd_mach_mips4000
:
282 big
= MIPS_MAGIC_BIG3
;
283 little
= MIPS_MAGIC_LITTLE3
;
287 return bfd_big_endian (abfd
) ? big
: little
;
298 /* Get the section s_flags to use for a section. */
301 ecoff_sec_to_styp_flags (name
, flags
)
309 if (strcmp (name
, _TEXT
) == 0)
311 else if (strcmp (name
, _DATA
) == 0)
313 else if (strcmp (name
, _SDATA
) == 0)
315 else if (strcmp (name
, _RDATA
) == 0)
317 else if (strcmp (name
, _LITA
) == 0)
319 else if (strcmp (name
, _LIT8
) == 0)
321 else if (strcmp (name
, _LIT4
) == 0)
323 else if (strcmp (name
, _BSS
) == 0)
325 else if (strcmp (name
, _SBSS
) == 0)
327 else if (strcmp (name
, _INIT
) == 0)
328 styp
= STYP_ECOFF_INIT
;
329 else if (strcmp (name
, _FINI
) == 0)
330 styp
= STYP_ECOFF_FINI
;
331 else if (strcmp (name
, _PDATA
) == 0)
333 else if (strcmp (name
, _XDATA
) == 0)
335 else if (strcmp (name
, _LIB
) == 0)
336 styp
= STYP_ECOFF_LIB
;
337 else if (strcmp (name
, _GOT
) == 0)
339 else if (strcmp (name
, _HASH
) == 0)
341 else if (strcmp (name
, _DYNAMIC
) == 0)
343 else if (strcmp (name
, _LIBLIST
) == 0)
345 else if (strcmp (name
, _RELDYN
) == 0)
347 else if (strcmp (name
, _CONFLIC
) == 0)
349 else if (strcmp (name
, _DYNSTR
) == 0)
351 else if (strcmp (name
, _DYNSYM
) == 0)
353 else if (strcmp (name
, _COMMENT
) == 0)
356 flags
&=~ SEC_NEVER_LOAD
;
358 else if (strcmp (name
, _RCONST
) == 0)
360 else if (flags
& SEC_CODE
)
362 else if (flags
& SEC_DATA
)
364 else if (flags
& SEC_READONLY
)
366 else if (flags
& SEC_LOAD
)
371 if (flags
& SEC_NEVER_LOAD
)
377 /* Get the BFD flags to use for a section. */
380 _bfd_ecoff_styp_to_sec_flags (abfd
, hdr
, name
, section
, flags_ptr
)
381 bfd
*abfd ATTRIBUTE_UNUSED
;
383 const char *name ATTRIBUTE_UNUSED
;
384 asection
*section ATTRIBUTE_UNUSED
;
385 flagword
* flags_ptr
;
387 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
388 long styp_flags
= internal_s
->s_flags
;
389 flagword sec_flags
= 0;
391 if (styp_flags
& STYP_NOLOAD
)
392 sec_flags
|= SEC_NEVER_LOAD
;
394 /* For 386 COFF, at least, an unloadable text or data section is
395 actually a shared library section. */
396 if ((styp_flags
& STYP_TEXT
)
397 || (styp_flags
& STYP_ECOFF_INIT
)
398 || (styp_flags
& STYP_ECOFF_FINI
)
399 || (styp_flags
& STYP_DYNAMIC
)
400 || (styp_flags
& STYP_LIBLIST
)
401 || (styp_flags
& STYP_RELDYN
)
402 || styp_flags
== STYP_CONFLIC
403 || (styp_flags
& STYP_DYNSTR
)
404 || (styp_flags
& STYP_DYNSYM
)
405 || (styp_flags
& STYP_HASH
))
407 if (sec_flags
& SEC_NEVER_LOAD
)
408 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
410 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
412 else if ((styp_flags
& STYP_DATA
)
413 || (styp_flags
& STYP_RDATA
)
414 || (styp_flags
& STYP_SDATA
)
415 || styp_flags
== STYP_PDATA
416 || styp_flags
== STYP_XDATA
417 || (styp_flags
& STYP_GOT
)
418 || styp_flags
== STYP_RCONST
)
420 if (sec_flags
& SEC_NEVER_LOAD
)
421 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
423 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
424 if ((styp_flags
& STYP_RDATA
)
425 || styp_flags
== STYP_PDATA
426 || styp_flags
== STYP_RCONST
)
427 sec_flags
|= SEC_READONLY
;
429 else if ((styp_flags
& STYP_BSS
)
430 || (styp_flags
& STYP_SBSS
))
431 sec_flags
|= SEC_ALLOC
;
432 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
433 sec_flags
|= SEC_NEVER_LOAD
;
434 else if ((styp_flags
& STYP_LITA
)
435 || (styp_flags
& STYP_LIT8
)
436 || (styp_flags
& STYP_LIT4
))
437 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
438 else if (styp_flags
& STYP_ECOFF_LIB
)
439 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
441 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
443 * flags_ptr
= sec_flags
;
447 /* Read in the symbolic header for an ECOFF object file. */
450 ecoff_slurp_symbolic_header (abfd
)
453 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
454 bfd_size_type external_hdr_size
;
456 HDRR
*internal_symhdr
;
458 /* See if we've already read it in. */
459 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
460 backend
->debug_swap
.sym_magic
)
463 /* See whether there is a symbolic header. */
464 if (ecoff_data (abfd
)->sym_filepos
== 0)
466 bfd_get_symcount (abfd
) = 0;
470 /* At this point bfd_get_symcount (abfd) holds the number of symbols
471 as read from the file header, but on ECOFF this is always the
472 size of the symbolic information header. It would be cleaner to
473 handle this when we first read the file in coffgen.c. */
474 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
475 if (bfd_get_symcount (abfd
) != external_hdr_size
)
477 bfd_set_error (bfd_error_bad_value
);
481 /* Read the symbolic information header. */
482 raw
= (PTR
) bfd_malloc (external_hdr_size
);
486 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) != 0
487 || bfd_bread (raw
, external_hdr_size
, abfd
) != external_hdr_size
)
489 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
490 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
492 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
494 bfd_set_error (bfd_error_bad_value
);
498 /* Now we can get the correct number of symbols. */
499 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
500 + internal_symhdr
->iextMax
);
511 /* Read in and swap the important symbolic information for an ECOFF
512 object file. This is called by gdb via the read_debug_info entry
513 point in the backend structure. */
516 _bfd_ecoff_slurp_symbolic_info (abfd
, ignore
, debug
)
518 asection
*ignore ATTRIBUTE_UNUSED
;
519 struct ecoff_debug_info
*debug
;
521 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
522 HDRR
*internal_symhdr
;
523 bfd_size_type raw_base
;
524 bfd_size_type raw_size
;
526 bfd_size_type external_fdr_size
;
530 bfd_size_type raw_end
;
531 bfd_size_type cb_end
;
535 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
537 /* Check whether we've already gotten it, and whether there's any to
539 if (ecoff_data (abfd
)->raw_syments
!= (PTR
) NULL
)
541 if (ecoff_data (abfd
)->sym_filepos
== 0)
543 bfd_get_symcount (abfd
) = 0;
547 if (! ecoff_slurp_symbolic_header (abfd
))
550 internal_symhdr
= &debug
->symbolic_header
;
552 /* Read all the symbolic information at once. */
553 raw_base
= (ecoff_data (abfd
)->sym_filepos
554 + backend
->debug_swap
.external_hdr_size
);
556 /* Alpha ecoff makes the determination of raw_size difficult. It has
557 an undocumented debug data section between the symhdr and the first
558 documented section. And the ordering of the sections varies between
559 statically and dynamically linked executables.
560 If bfd supports SEEK_END someday, this code could be simplified. */
563 #define UPDATE_RAW_END(start, count, size) \
564 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
565 if (cb_end > raw_end) \
568 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
569 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
570 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
571 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
572 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
573 optimization symtab, not the number of entries */
574 UPDATE_RAW_END (cbOptOffset
, ioptMax
, sizeof (char));
575 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
576 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
577 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
578 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
579 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
580 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
582 #undef UPDATE_RAW_END
584 raw_size
= raw_end
- raw_base
;
587 ecoff_data (abfd
)->sym_filepos
= 0;
590 raw
= (PTR
) bfd_alloc (abfd
, raw_size
);
594 pos
= ecoff_data (abfd
)->sym_filepos
;
595 pos
+= backend
->debug_swap
.external_hdr_size
;
596 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
597 || bfd_bread (raw
, raw_size
, abfd
) != raw_size
)
599 bfd_release (abfd
, raw
);
603 ecoff_data (abfd
)->raw_syments
= raw
;
605 /* Get pointers for the numeric offsets in the HDRR structure. */
606 #define FIX(off1, off2, type) \
607 if (internal_symhdr->off1 == 0) \
608 debug->off2 = (type) NULL; \
610 debug->off2 = (type) ((char *) raw \
611 + (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 amt
= internal_symhdr
->ifdMax
;
636 amt
*= sizeof (struct fdr
);
637 debug
->fdr
= (struct fdr
*) bfd_alloc (abfd
, amt
);
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;
669 bfd_size_type amt
= sizeof (ecoff_symbol_type
);
671 new = (ecoff_symbol_type
*) bfd_zalloc (abfd
, amt
);
672 if (new == (ecoff_symbol_type
*) NULL
)
673 return (asymbol
*) NULL
;
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
;
737 if (ecoff_sym
->st
== stProc
|| ecoff_sym
->st
== stStaticProc
)
738 asym
->flags
|= BSF_FUNCTION
;
740 switch (ecoff_sym
->sc
)
743 /* Used for compiler generated labels. Leave them in the
744 debugging section, and mark them as local. If BSF_DEBUGGING
745 is set, then nm does not display them for some reason. If no
746 flags are set then the linker whines about them. */
747 asym
->flags
= BSF_LOCAL
;
750 asym
->section
= bfd_make_section_old_way (abfd
, ".text");
751 asym
->value
-= asym
->section
->vma
;
754 asym
->section
= bfd_make_section_old_way (abfd
, ".data");
755 asym
->value
-= asym
->section
->vma
;
758 asym
->section
= bfd_make_section_old_way (abfd
, ".bss");
759 asym
->value
-= asym
->section
->vma
;
762 asym
->flags
= BSF_DEBUGGING
;
765 asym
->section
= bfd_abs_section_ptr
;
768 asym
->section
= bfd_und_section_ptr
;
778 asym
->flags
= BSF_DEBUGGING
;
781 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
782 asym
->value
-= asym
->section
->vma
;
785 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
786 asym
->value
-= asym
->section
->vma
;
789 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
790 asym
->value
-= asym
->section
->vma
;
793 asym
->flags
= BSF_DEBUGGING
;
796 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
798 asym
->section
= bfd_com_section_ptr
;
804 if (ecoff_scom_section
.name
== NULL
)
806 /* Initialize the small common section. */
807 ecoff_scom_section
.name
= SCOMMON
;
808 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
809 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
810 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
811 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
812 ecoff_scom_symbol
.name
= SCOMMON
;
813 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
814 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
815 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
817 asym
->section
= &ecoff_scom_section
;
822 asym
->flags
= BSF_DEBUGGING
;
825 asym
->section
= bfd_und_section_ptr
;
830 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
831 asym
->value
-= asym
->section
->vma
;
836 asym
->flags
= BSF_DEBUGGING
;
839 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
840 asym
->value
-= asym
->section
->vma
;
843 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
844 asym
->value
-= asym
->section
->vma
;
850 /* Look for special constructors symbols and make relocation entries
851 in a special construction section. These are produced by the
852 -fgnu-linker argument to g++. */
853 if (ECOFF_IS_STAB (ecoff_sym
))
855 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
865 /* This code is no longer needed. It used to be used to
866 make the linker handle set symbols, but they are now
867 handled in the add_symbols routine instead. */
871 arelent_chain
*reloc_chain
;
872 unsigned int bitsize
;
875 /* Get a section with the same name as the symbol (usually
876 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
877 name ___CTOR_LIST (three underscores). We need
878 __CTOR_LIST (two underscores), since ECOFF doesn't use
879 a leading underscore. This should be handled by gcc,
880 but instead we do it here. Actually, this should all
881 be done differently anyhow. */
882 name
= bfd_asymbol_name (asym
);
883 if (name
[0] == '_' && name
[1] == '_' && name
[2] == '_')
888 section
= bfd_get_section_by_name (abfd
, name
);
889 if (section
== (asection
*) NULL
)
893 amt
= strlen (name
) + 1;
894 copy
= (char *) bfd_alloc (abfd
, amt
);
898 section
= bfd_make_section (abfd
, copy
);
901 /* Build a reloc pointing to this constructor. */
902 amt
= sizeof (arelent_chain
);
903 reloc_chain
= (arelent_chain
*) bfd_alloc (abfd
, amt
);
906 reloc_chain
->relent
.sym_ptr_ptr
=
907 bfd_get_section (asym
)->symbol_ptr_ptr
;
908 reloc_chain
->relent
.address
= section
->size
;
909 reloc_chain
->relent
.addend
= asym
->value
;
910 reloc_chain
->relent
.howto
=
911 ecoff_backend (abfd
)->constructor_reloc
;
913 /* Set up the constructor section to hold the reloc. */
914 section
->flags
= SEC_CONSTRUCTOR
;
915 ++section
->reloc_count
;
917 /* Constructor sections must be rounded to a boundary
918 based on the bitsize. These are not real sections--
919 they are handled specially by the linker--so the ECOFF
920 16 byte alignment restriction does not apply. */
921 bitsize
= ecoff_backend (abfd
)->constructor_bitsize
;
922 section
->alignment_power
= 1;
923 while ((1 << section
->alignment_power
) < bitsize
/ 8)
924 ++section
->alignment_power
;
926 reloc_chain
->next
= section
->constructor_chain
;
927 section
->constructor_chain
= reloc_chain
;
928 section
->size
+= bitsize
/ 8;
932 /* Mark the symbol as a constructor. */
933 asym
->flags
|= BSF_CONSTRUCTOR
;
941 /* Read an ECOFF symbol table. */
944 _bfd_ecoff_slurp_symbol_table (abfd
)
947 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
948 const bfd_size_type external_ext_size
949 = backend
->debug_swap
.external_ext_size
;
950 const bfd_size_type external_sym_size
951 = backend
->debug_swap
.external_sym_size
;
952 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
953 = backend
->debug_swap
.swap_ext_in
;
954 void (* const swap_sym_in
) PARAMS ((bfd
*, PTR
, SYMR
*))
955 = backend
->debug_swap
.swap_sym_in
;
956 bfd_size_type internal_size
;
957 ecoff_symbol_type
*internal
;
958 ecoff_symbol_type
*internal_ptr
;
964 /* If we've already read in the symbol table, do nothing. */
965 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
968 /* Get the symbolic information. */
969 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
970 &ecoff_data (abfd
)->debug_info
))
972 if (bfd_get_symcount (abfd
) == 0)
975 internal_size
= bfd_get_symcount (abfd
);
976 internal_size
*= sizeof (ecoff_symbol_type
);
977 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
978 if (internal
== NULL
)
981 internal_ptr
= internal
;
982 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
984 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
985 * external_ext_size
));
986 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
990 (*swap_ext_in
) (abfd
, (PTR
) eraw_src
, &internal_esym
);
991 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
992 + internal_esym
.asym
.iss
);
993 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
994 &internal_ptr
->symbol
, 1,
995 internal_esym
.weakext
))
997 /* The alpha uses a negative ifd field for section symbols. */
998 if (internal_esym
.ifd
>= 0)
999 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
1000 + internal_esym
.ifd
);
1002 internal_ptr
->fdr
= NULL
;
1003 internal_ptr
->local
= FALSE
;
1004 internal_ptr
->native
= (PTR
) eraw_src
;
1007 /* The local symbols must be accessed via the fdr's, because the
1008 string and aux indices are relative to the fdr information. */
1009 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
1010 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
1011 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
1016 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
1017 + fdr_ptr
->isymBase
* external_sym_size
);
1018 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
1020 lraw_src
< lraw_end
;
1021 lraw_src
+= external_sym_size
, internal_ptr
++)
1025 (*swap_sym_in
) (abfd
, (PTR
) lraw_src
, &internal_sym
);
1026 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
1028 + internal_sym
.iss
);
1029 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
1030 &internal_ptr
->symbol
, 0, 0))
1032 internal_ptr
->fdr
= fdr_ptr
;
1033 internal_ptr
->local
= TRUE
;
1034 internal_ptr
->native
= (PTR
) lraw_src
;
1038 ecoff_data (abfd
)->canonical_symbols
= internal
;
1043 /* Return the amount of space needed for the canonical symbols. */
1046 _bfd_ecoff_get_symtab_upper_bound (abfd
)
1049 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
1050 &ecoff_data (abfd
)->debug_info
))
1053 if (bfd_get_symcount (abfd
) == 0)
1056 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
1059 /* Get the canonical symbols. */
1062 _bfd_ecoff_canonicalize_symtab (abfd
, alocation
)
1064 asymbol
**alocation
;
1066 unsigned int counter
= 0;
1067 ecoff_symbol_type
*symbase
;
1068 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1070 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1072 if (bfd_get_symcount (abfd
) == 0)
1075 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1076 while (counter
< bfd_get_symcount (abfd
))
1078 *(location
++) = symbase
++;
1081 *location
++ = (ecoff_symbol_type
*) NULL
;
1082 return bfd_get_symcount (abfd
);
1085 /* Turn ECOFF type information into a printable string.
1086 ecoff_emit_aggregate and ecoff_type_to_string are from
1087 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1089 /* Write aggregate information to a string. */
1092 ecoff_emit_aggregate (abfd
, fdr
, string
, rndx
, isym
, which
)
1100 const struct ecoff_debug_swap
* const debug_swap
=
1101 &ecoff_backend (abfd
)->debug_swap
;
1102 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1103 unsigned int ifd
= rndx
->rfd
;
1104 unsigned int indx
= rndx
->index
;
1110 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1111 struct return type of a procedure compiled without -g. */
1112 if (ifd
== 0xffffffff
1113 || (rndx
->rfd
== 0xfff && indx
== 0))
1114 name
= "<undefined>";
1115 else if (indx
== indexNil
)
1121 if (debug_info
->external_rfd
== NULL
)
1122 fdr
= debug_info
->fdr
+ ifd
;
1127 (*debug_swap
->swap_rfd_in
) (abfd
,
1128 ((char *) debug_info
->external_rfd
1129 + ((fdr
->rfdBase
+ ifd
)
1130 * debug_swap
->external_rfd_size
)),
1132 fdr
= debug_info
->fdr
+ rfd
;
1135 indx
+= fdr
->isymBase
;
1137 (*debug_swap
->swap_sym_in
) (abfd
,
1138 ((char *) debug_info
->external_sym
1139 + indx
* debug_swap
->external_sym_size
),
1142 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1146 "%s %s { ifd = %u, index = %lu }",
1149 + debug_info
->symbolic_header
.iextMax
));
1152 /* Convert the type information to string format. */
1155 ecoff_type_to_string (abfd
, fdr
, indx
)
1160 union aux_ext
*aux_ptr
;
1169 unsigned int basic_type
;
1172 static char buffer2
[1024];
1177 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1178 bigendian
= fdr
->fBigendian
;
1180 for (i
= 0; i
< 7; i
++)
1182 qualifiers
[i
].low_bound
= 0;
1183 qualifiers
[i
].high_bound
= 0;
1184 qualifiers
[i
].stride
= 0;
1187 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1188 return "-1 (no type)";
1189 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1191 basic_type
= u
.ti
.bt
;
1192 qualifiers
[0].type
= u
.ti
.tq0
;
1193 qualifiers
[1].type
= u
.ti
.tq1
;
1194 qualifiers
[2].type
= u
.ti
.tq2
;
1195 qualifiers
[3].type
= u
.ti
.tq3
;
1196 qualifiers
[4].type
= u
.ti
.tq4
;
1197 qualifiers
[5].type
= u
.ti
.tq5
;
1198 qualifiers
[6].type
= tqNil
;
1200 /* Go get the basic type. */
1203 case btNil
: /* Undefined. */
1207 case btAdr
: /* Address - integer same size as pointer. */
1208 strcpy (p1
, "address");
1211 case btChar
: /* Character. */
1212 strcpy (p1
, "char");
1215 case btUChar
: /* Unsigned character. */
1216 strcpy (p1
, "unsigned char");
1219 case btShort
: /* Short. */
1220 strcpy (p1
, "short");
1223 case btUShort
: /* Unsigned short. */
1224 strcpy (p1
, "unsigned short");
1227 case btInt
: /* Int. */
1231 case btUInt
: /* Unsigned int. */
1232 strcpy (p1
, "unsigned int");
1235 case btLong
: /* Long. */
1236 strcpy (p1
, "long");
1239 case btULong
: /* Unsigned long. */
1240 strcpy (p1
, "unsigned long");
1243 case btFloat
: /* Float (real). */
1244 strcpy (p1
, "float");
1247 case btDouble
: /* Double (real). */
1248 strcpy (p1
, "double");
1251 /* Structures add 1-2 aux words:
1252 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1253 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1255 case btStruct
: /* Structure (Record). */
1256 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1257 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1258 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1260 indx
++; /* Skip aux words. */
1263 /* Unions add 1-2 aux words:
1264 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1265 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1267 case btUnion
: /* Union. */
1268 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1269 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1270 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1272 indx
++; /* Skip aux words. */
1275 /* Enumerations add 1-2 aux words:
1276 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1277 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1279 case btEnum
: /* Enumeration. */
1280 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1281 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1282 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1284 indx
++; /* Skip aux words. */
1287 case btTypedef
: /* Defined via a typedef, isymRef points. */
1288 strcpy (p1
, "typedef");
1291 case btRange
: /* Subrange of int. */
1292 strcpy (p1
, "subrange");
1295 case btSet
: /* Pascal sets. */
1299 case btComplex
: /* Fortran complex. */
1300 strcpy (p1
, "complex");
1303 case btDComplex
: /* Fortran double complex. */
1304 strcpy (p1
, "double complex");
1307 case btIndirect
: /* Forward or unnamed typedef. */
1308 strcpy (p1
, "forward/unamed typedef");
1311 case btFixedDec
: /* Fixed Decimal. */
1312 strcpy (p1
, "fixed decimal");
1315 case btFloatDec
: /* Float Decimal. */
1316 strcpy (p1
, "float decimal");
1319 case btString
: /* Varying Length Character String. */
1320 strcpy (p1
, "string");
1323 case btBit
: /* Aligned Bit String. */
1327 case btPicture
: /* Picture. */
1328 strcpy (p1
, "picture");
1331 case btVoid
: /* Void. */
1332 strcpy (p1
, "void");
1336 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1340 p1
+= strlen (buffer1
);
1342 /* If this is a bitfield, get the bitsize. */
1347 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1348 sprintf (p1
, " : %d", bitsize
);
1349 p1
+= strlen (buffer1
);
1352 /* Deal with any qualifiers. */
1353 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. */
1362 for (i
= 0; i
< 7; i
++)
1364 if (qualifiers
[i
].type
== tqArray
)
1366 qualifiers
[i
].low_bound
=
1367 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1368 qualifiers
[i
].high_bound
=
1369 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1370 qualifiers
[i
].stride
=
1371 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1376 /* Now print out the qualifiers. */
1377 for (i
= 0; i
< 6; i
++)
1379 switch (qualifiers
[i
].type
)
1386 strcpy (p2
, "ptr to ");
1387 p2
+= sizeof ("ptr to ")-1;
1391 strcpy (p2
, "volatile ");
1392 p2
+= sizeof ("volatile ")-1;
1396 strcpy (p2
, "far ");
1397 p2
+= sizeof ("far ")-1;
1401 strcpy (p2
, "func. ret. ");
1402 p2
+= sizeof ("func. ret. ");
1407 int first_array
= i
;
1410 /* Print array bounds reversed (ie, in the order the C
1411 programmer writes them). C is such a fun language.... */
1412 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1415 for (j
= i
; j
>= first_array
; j
--)
1417 strcpy (p2
, "array [");
1418 p2
+= sizeof ("array [")-1;
1419 if (qualifiers
[j
].low_bound
!= 0)
1421 "%ld:%ld {%ld bits}",
1422 (long) qualifiers
[j
].low_bound
,
1423 (long) qualifiers
[j
].high_bound
,
1424 (long) qualifiers
[j
].stride
);
1426 else if (qualifiers
[j
].high_bound
!= -1)
1429 (long) (qualifiers
[j
].high_bound
+ 1),
1430 (long) (qualifiers
[j
].stride
));
1433 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1436 strcpy (p2
, "] of ");
1437 p2
+= sizeof ("] of ")-1;
1445 strcpy (p2
, buffer1
);
1449 /* Return information about ECOFF symbol SYMBOL in RET. */
1452 _bfd_ecoff_get_symbol_info (abfd
, symbol
, ret
)
1453 bfd
*abfd ATTRIBUTE_UNUSED
;
1457 bfd_symbol_info (symbol
, ret
);
1460 /* Return whether this is a local label. */
1463 _bfd_ecoff_bfd_is_local_label_name (abfd
, name
)
1464 bfd
*abfd ATTRIBUTE_UNUSED
;
1467 return name
[0] == '$';
1470 /* Print information about an ECOFF symbol. */
1473 _bfd_ecoff_print_symbol (abfd
, filep
, symbol
, how
)
1477 bfd_print_symbol_type how
;
1479 const struct ecoff_debug_swap
* const debug_swap
1480 = &ecoff_backend (abfd
)->debug_swap
;
1481 FILE *file
= (FILE *)filep
;
1485 case bfd_print_symbol_name
:
1486 fprintf (file
, "%s", symbol
->name
);
1488 case bfd_print_symbol_more
:
1489 if (ecoffsymbol (symbol
)->local
)
1493 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1495 fprintf (file
, "ecoff local ");
1496 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1497 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1498 (unsigned) ecoff_sym
.sc
);
1504 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1506 fprintf (file
, "ecoff extern ");
1507 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1508 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1509 (unsigned) ecoff_ext
.asym
.sc
);
1512 case bfd_print_symbol_all
:
1513 /* Print out the symbols in a reasonable way. */
1522 if (ecoffsymbol (symbol
)->local
)
1524 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1527 pos
= ((((char *) ecoffsymbol (symbol
)->native
1528 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1529 / debug_swap
->external_sym_size
)
1530 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1537 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1540 pos
= (((char *) ecoffsymbol (symbol
)->native
1541 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1542 / debug_swap
->external_ext_size
);
1543 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1544 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1545 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1548 fprintf (file
, "[%3d] %c ",
1550 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1551 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1552 (unsigned) ecoff_ext
.asym
.st
,
1553 (unsigned) ecoff_ext
.asym
.sc
,
1554 (unsigned) ecoff_ext
.asym
.index
,
1555 jmptbl
, cobol_main
, weakext
,
1558 if (ecoffsymbol (symbol
)->fdr
!= NULL
1559 && ecoff_ext
.asym
.index
!= indexNil
)
1564 bfd_size_type sym_base
;
1565 union aux_ext
*aux_base
;
1567 fdr
= ecoffsymbol (symbol
)->fdr
;
1568 indx
= ecoff_ext
.asym
.index
;
1570 /* sym_base is used to map the fdr relative indices which
1571 appear in the file to the position number which we are
1573 sym_base
= fdr
->isymBase
;
1574 if (ecoffsymbol (symbol
)->local
)
1576 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1578 /* aux_base is the start of the aux entries for this file;
1579 asym.index is an offset from this. */
1580 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1583 /* The aux entries are stored in host byte order; the
1584 order is indicated by a bit in the fdr. */
1585 bigendian
= fdr
->fBigendian
;
1587 /* This switch is basically from gcc/mips-tdump.c. */
1588 switch (ecoff_ext
.asym
.st
)
1596 fprintf (file
, _("\n End+1 symbol: %ld"),
1597 (long) (indx
+ sym_base
));
1601 if (ecoff_ext
.asym
.sc
== scText
1602 || ecoff_ext
.asym
.sc
== scInfo
)
1603 fprintf (file
, _("\n First symbol: %ld"),
1604 (long) (indx
+ sym_base
));
1606 fprintf (file
, _("\n First symbol: %ld"),
1608 (AUX_GET_ISYM (bigendian
,
1609 &aux_base
[ecoff_ext
.asym
.index
])
1615 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1617 else if (ecoffsymbol (symbol
)->local
)
1618 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1620 (AUX_GET_ISYM (bigendian
,
1621 &aux_base
[ecoff_ext
.asym
.index
])
1623 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1625 fprintf (file
, _("\n Local symbol: %ld"),
1628 + (ecoff_data (abfd
)
1629 ->debug_info
.symbolic_header
.iextMax
)));
1633 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1634 (long) (indx
+ sym_base
));
1638 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1639 (long) (indx
+ sym_base
));
1643 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1644 (long) (indx
+ sym_base
));
1648 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1649 fprintf (file
, _("\n Type: %s"),
1650 ecoff_type_to_string (abfd
, fdr
, indx
));
1659 /* Read in the relocs for a section. */
1662 ecoff_slurp_reloc_table (abfd
, section
, symbols
)
1667 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1668 arelent
*internal_relocs
;
1669 bfd_size_type external_reloc_size
;
1671 char *external_relocs
;
1675 if (section
->relocation
!= (arelent
*) NULL
1676 || section
->reloc_count
== 0
1677 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1680 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1683 amt
= section
->reloc_count
;
1684 amt
*= sizeof (arelent
);
1685 internal_relocs
= (arelent
*) bfd_alloc (abfd
, amt
);
1687 external_reloc_size
= backend
->external_reloc_size
;
1688 amt
= external_reloc_size
* section
->reloc_count
;
1689 external_relocs
= (char *) bfd_alloc (abfd
, amt
);
1690 if (internal_relocs
== (arelent
*) NULL
1691 || external_relocs
== (char *) NULL
)
1693 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1695 if (bfd_bread (external_relocs
, amt
, abfd
) != amt
)
1698 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1700 struct internal_reloc intern
;
1702 (*backend
->swap_reloc_in
) (abfd
,
1703 external_relocs
+ i
* external_reloc_size
,
1706 if (intern
.r_extern
)
1708 /* r_symndx is an index into the external symbols. */
1709 BFD_ASSERT (intern
.r_symndx
>= 0
1711 < (ecoff_data (abfd
)
1712 ->debug_info
.symbolic_header
.iextMax
)));
1713 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1716 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1717 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1719 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1724 const char *sec_name
;
1727 /* r_symndx is a section key. */
1728 switch (intern
.r_symndx
)
1730 case RELOC_SECTION_TEXT
: sec_name
= ".text"; break;
1731 case RELOC_SECTION_RDATA
: sec_name
= ".rdata"; break;
1732 case RELOC_SECTION_DATA
: sec_name
= ".data"; break;
1733 case RELOC_SECTION_SDATA
: sec_name
= ".sdata"; break;
1734 case RELOC_SECTION_SBSS
: sec_name
= ".sbss"; break;
1735 case RELOC_SECTION_BSS
: sec_name
= ".bss"; break;
1736 case RELOC_SECTION_INIT
: sec_name
= ".init"; break;
1737 case RELOC_SECTION_LIT8
: sec_name
= ".lit8"; break;
1738 case RELOC_SECTION_LIT4
: sec_name
= ".lit4"; break;
1739 case RELOC_SECTION_XDATA
: sec_name
= ".xdata"; break;
1740 case RELOC_SECTION_PDATA
: sec_name
= ".pdata"; break;
1741 case RELOC_SECTION_FINI
: sec_name
= ".fini"; break;
1742 case RELOC_SECTION_LITA
: sec_name
= ".lita"; break;
1743 case RELOC_SECTION_RCONST
: sec_name
= ".rconst"; break;
1747 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1748 if (sec
== (asection
*) NULL
)
1750 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1752 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1755 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1757 /* Let the backend select the howto field and do any other
1758 required processing. */
1759 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1762 bfd_release (abfd
, external_relocs
);
1764 section
->relocation
= internal_relocs
;
1769 /* Get a canonical list of relocs. */
1772 _bfd_ecoff_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
1780 if (section
->flags
& SEC_CONSTRUCTOR
)
1782 arelent_chain
*chain
;
1784 /* This section has relocs made up by us, not the file, so take
1785 them out of their chain and place them into the data area
1787 for (count
= 0, chain
= section
->constructor_chain
;
1788 count
< section
->reloc_count
;
1789 count
++, chain
= chain
->next
)
1790 *relptr
++ = &chain
->relent
;
1796 if (! ecoff_slurp_reloc_table (abfd
, section
, symbols
))
1799 tblptr
= section
->relocation
;
1801 for (count
= 0; count
< section
->reloc_count
; count
++)
1802 *relptr
++ = tblptr
++;
1805 *relptr
= (arelent
*) NULL
;
1807 return section
->reloc_count
;
1810 /* Provided a BFD, a section and an offset into the section, calculate
1811 and return the name of the source file and the line nearest to the
1815 _bfd_ecoff_find_nearest_line (abfd
, section
, ignore_symbols
, offset
,
1816 filename_ptr
, functionname_ptr
, retline_ptr
)
1819 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
;
1821 const char **filename_ptr
;
1822 const char **functionname_ptr
;
1823 unsigned int *retline_ptr
;
1825 const struct ecoff_debug_swap
* const debug_swap
1826 = &ecoff_backend (abfd
)->debug_swap
;
1827 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1828 struct ecoff_find_line
*line_info
;
1830 /* Make sure we have the FDR's. */
1831 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
, debug_info
)
1832 || bfd_get_symcount (abfd
) == 0)
1835 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1837 bfd_size_type amt
= sizeof (struct ecoff_find_line
);
1838 ecoff_data (abfd
)->find_line_info
1839 = (struct ecoff_find_line
*) bfd_zalloc (abfd
, amt
);
1840 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1843 line_info
= ecoff_data (abfd
)->find_line_info
;
1845 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1846 debug_swap
, line_info
, filename_ptr
,
1847 functionname_ptr
, retline_ptr
);
1850 /* Copy private BFD data. This is called by objcopy and strip. We
1851 use it to copy the ECOFF debugging information from one BFD to the
1852 other. It would be theoretically possible to represent the ECOFF
1853 debugging information in the symbol table. However, it would be a
1854 lot of work, and there would be little gain (gas, gdb, and ld
1855 already access the ECOFF debugging information via the
1856 ecoff_debug_info structure, and that structure would have to be
1857 retained in order to support ECOFF debugging in MIPS ELF).
1859 The debugging information for the ECOFF external symbols comes from
1860 the symbol table, so this function only handles the other debugging
1864 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd
, obfd
)
1868 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1869 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1871 asymbol
**sym_ptr_ptr
;
1875 /* We only want to copy information over if both BFD's use ECOFF
1877 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1878 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1881 /* Copy the GP value and the register masks. */
1882 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1883 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1884 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1885 for (i
= 0; i
< 3; i
++)
1886 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1888 /* Copy the version stamp. */
1889 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1891 /* If there are no symbols, don't copy any debugging information. */
1892 c
= bfd_get_symcount (obfd
);
1893 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1894 if (c
== 0 || sym_ptr_ptr
== (asymbol
**) NULL
)
1897 /* See if there are any local symbols. */
1899 for (; c
> 0; c
--, sym_ptr_ptr
++)
1901 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1910 /* There are some local symbols. We just bring over all the
1911 debugging information. FIXME: This is not quite the right
1912 thing to do. If the user has asked us to discard all
1913 debugging information, then we are probably going to wind up
1914 keeping it because there will probably be some local symbol
1915 which objcopy did not discard. We should actually break
1916 apart the debugging information and only keep that which
1917 applies to the symbols we want to keep. */
1918 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1919 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1920 oinfo
->line
= iinfo
->line
;
1922 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1923 oinfo
->external_dnr
= iinfo
->external_dnr
;
1925 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1926 oinfo
->external_pdr
= iinfo
->external_pdr
;
1928 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1929 oinfo
->external_sym
= iinfo
->external_sym
;
1931 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1932 oinfo
->external_opt
= iinfo
->external_opt
;
1934 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1935 oinfo
->external_aux
= iinfo
->external_aux
;
1937 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1938 oinfo
->ss
= iinfo
->ss
;
1940 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1941 oinfo
->external_fdr
= iinfo
->external_fdr
;
1943 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1944 oinfo
->external_rfd
= iinfo
->external_rfd
;
1948 /* We are discarding all the local symbol information. Look
1949 through the external symbols and remove all references to FDR
1950 or aux information. */
1951 c
= bfd_get_symcount (obfd
);
1952 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1953 for (; c
> 0; c
--, sym_ptr_ptr
++)
1957 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1958 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1960 esym
.asym
.index
= indexNil
;
1961 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1962 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1969 /* Set the architecture. The supported architecture is stored in the
1970 backend pointer. We always set the architecture anyhow, since many
1971 callers ignore the return value. */
1974 _bfd_ecoff_set_arch_mach (abfd
, arch
, machine
)
1976 enum bfd_architecture arch
;
1977 unsigned long machine
;
1979 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1980 return arch
== ecoff_backend (abfd
)->arch
;
1983 /* Get the size of the section headers. */
1986 _bfd_ecoff_sizeof_headers (abfd
, reloc
)
1988 bfd_boolean reloc ATTRIBUTE_UNUSED
;
1995 for (current
= abfd
->sections
;
1996 current
!= (asection
*)NULL
;
1997 current
= current
->next
)
2000 ret
= (bfd_coff_filhsz (abfd
)
2001 + bfd_coff_aoutsz (abfd
)
2002 + c
* bfd_coff_scnhsz (abfd
));
2003 return BFD_ALIGN (ret
, 16);
2006 /* Get the contents of a section. */
2009 _bfd_ecoff_get_section_contents (abfd
, section
, location
, offset
, count
)
2014 bfd_size_type count
;
2016 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2020 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2021 called via qsort. */
2024 ecoff_sort_hdrs (arg1
, arg2
)
2028 const asection
*hdr1
= *(const asection
**) arg1
;
2029 const asection
*hdr2
= *(const asection
**) arg2
;
2031 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
2033 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
2038 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
2041 if (hdr1
->vma
< hdr2
->vma
)
2043 else if (hdr1
->vma
> hdr2
->vma
)
2049 /* Calculate the file position for each section, and set
2053 ecoff_compute_section_file_positions (abfd
)
2056 file_ptr sofar
, file_sofar
;
2057 asection
**sorted_hdrs
;
2061 bfd_boolean rdata_in_text
;
2062 bfd_boolean first_data
, first_nonalloc
;
2063 const bfd_vma round
= ecoff_backend (abfd
)->round
;
2066 sofar
= _bfd_ecoff_sizeof_headers (abfd
, FALSE
);
2069 /* Sort the sections by VMA. */
2070 amt
= abfd
->section_count
;
2071 amt
*= sizeof (asection
*);
2072 sorted_hdrs
= (asection
**) bfd_malloc (amt
);
2073 if (sorted_hdrs
== NULL
)
2075 for (current
= abfd
->sections
, i
= 0;
2077 current
= current
->next
, i
++)
2078 sorted_hdrs
[i
] = current
;
2079 BFD_ASSERT (i
== abfd
->section_count
);
2081 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2084 /* Some versions of the OSF linker put the .rdata section in the
2085 text segment, and some do not. */
2086 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2089 for (i
= 0; i
< abfd
->section_count
; i
++)
2091 current
= sorted_hdrs
[i
];
2092 if (strcmp (current
->name
, _RDATA
) == 0)
2094 if ((current
->flags
& SEC_CODE
) == 0
2095 && strcmp (current
->name
, _PDATA
) != 0
2096 && strcmp (current
->name
, _RCONST
) != 0)
2098 rdata_in_text
= FALSE
;
2103 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2106 first_nonalloc
= TRUE
;
2107 for (i
= 0; i
< abfd
->section_count
; i
++)
2109 unsigned int alignment_power
;
2111 current
= sorted_hdrs
[i
];
2113 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2114 supposed to indicate the number of .pdata entries that are
2115 really in the section. Each entry is 8 bytes. We store this
2116 away in line_filepos before increasing the section size. */
2117 if (strcmp (current
->name
, _PDATA
) == 0)
2118 current
->line_filepos
= current
->size
/ 8;
2120 alignment_power
= current
->alignment_power
;
2122 /* On Ultrix, the data sections in an executable file must be
2123 aligned to a page boundary within the file. This does not
2124 affect the section size, though. FIXME: Does this work for
2125 other platforms? It requires some modification for the
2126 Alpha, because .rdata on the Alpha goes with the text, not
2128 if ((abfd
->flags
& EXEC_P
) != 0
2129 && (abfd
->flags
& D_PAGED
) != 0
2131 && (current
->flags
& SEC_CODE
) == 0
2133 || strcmp (current
->name
, _RDATA
) != 0)
2134 && strcmp (current
->name
, _PDATA
) != 0
2135 && strcmp (current
->name
, _RCONST
) != 0)
2137 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2138 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2141 else if (strcmp (current
->name
, _LIB
) == 0)
2143 /* On Irix 4, the location of contents of the .lib section
2144 from a shared library section is also rounded up to a
2147 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2148 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2150 else if (first_nonalloc
2151 && (current
->flags
& SEC_ALLOC
) == 0
2152 && (abfd
->flags
& D_PAGED
) != 0)
2154 /* Skip up to the next page for an unallocated section, such
2155 as the .comment section on the Alpha. This leaves room
2156 for the .bss section. */
2157 first_nonalloc
= FALSE
;
2158 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2159 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2162 /* Align the sections in the file to the same boundary on
2163 which they are aligned in virtual memory. */
2164 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2165 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2166 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2168 if ((abfd
->flags
& D_PAGED
) != 0
2169 && (current
->flags
& SEC_ALLOC
) != 0)
2171 sofar
+= (current
->vma
- sofar
) % round
;
2172 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2173 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2176 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2177 current
->filepos
= file_sofar
;
2179 sofar
+= current
->size
;
2180 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2181 file_sofar
+= current
->size
;
2183 /* Make sure that this section is of the right size too. */
2185 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2186 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2187 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2188 current
->size
+= sofar
- old_sofar
;
2194 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2199 /* Determine the location of the relocs for all the sections in the
2200 output file, as well as the location of the symbolic debugging
2203 static bfd_size_type
2204 ecoff_compute_reloc_file_positions (abfd
)
2207 const bfd_size_type external_reloc_size
=
2208 ecoff_backend (abfd
)->external_reloc_size
;
2209 file_ptr reloc_base
;
2210 bfd_size_type reloc_size
;
2214 if (! abfd
->output_has_begun
)
2216 if (! ecoff_compute_section_file_positions (abfd
))
2218 abfd
->output_has_begun
= TRUE
;
2221 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2224 for (current
= abfd
->sections
;
2225 current
!= (asection
*)NULL
;
2226 current
= current
->next
)
2228 if (current
->reloc_count
== 0)
2229 current
->rel_filepos
= 0;
2232 bfd_size_type relsize
;
2234 current
->rel_filepos
= reloc_base
;
2235 relsize
= current
->reloc_count
* external_reloc_size
;
2236 reloc_size
+= relsize
;
2237 reloc_base
+= relsize
;
2241 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2243 /* At least on Ultrix, the symbol table of an executable file must
2244 be aligned to a page boundary. FIXME: Is this true on other
2246 if ((abfd
->flags
& EXEC_P
) != 0
2247 && (abfd
->flags
& D_PAGED
) != 0)
2248 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2249 &~ (ecoff_backend (abfd
)->round
- 1));
2251 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2256 /* Set the contents of a section. */
2259 _bfd_ecoff_set_section_contents (abfd
, section
, location
, offset
, count
)
2264 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
)
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 pos
= section
->filepos
+ offset
;
2297 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2298 || bfd_bwrite (location
, count
, abfd
) != count
)
2304 /* Get the GP value for an ECOFF file. This is a hook used by
2308 bfd_ecoff_get_gp_value (abfd
)
2311 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2312 || bfd_get_format (abfd
) != bfd_object
)
2314 bfd_set_error (bfd_error_invalid_operation
);
2318 return ecoff_data (abfd
)->gp
;
2321 /* Set the GP value for an ECOFF file. This is a hook used by the
2325 bfd_ecoff_set_gp_value (abfd
, gp_value
)
2329 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2330 || bfd_get_format (abfd
) != bfd_object
)
2332 bfd_set_error (bfd_error_invalid_operation
);
2336 ecoff_data (abfd
)->gp
= gp_value
;
2341 /* Set the register masks for an ECOFF file. This is a hook used by
2345 bfd_ecoff_set_regmasks (abfd
, gprmask
, fprmask
, cprmask
)
2347 unsigned long gprmask
;
2348 unsigned long fprmask
;
2349 unsigned long *cprmask
;
2351 ecoff_data_type
*tdata
;
2353 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2354 || bfd_get_format (abfd
) != bfd_object
)
2356 bfd_set_error (bfd_error_invalid_operation
);
2360 tdata
= ecoff_data (abfd
);
2361 tdata
->gprmask
= gprmask
;
2362 tdata
->fprmask
= fprmask
;
2363 if (cprmask
!= (unsigned long *) NULL
)
2367 for (i
= 0; i
< 3; i
++)
2368 tdata
->cprmask
[i
] = cprmask
[i
];
2374 /* Get ECOFF EXTR information for an external symbol. This function
2375 is passed to bfd_ecoff_debug_externals. */
2378 ecoff_get_extr (sym
, esym
)
2382 ecoff_symbol_type
*ecoff_sym_ptr
;
2385 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2386 || ecoffsymbol (sym
)->native
== NULL
)
2388 /* Don't include debugging, local, or section symbols. */
2389 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2390 || (sym
->flags
& BSF_LOCAL
) != 0
2391 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2395 esym
->cobol_main
= 0;
2396 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2399 /* FIXME: we can do better than this for st and sc. */
2400 esym
->asym
.st
= stGlobal
;
2401 esym
->asym
.sc
= scAbs
;
2402 esym
->asym
.reserved
= 0;
2403 esym
->asym
.index
= indexNil
;
2407 ecoff_sym_ptr
= ecoffsymbol (sym
);
2409 if (ecoff_sym_ptr
->local
)
2412 input_bfd
= bfd_asymbol_bfd (sym
);
2413 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2414 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2416 /* If the symbol was defined by the linker, then esym will be
2417 undefined but sym will not be. Get a better class for such a
2419 if ((esym
->asym
.sc
== scUndefined
2420 || esym
->asym
.sc
== scSUndefined
)
2421 && ! bfd_is_und_section (bfd_get_section (sym
)))
2422 esym
->asym
.sc
= scAbs
;
2424 /* Adjust the FDR index for the symbol by that used for the input
2426 if (esym
->ifd
!= -1)
2428 struct ecoff_debug_info
*input_debug
;
2430 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2431 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2432 if (input_debug
->ifdmap
!= (RFDT
*) NULL
)
2433 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2439 /* Set the external symbol index. This routine is passed to
2440 bfd_ecoff_debug_externals. */
2443 ecoff_set_index (sym
, indx
)
2447 ecoff_set_sym_index (sym
, indx
);
2450 /* Write out an ECOFF file. */
2453 _bfd_ecoff_write_object_contents (abfd
)
2456 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2457 const bfd_vma round
= backend
->round
;
2458 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2459 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2460 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2461 const bfd_size_type external_hdr_size
2462 = backend
->debug_swap
.external_hdr_size
;
2463 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2464 void (* const adjust_reloc_out
)
2465 PARAMS ((bfd
*, const arelent
*, struct internal_reloc
*))
2466 = backend
->adjust_reloc_out
;
2467 void (* const swap_reloc_out
)
2468 PARAMS ((bfd
*, const struct internal_reloc
*, PTR
))
2469 = backend
->swap_reloc_out
;
2470 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2471 HDRR
* const symhdr
= &debug
->symbolic_header
;
2474 bfd_size_type reloc_size
;
2475 bfd_size_type text_size
;
2477 bfd_boolean set_text_start
;
2478 bfd_size_type data_size
;
2480 bfd_boolean set_data_start
;
2481 bfd_size_type bss_size
;
2483 PTR reloc_buff
= NULL
;
2484 struct internal_filehdr internal_f
;
2485 struct internal_aouthdr internal_a
;
2488 /* Determine where the sections and relocs will go in the output
2490 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2493 for (current
= abfd
->sections
;
2494 current
!= (asection
*)NULL
;
2495 current
= current
->next
)
2497 current
->target_index
= count
;
2501 if ((abfd
->flags
& D_PAGED
) != 0)
2502 text_size
= _bfd_ecoff_sizeof_headers (abfd
, FALSE
);
2506 set_text_start
= FALSE
;
2509 set_data_start
= FALSE
;
2512 /* Write section headers to the file. */
2514 /* Allocate buff big enough to hold a section header,
2515 file header, or a.out header. */
2523 buff
= (PTR
) bfd_malloc (siz
);
2528 internal_f
.f_nscns
= 0;
2529 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2531 for (current
= abfd
->sections
;
2532 current
!= (asection
*) NULL
;
2533 current
= current
->next
)
2535 struct internal_scnhdr section
;
2538 ++internal_f
.f_nscns
;
2540 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2542 /* This seems to be correct for Irix 4 shared libraries. */
2543 vma
= bfd_get_section_vma (abfd
, current
);
2544 if (strcmp (current
->name
, _LIB
) == 0)
2545 section
.s_vaddr
= 0;
2547 section
.s_vaddr
= vma
;
2549 section
.s_paddr
= current
->lma
;
2550 section
.s_size
= current
->size
;
2552 /* If this section is unloadable then the scnptr will be 0. */
2553 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2554 section
.s_scnptr
= 0;
2556 section
.s_scnptr
= current
->filepos
;
2557 section
.s_relptr
= current
->rel_filepos
;
2559 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2560 object file produced by the assembler is supposed to point to
2561 information about how much room is required by objects of
2562 various different sizes. I think this only matters if we
2563 want the linker to compute the best size to use, or
2564 something. I don't know what happens if the information is
2566 if (strcmp (current
->name
, _PDATA
) != 0)
2567 section
.s_lnnoptr
= 0;
2570 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2571 hold the number of entries in the section (each entry is
2572 8 bytes). We stored this in the line_filepos field in
2573 ecoff_compute_section_file_positions. */
2574 section
.s_lnnoptr
= current
->line_filepos
;
2577 section
.s_nreloc
= current
->reloc_count
;
2578 section
.s_nlnno
= 0;
2579 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2582 if (bfd_coff_swap_scnhdr_out (abfd
, (PTR
) §ion
, buff
) == 0
2583 || bfd_bwrite (buff
, scnhsz
, abfd
) != scnhsz
)
2586 if ((section
.s_flags
& STYP_TEXT
) != 0
2587 || ((section
.s_flags
& STYP_RDATA
) != 0
2588 && ecoff_data (abfd
)->rdata_in_text
)
2589 || section
.s_flags
== STYP_PDATA
2590 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2591 || (section
.s_flags
& STYP_LIBLIST
) != 0
2592 || (section
.s_flags
& STYP_RELDYN
) != 0
2593 || section
.s_flags
== STYP_CONFLIC
2594 || (section
.s_flags
& STYP_DYNSTR
) != 0
2595 || (section
.s_flags
& STYP_DYNSYM
) != 0
2596 || (section
.s_flags
& STYP_HASH
) != 0
2597 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2598 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2599 || section
.s_flags
== STYP_RCONST
)
2601 text_size
+= current
->size
;
2602 if (! set_text_start
|| text_start
> vma
)
2605 set_text_start
= TRUE
;
2608 else if ((section
.s_flags
& STYP_RDATA
) != 0
2609 || (section
.s_flags
& STYP_DATA
) != 0
2610 || (section
.s_flags
& STYP_LITA
) != 0
2611 || (section
.s_flags
& STYP_LIT8
) != 0
2612 || (section
.s_flags
& STYP_LIT4
) != 0
2613 || (section
.s_flags
& STYP_SDATA
) != 0
2614 || section
.s_flags
== STYP_XDATA
2615 || (section
.s_flags
& STYP_GOT
) != 0)
2617 data_size
+= current
->size
;
2618 if (! set_data_start
|| data_start
> vma
)
2621 set_data_start
= TRUE
;
2624 else if ((section
.s_flags
& STYP_BSS
) != 0
2625 || (section
.s_flags
& STYP_SBSS
) != 0)
2626 bss_size
+= current
->size
;
2627 else if (section
.s_flags
== 0
2628 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2629 || section
.s_flags
== STYP_COMMENT
)
2635 /* Set up the file header. */
2636 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2638 /* We will NOT put a fucking timestamp in the header here. Every
2639 time you put it back, I will come in and take it out again. I'm
2640 sorry. This field does not belong here. We fill it with a 0 so
2641 it compares the same but is not a reasonable time. --
2643 internal_f
.f_timdat
= 0;
2645 if (bfd_get_symcount (abfd
) != 0)
2647 /* The ECOFF f_nsyms field is not actually the number of
2648 symbols, it's the size of symbolic information header. */
2649 internal_f
.f_nsyms
= external_hdr_size
;
2650 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2654 internal_f
.f_nsyms
= 0;
2655 internal_f
.f_symptr
= 0;
2658 internal_f
.f_opthdr
= aoutsz
;
2660 internal_f
.f_flags
= F_LNNO
;
2661 if (reloc_size
== 0)
2662 internal_f
.f_flags
|= F_RELFLG
;
2663 if (bfd_get_symcount (abfd
) == 0)
2664 internal_f
.f_flags
|= F_LSYMS
;
2665 if (abfd
->flags
& EXEC_P
)
2666 internal_f
.f_flags
|= F_EXEC
;
2668 if (bfd_little_endian (abfd
))
2669 internal_f
.f_flags
|= F_AR32WR
;
2671 internal_f
.f_flags
|= F_AR32W
;
2673 /* Set up the ``optional'' header. */
2674 if ((abfd
->flags
& D_PAGED
) != 0)
2675 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2677 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2679 /* FIXME: Is this really correct? */
2680 internal_a
.vstamp
= symhdr
->vstamp
;
2682 /* At least on Ultrix, these have to be rounded to page boundaries.
2683 FIXME: Is this true on other platforms? */
2684 if ((abfd
->flags
& D_PAGED
) != 0)
2686 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2687 internal_a
.text_start
= text_start
&~ (round
- 1);
2688 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2689 internal_a
.data_start
= data_start
&~ (round
- 1);
2693 internal_a
.tsize
= text_size
;
2694 internal_a
.text_start
= text_start
;
2695 internal_a
.dsize
= data_size
;
2696 internal_a
.data_start
= data_start
;
2699 /* On Ultrix, the initial portions of the .sbss and .bss segments
2700 are at the end of the data section. The bsize field in the
2701 optional header records how many bss bytes are required beyond
2702 those in the data section. The value is not rounded to a page
2704 if (bss_size
< internal_a
.dsize
- data_size
)
2707 bss_size
-= internal_a
.dsize
- data_size
;
2708 internal_a
.bsize
= bss_size
;
2709 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2711 internal_a
.entry
= bfd_get_start_address (abfd
);
2713 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2715 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2716 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2717 for (i
= 0; i
< 4; i
++)
2718 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2720 /* Let the backend adjust the headers if necessary. */
2721 if (backend
->adjust_headers
)
2723 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2727 /* Write out the file header and the optional header. */
2728 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2731 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, buff
);
2732 if (bfd_bwrite (buff
, filhsz
, abfd
) != filhsz
)
2735 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) &internal_a
, buff
);
2736 if (bfd_bwrite (buff
, aoutsz
, abfd
) != aoutsz
)
2739 /* Build the external symbol information. This must be done before
2740 writing out the relocs so that we know the symbol indices. We
2741 don't do this if this BFD was created by the backend linker,
2742 since it will have already handled the symbols and relocs. */
2743 if (! ecoff_data (abfd
)->linker
)
2745 symhdr
->iextMax
= 0;
2746 symhdr
->issExtMax
= 0;
2747 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2748 debug
->ssext
= debug
->ssext_end
= NULL
;
2749 if (! bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2750 (abfd
->flags
& EXEC_P
) == 0,
2751 ecoff_get_extr
, ecoff_set_index
))
2754 /* Write out the relocs. */
2755 for (current
= abfd
->sections
;
2756 current
!= (asection
*) NULL
;
2757 current
= current
->next
)
2759 arelent
**reloc_ptr_ptr
;
2760 arelent
**reloc_end
;
2764 if (current
->reloc_count
== 0)
2767 amt
= current
->reloc_count
* external_reloc_size
;
2768 reloc_buff
= bfd_alloc (abfd
, amt
);
2769 if (reloc_buff
== NULL
)
2772 reloc_ptr_ptr
= current
->orelocation
;
2773 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2774 out_ptr
= (char *) reloc_buff
;
2776 reloc_ptr_ptr
< reloc_end
;
2777 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2781 struct internal_reloc in
;
2783 memset ((PTR
) &in
, 0, sizeof in
);
2785 reloc
= *reloc_ptr_ptr
;
2786 sym
= *reloc
->sym_ptr_ptr
;
2788 in
.r_vaddr
= (reloc
->address
2789 + bfd_get_section_vma (abfd
, current
));
2790 in
.r_type
= reloc
->howto
->type
;
2792 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2794 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2801 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2802 if (strcmp (name
, ".text") == 0)
2803 in
.r_symndx
= RELOC_SECTION_TEXT
;
2804 else if (strcmp (name
, ".rdata") == 0)
2805 in
.r_symndx
= RELOC_SECTION_RDATA
;
2806 else if (strcmp (name
, ".data") == 0)
2807 in
.r_symndx
= RELOC_SECTION_DATA
;
2808 else if (strcmp (name
, ".sdata") == 0)
2809 in
.r_symndx
= RELOC_SECTION_SDATA
;
2810 else if (strcmp (name
, ".sbss") == 0)
2811 in
.r_symndx
= RELOC_SECTION_SBSS
;
2812 else if (strcmp (name
, ".bss") == 0)
2813 in
.r_symndx
= RELOC_SECTION_BSS
;
2814 else if (strcmp (name
, ".init") == 0)
2815 in
.r_symndx
= RELOC_SECTION_INIT
;
2816 else if (strcmp (name
, ".lit8") == 0)
2817 in
.r_symndx
= RELOC_SECTION_LIT8
;
2818 else if (strcmp (name
, ".lit4") == 0)
2819 in
.r_symndx
= RELOC_SECTION_LIT4
;
2820 else if (strcmp (name
, ".xdata") == 0)
2821 in
.r_symndx
= RELOC_SECTION_XDATA
;
2822 else if (strcmp (name
, ".pdata") == 0)
2823 in
.r_symndx
= RELOC_SECTION_PDATA
;
2824 else if (strcmp (name
, ".fini") == 0)
2825 in
.r_symndx
= RELOC_SECTION_FINI
;
2826 else if (strcmp (name
, ".lita") == 0)
2827 in
.r_symndx
= RELOC_SECTION_LITA
;
2828 else if (strcmp (name
, "*ABS*") == 0)
2829 in
.r_symndx
= RELOC_SECTION_ABS
;
2830 else if (strcmp (name
, ".rconst") == 0)
2831 in
.r_symndx
= RELOC_SECTION_RCONST
;
2837 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2839 (*swap_reloc_out
) (abfd
, &in
, (PTR
) out_ptr
);
2842 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2844 amt
= current
->reloc_count
* external_reloc_size
;
2845 if (bfd_bwrite (reloc_buff
, amt
, abfd
) != amt
)
2847 bfd_release (abfd
, reloc_buff
);
2851 /* Write out the symbolic debugging information. */
2852 if (bfd_get_symcount (abfd
) > 0)
2854 /* Write out the debugging information. */
2855 if (! bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2856 ecoff_data (abfd
)->sym_filepos
))
2861 /* The .bss section of a demand paged executable must receive an
2862 entire page. If there are symbols, the symbols will start on the
2863 next page. If there are no symbols, we must fill out the page by
2865 if (bfd_get_symcount (abfd
) == 0
2866 && (abfd
->flags
& EXEC_P
) != 0
2867 && (abfd
->flags
& D_PAGED
) != 0)
2871 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2874 if (bfd_bread (&c
, (bfd_size_type
) 1, abfd
) == 0)
2876 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2879 if (bfd_bwrite (&c
, (bfd_size_type
) 1, abfd
) != 1)
2883 if (reloc_buff
!= NULL
)
2884 bfd_release (abfd
, reloc_buff
);
2889 if (reloc_buff
!= NULL
)
2890 bfd_release (abfd
, reloc_buff
);
2896 /* Archive handling. ECOFF uses what appears to be a unique type of
2897 archive header (armap). The byte ordering of the armap and the
2898 contents are encoded in the name of the armap itself. At least for
2899 now, we only support archives with the same byte ordering in the
2900 armap and the contents.
2902 The first four bytes in the armap are the number of symbol
2903 definitions. This is always a power of two.
2905 This is followed by the symbol definitions. Each symbol definition
2906 occupies 8 bytes. The first four bytes are the offset from the
2907 start of the armap strings to the null-terminated string naming
2908 this symbol. The second four bytes are the file offset to the
2909 archive member which defines this symbol. If the second four bytes
2910 are 0, then this is not actually a symbol definition, and it should
2913 The symbols are hashed into the armap with a closed hashing scheme.
2914 See the functions below for the details of the algorithm.
2916 After the symbol definitions comes four bytes holding the size of
2917 the string table, followed by the string table itself. */
2919 /* The name of an archive headers looks like this:
2920 __________E[BL]E[BL]_ (with a trailing space).
2921 The trailing space is changed to an X if the archive is changed to
2922 indicate that the armap is out of date.
2924 The Alpha seems to use ________64E[BL]E[BL]_. */
2926 #define ARMAP_BIG_ENDIAN 'B'
2927 #define ARMAP_LITTLE_ENDIAN 'L'
2928 #define ARMAP_MARKER 'E'
2929 #define ARMAP_START_LENGTH 10
2930 #define ARMAP_HEADER_MARKER_INDEX 10
2931 #define ARMAP_HEADER_ENDIAN_INDEX 11
2932 #define ARMAP_OBJECT_MARKER_INDEX 12
2933 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2934 #define ARMAP_END_INDEX 14
2935 #define ARMAP_END "_ "
2937 /* This is a magic number used in the hashing algorithm. */
2938 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2940 /* This returns the hash value to use for a string. It also sets
2941 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2942 is the number of entries in the hash table, and HLOG is the log
2946 ecoff_armap_hash (s
, rehash
, size
, hlog
)
2948 unsigned int *rehash
;
2958 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2959 hash
*= ARMAP_HASH_MAGIC
;
2960 *rehash
= (hash
& (size
- 1)) | 1;
2961 return hash
>> (32 - hlog
);
2964 /* Read in the armap. */
2967 _bfd_ecoff_slurp_armap (abfd
)
2972 struct areltdata
*mapdata
;
2973 bfd_size_type parsed_size
;
2975 struct artdata
*ardata
;
2978 struct symdef
*symdef_ptr
;
2982 /* Get the name of the first element. */
2983 i
= bfd_bread ((PTR
) nextname
, (bfd_size_type
) 16, abfd
);
2989 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2992 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2993 standard COFF armap. We could move the ECOFF armap stuff into
2994 bfd_slurp_armap, but that seems inappropriate since no other
2995 target uses this format. Instead, we check directly for a COFF
2997 if (strncmp (nextname
, "/ ", 16) == 0)
2998 return bfd_slurp_armap (abfd
);
3000 /* See if the first element is an armap. */
3001 if (strncmp (nextname
, ecoff_backend (abfd
)->armap_start
,
3002 ARMAP_START_LENGTH
) != 0
3003 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
3004 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3005 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3006 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
3007 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3008 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3009 || strncmp (nextname
+ ARMAP_END_INDEX
,
3010 ARMAP_END
, sizeof ARMAP_END
- 1) != 0)
3012 bfd_has_map (abfd
) = FALSE
;
3016 /* Make sure we have the right byte ordering. */
3017 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3018 ^ (bfd_header_big_endian (abfd
)))
3019 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3020 ^ (bfd_big_endian (abfd
))))
3022 bfd_set_error (bfd_error_wrong_format
);
3026 /* Read in the armap. */
3027 ardata
= bfd_ardata (abfd
);
3028 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
3029 if (mapdata
== (struct areltdata
*) NULL
)
3031 parsed_size
= mapdata
->parsed_size
;
3032 bfd_release (abfd
, (PTR
) mapdata
);
3034 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
3035 if (raw_armap
== (char *) NULL
)
3038 if (bfd_bread ((PTR
) raw_armap
, parsed_size
, abfd
) != parsed_size
)
3040 if (bfd_get_error () != bfd_error_system_call
)
3041 bfd_set_error (bfd_error_malformed_archive
);
3042 bfd_release (abfd
, (PTR
) raw_armap
);
3046 ardata
->tdata
= (PTR
) raw_armap
;
3048 count
= H_GET_32 (abfd
, raw_armap
);
3050 ardata
->symdef_count
= 0;
3051 ardata
->cache
= (struct ar_cache
*) NULL
;
3053 /* This code used to overlay the symdefs over the raw archive data,
3054 but that doesn't work on a 64 bit host. */
3055 stringbase
= raw_armap
+ count
* 8 + 8;
3057 #ifdef CHECK_ARMAP_HASH
3061 /* Double check that I have the hashing algorithm right by making
3062 sure that every symbol can be looked up successfully. */
3064 for (i
= 1; i
< count
; i
<<= 1)
3066 BFD_ASSERT (i
== count
);
3068 raw_ptr
= raw_armap
+ 4;
3069 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3071 unsigned int name_offset
, file_offset
;
3072 unsigned int hash
, rehash
, srch
;
3074 name_offset
= H_GET_32 (abfd
, raw_ptr
);
3075 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
3076 if (file_offset
== 0)
3078 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
3083 /* See if we can rehash to this location. */
3084 for (srch
= (hash
+ rehash
) & (count
- 1);
3085 srch
!= hash
&& srch
!= i
;
3086 srch
= (srch
+ rehash
) & (count
- 1))
3087 BFD_ASSERT (H_GET_32 (abfd
, (raw_armap
+ 8 + srch
* 8)) != 0);
3088 BFD_ASSERT (srch
== i
);
3092 #endif /* CHECK_ARMAP_HASH */
3094 raw_ptr
= raw_armap
+ 4;
3095 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3096 if (H_GET_32 (abfd
, (raw_ptr
+ 4)) != 0)
3097 ++ardata
->symdef_count
;
3099 amt
= ardata
->symdef_count
;
3100 amt
*= sizeof (struct symdef
);
3101 symdef_ptr
= (struct symdef
*) bfd_alloc (abfd
, amt
);
3105 ardata
->symdefs
= (carsym
*) symdef_ptr
;
3107 raw_ptr
= raw_armap
+ 4;
3108 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3110 unsigned int name_offset
, file_offset
;
3112 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
3113 if (file_offset
== 0)
3115 name_offset
= H_GET_32 (abfd
, raw_ptr
);
3116 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
3117 symdef_ptr
->file_offset
= file_offset
;
3121 ardata
->first_file_filepos
= bfd_tell (abfd
);
3122 /* Pad to an even boundary. */
3123 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3125 bfd_has_map (abfd
) = TRUE
;
3130 /* Write out an armap. */
3133 _bfd_ecoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
3135 unsigned int elength
;
3137 unsigned int orl_count
;
3140 unsigned int hashsize
, hashlog
;
3141 bfd_size_type symdefsize
;
3143 unsigned int stringsize
;
3144 unsigned int mapsize
;
3147 struct stat statbuf
;
3150 bfd_byte
*hashtable
;
3154 /* Ultrix appears to use as a hash table size the least power of two
3155 greater than twice the number of entries. */
3156 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3158 hashsize
= 1 << hashlog
;
3160 symdefsize
= hashsize
* 8;
3162 stringsize
= stridx
+ padit
;
3164 /* Include 8 bytes to store symdefsize and stringsize in output. */
3165 mapsize
= symdefsize
+ stringsize
+ 8;
3167 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3169 memset ((PTR
) &hdr
, 0, sizeof hdr
);
3171 /* Work out the ECOFF armap name. */
3172 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3173 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3174 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3175 (bfd_header_big_endian (abfd
)
3177 : ARMAP_LITTLE_ENDIAN
);
3178 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3179 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3180 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3181 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3183 /* Write the timestamp of the archive header to be just a little bit
3184 later than the timestamp of the file, otherwise the linker will
3185 complain that the index is out of date. Actually, the Ultrix
3186 linker just checks the archive name; the GNU linker may check the
3188 stat (abfd
->filename
, &statbuf
);
3189 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3191 /* The DECstation uses zeroes for the uid, gid and mode of the
3193 hdr
.ar_uid
[0] = '0';
3194 hdr
.ar_gid
[0] = '0';
3196 hdr
.ar_mode
[0] = '0';
3198 /* Building gcc ends up extracting the armap as a file - twice. */
3199 hdr
.ar_mode
[0] = '6';
3200 hdr
.ar_mode
[1] = '4';
3201 hdr
.ar_mode
[2] = '4';
3204 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3206 hdr
.ar_fmag
[0] = '`';
3207 hdr
.ar_fmag
[1] = '\012';
3209 /* Turn all null bytes in the header into spaces. */
3210 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3211 if (((char *) (&hdr
))[i
] == '\0')
3212 (((char *) (&hdr
))[i
]) = ' ';
3214 if (bfd_bwrite ((PTR
) &hdr
, (bfd_size_type
) sizeof (struct ar_hdr
), abfd
)
3215 != sizeof (struct ar_hdr
))
3218 H_PUT_32 (abfd
, hashsize
, temp
);
3219 if (bfd_bwrite ((PTR
) temp
, (bfd_size_type
) 4, abfd
) != 4)
3222 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3226 current
= abfd
->archive_head
;
3228 for (i
= 0; i
< orl_count
; i
++)
3230 unsigned int hash
, rehash
;
3232 /* Advance firstreal to the file position of this archive
3234 if (map
[i
].u
.abfd
!= last_elt
)
3238 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3239 firstreal
+= firstreal
% 2;
3240 current
= current
->next
;
3242 while (current
!= map
[i
].u
.abfd
);
3247 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3248 if (H_GET_32 (abfd
, (hashtable
+ (hash
* 8) + 4)) != 0)
3252 /* The desired slot is already taken. */
3253 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3255 srch
= (srch
+ rehash
) & (hashsize
- 1))
3256 if (H_GET_32 (abfd
, (hashtable
+ (srch
* 8) + 4)) == 0)
3259 BFD_ASSERT (srch
!= hash
);
3264 H_PUT_32 (abfd
, map
[i
].namidx
, (hashtable
+ hash
* 8));
3265 H_PUT_32 (abfd
, firstreal
, (hashtable
+ hash
* 8 + 4));
3268 if (bfd_bwrite ((PTR
) hashtable
, symdefsize
, abfd
) != symdefsize
)
3271 bfd_release (abfd
, hashtable
);
3273 /* Now write the strings. */
3274 H_PUT_32 (abfd
, stringsize
, temp
);
3275 if (bfd_bwrite ((PTR
) temp
, (bfd_size_type
) 4, abfd
) != 4)
3277 for (i
= 0; i
< orl_count
; i
++)
3281 len
= strlen (*map
[i
].name
) + 1;
3282 if (bfd_bwrite ((PTR
) (*map
[i
].name
), len
, abfd
) != len
)
3286 /* The spec sez this should be a newline. But in order to be
3287 bug-compatible for DECstation ar we use a null. */
3290 if (bfd_bwrite ("", (bfd_size_type
) 1, abfd
) != 1)
3297 /* See whether this BFD is an archive. If it is, read in the armap
3298 and the extended name table. */
3301 _bfd_ecoff_archive_p (abfd
)
3304 struct artdata
*tdata_hold
;
3305 char armag
[SARMAG
+ 1];
3308 if (bfd_bread ((PTR
) armag
, (bfd_size_type
) SARMAG
, abfd
) != SARMAG
)
3310 if (bfd_get_error () != bfd_error_system_call
)
3311 bfd_set_error (bfd_error_wrong_format
);
3312 return (const bfd_target
*) NULL
;
3315 if (strncmp (armag
, ARMAG
, SARMAG
) != 0)
3317 bfd_set_error (bfd_error_wrong_format
);
3321 tdata_hold
= bfd_ardata (abfd
);
3323 amt
= sizeof (struct artdata
);
3324 bfd_ardata (abfd
) = (struct artdata
*) bfd_zalloc (abfd
, amt
);
3325 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
3327 bfd_ardata (abfd
) = tdata_hold
;
3328 return (const bfd_target
*) NULL
;
3331 bfd_ardata (abfd
)->first_file_filepos
= SARMAG
;
3332 bfd_ardata (abfd
)->cache
= NULL
;
3333 bfd_ardata (abfd
)->archive_head
= NULL
;
3334 bfd_ardata (abfd
)->symdefs
= NULL
;
3335 bfd_ardata (abfd
)->extended_names
= NULL
;
3336 bfd_ardata (abfd
)->tdata
= NULL
;
3338 if (! _bfd_ecoff_slurp_armap (abfd
)
3339 || ! _bfd_ecoff_slurp_extended_name_table (abfd
))
3341 bfd_release (abfd
, bfd_ardata (abfd
));
3342 bfd_ardata (abfd
) = tdata_hold
;
3343 return (const bfd_target
*) NULL
;
3346 if (bfd_has_map (abfd
))
3350 /* This archive has a map, so we may presume that the contents
3351 are object files. Make sure that if the first file in the
3352 archive can be recognized as an object file, it is for this
3353 target. If not, assume that this is the wrong format. If
3354 the first file is not an object file, somebody is doing
3355 something weird, and we permit it so that ar -t will work. */
3357 first
= bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
);
3360 first
->target_defaulted
= FALSE
;
3361 if (bfd_check_format (first
, bfd_object
)
3362 && first
->xvec
!= abfd
->xvec
)
3365 /* We ought to close `first' here, but we can't, because
3366 we have no way to remove it from the archive cache.
3367 It's close to impossible to figure out when we can
3368 release bfd_ardata. FIXME. */
3369 (void) bfd_close (first
);
3370 bfd_release (abfd
, bfd_ardata (abfd
));
3372 bfd_set_error (bfd_error_wrong_object_format
);
3373 bfd_ardata (abfd
) = tdata_hold
;
3376 /* And we ought to close `first' here too. */
3383 /* ECOFF linker code. */
3385 static struct bfd_hash_entry
*ecoff_link_hash_newfunc
3386 PARAMS ((struct bfd_hash_entry
*entry
,
3387 struct bfd_hash_table
*table
,
3388 const char *string
));
3389 static bfd_boolean ecoff_link_add_archive_symbols
3390 PARAMS ((bfd
*, struct bfd_link_info
*));
3391 static bfd_boolean ecoff_link_check_archive_element
3392 PARAMS ((bfd
*, struct bfd_link_info
*, bfd_boolean
*pneeded
));
3393 static bfd_boolean ecoff_link_add_object_symbols
3394 PARAMS ((bfd
*, struct bfd_link_info
*));
3395 static bfd_boolean ecoff_link_add_externals
3396 PARAMS ((bfd
*, struct bfd_link_info
*, PTR
, char *));
3398 /* Routine to create an entry in an ECOFF link hash table. */
3400 static struct bfd_hash_entry
*
3401 ecoff_link_hash_newfunc (entry
, table
, string
)
3402 struct bfd_hash_entry
*entry
;
3403 struct bfd_hash_table
*table
;
3406 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3408 /* Allocate the structure if it has not already been allocated by a
3410 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3411 ret
= ((struct ecoff_link_hash_entry
*)
3412 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3413 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3416 /* Call the allocation method of the superclass. */
3417 ret
= ((struct ecoff_link_hash_entry
*)
3418 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3423 /* Set local fields. */
3429 memset ((PTR
) &ret
->esym
, 0, sizeof ret
->esym
);
3431 return (struct bfd_hash_entry
*) ret
;
3434 /* Create an ECOFF link hash table. */
3436 struct bfd_link_hash_table
*
3437 _bfd_ecoff_bfd_link_hash_table_create (abfd
)
3440 struct ecoff_link_hash_table
*ret
;
3441 bfd_size_type amt
= sizeof (struct ecoff_link_hash_table
);
3443 ret
= (struct ecoff_link_hash_table
*) bfd_malloc (amt
);
3446 if (! _bfd_link_hash_table_init (&ret
->root
, abfd
,
3447 ecoff_link_hash_newfunc
))
3450 return (struct bfd_link_hash_table
*) NULL
;
3455 /* Look up an entry in an ECOFF link hash table. */
3457 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3458 ((struct ecoff_link_hash_entry *) \
3459 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3461 /* Traverse an ECOFF link hash table. */
3463 #define ecoff_link_hash_traverse(table, func, info) \
3464 (bfd_link_hash_traverse \
3466 (bfd_boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3469 /* Get the ECOFF link hash table from the info structure. This is
3472 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3474 /* Given an ECOFF BFD, add symbols to the global hash table as
3478 _bfd_ecoff_bfd_link_add_symbols (abfd
, info
)
3480 struct bfd_link_info
*info
;
3482 switch (bfd_get_format (abfd
))
3485 return ecoff_link_add_object_symbols (abfd
, info
);
3487 return ecoff_link_add_archive_symbols (abfd
, info
);
3489 bfd_set_error (bfd_error_wrong_format
);
3494 /* Add the symbols from an archive file to the global hash table.
3495 This looks through the undefined symbols, looks each one up in the
3496 archive hash table, and adds any associated object file. We do not
3497 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3498 already have a hash table, so there is no reason to construct
3502 ecoff_link_add_archive_symbols (abfd
, info
)
3504 struct bfd_link_info
*info
;
3506 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3507 const bfd_byte
*raw_armap
;
3508 struct bfd_link_hash_entry
**pundef
;
3509 unsigned int armap_count
;
3510 unsigned int armap_log
;
3512 const bfd_byte
*hashtable
;
3513 const char *stringbase
;
3515 if (! bfd_has_map (abfd
))
3517 /* An empty archive is a special case. */
3518 if (bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
) == NULL
)
3520 bfd_set_error (bfd_error_no_armap
);
3524 /* If we don't have any raw data for this archive, as can happen on
3525 Irix 4.0.5F, we call the generic routine.
3526 FIXME: We should be more clever about this, since someday tdata
3527 may get to something for a generic archive. */
3528 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3529 if (raw_armap
== (bfd_byte
*) NULL
)
3530 return (_bfd_generic_link_add_archive_symbols
3531 (abfd
, info
, ecoff_link_check_archive_element
));
3533 armap_count
= H_GET_32 (abfd
, raw_armap
);
3536 for (i
= 1; i
< armap_count
; i
<<= 1)
3538 BFD_ASSERT (i
== armap_count
);
3540 hashtable
= raw_armap
+ 4;
3541 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3543 /* Look through the list of undefined symbols. */
3544 pundef
= &info
->hash
->undefs
;
3545 while (*pundef
!= (struct bfd_link_hash_entry
*) NULL
)
3547 struct bfd_link_hash_entry
*h
;
3548 unsigned int hash
, rehash
;
3549 unsigned int file_offset
;
3555 /* When a symbol is defined, it is not necessarily removed from
3557 if (h
->type
!= bfd_link_hash_undefined
3558 && h
->type
!= bfd_link_hash_common
)
3560 /* Remove this entry from the list, for general cleanliness
3561 and because we are going to look through the list again
3562 if we search any more libraries. We can't remove the
3563 entry if it is the tail, because that would lose any
3564 entries we add to the list later on. */
3565 if (*pundef
!= info
->hash
->undefs_tail
)
3566 *pundef
= (*pundef
)->u
.undef
.next
;
3568 pundef
= &(*pundef
)->u
.undef
.next
;
3572 /* Native ECOFF linkers do not pull in archive elements merely
3573 to satisfy common definitions, so neither do we. We leave
3574 them on the list, though, in case we are linking against some
3575 other object format. */
3576 if (h
->type
!= bfd_link_hash_undefined
)
3578 pundef
= &(*pundef
)->u
.undef
.next
;
3582 /* Look for this symbol in the archive hash table. */
3583 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3586 file_offset
= H_GET_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3587 if (file_offset
== 0)
3589 /* Nothing in this slot. */
3590 pundef
= &(*pundef
)->u
.undef
.next
;
3594 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (hash
* 8));
3595 if (name
[0] != h
->root
.string
[0]
3596 || strcmp (name
, h
->root
.string
) != 0)
3601 /* That was the wrong symbol. Try rehashing. */
3603 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3605 srch
= (srch
+ rehash
) & (armap_count
- 1))
3607 file_offset
= H_GET_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3608 if (file_offset
== 0)
3610 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (srch
* 8));
3611 if (name
[0] == h
->root
.string
[0]
3612 && strcmp (name
, h
->root
.string
) == 0)
3621 pundef
= &(*pundef
)->u
.undef
.next
;
3628 element
= (*backend
->get_elt_at_filepos
) (abfd
, (file_ptr
) file_offset
);
3629 if (element
== (bfd
*) NULL
)
3632 if (! bfd_check_format (element
, bfd_object
))
3635 /* Unlike the generic linker, we know that this element provides
3636 a definition for an undefined symbol and we know that we want
3637 to include it. We don't need to check anything. */
3638 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3640 if (! ecoff_link_add_object_symbols (element
, info
))
3643 pundef
= &(*pundef
)->u
.undef
.next
;
3649 /* This is called if we used _bfd_generic_link_add_archive_symbols
3650 because we were not dealing with an ECOFF archive. */
3653 ecoff_link_check_archive_element (abfd
, info
, pneeded
)
3655 struct bfd_link_info
*info
;
3656 bfd_boolean
*pneeded
;
3658 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3659 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3660 = backend
->debug_swap
.swap_ext_in
;
3662 bfd_size_type external_ext_size
;
3663 PTR external_ext
= NULL
;
3664 bfd_size_type esize
;
3671 if (! ecoff_slurp_symbolic_header (abfd
))
3674 /* If there are no symbols, we don't want it. */
3675 if (bfd_get_symcount (abfd
) == 0)
3676 goto successful_return
;
3678 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3680 /* Read in the external symbols and external strings. */
3681 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3682 esize
= symhdr
->iextMax
* external_ext_size
;
3683 external_ext
= (PTR
) bfd_malloc (esize
);
3684 if (external_ext
== NULL
&& esize
!= 0)
3687 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3688 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3691 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3692 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3695 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3696 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3697 != (bfd_size_type
) symhdr
->issExtMax
))
3700 /* Look through the external symbols to see if they define some
3701 symbol that is currently undefined. */
3702 ext_ptr
= (char *) external_ext
;
3703 ext_end
= ext_ptr
+ esize
;
3704 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3709 struct bfd_link_hash_entry
*h
;
3711 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3713 /* See if this symbol defines something. */
3714 if (esym
.asym
.st
!= stGlobal
3715 && esym
.asym
.st
!= stLabel
3716 && esym
.asym
.st
!= stProc
)
3719 switch (esym
.asym
.sc
)
3743 name
= ssext
+ esym
.asym
.iss
;
3744 h
= bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
3746 /* Unlike the generic linker, we do not pull in elements because
3747 of common symbols. */
3748 if (h
== (struct bfd_link_hash_entry
*) NULL
3749 || h
->type
!= bfd_link_hash_undefined
)
3752 /* Include this element. */
3753 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3755 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3759 goto successful_return
;
3763 if (external_ext
!= NULL
)
3764 free (external_ext
);
3769 if (external_ext
!= NULL
)
3770 free (external_ext
);
3776 /* Add symbols from an ECOFF object file to the global linker hash
3780 ecoff_link_add_object_symbols (abfd
, info
)
3782 struct bfd_link_info
*info
;
3785 bfd_size_type external_ext_size
;
3786 PTR external_ext
= NULL
;
3787 bfd_size_type esize
;
3791 if (! ecoff_slurp_symbolic_header (abfd
))
3794 /* If there are no symbols, we don't want it. */
3795 if (bfd_get_symcount (abfd
) == 0)
3798 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3800 /* Read in the external symbols and external strings. */
3801 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3802 esize
= symhdr
->iextMax
* external_ext_size
;
3803 external_ext
= (PTR
) bfd_malloc (esize
);
3804 if (external_ext
== NULL
&& esize
!= 0)
3807 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3808 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3811 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3812 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3815 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3816 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3817 != (bfd_size_type
) symhdr
->issExtMax
))
3820 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3824 if (external_ext
!= NULL
)
3825 free (external_ext
);
3831 if (external_ext
!= NULL
)
3832 free (external_ext
);
3836 /* Add the external symbols of an object file to the global linker
3837 hash table. The external symbols and strings we are passed are
3838 just allocated on the stack, and will be discarded. We must
3839 explicitly save any information we may need later on in the link.
3840 We do not want to read the external symbol information again. */
3843 ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
)
3845 struct bfd_link_info
*info
;
3849 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3850 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3851 = backend
->debug_swap
.swap_ext_in
;
3852 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3853 unsigned long ext_count
;
3854 struct bfd_link_hash_entry
**sym_hash
;
3859 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3862 amt
*= sizeof (struct bfd_link_hash_entry
*);
3863 sym_hash
= (struct bfd_link_hash_entry
**) bfd_alloc (abfd
, amt
);
3866 ecoff_data (abfd
)->sym_hashes
= (struct ecoff_link_hash_entry
**) sym_hash
;
3868 ext_ptr
= (char *) external_ext
;
3869 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3870 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3877 struct ecoff_link_hash_entry
*h
;
3881 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3883 /* Skip debugging symbols. */
3885 switch (esym
.asym
.st
)
3901 /* Get the information for this symbol. */
3902 value
= esym
.asym
.value
;
3903 switch (esym
.asym
.sc
)
3923 section
= bfd_make_section_old_way (abfd
, ".text");
3924 value
-= section
->vma
;
3927 section
= bfd_make_section_old_way (abfd
, ".data");
3928 value
-= section
->vma
;
3931 section
= bfd_make_section_old_way (abfd
, ".bss");
3932 value
-= section
->vma
;
3935 section
= bfd_abs_section_ptr
;
3938 section
= bfd_und_section_ptr
;
3941 section
= bfd_make_section_old_way (abfd
, ".sdata");
3942 value
-= section
->vma
;
3945 section
= bfd_make_section_old_way (abfd
, ".sbss");
3946 value
-= section
->vma
;
3949 section
= bfd_make_section_old_way (abfd
, ".rdata");
3950 value
-= section
->vma
;
3953 if (value
> ecoff_data (abfd
)->gp_size
)
3955 section
= bfd_com_section_ptr
;
3960 if (ecoff_scom_section
.name
== NULL
)
3962 /* Initialize the small common section. */
3963 ecoff_scom_section
.name
= SCOMMON
;
3964 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3965 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3966 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3967 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3968 ecoff_scom_symbol
.name
= SCOMMON
;
3969 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3970 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3971 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3973 section
= &ecoff_scom_section
;
3976 section
= bfd_und_section_ptr
;
3979 section
= bfd_make_section_old_way (abfd
, ".init");
3980 value
-= section
->vma
;
3983 section
= bfd_make_section_old_way (abfd
, ".fini");
3984 value
-= section
->vma
;
3987 section
= bfd_make_section_old_way (abfd
, ".rconst");
3988 value
-= section
->vma
;
3992 if (section
== (asection
*) NULL
)
3995 name
= ssext
+ esym
.asym
.iss
;
3997 if (! (_bfd_generic_link_add_one_symbol
3999 (flagword
) (esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
),
4000 section
, value
, (const char *) NULL
, TRUE
, TRUE
, sym_hash
)))
4003 h
= (struct ecoff_link_hash_entry
*) *sym_hash
;
4005 /* If we are building an ECOFF hash table, save the external
4006 symbol information. */
4007 if (info
->hash
->creator
->flavour
== bfd_get_flavour (abfd
))
4009 if (h
->abfd
== (bfd
*) NULL
4010 || (! bfd_is_und_section (section
)
4011 && (! bfd_is_com_section (section
)
4012 || (h
->root
.type
!= bfd_link_hash_defined
4013 && h
->root
.type
!= bfd_link_hash_defweak
))))
4019 /* Remember whether this symbol was small undefined. */
4020 if (esym
.asym
.sc
== scSUndefined
)
4023 /* If this symbol was ever small undefined, it needs to wind
4024 up in a GP relative section. We can't control the
4025 section of a defined symbol, but we can control the
4026 section of a common symbol. This case is actually needed
4027 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4029 && h
->root
.type
== bfd_link_hash_common
4030 && strcmp (h
->root
.u
.c
.p
->section
->name
, SCOMMON
) != 0)
4032 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
4034 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
4035 if (h
->esym
.asym
.sc
== scCommon
)
4036 h
->esym
.asym
.sc
= scSCommon
;
4044 /* ECOFF final link routines. */
4046 static bfd_boolean ecoff_final_link_debug_accumulate
4047 PARAMS ((bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*,
4049 static bfd_boolean ecoff_link_write_external
4050 PARAMS ((struct ecoff_link_hash_entry
*, PTR
));
4051 static bfd_boolean ecoff_indirect_link_order
4052 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4053 struct bfd_link_order
*));
4054 static bfd_boolean ecoff_reloc_link_order
4055 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4056 struct bfd_link_order
*));
4058 /* Structure used to pass information to ecoff_link_write_external. */
4063 struct bfd_link_info
*info
;
4066 /* ECOFF final link routine. This looks through all the input BFDs
4067 and gathers together all the debugging information, and then
4068 processes all the link order information. This may cause it to
4069 close and reopen some input BFDs; I'll see how bad this is. */
4072 _bfd_ecoff_bfd_final_link (abfd
, info
)
4074 struct bfd_link_info
*info
;
4076 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4077 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4080 register bfd
*input_bfd
;
4082 struct bfd_link_order
*p
;
4083 struct extsym_info einfo
;
4085 /* We accumulate the debugging information counts in the symbolic
4087 symhdr
= &debug
->symbolic_header
;
4089 symhdr
->ilineMax
= 0;
4093 symhdr
->isymMax
= 0;
4094 symhdr
->ioptMax
= 0;
4095 symhdr
->iauxMax
= 0;
4097 symhdr
->issExtMax
= 0;
4100 symhdr
->iextMax
= 0;
4102 /* We accumulate the debugging information itself in the debug_info
4105 debug
->external_dnr
= NULL
;
4106 debug
->external_pdr
= NULL
;
4107 debug
->external_sym
= NULL
;
4108 debug
->external_opt
= NULL
;
4109 debug
->external_aux
= NULL
;
4111 debug
->ssext
= debug
->ssext_end
= NULL
;
4112 debug
->external_fdr
= NULL
;
4113 debug
->external_rfd
= NULL
;
4114 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4116 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4117 if (handle
== (PTR
) NULL
)
4120 /* Accumulate the debugging symbols from each input BFD. */
4121 for (input_bfd
= info
->input_bfds
;
4122 input_bfd
!= (bfd
*) NULL
;
4123 input_bfd
= input_bfd
->link_next
)
4127 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4129 /* Arbitrarily set the symbolic header vstamp to the vstamp
4130 of the first object file in the link. */
4131 if (symhdr
->vstamp
== 0)
4133 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4134 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4138 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4139 debug
, &backend
->debug_swap
,
4144 /* Combine the register masks. */
4145 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4146 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4147 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4148 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4149 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4150 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4153 /* Write out the external symbols. */
4156 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4157 ecoff_link_write_external
,
4160 if (info
->relocatable
)
4162 /* We need to make a pass over the link_orders to count up the
4163 number of relocations we will need to output, so that we know
4164 how much space they will take up. */
4165 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4168 for (p
= o
->link_order_head
;
4169 p
!= (struct bfd_link_order
*) NULL
;
4171 if (p
->type
== bfd_indirect_link_order
)
4172 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4173 else if (p
->type
== bfd_section_reloc_link_order
4174 || p
->type
== bfd_symbol_reloc_link_order
)
4179 /* Compute the reloc and symbol file positions. */
4180 ecoff_compute_reloc_file_positions (abfd
);
4182 /* Write out the debugging information. */
4183 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4184 &backend
->debug_swap
, info
,
4185 ecoff_data (abfd
)->sym_filepos
))
4188 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4190 if (info
->relocatable
)
4192 /* Now reset the reloc_count field of the sections in the output
4193 BFD to 0, so that we can use them to keep track of how many
4194 relocs we have output thus far. */
4195 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4199 /* Get a value for the GP register. */
4200 if (ecoff_data (abfd
)->gp
== 0)
4202 struct bfd_link_hash_entry
*h
;
4204 h
= bfd_link_hash_lookup (info
->hash
, "_gp", FALSE
, FALSE
, TRUE
);
4205 if (h
!= (struct bfd_link_hash_entry
*) NULL
4206 && h
->type
== bfd_link_hash_defined
)
4207 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4208 + h
->u
.def
.section
->output_section
->vma
4209 + h
->u
.def
.section
->output_offset
);
4210 else if (info
->relocatable
)
4214 /* Make up a value. */
4216 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4219 && (strcmp (o
->name
, _SBSS
) == 0
4220 || strcmp (o
->name
, _SDATA
) == 0
4221 || strcmp (o
->name
, _LIT4
) == 0
4222 || strcmp (o
->name
, _LIT8
) == 0
4223 || strcmp (o
->name
, _LITA
) == 0))
4226 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4230 /* If the relocate_section function needs to do a reloc
4231 involving the GP value, it should make a reloc_dangerous
4232 callback to warn that GP is not defined. */
4236 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4238 for (p
= o
->link_order_head
;
4239 p
!= (struct bfd_link_order
*) NULL
;
4242 if (p
->type
== bfd_indirect_link_order
4243 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4244 == bfd_target_ecoff_flavour
))
4246 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4249 else if (p
->type
== bfd_section_reloc_link_order
4250 || p
->type
== bfd_symbol_reloc_link_order
)
4252 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4257 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4263 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4265 ecoff_data (abfd
)->linker
= TRUE
;
4270 /* Accumulate the debugging information for an input BFD into the
4271 output BFD. This must read in the symbolic information of the
4275 ecoff_final_link_debug_accumulate (output_bfd
, input_bfd
, info
, handle
)
4278 struct bfd_link_info
*info
;
4281 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
4282 const struct ecoff_debug_swap
* const swap
=
4283 &ecoff_backend (input_bfd
)->debug_swap
;
4284 HDRR
*symhdr
= &debug
->symbolic_header
;
4287 #define READ(ptr, offset, count, size, type) \
4288 if (symhdr->count == 0) \
4289 debug->ptr = NULL; \
4292 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
4293 debug->ptr = (type) bfd_malloc (amt); \
4294 if (debug->ptr == NULL) \
4297 goto return_something; \
4299 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
4300 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
4303 goto return_something; \
4307 /* If raw_syments is not NULL, then the data was already by read by
4308 _bfd_ecoff_slurp_symbolic_info. */
4309 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4311 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
4313 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
4314 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
4315 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
4316 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
4317 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
4319 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
4320 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
4321 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
4325 /* We do not read the external strings or the external symbols. */
4327 ret
= (bfd_ecoff_debug_accumulate
4328 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4329 &ecoff_backend (output_bfd
)->debug_swap
,
4330 input_bfd
, debug
, swap
, info
));
4333 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4335 if (debug
->line
!= NULL
)
4337 if (debug
->external_dnr
!= NULL
)
4338 free (debug
->external_dnr
);
4339 if (debug
->external_pdr
!= NULL
)
4340 free (debug
->external_pdr
);
4341 if (debug
->external_sym
!= NULL
)
4342 free (debug
->external_sym
);
4343 if (debug
->external_opt
!= NULL
)
4344 free (debug
->external_opt
);
4345 if (debug
->external_aux
!= NULL
)
4346 free (debug
->external_aux
);
4347 if (debug
->ss
!= NULL
)
4349 if (debug
->external_fdr
!= NULL
)
4350 free (debug
->external_fdr
);
4351 if (debug
->external_rfd
!= NULL
)
4352 free (debug
->external_rfd
);
4354 /* Make sure we don't accidentally follow one of these pointers
4355 into freed memory. */
4357 debug
->external_dnr
= NULL
;
4358 debug
->external_pdr
= NULL
;
4359 debug
->external_sym
= NULL
;
4360 debug
->external_opt
= NULL
;
4361 debug
->external_aux
= NULL
;
4363 debug
->external_fdr
= NULL
;
4364 debug
->external_rfd
= NULL
;
4370 /* Put out information for an external symbol. These come only from
4374 ecoff_link_write_external (h
, data
)
4375 struct ecoff_link_hash_entry
*h
;
4378 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4379 bfd
*output_bfd
= einfo
->abfd
;
4382 if (h
->root
.type
== bfd_link_hash_warning
)
4384 h
= (struct ecoff_link_hash_entry
*) h
->root
.u
.i
.link
;
4385 if (h
->root
.type
== bfd_link_hash_new
)
4389 /* We need to check if this symbol is being stripped. */
4390 if (h
->root
.type
== bfd_link_hash_undefined
4391 || h
->root
.type
== bfd_link_hash_undefweak
)
4393 else if (einfo
->info
->strip
== strip_all
4394 || (einfo
->info
->strip
== strip_some
4395 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4396 h
->root
.root
.string
,
4397 FALSE
, FALSE
) == NULL
))
4402 if (strip
|| h
->written
)
4405 if (h
->abfd
== (bfd
*) NULL
)
4408 h
->esym
.cobol_main
= 0;
4409 h
->esym
.weakext
= 0;
4410 h
->esym
.reserved
= 0;
4411 h
->esym
.ifd
= ifdNil
;
4412 h
->esym
.asym
.value
= 0;
4413 h
->esym
.asym
.st
= stGlobal
;
4415 if (h
->root
.type
!= bfd_link_hash_defined
4416 && h
->root
.type
!= bfd_link_hash_defweak
)
4417 h
->esym
.asym
.sc
= scAbs
;
4420 asection
*output_section
;
4423 output_section
= h
->root
.u
.def
.section
->output_section
;
4424 name
= bfd_section_name (output_section
->owner
, output_section
);
4426 if (strcmp (name
, _TEXT
) == 0)
4427 h
->esym
.asym
.sc
= scText
;
4428 else if (strcmp (name
, _DATA
) == 0)
4429 h
->esym
.asym
.sc
= scData
;
4430 else if (strcmp (name
, _SDATA
) == 0)
4431 h
->esym
.asym
.sc
= scSData
;
4432 else if (strcmp (name
, _RDATA
) == 0)
4433 h
->esym
.asym
.sc
= scRData
;
4434 else if (strcmp (name
, _BSS
) == 0)
4435 h
->esym
.asym
.sc
= scBss
;
4436 else if (strcmp (name
, _SBSS
) == 0)
4437 h
->esym
.asym
.sc
= scSBss
;
4438 else if (strcmp (name
, _INIT
) == 0)
4439 h
->esym
.asym
.sc
= scInit
;
4440 else if (strcmp (name
, _FINI
) == 0)
4441 h
->esym
.asym
.sc
= scFini
;
4442 else if (strcmp (name
, _PDATA
) == 0)
4443 h
->esym
.asym
.sc
= scPData
;
4444 else if (strcmp (name
, _XDATA
) == 0)
4445 h
->esym
.asym
.sc
= scXData
;
4446 else if (strcmp (name
, _RCONST
) == 0)
4447 h
->esym
.asym
.sc
= scRConst
;
4449 h
->esym
.asym
.sc
= scAbs
;
4452 h
->esym
.asym
.reserved
= 0;
4453 h
->esym
.asym
.index
= indexNil
;
4455 else if (h
->esym
.ifd
!= -1)
4457 struct ecoff_debug_info
*debug
;
4459 /* Adjust the FDR index for the symbol by that used for the
4461 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4462 BFD_ASSERT (h
->esym
.ifd
>= 0
4463 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4464 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4467 switch (h
->root
.type
)
4470 case bfd_link_hash_warning
:
4471 case bfd_link_hash_new
:
4473 case bfd_link_hash_undefined
:
4474 case bfd_link_hash_undefweak
:
4475 if (h
->esym
.asym
.sc
!= scUndefined
4476 && h
->esym
.asym
.sc
!= scSUndefined
)
4477 h
->esym
.asym
.sc
= scUndefined
;
4479 case bfd_link_hash_defined
:
4480 case bfd_link_hash_defweak
:
4481 if (h
->esym
.asym
.sc
== scUndefined
4482 || h
->esym
.asym
.sc
== scSUndefined
)
4483 h
->esym
.asym
.sc
= scAbs
;
4484 else if (h
->esym
.asym
.sc
== scCommon
)
4485 h
->esym
.asym
.sc
= scBss
;
4486 else if (h
->esym
.asym
.sc
== scSCommon
)
4487 h
->esym
.asym
.sc
= scSBss
;
4488 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4489 + h
->root
.u
.def
.section
->output_section
->vma
4490 + h
->root
.u
.def
.section
->output_offset
);
4492 case bfd_link_hash_common
:
4493 if (h
->esym
.asym
.sc
!= scCommon
4494 && h
->esym
.asym
.sc
!= scSCommon
)
4495 h
->esym
.asym
.sc
= scCommon
;
4496 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4498 case bfd_link_hash_indirect
:
4499 /* We ignore these symbols, since the indirected symbol is
4500 already in the hash table. */
4504 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4506 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4509 return (bfd_ecoff_debug_one_external
4510 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4511 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4515 /* Relocate and write an ECOFF section into an ECOFF output file. */
4518 ecoff_indirect_link_order (output_bfd
, info
, output_section
, link_order
)
4520 struct bfd_link_info
*info
;
4521 asection
*output_section
;
4522 struct bfd_link_order
*link_order
;
4524 asection
*input_section
;
4526 bfd_byte
*contents
= NULL
;
4527 bfd_size_type external_reloc_size
;
4528 bfd_size_type external_relocs_size
;
4529 PTR external_relocs
= NULL
;
4531 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
4533 if (link_order
->size
== 0)
4536 input_section
= link_order
->u
.indirect
.section
;
4537 input_bfd
= input_section
->owner
;
4539 BFD_ASSERT (input_section
->output_section
== output_section
);
4540 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
4541 BFD_ASSERT (input_section
->size
== link_order
->size
);
4543 /* Get the section contents. */
4544 if (!bfd_malloc_and_get_section (input_bfd
, input_section
, &contents
))
4547 /* Get the relocs. If we are relaxing MIPS code, they will already
4548 have been read in. Otherwise, we read them in now. */
4549 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
4550 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
4552 external_relocs
= (PTR
) bfd_malloc (external_relocs_size
);
4553 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
4556 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
4557 || (bfd_bread (external_relocs
, external_relocs_size
, input_bfd
)
4558 != external_relocs_size
))
4561 /* Relocate the section contents. */
4562 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4563 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4567 /* Write out the relocated section. */
4568 if (! bfd_set_section_contents (output_bfd
,
4571 input_section
->output_offset
,
4572 input_section
->size
))
4575 /* If we are producing relocatable output, the relocs were
4576 modified, and we write them out now. We use the reloc_count
4577 field of output_section to keep track of the number of relocs we
4578 have output so far. */
4579 if (info
->relocatable
)
4581 file_ptr pos
= (output_section
->rel_filepos
4582 + output_section
->reloc_count
* external_reloc_size
);
4583 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
4584 || (bfd_bwrite (external_relocs
, external_relocs_size
, output_bfd
)
4585 != external_relocs_size
))
4587 output_section
->reloc_count
+= input_section
->reloc_count
;
4590 if (contents
!= NULL
)
4592 if (external_relocs
!= NULL
)
4593 free (external_relocs
);
4597 if (contents
!= NULL
)
4599 if (external_relocs
!= NULL
)
4600 free (external_relocs
);
4604 /* Generate a reloc when linking an ECOFF file. This is a reloc
4605 requested by the linker, and does come from any input file. This
4606 is used to build constructor and destructor tables when linking
4610 ecoff_reloc_link_order (output_bfd
, info
, output_section
, link_order
)
4612 struct bfd_link_info
*info
;
4613 asection
*output_section
;
4614 struct bfd_link_order
*link_order
;
4616 enum bfd_link_order_type type
;
4620 struct internal_reloc in
;
4621 bfd_size_type external_reloc_size
;
4626 type
= link_order
->type
;
4628 addend
= link_order
->u
.reloc
.p
->addend
;
4630 /* We set up an arelent to pass to the backend adjust_reloc_out
4632 rel
.address
= link_order
->offset
;
4634 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4637 bfd_set_error (bfd_error_bad_value
);
4641 if (type
== bfd_section_reloc_link_order
)
4643 section
= link_order
->u
.reloc
.p
->u
.section
;
4644 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4648 struct bfd_link_hash_entry
*h
;
4650 /* Treat a reloc against a defined symbol as though it were
4651 actually against the section. */
4652 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4653 link_order
->u
.reloc
.p
->u
.name
,
4654 FALSE
, FALSE
, FALSE
);
4656 && (h
->type
== bfd_link_hash_defined
4657 || h
->type
== bfd_link_hash_defweak
))
4659 type
= bfd_section_reloc_link_order
;
4660 section
= h
->u
.def
.section
->output_section
;
4661 /* It seems that we ought to add the symbol value to the
4662 addend here, but in practice it has already been added
4663 because it was passed to constructor_callback. */
4664 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4668 /* We can't set up a reloc against a symbol correctly,
4669 because we have no asymbol structure. Currently no
4670 adjust_reloc_out routine cares. */
4671 rel
.sym_ptr_ptr
= (asymbol
**) NULL
;
4675 /* All ECOFF relocs are in-place. Put the addend into the object
4678 BFD_ASSERT (rel
.howto
->partial_inplace
);
4682 bfd_reloc_status_type rstat
;
4685 size
= bfd_get_reloc_size (rel
.howto
);
4686 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4687 if (buf
== (bfd_byte
*) NULL
)
4689 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
,
4690 (bfd_vma
) addend
, buf
);
4696 case bfd_reloc_outofrange
:
4698 case bfd_reloc_overflow
:
4699 if (! ((*info
->callbacks
->reloc_overflow
)
4701 (link_order
->type
== bfd_section_reloc_link_order
4702 ? bfd_section_name (output_bfd
, section
)
4703 : link_order
->u
.reloc
.p
->u
.name
),
4704 rel
.howto
->name
, addend
, (bfd
*) NULL
,
4705 (asection
*) NULL
, (bfd_vma
) 0)))
4712 ok
= bfd_set_section_contents (output_bfd
, output_section
, (PTR
) buf
,
4713 (file_ptr
) link_order
->offset
, size
);
4721 /* Move the information into an internal_reloc structure. */
4722 in
.r_vaddr
= (rel
.address
4723 + bfd_get_section_vma (output_bfd
, output_section
));
4724 in
.r_type
= rel
.howto
->type
;
4726 if (type
== bfd_symbol_reloc_link_order
)
4728 struct ecoff_link_hash_entry
*h
;
4730 h
= ((struct ecoff_link_hash_entry
*)
4731 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4732 link_order
->u
.reloc
.p
->u
.name
,
4733 FALSE
, FALSE
, TRUE
));
4734 if (h
!= (struct ecoff_link_hash_entry
*) NULL
4736 in
.r_symndx
= h
->indx
;
4739 if (! ((*info
->callbacks
->unattached_reloc
)
4740 (info
, link_order
->u
.reloc
.p
->u
.name
, (bfd
*) NULL
,
4741 (asection
*) NULL
, (bfd_vma
) 0)))
4751 name
= bfd_get_section_name (output_bfd
, section
);
4752 if (strcmp (name
, ".text") == 0)
4753 in
.r_symndx
= RELOC_SECTION_TEXT
;
4754 else if (strcmp (name
, ".rdata") == 0)
4755 in
.r_symndx
= RELOC_SECTION_RDATA
;
4756 else if (strcmp (name
, ".data") == 0)
4757 in
.r_symndx
= RELOC_SECTION_DATA
;
4758 else if (strcmp (name
, ".sdata") == 0)
4759 in
.r_symndx
= RELOC_SECTION_SDATA
;
4760 else if (strcmp (name
, ".sbss") == 0)
4761 in
.r_symndx
= RELOC_SECTION_SBSS
;
4762 else if (strcmp (name
, ".bss") == 0)
4763 in
.r_symndx
= RELOC_SECTION_BSS
;
4764 else if (strcmp (name
, ".init") == 0)
4765 in
.r_symndx
= RELOC_SECTION_INIT
;
4766 else if (strcmp (name
, ".lit8") == 0)
4767 in
.r_symndx
= RELOC_SECTION_LIT8
;
4768 else if (strcmp (name
, ".lit4") == 0)
4769 in
.r_symndx
= RELOC_SECTION_LIT4
;
4770 else if (strcmp (name
, ".xdata") == 0)
4771 in
.r_symndx
= RELOC_SECTION_XDATA
;
4772 else if (strcmp (name
, ".pdata") == 0)
4773 in
.r_symndx
= RELOC_SECTION_PDATA
;
4774 else if (strcmp (name
, ".fini") == 0)
4775 in
.r_symndx
= RELOC_SECTION_FINI
;
4776 else if (strcmp (name
, ".lita") == 0)
4777 in
.r_symndx
= RELOC_SECTION_LITA
;
4778 else if (strcmp (name
, "*ABS*") == 0)
4779 in
.r_symndx
= RELOC_SECTION_ABS
;
4780 else if (strcmp (name
, ".rconst") == 0)
4781 in
.r_symndx
= RELOC_SECTION_RCONST
;
4787 /* Let the BFD backend adjust the reloc. */
4788 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4790 /* Get some memory and swap out the reloc. */
4791 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4792 rbuf
= (bfd_byte
*) bfd_malloc (external_reloc_size
);
4793 if (rbuf
== (bfd_byte
*) NULL
)
4796 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (PTR
) rbuf
);
4798 pos
= (output_section
->rel_filepos
4799 + output_section
->reloc_count
* external_reloc_size
);
4800 ok
= (bfd_seek (output_bfd
, pos
, SEEK_SET
) == 0
4801 && (bfd_bwrite ((PTR
) rbuf
, external_reloc_size
, output_bfd
)
4802 == external_reloc_size
));
4805 ++output_section
->reloc_count
;