1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
3 2002, 2003 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. */
78 static asection bfd_debug_section
=
80 /* name, id, index, next, flags, user_set_vma, reloc_done, */
81 "*DEBUG*", 0, 0, NULL
, 0, 0, 0,
82 /* linker_mark, linker_has_input, gc_mark, segment_mark, */
84 /* sec_info_type, use_rela_p, has_tls_reloc, flag11, flag12, */
86 /* flag13, flag14, flag15, flag16, flag20, flag24, */
88 /* vma, lma, _cooked_size, _raw_size, */
90 /* output_offset, output_section, alignment_power, */
92 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
94 /* line_filepos, userdata, contents, lineno, lineno_count, */
95 0, NULL
, NULL
, NULL
, 0,
96 /* entsize, comdat, moving_line_filepos, */
98 /* target_index, used_by_bfd, constructor_chain, owner, */
101 (struct symbol_cache_entry
*) NULL
,
102 /* symbol_ptr_ptr, */
103 (struct symbol_cache_entry
**) NULL
,
104 /* link_order_head, link_order_tail */
108 /* Create an ECOFF object. */
111 _bfd_ecoff_mkobject (abfd
)
114 bfd_size_type amt
= sizeof (ecoff_data_type
);
116 abfd
->tdata
.ecoff_obj_data
= (struct ecoff_tdata
*) bfd_zalloc (abfd
, amt
);
117 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
123 /* This is a hook called by coff_real_object_p to create any backend
124 specific information. */
127 _bfd_ecoff_mkobject_hook (abfd
, filehdr
, aouthdr
)
132 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
133 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
134 ecoff_data_type
*ecoff
;
136 if (! _bfd_ecoff_mkobject (abfd
))
139 ecoff
= ecoff_data (abfd
);
141 ecoff
->sym_filepos
= internal_f
->f_symptr
;
143 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
147 ecoff
->text_start
= internal_a
->text_start
;
148 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
149 ecoff
->gp
= internal_a
->gp_value
;
150 ecoff
->gprmask
= internal_a
->gprmask
;
151 for (i
= 0; i
< 4; i
++)
152 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
153 ecoff
->fprmask
= internal_a
->fprmask
;
154 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
155 abfd
->flags
|= D_PAGED
;
157 abfd
->flags
&=~ D_PAGED
;
160 /* It turns out that no special action is required by the MIPS or
161 Alpha ECOFF backends. They have different information in the
162 a.out header, but we just copy it all (e.g., gprmask, cprmask and
163 fprmask) and let the swapping routines ensure that only relevant
164 information is written out. */
169 /* Initialize a new section. */
172 _bfd_ecoff_new_section_hook (abfd
, section
)
173 bfd
*abfd ATTRIBUTE_UNUSED
;
176 section
->alignment_power
= 4;
178 if (strcmp (section
->name
, _TEXT
) == 0
179 || strcmp (section
->name
, _INIT
) == 0
180 || strcmp (section
->name
, _FINI
) == 0)
181 section
->flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
182 else if (strcmp (section
->name
, _DATA
) == 0
183 || strcmp (section
->name
, _SDATA
) == 0)
184 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
185 else if (strcmp (section
->name
, _RDATA
) == 0
186 || strcmp (section
->name
, _LIT8
) == 0
187 || strcmp (section
->name
, _LIT4
) == 0
188 || strcmp (section
->name
, _RCONST
) == 0
189 || strcmp (section
->name
, _PDATA
) == 0)
190 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
191 else if (strcmp (section
->name
, _BSS
) == 0
192 || strcmp (section
->name
, _SBSS
) == 0)
193 section
->flags
|= SEC_ALLOC
;
194 else if (strcmp (section
->name
, _LIB
) == 0)
195 /* An Irix 4 shared libary. */
196 section
->flags
|= SEC_COFF_SHARED_LIBRARY
;
198 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
199 uncertain about .init on some systems and I don't know how shared
205 /* Determine the machine architecture and type. This is called from
206 the generic COFF routines. It is the inverse of ecoff_get_magic,
207 below. This could be an ECOFF backend routine, with one version
208 for each target, but there aren't all that many ECOFF targets. */
211 _bfd_ecoff_set_arch_mach_hook (abfd
, filehdr
)
215 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
216 enum bfd_architecture arch
;
219 switch (internal_f
->f_magic
)
222 case MIPS_MAGIC_LITTLE
:
224 arch
= bfd_arch_mips
;
225 mach
= bfd_mach_mips3000
;
228 case MIPS_MAGIC_LITTLE2
:
229 case MIPS_MAGIC_BIG2
:
230 /* MIPS ISA level 2: the r6000. */
231 arch
= bfd_arch_mips
;
232 mach
= bfd_mach_mips6000
;
235 case MIPS_MAGIC_LITTLE3
:
236 case MIPS_MAGIC_BIG3
:
237 /* MIPS ISA level 3: the r4000. */
238 arch
= bfd_arch_mips
;
239 mach
= bfd_mach_mips4000
;
243 arch
= bfd_arch_alpha
;
248 arch
= bfd_arch_obscure
;
253 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
256 /* Get the magic number to use based on the architecture and machine.
257 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
260 ecoff_get_magic (abfd
)
265 switch (bfd_get_arch (abfd
))
268 switch (bfd_get_mach (abfd
))
272 case bfd_mach_mips3000
:
273 big
= MIPS_MAGIC_BIG
;
274 little
= MIPS_MAGIC_LITTLE
;
277 case bfd_mach_mips6000
:
278 big
= MIPS_MAGIC_BIG2
;
279 little
= MIPS_MAGIC_LITTLE2
;
282 case bfd_mach_mips4000
:
283 big
= MIPS_MAGIC_BIG3
;
284 little
= MIPS_MAGIC_LITTLE3
;
288 return bfd_big_endian (abfd
) ? big
: little
;
299 /* Get the section s_flags to use for a section. */
302 ecoff_sec_to_styp_flags (name
, flags
)
310 if (strcmp (name
, _TEXT
) == 0)
312 else if (strcmp (name
, _DATA
) == 0)
314 else if (strcmp (name
, _SDATA
) == 0)
316 else if (strcmp (name
, _RDATA
) == 0)
318 else if (strcmp (name
, _LITA
) == 0)
320 else if (strcmp (name
, _LIT8
) == 0)
322 else if (strcmp (name
, _LIT4
) == 0)
324 else if (strcmp (name
, _BSS
) == 0)
326 else if (strcmp (name
, _SBSS
) == 0)
328 else if (strcmp (name
, _INIT
) == 0)
329 styp
= STYP_ECOFF_INIT
;
330 else if (strcmp (name
, _FINI
) == 0)
331 styp
= STYP_ECOFF_FINI
;
332 else if (strcmp (name
, _PDATA
) == 0)
334 else if (strcmp (name
, _XDATA
) == 0)
336 else if (strcmp (name
, _LIB
) == 0)
337 styp
= STYP_ECOFF_LIB
;
338 else if (strcmp (name
, _GOT
) == 0)
340 else if (strcmp (name
, _HASH
) == 0)
342 else if (strcmp (name
, _DYNAMIC
) == 0)
344 else if (strcmp (name
, _LIBLIST
) == 0)
346 else if (strcmp (name
, _RELDYN
) == 0)
348 else if (strcmp (name
, _CONFLIC
) == 0)
350 else if (strcmp (name
, _DYNSTR
) == 0)
352 else if (strcmp (name
, _DYNSYM
) == 0)
354 else if (strcmp (name
, _COMMENT
) == 0)
357 flags
&=~ SEC_NEVER_LOAD
;
359 else if (strcmp (name
, _RCONST
) == 0)
361 else if (flags
& SEC_CODE
)
363 else if (flags
& SEC_DATA
)
365 else if (flags
& SEC_READONLY
)
367 else if (flags
& SEC_LOAD
)
372 if (flags
& SEC_NEVER_LOAD
)
378 /* Get the BFD flags to use for a section. */
381 _bfd_ecoff_styp_to_sec_flags (abfd
, hdr
, name
, section
, flags_ptr
)
382 bfd
*abfd ATTRIBUTE_UNUSED
;
384 const char *name ATTRIBUTE_UNUSED
;
385 asection
*section ATTRIBUTE_UNUSED
;
386 flagword
* flags_ptr
;
388 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
389 long styp_flags
= internal_s
->s_flags
;
390 flagword sec_flags
= 0;
392 if (styp_flags
& STYP_NOLOAD
)
393 sec_flags
|= SEC_NEVER_LOAD
;
395 /* For 386 COFF, at least, an unloadable text or data section is
396 actually a shared library section. */
397 if ((styp_flags
& STYP_TEXT
)
398 || (styp_flags
& STYP_ECOFF_INIT
)
399 || (styp_flags
& STYP_ECOFF_FINI
)
400 || (styp_flags
& STYP_DYNAMIC
)
401 || (styp_flags
& STYP_LIBLIST
)
402 || (styp_flags
& STYP_RELDYN
)
403 || styp_flags
== STYP_CONFLIC
404 || (styp_flags
& STYP_DYNSTR
)
405 || (styp_flags
& STYP_DYNSYM
)
406 || (styp_flags
& STYP_HASH
))
408 if (sec_flags
& SEC_NEVER_LOAD
)
409 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
411 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
413 else if ((styp_flags
& STYP_DATA
)
414 || (styp_flags
& STYP_RDATA
)
415 || (styp_flags
& STYP_SDATA
)
416 || styp_flags
== STYP_PDATA
417 || styp_flags
== STYP_XDATA
418 || (styp_flags
& STYP_GOT
)
419 || styp_flags
== STYP_RCONST
)
421 if (sec_flags
& SEC_NEVER_LOAD
)
422 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
424 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
425 if ((styp_flags
& STYP_RDATA
)
426 || styp_flags
== STYP_PDATA
427 || styp_flags
== STYP_RCONST
)
428 sec_flags
|= SEC_READONLY
;
430 else if ((styp_flags
& STYP_BSS
)
431 || (styp_flags
& STYP_SBSS
))
432 sec_flags
|= SEC_ALLOC
;
433 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
434 sec_flags
|= SEC_NEVER_LOAD
;
435 else if ((styp_flags
& STYP_LITA
)
436 || (styp_flags
& STYP_LIT8
)
437 || (styp_flags
& STYP_LIT4
))
438 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
439 else if (styp_flags
& STYP_ECOFF_LIB
)
440 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
442 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
444 * flags_ptr
= sec_flags
;
448 /* Read in the symbolic header for an ECOFF object file. */
451 ecoff_slurp_symbolic_header (abfd
)
454 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
455 bfd_size_type external_hdr_size
;
457 HDRR
*internal_symhdr
;
459 /* See if we've already read it in. */
460 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
461 backend
->debug_swap
.sym_magic
)
464 /* See whether there is a symbolic header. */
465 if (ecoff_data (abfd
)->sym_filepos
== 0)
467 bfd_get_symcount (abfd
) = 0;
471 /* At this point bfd_get_symcount (abfd) holds the number of symbols
472 as read from the file header, but on ECOFF this is always the
473 size of the symbolic information header. It would be cleaner to
474 handle this when we first read the file in coffgen.c. */
475 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
476 if (bfd_get_symcount (abfd
) != external_hdr_size
)
478 bfd_set_error (bfd_error_bad_value
);
482 /* Read the symbolic information header. */
483 raw
= (PTR
) bfd_malloc (external_hdr_size
);
487 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) != 0
488 || bfd_bread (raw
, external_hdr_size
, abfd
) != external_hdr_size
)
490 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
491 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
493 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
495 bfd_set_error (bfd_error_bad_value
);
499 /* Now we can get the correct number of symbols. */
500 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
501 + internal_symhdr
->iextMax
);
512 /* Read in and swap the important symbolic information for an ECOFF
513 object file. This is called by gdb via the read_debug_info entry
514 point in the backend structure. */
517 _bfd_ecoff_slurp_symbolic_info (abfd
, ignore
, debug
)
519 asection
*ignore ATTRIBUTE_UNUSED
;
520 struct ecoff_debug_info
*debug
;
522 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
523 HDRR
*internal_symhdr
;
524 bfd_size_type raw_base
;
525 bfd_size_type raw_size
;
527 bfd_size_type external_fdr_size
;
531 bfd_size_type raw_end
;
532 bfd_size_type cb_end
;
536 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
538 /* Check whether we've already gotten it, and whether there's any to
540 if (ecoff_data (abfd
)->raw_syments
!= (PTR
) NULL
)
542 if (ecoff_data (abfd
)->sym_filepos
== 0)
544 bfd_get_symcount (abfd
) = 0;
548 if (! ecoff_slurp_symbolic_header (abfd
))
551 internal_symhdr
= &debug
->symbolic_header
;
553 /* Read all the symbolic information at once. */
554 raw_base
= (ecoff_data (abfd
)->sym_filepos
555 + backend
->debug_swap
.external_hdr_size
);
557 /* Alpha ecoff makes the determination of raw_size difficult. It has
558 an undocumented debug data section between the symhdr and the first
559 documented section. And the ordering of the sections varies between
560 statically and dynamically linked executables.
561 If bfd supports SEEK_END someday, this code could be simplified. */
564 #define UPDATE_RAW_END(start, count, size) \
565 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
566 if (cb_end > raw_end) \
569 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
570 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
571 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
572 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
573 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
574 optimization symtab, not the number of entries */
575 UPDATE_RAW_END (cbOptOffset
, ioptMax
, sizeof (char));
576 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
577 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
578 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
579 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
580 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
581 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
583 #undef UPDATE_RAW_END
585 raw_size
= raw_end
- raw_base
;
588 ecoff_data (abfd
)->sym_filepos
= 0;
591 raw
= (PTR
) bfd_alloc (abfd
, raw_size
);
595 pos
= ecoff_data (abfd
)->sym_filepos
;
596 pos
+= backend
->debug_swap
.external_hdr_size
;
597 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
598 || bfd_bread (raw
, raw_size
, abfd
) != raw_size
)
600 bfd_release (abfd
, raw
);
604 ecoff_data (abfd
)->raw_syments
= raw
;
606 /* Get pointers for the numeric offsets in the HDRR structure. */
607 #define FIX(off1, off2, type) \
608 if (internal_symhdr->off1 == 0) \
609 debug->off2 = (type) NULL; \
611 debug->off2 = (type) ((char *) raw \
612 + (internal_symhdr->off1 \
615 FIX (cbLineOffset
, line
, unsigned char *);
616 FIX (cbDnOffset
, external_dnr
, PTR
);
617 FIX (cbPdOffset
, external_pdr
, PTR
);
618 FIX (cbSymOffset
, external_sym
, PTR
);
619 FIX (cbOptOffset
, external_opt
, PTR
);
620 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
621 FIX (cbSsOffset
, ss
, char *);
622 FIX (cbSsExtOffset
, ssext
, char *);
623 FIX (cbFdOffset
, external_fdr
, PTR
);
624 FIX (cbRfdOffset
, external_rfd
, PTR
);
625 FIX (cbExtOffset
, external_ext
, PTR
);
628 /* I don't want to always swap all the data, because it will just
629 waste time and most programs will never look at it. The only
630 time the linker needs most of the debugging information swapped
631 is when linking big-endian and little-endian MIPS object files
632 together, which is not a common occurrence.
634 We need to look at the fdr to deal with a lot of information in
635 the symbols, so we swap them here. */
636 amt
= internal_symhdr
->ifdMax
;
637 amt
*= sizeof (struct fdr
);
638 debug
->fdr
= (struct fdr
*) bfd_alloc (abfd
, amt
);
639 if (debug
->fdr
== NULL
)
641 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
642 fdr_ptr
= debug
->fdr
;
643 fraw_src
= (char *) debug
->external_fdr
;
644 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
645 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
646 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
651 /* ECOFF symbol table routines. The ECOFF symbol table is described
652 in gcc/mips-tfile.c. */
654 /* ECOFF uses two common sections. One is the usual one, and the
655 other is for small objects. All the small objects are kept
656 together, and then referenced via the gp pointer, which yields
657 faster assembler code. This is what we use for the small common
659 static asection ecoff_scom_section
;
660 static asymbol ecoff_scom_symbol
;
661 static asymbol
*ecoff_scom_symbol_ptr
;
663 /* Create an empty symbol. */
666 _bfd_ecoff_make_empty_symbol (abfd
)
669 ecoff_symbol_type
*new;
670 bfd_size_type amt
= sizeof (ecoff_symbol_type
);
672 new = (ecoff_symbol_type
*) bfd_zalloc (abfd
, amt
);
673 if (new == (ecoff_symbol_type
*) NULL
)
674 return (asymbol
*) NULL
;
675 new->symbol
.section
= (asection
*) NULL
;
676 new->fdr
= (FDR
*) NULL
;
679 new->symbol
.the_bfd
= abfd
;
683 /* Set the BFD flags and section for an ECOFF symbol. */
686 ecoff_set_symbol_info (abfd
, ecoff_sym
, asym
, ext
, weak
)
693 asym
->the_bfd
= abfd
;
694 asym
->value
= ecoff_sym
->value
;
695 asym
->section
= &bfd_debug_section
;
698 /* Most symbol types are just for debugging. */
699 switch (ecoff_sym
->st
)
708 if (ECOFF_IS_STAB (ecoff_sym
))
710 asym
->flags
= BSF_DEBUGGING
;
715 asym
->flags
= BSF_DEBUGGING
;
720 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
722 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
725 asym
->flags
= BSF_LOCAL
;
726 /* Normally, a local stProc symbol will have a corresponding
727 external symbol. We mark the local symbol as a debugging
728 symbol, in order to prevent nm from printing both out.
729 Similarly, we mark stLabel and stabs symbols as debugging
730 symbols. In both cases, we do want to set the value
731 correctly based on the symbol class. */
732 if (ecoff_sym
->st
== stProc
733 || ecoff_sym
->st
== stLabel
734 || ECOFF_IS_STAB (ecoff_sym
))
735 asym
->flags
|= BSF_DEBUGGING
;
738 if (ecoff_sym
->st
== stProc
|| ecoff_sym
->st
== stStaticProc
)
739 asym
->flags
|= BSF_FUNCTION
;
741 switch (ecoff_sym
->sc
)
744 /* Used for compiler generated labels. Leave them in the
745 debugging section, and mark them as local. If BSF_DEBUGGING
746 is set, then nm does not display them for some reason. If no
747 flags are set then the linker whines about them. */
748 asym
->flags
= BSF_LOCAL
;
751 asym
->section
= bfd_make_section_old_way (abfd
, ".text");
752 asym
->value
-= asym
->section
->vma
;
755 asym
->section
= bfd_make_section_old_way (abfd
, ".data");
756 asym
->value
-= asym
->section
->vma
;
759 asym
->section
= bfd_make_section_old_way (abfd
, ".bss");
760 asym
->value
-= asym
->section
->vma
;
763 asym
->flags
= BSF_DEBUGGING
;
766 asym
->section
= bfd_abs_section_ptr
;
769 asym
->section
= bfd_und_section_ptr
;
779 asym
->flags
= BSF_DEBUGGING
;
782 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
783 asym
->value
-= asym
->section
->vma
;
786 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
787 asym
->value
-= asym
->section
->vma
;
790 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
791 asym
->value
-= asym
->section
->vma
;
794 asym
->flags
= BSF_DEBUGGING
;
797 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
799 asym
->section
= bfd_com_section_ptr
;
805 if (ecoff_scom_section
.name
== NULL
)
807 /* Initialize the small common section. */
808 ecoff_scom_section
.name
= SCOMMON
;
809 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
810 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
811 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
812 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
813 ecoff_scom_symbol
.name
= SCOMMON
;
814 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
815 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
816 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
818 asym
->section
= &ecoff_scom_section
;
823 asym
->flags
= BSF_DEBUGGING
;
826 asym
->section
= bfd_und_section_ptr
;
831 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
832 asym
->value
-= asym
->section
->vma
;
837 asym
->flags
= BSF_DEBUGGING
;
840 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
841 asym
->value
-= asym
->section
->vma
;
844 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
845 asym
->value
-= asym
->section
->vma
;
851 /* Look for special constructors symbols and make relocation entries
852 in a special construction section. These are produced by the
853 -fgnu-linker argument to g++. */
854 if (ECOFF_IS_STAB (ecoff_sym
))
856 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
866 /* This code is no longer needed. It used to be used to
867 make the linker handle set symbols, but they are now
868 handled in the add_symbols routine instead. */
872 arelent_chain
*reloc_chain
;
873 unsigned int bitsize
;
876 /* Get a section with the same name as the symbol (usually
877 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
878 name ___CTOR_LIST (three underscores). We need
879 __CTOR_LIST (two underscores), since ECOFF doesn't use
880 a leading underscore. This should be handled by gcc,
881 but instead we do it here. Actually, this should all
882 be done differently anyhow. */
883 name
= bfd_asymbol_name (asym
);
884 if (name
[0] == '_' && name
[1] == '_' && name
[2] == '_')
889 section
= bfd_get_section_by_name (abfd
, name
);
890 if (section
== (asection
*) NULL
)
894 amt
= strlen (name
) + 1;
895 copy
= (char *) bfd_alloc (abfd
, amt
);
899 section
= bfd_make_section (abfd
, copy
);
902 /* Build a reloc pointing to this constructor. */
903 amt
= sizeof (arelent_chain
);
904 reloc_chain
= (arelent_chain
*) bfd_alloc (abfd
, amt
);
907 reloc_chain
->relent
.sym_ptr_ptr
=
908 bfd_get_section (asym
)->symbol_ptr_ptr
;
909 reloc_chain
->relent
.address
= section
->_raw_size
;
910 reloc_chain
->relent
.addend
= asym
->value
;
911 reloc_chain
->relent
.howto
=
912 ecoff_backend (abfd
)->constructor_reloc
;
914 /* Set up the constructor section to hold the reloc. */
915 section
->flags
= SEC_CONSTRUCTOR
;
916 ++section
->reloc_count
;
918 /* Constructor sections must be rounded to a boundary
919 based on the bitsize. These are not real sections--
920 they are handled specially by the linker--so the ECOFF
921 16 byte alignment restriction does not apply. */
922 bitsize
= ecoff_backend (abfd
)->constructor_bitsize
;
923 section
->alignment_power
= 1;
924 while ((1 << section
->alignment_power
) < bitsize
/ 8)
925 ++section
->alignment_power
;
927 reloc_chain
->next
= section
->constructor_chain
;
928 section
->constructor_chain
= reloc_chain
;
929 section
->_raw_size
+= bitsize
/ 8;
933 /* Mark the symbol as a constructor. */
934 asym
->flags
|= BSF_CONSTRUCTOR
;
942 /* Read an ECOFF symbol table. */
945 _bfd_ecoff_slurp_symbol_table (abfd
)
948 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
949 const bfd_size_type external_ext_size
950 = backend
->debug_swap
.external_ext_size
;
951 const bfd_size_type external_sym_size
952 = backend
->debug_swap
.external_sym_size
;
953 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
954 = backend
->debug_swap
.swap_ext_in
;
955 void (* const swap_sym_in
) PARAMS ((bfd
*, PTR
, SYMR
*))
956 = backend
->debug_swap
.swap_sym_in
;
957 bfd_size_type internal_size
;
958 ecoff_symbol_type
*internal
;
959 ecoff_symbol_type
*internal_ptr
;
965 /* If we've already read in the symbol table, do nothing. */
966 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
969 /* Get the symbolic information. */
970 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
971 &ecoff_data (abfd
)->debug_info
))
973 if (bfd_get_symcount (abfd
) == 0)
976 internal_size
= bfd_get_symcount (abfd
);
977 internal_size
*= sizeof (ecoff_symbol_type
);
978 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
979 if (internal
== NULL
)
982 internal_ptr
= internal
;
983 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
985 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
986 * external_ext_size
));
987 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
991 (*swap_ext_in
) (abfd
, (PTR
) eraw_src
, &internal_esym
);
992 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
993 + internal_esym
.asym
.iss
);
994 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
995 &internal_ptr
->symbol
, 1,
996 internal_esym
.weakext
))
998 /* The alpha uses a negative ifd field for section symbols. */
999 if (internal_esym
.ifd
>= 0)
1000 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
1001 + internal_esym
.ifd
);
1003 internal_ptr
->fdr
= NULL
;
1004 internal_ptr
->local
= FALSE
;
1005 internal_ptr
->native
= (PTR
) eraw_src
;
1008 /* The local symbols must be accessed via the fdr's, because the
1009 string and aux indices are relative to the fdr information. */
1010 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
1011 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
1012 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
1017 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
1018 + fdr_ptr
->isymBase
* external_sym_size
);
1019 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
1021 lraw_src
< lraw_end
;
1022 lraw_src
+= external_sym_size
, internal_ptr
++)
1026 (*swap_sym_in
) (abfd
, (PTR
) lraw_src
, &internal_sym
);
1027 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
1029 + internal_sym
.iss
);
1030 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
1031 &internal_ptr
->symbol
, 0, 0))
1033 internal_ptr
->fdr
= fdr_ptr
;
1034 internal_ptr
->local
= TRUE
;
1035 internal_ptr
->native
= (PTR
) lraw_src
;
1039 ecoff_data (abfd
)->canonical_symbols
= internal
;
1044 /* Return the amount of space needed for the canonical symbols. */
1047 _bfd_ecoff_get_symtab_upper_bound (abfd
)
1050 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
1051 &ecoff_data (abfd
)->debug_info
))
1054 if (bfd_get_symcount (abfd
) == 0)
1057 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
1060 /* Get the canonical symbols. */
1063 _bfd_ecoff_get_symtab (abfd
, alocation
)
1065 asymbol
**alocation
;
1067 unsigned int counter
= 0;
1068 ecoff_symbol_type
*symbase
;
1069 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1071 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1073 if (bfd_get_symcount (abfd
) == 0)
1076 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1077 while (counter
< bfd_get_symcount (abfd
))
1079 *(location
++) = symbase
++;
1082 *location
++ = (ecoff_symbol_type
*) NULL
;
1083 return bfd_get_symcount (abfd
);
1086 /* Turn ECOFF type information into a printable string.
1087 ecoff_emit_aggregate and ecoff_type_to_string are from
1088 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1090 /* Write aggregate information to a string. */
1093 ecoff_emit_aggregate (abfd
, fdr
, string
, rndx
, isym
, which
)
1101 const struct ecoff_debug_swap
* const debug_swap
=
1102 &ecoff_backend (abfd
)->debug_swap
;
1103 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1104 unsigned int ifd
= rndx
->rfd
;
1105 unsigned int indx
= rndx
->index
;
1111 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1112 struct return type of a procedure compiled without -g. */
1113 if (ifd
== 0xffffffff
1114 || (rndx
->rfd
== 0xfff && indx
== 0))
1115 name
= "<undefined>";
1116 else if (indx
== indexNil
)
1122 if (debug_info
->external_rfd
== NULL
)
1123 fdr
= debug_info
->fdr
+ ifd
;
1128 (*debug_swap
->swap_rfd_in
) (abfd
,
1129 ((char *) debug_info
->external_rfd
1130 + ((fdr
->rfdBase
+ ifd
)
1131 * debug_swap
->external_rfd_size
)),
1133 fdr
= debug_info
->fdr
+ rfd
;
1136 indx
+= fdr
->isymBase
;
1138 (*debug_swap
->swap_sym_in
) (abfd
,
1139 ((char *) debug_info
->external_sym
1140 + indx
* debug_swap
->external_sym_size
),
1143 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1147 "%s %s { ifd = %u, index = %lu }",
1150 + debug_info
->symbolic_header
.iextMax
));
1153 /* Convert the type information to string format. */
1156 ecoff_type_to_string (abfd
, fdr
, indx
)
1161 union aux_ext
*aux_ptr
;
1170 unsigned int basic_type
;
1173 static char buffer2
[1024];
1178 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1179 bigendian
= fdr
->fBigendian
;
1181 for (i
= 0; i
< 7; i
++)
1183 qualifiers
[i
].low_bound
= 0;
1184 qualifiers
[i
].high_bound
= 0;
1185 qualifiers
[i
].stride
= 0;
1188 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1189 return "-1 (no type)";
1190 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1192 basic_type
= u
.ti
.bt
;
1193 qualifiers
[0].type
= u
.ti
.tq0
;
1194 qualifiers
[1].type
= u
.ti
.tq1
;
1195 qualifiers
[2].type
= u
.ti
.tq2
;
1196 qualifiers
[3].type
= u
.ti
.tq3
;
1197 qualifiers
[4].type
= u
.ti
.tq4
;
1198 qualifiers
[5].type
= u
.ti
.tq5
;
1199 qualifiers
[6].type
= tqNil
;
1201 /* Go get the basic type. */
1204 case btNil
: /* Undefined. */
1208 case btAdr
: /* Address - integer same size as pointer. */
1209 strcpy (p1
, "address");
1212 case btChar
: /* Character. */
1213 strcpy (p1
, "char");
1216 case btUChar
: /* Unsigned character. */
1217 strcpy (p1
, "unsigned char");
1220 case btShort
: /* Short. */
1221 strcpy (p1
, "short");
1224 case btUShort
: /* Unsigned short. */
1225 strcpy (p1
, "unsigned short");
1228 case btInt
: /* Int. */
1232 case btUInt
: /* Unsigned int. */
1233 strcpy (p1
, "unsigned int");
1236 case btLong
: /* Long. */
1237 strcpy (p1
, "long");
1240 case btULong
: /* Unsigned long. */
1241 strcpy (p1
, "unsigned long");
1244 case btFloat
: /* Float (real). */
1245 strcpy (p1
, "float");
1248 case btDouble
: /* Double (real). */
1249 strcpy (p1
, "double");
1252 /* Structures add 1-2 aux words:
1253 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1254 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1256 case btStruct
: /* Structure (Record). */
1257 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1258 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1259 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1261 indx
++; /* Skip aux words. */
1264 /* Unions add 1-2 aux words:
1265 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1266 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1268 case btUnion
: /* Union. */
1269 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1270 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1271 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1273 indx
++; /* Skip aux words. */
1276 /* Enumerations add 1-2 aux words:
1277 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1278 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1280 case btEnum
: /* Enumeration. */
1281 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1282 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1283 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1285 indx
++; /* Skip aux words. */
1288 case btTypedef
: /* Defined via a typedef, isymRef points. */
1289 strcpy (p1
, "typedef");
1292 case btRange
: /* Subrange of int. */
1293 strcpy (p1
, "subrange");
1296 case btSet
: /* Pascal sets. */
1300 case btComplex
: /* Fortran complex. */
1301 strcpy (p1
, "complex");
1304 case btDComplex
: /* Fortran double complex. */
1305 strcpy (p1
, "double complex");
1308 case btIndirect
: /* Forward or unnamed typedef. */
1309 strcpy (p1
, "forward/unamed typedef");
1312 case btFixedDec
: /* Fixed Decimal. */
1313 strcpy (p1
, "fixed decimal");
1316 case btFloatDec
: /* Float Decimal. */
1317 strcpy (p1
, "float decimal");
1320 case btString
: /* Varying Length Character String. */
1321 strcpy (p1
, "string");
1324 case btBit
: /* Aligned Bit String. */
1328 case btPicture
: /* Picture. */
1329 strcpy (p1
, "picture");
1332 case btVoid
: /* Void. */
1333 strcpy (p1
, "void");
1337 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1341 p1
+= strlen (buffer1
);
1343 /* If this is a bitfield, get the bitsize. */
1348 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1349 sprintf (p1
, " : %d", bitsize
);
1350 p1
+= strlen (buffer1
);
1353 /* Deal with any qualifiers. */
1354 if (qualifiers
[0].type
!= tqNil
)
1356 /* Snarf up any array bounds in the correct order. Arrays
1357 store 5 successive words in the aux. table:
1358 word 0 RNDXR to type of the bounds (ie, int)
1359 word 1 Current file descriptor index
1361 word 3 high bound (or -1 if [])
1362 word 4 stride size in bits. */
1363 for (i
= 0; i
< 7; i
++)
1365 if (qualifiers
[i
].type
== tqArray
)
1367 qualifiers
[i
].low_bound
=
1368 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1369 qualifiers
[i
].high_bound
=
1370 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1371 qualifiers
[i
].stride
=
1372 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1377 /* Now print out the qualifiers. */
1378 for (i
= 0; i
< 6; i
++)
1380 switch (qualifiers
[i
].type
)
1387 strcpy (p2
, "ptr to ");
1388 p2
+= sizeof ("ptr to ")-1;
1392 strcpy (p2
, "volatile ");
1393 p2
+= sizeof ("volatile ")-1;
1397 strcpy (p2
, "far ");
1398 p2
+= sizeof ("far ")-1;
1402 strcpy (p2
, "func. ret. ");
1403 p2
+= sizeof ("func. ret. ");
1408 int first_array
= i
;
1411 /* Print array bounds reversed (ie, in the order the C
1412 programmer writes them). C is such a fun language.... */
1413 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1416 for (j
= i
; j
>= first_array
; j
--)
1418 strcpy (p2
, "array [");
1419 p2
+= sizeof ("array [")-1;
1420 if (qualifiers
[j
].low_bound
!= 0)
1422 "%ld:%ld {%ld bits}",
1423 (long) qualifiers
[j
].low_bound
,
1424 (long) qualifiers
[j
].high_bound
,
1425 (long) qualifiers
[j
].stride
);
1427 else if (qualifiers
[j
].high_bound
!= -1)
1430 (long) (qualifiers
[j
].high_bound
+ 1),
1431 (long) (qualifiers
[j
].stride
));
1434 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1437 strcpy (p2
, "] of ");
1438 p2
+= sizeof ("] of ")-1;
1446 strcpy (p2
, buffer1
);
1450 /* Return information about ECOFF symbol SYMBOL in RET. */
1453 _bfd_ecoff_get_symbol_info (abfd
, symbol
, ret
)
1454 bfd
*abfd ATTRIBUTE_UNUSED
;
1458 bfd_symbol_info (symbol
, ret
);
1461 /* Return whether this is a local label. */
1464 _bfd_ecoff_bfd_is_local_label_name (abfd
, name
)
1465 bfd
*abfd ATTRIBUTE_UNUSED
;
1468 return name
[0] == '$';
1471 /* Print information about an ECOFF symbol. */
1474 _bfd_ecoff_print_symbol (abfd
, filep
, symbol
, how
)
1478 bfd_print_symbol_type how
;
1480 const struct ecoff_debug_swap
* const debug_swap
1481 = &ecoff_backend (abfd
)->debug_swap
;
1482 FILE *file
= (FILE *)filep
;
1486 case bfd_print_symbol_name
:
1487 fprintf (file
, "%s", symbol
->name
);
1489 case bfd_print_symbol_more
:
1490 if (ecoffsymbol (symbol
)->local
)
1494 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1496 fprintf (file
, "ecoff local ");
1497 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1498 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1499 (unsigned) ecoff_sym
.sc
);
1505 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1507 fprintf (file
, "ecoff extern ");
1508 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1509 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1510 (unsigned) ecoff_ext
.asym
.sc
);
1513 case bfd_print_symbol_all
:
1514 /* Print out the symbols in a reasonable way. */
1523 if (ecoffsymbol (symbol
)->local
)
1525 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1528 pos
= ((((char *) ecoffsymbol (symbol
)->native
1529 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1530 / debug_swap
->external_sym_size
)
1531 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1538 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1541 pos
= (((char *) ecoffsymbol (symbol
)->native
1542 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1543 / debug_swap
->external_ext_size
);
1544 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1545 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1546 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1549 fprintf (file
, "[%3d] %c ",
1551 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1552 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1553 (unsigned) ecoff_ext
.asym
.st
,
1554 (unsigned) ecoff_ext
.asym
.sc
,
1555 (unsigned) ecoff_ext
.asym
.index
,
1556 jmptbl
, cobol_main
, weakext
,
1559 if (ecoffsymbol (symbol
)->fdr
!= NULL
1560 && ecoff_ext
.asym
.index
!= indexNil
)
1565 bfd_size_type sym_base
;
1566 union aux_ext
*aux_base
;
1568 fdr
= ecoffsymbol (symbol
)->fdr
;
1569 indx
= ecoff_ext
.asym
.index
;
1571 /* sym_base is used to map the fdr relative indices which
1572 appear in the file to the position number which we are
1574 sym_base
= fdr
->isymBase
;
1575 if (ecoffsymbol (symbol
)->local
)
1577 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1579 /* aux_base is the start of the aux entries for this file;
1580 asym.index is an offset from this. */
1581 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1584 /* The aux entries are stored in host byte order; the
1585 order is indicated by a bit in the fdr. */
1586 bigendian
= fdr
->fBigendian
;
1588 /* This switch is basically from gcc/mips-tdump.c. */
1589 switch (ecoff_ext
.asym
.st
)
1597 fprintf (file
, _("\n End+1 symbol: %ld"),
1598 (long) (indx
+ sym_base
));
1602 if (ecoff_ext
.asym
.sc
== scText
1603 || ecoff_ext
.asym
.sc
== scInfo
)
1604 fprintf (file
, _("\n First symbol: %ld"),
1605 (long) (indx
+ sym_base
));
1607 fprintf (file
, _("\n First symbol: %ld"),
1609 (AUX_GET_ISYM (bigendian
,
1610 &aux_base
[ecoff_ext
.asym
.index
])
1616 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1618 else if (ecoffsymbol (symbol
)->local
)
1619 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1621 (AUX_GET_ISYM (bigendian
,
1622 &aux_base
[ecoff_ext
.asym
.index
])
1624 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1626 fprintf (file
, _("\n Local symbol: %ld"),
1629 + (ecoff_data (abfd
)
1630 ->debug_info
.symbolic_header
.iextMax
)));
1634 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1635 (long) (indx
+ sym_base
));
1639 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1640 (long) (indx
+ sym_base
));
1644 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1645 (long) (indx
+ sym_base
));
1649 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1650 fprintf (file
, _("\n Type: %s"),
1651 ecoff_type_to_string (abfd
, fdr
, indx
));
1660 /* Read in the relocs for a section. */
1663 ecoff_slurp_reloc_table (abfd
, section
, symbols
)
1668 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1669 arelent
*internal_relocs
;
1670 bfd_size_type external_reloc_size
;
1672 char *external_relocs
;
1676 if (section
->relocation
!= (arelent
*) NULL
1677 || section
->reloc_count
== 0
1678 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1681 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1684 amt
= section
->reloc_count
;
1685 amt
*= sizeof (arelent
);
1686 internal_relocs
= (arelent
*) bfd_alloc (abfd
, amt
);
1688 external_reloc_size
= backend
->external_reloc_size
;
1689 amt
= external_reloc_size
* section
->reloc_count
;
1690 external_relocs
= (char *) bfd_alloc (abfd
, amt
);
1691 if (internal_relocs
== (arelent
*) NULL
1692 || external_relocs
== (char *) NULL
)
1694 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1696 if (bfd_bread (external_relocs
, amt
, abfd
) != amt
)
1699 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1701 struct internal_reloc intern
;
1703 (*backend
->swap_reloc_in
) (abfd
,
1704 external_relocs
+ i
* external_reloc_size
,
1707 if (intern
.r_extern
)
1709 /* r_symndx is an index into the external symbols. */
1710 BFD_ASSERT (intern
.r_symndx
>= 0
1712 < (ecoff_data (abfd
)
1713 ->debug_info
.symbolic_header
.iextMax
)));
1714 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1717 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1718 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1720 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1725 const char *sec_name
;
1728 /* r_symndx is a section key. */
1729 switch (intern
.r_symndx
)
1731 case RELOC_SECTION_TEXT
: sec_name
= ".text"; break;
1732 case RELOC_SECTION_RDATA
: sec_name
= ".rdata"; break;
1733 case RELOC_SECTION_DATA
: sec_name
= ".data"; break;
1734 case RELOC_SECTION_SDATA
: sec_name
= ".sdata"; break;
1735 case RELOC_SECTION_SBSS
: sec_name
= ".sbss"; break;
1736 case RELOC_SECTION_BSS
: sec_name
= ".bss"; break;
1737 case RELOC_SECTION_INIT
: sec_name
= ".init"; break;
1738 case RELOC_SECTION_LIT8
: sec_name
= ".lit8"; break;
1739 case RELOC_SECTION_LIT4
: sec_name
= ".lit4"; break;
1740 case RELOC_SECTION_XDATA
: sec_name
= ".xdata"; break;
1741 case RELOC_SECTION_PDATA
: sec_name
= ".pdata"; break;
1742 case RELOC_SECTION_FINI
: sec_name
= ".fini"; break;
1743 case RELOC_SECTION_LITA
: sec_name
= ".lita"; break;
1744 case RELOC_SECTION_RCONST
: sec_name
= ".rconst"; break;
1748 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1749 if (sec
== (asection
*) NULL
)
1751 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1753 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1756 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1758 /* Let the backend select the howto field and do any other
1759 required processing. */
1760 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1763 bfd_release (abfd
, external_relocs
);
1765 section
->relocation
= internal_relocs
;
1770 /* Get a canonical list of relocs. */
1773 _bfd_ecoff_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
1781 if (section
->flags
& SEC_CONSTRUCTOR
)
1783 arelent_chain
*chain
;
1785 /* This section has relocs made up by us, not the file, so take
1786 them out of their chain and place them into the data area
1788 for (count
= 0, chain
= section
->constructor_chain
;
1789 count
< section
->reloc_count
;
1790 count
++, chain
= chain
->next
)
1791 *relptr
++ = &chain
->relent
;
1797 if (! ecoff_slurp_reloc_table (abfd
, section
, symbols
))
1800 tblptr
= section
->relocation
;
1802 for (count
= 0; count
< section
->reloc_count
; count
++)
1803 *relptr
++ = tblptr
++;
1806 *relptr
= (arelent
*) NULL
;
1808 return section
->reloc_count
;
1811 /* Provided a BFD, a section and an offset into the section, calculate
1812 and return the name of the source file and the line nearest to the
1816 _bfd_ecoff_find_nearest_line (abfd
, section
, ignore_symbols
, offset
,
1817 filename_ptr
, functionname_ptr
, retline_ptr
)
1820 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
;
1822 const char **filename_ptr
;
1823 const char **functionname_ptr
;
1824 unsigned int *retline_ptr
;
1826 const struct ecoff_debug_swap
* const debug_swap
1827 = &ecoff_backend (abfd
)->debug_swap
;
1828 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1829 struct ecoff_find_line
*line_info
;
1831 /* Make sure we have the FDR's. */
1832 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
, debug_info
)
1833 || bfd_get_symcount (abfd
) == 0)
1836 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1838 bfd_size_type amt
= sizeof (struct ecoff_find_line
);
1839 ecoff_data (abfd
)->find_line_info
1840 = (struct ecoff_find_line
*) bfd_zalloc (abfd
, amt
);
1841 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1844 line_info
= ecoff_data (abfd
)->find_line_info
;
1846 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1847 debug_swap
, line_info
, filename_ptr
,
1848 functionname_ptr
, retline_ptr
);
1851 /* Copy private BFD data. This is called by objcopy and strip. We
1852 use it to copy the ECOFF debugging information from one BFD to the
1853 other. It would be theoretically possible to represent the ECOFF
1854 debugging information in the symbol table. However, it would be a
1855 lot of work, and there would be little gain (gas, gdb, and ld
1856 already access the ECOFF debugging information via the
1857 ecoff_debug_info structure, and that structure would have to be
1858 retained in order to support ECOFF debugging in MIPS ELF).
1860 The debugging information for the ECOFF external symbols comes from
1861 the symbol table, so this function only handles the other debugging
1865 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd
, obfd
)
1869 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1870 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1872 asymbol
**sym_ptr_ptr
;
1876 /* We only want to copy information over if both BFD's use ECOFF
1878 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1879 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1882 /* Copy the GP value and the register masks. */
1883 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1884 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1885 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1886 for (i
= 0; i
< 3; i
++)
1887 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1889 /* Copy the version stamp. */
1890 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1892 /* If there are no symbols, don't copy any debugging information. */
1893 c
= bfd_get_symcount (obfd
);
1894 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1895 if (c
== 0 || sym_ptr_ptr
== (asymbol
**) NULL
)
1898 /* See if there are any local symbols. */
1900 for (; c
> 0; c
--, sym_ptr_ptr
++)
1902 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1911 /* There are some local symbols. We just bring over all the
1912 debugging information. FIXME: This is not quite the right
1913 thing to do. If the user has asked us to discard all
1914 debugging information, then we are probably going to wind up
1915 keeping it because there will probably be some local symbol
1916 which objcopy did not discard. We should actually break
1917 apart the debugging information and only keep that which
1918 applies to the symbols we want to keep. */
1919 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1920 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1921 oinfo
->line
= iinfo
->line
;
1923 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1924 oinfo
->external_dnr
= iinfo
->external_dnr
;
1926 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1927 oinfo
->external_pdr
= iinfo
->external_pdr
;
1929 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1930 oinfo
->external_sym
= iinfo
->external_sym
;
1932 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1933 oinfo
->external_opt
= iinfo
->external_opt
;
1935 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1936 oinfo
->external_aux
= iinfo
->external_aux
;
1938 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1939 oinfo
->ss
= iinfo
->ss
;
1941 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1942 oinfo
->external_fdr
= iinfo
->external_fdr
;
1944 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1945 oinfo
->external_rfd
= iinfo
->external_rfd
;
1949 /* We are discarding all the local symbol information. Look
1950 through the external symbols and remove all references to FDR
1951 or aux information. */
1952 c
= bfd_get_symcount (obfd
);
1953 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1954 for (; c
> 0; c
--, sym_ptr_ptr
++)
1958 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1959 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1961 esym
.asym
.index
= indexNil
;
1962 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1963 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1970 /* Set the architecture. The supported architecture is stored in the
1971 backend pointer. We always set the architecture anyhow, since many
1972 callers ignore the return value. */
1975 _bfd_ecoff_set_arch_mach (abfd
, arch
, machine
)
1977 enum bfd_architecture arch
;
1978 unsigned long machine
;
1980 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1981 return arch
== ecoff_backend (abfd
)->arch
;
1984 /* Get the size of the section headers. */
1987 _bfd_ecoff_sizeof_headers (abfd
, reloc
)
1989 bfd_boolean reloc ATTRIBUTE_UNUSED
;
1996 for (current
= abfd
->sections
;
1997 current
!= (asection
*)NULL
;
1998 current
= current
->next
)
2001 ret
= (bfd_coff_filhsz (abfd
)
2002 + bfd_coff_aoutsz (abfd
)
2003 + c
* bfd_coff_scnhsz (abfd
));
2004 return BFD_ALIGN (ret
, 16);
2007 /* Get the contents of a section. */
2010 _bfd_ecoff_get_section_contents (abfd
, section
, location
, offset
, count
)
2015 bfd_size_type count
;
2017 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2021 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2022 called via qsort. */
2025 ecoff_sort_hdrs (arg1
, arg2
)
2029 const asection
*hdr1
= *(const asection
**) arg1
;
2030 const asection
*hdr2
= *(const asection
**) arg2
;
2032 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
2034 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
2039 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
2042 if (hdr1
->vma
< hdr2
->vma
)
2044 else if (hdr1
->vma
> hdr2
->vma
)
2050 /* Calculate the file position for each section, and set
2054 ecoff_compute_section_file_positions (abfd
)
2057 file_ptr sofar
, file_sofar
;
2058 asection
**sorted_hdrs
;
2062 bfd_boolean rdata_in_text
;
2063 bfd_boolean first_data
, first_nonalloc
;
2064 const bfd_vma round
= ecoff_backend (abfd
)->round
;
2067 sofar
= _bfd_ecoff_sizeof_headers (abfd
, FALSE
);
2070 /* Sort the sections by VMA. */
2071 amt
= abfd
->section_count
;
2072 amt
*= sizeof (asection
*);
2073 sorted_hdrs
= (asection
**) bfd_malloc (amt
);
2074 if (sorted_hdrs
== NULL
)
2076 for (current
= abfd
->sections
, i
= 0;
2078 current
= current
->next
, i
++)
2079 sorted_hdrs
[i
] = current
;
2080 BFD_ASSERT (i
== abfd
->section_count
);
2082 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2085 /* Some versions of the OSF linker put the .rdata section in the
2086 text segment, and some do not. */
2087 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2090 for (i
= 0; i
< abfd
->section_count
; i
++)
2092 current
= sorted_hdrs
[i
];
2093 if (strcmp (current
->name
, _RDATA
) == 0)
2095 if ((current
->flags
& SEC_CODE
) == 0
2096 && strcmp (current
->name
, _PDATA
) != 0
2097 && strcmp (current
->name
, _RCONST
) != 0)
2099 rdata_in_text
= FALSE
;
2104 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2107 first_nonalloc
= TRUE
;
2108 for (i
= 0; i
< abfd
->section_count
; i
++)
2110 unsigned int alignment_power
;
2112 current
= sorted_hdrs
[i
];
2114 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2115 supposed to indicate the number of .pdata entries that are
2116 really in the section. Each entry is 8 bytes. We store this
2117 away in line_filepos before increasing the section size. */
2118 if (strcmp (current
->name
, _PDATA
) == 0)
2119 current
->line_filepos
= current
->_raw_size
/ 8;
2121 alignment_power
= current
->alignment_power
;
2123 /* On Ultrix, the data sections in an executable file must be
2124 aligned to a page boundary within the file. This does not
2125 affect the section size, though. FIXME: Does this work for
2126 other platforms? It requires some modification for the
2127 Alpha, because .rdata on the Alpha goes with the text, not
2129 if ((abfd
->flags
& EXEC_P
) != 0
2130 && (abfd
->flags
& D_PAGED
) != 0
2132 && (current
->flags
& SEC_CODE
) == 0
2134 || strcmp (current
->name
, _RDATA
) != 0)
2135 && strcmp (current
->name
, _PDATA
) != 0
2136 && strcmp (current
->name
, _RCONST
) != 0)
2138 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2139 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2142 else if (strcmp (current
->name
, _LIB
) == 0)
2144 /* On Irix 4, the location of contents of the .lib section
2145 from a shared library section is also rounded up to a
2148 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2149 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2151 else if (first_nonalloc
2152 && (current
->flags
& SEC_ALLOC
) == 0
2153 && (abfd
->flags
& D_PAGED
) != 0)
2155 /* Skip up to the next page for an unallocated section, such
2156 as the .comment section on the Alpha. This leaves room
2157 for the .bss section. */
2158 first_nonalloc
= FALSE
;
2159 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2160 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2163 /* Align the sections in the file to the same boundary on
2164 which they are aligned in virtual memory. */
2165 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2166 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2167 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2169 if ((abfd
->flags
& D_PAGED
) != 0
2170 && (current
->flags
& SEC_ALLOC
) != 0)
2172 sofar
+= (current
->vma
- sofar
) % round
;
2173 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2174 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2177 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2178 current
->filepos
= file_sofar
;
2180 sofar
+= current
->_raw_size
;
2181 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2182 file_sofar
+= current
->_raw_size
;
2184 /* Make sure that this section is of the right size too. */
2186 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2187 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2188 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2189 current
->_raw_size
+= sofar
- old_sofar
;
2195 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2200 /* Determine the location of the relocs for all the sections in the
2201 output file, as well as the location of the symbolic debugging
2204 static bfd_size_type
2205 ecoff_compute_reloc_file_positions (abfd
)
2208 const bfd_size_type external_reloc_size
=
2209 ecoff_backend (abfd
)->external_reloc_size
;
2210 file_ptr reloc_base
;
2211 bfd_size_type reloc_size
;
2215 if (! abfd
->output_has_begun
)
2217 if (! ecoff_compute_section_file_positions (abfd
))
2219 abfd
->output_has_begun
= TRUE
;
2222 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2225 for (current
= abfd
->sections
;
2226 current
!= (asection
*)NULL
;
2227 current
= current
->next
)
2229 if (current
->reloc_count
== 0)
2230 current
->rel_filepos
= 0;
2233 bfd_size_type relsize
;
2235 current
->rel_filepos
= reloc_base
;
2236 relsize
= current
->reloc_count
* external_reloc_size
;
2237 reloc_size
+= relsize
;
2238 reloc_base
+= relsize
;
2242 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2244 /* At least on Ultrix, the symbol table of an executable file must
2245 be aligned to a page boundary. FIXME: Is this true on other
2247 if ((abfd
->flags
& EXEC_P
) != 0
2248 && (abfd
->flags
& D_PAGED
) != 0)
2249 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2250 &~ (ecoff_backend (abfd
)->round
- 1));
2252 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2257 /* Set the contents of a section. */
2260 _bfd_ecoff_set_section_contents (abfd
, section
, location
, offset
, count
)
2265 bfd_size_type count
;
2269 /* This must be done first, because bfd_set_section_contents is
2270 going to set output_has_begun to TRUE. */
2271 if (! abfd
->output_has_begun
)
2273 if (! ecoff_compute_section_file_positions (abfd
))
2277 /* Handle the .lib section specially so that Irix 4 shared libraries
2278 work out. See coff_set_section_contents in coffcode.h. */
2279 if (strcmp (section
->name
, _LIB
) == 0)
2281 bfd_byte
*rec
, *recend
;
2283 rec
= (bfd_byte
*) location
;
2284 recend
= rec
+ count
;
2285 while (rec
< recend
)
2288 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2291 BFD_ASSERT (rec
== recend
);
2297 pos
= section
->filepos
+ offset
;
2298 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2299 || bfd_bwrite (location
, count
, abfd
) != count
)
2305 /* Get the GP value for an ECOFF file. This is a hook used by
2309 bfd_ecoff_get_gp_value (abfd
)
2312 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2313 || bfd_get_format (abfd
) != bfd_object
)
2315 bfd_set_error (bfd_error_invalid_operation
);
2319 return ecoff_data (abfd
)->gp
;
2322 /* Set the GP value for an ECOFF file. This is a hook used by the
2326 bfd_ecoff_set_gp_value (abfd
, gp_value
)
2330 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2331 || bfd_get_format (abfd
) != bfd_object
)
2333 bfd_set_error (bfd_error_invalid_operation
);
2337 ecoff_data (abfd
)->gp
= gp_value
;
2342 /* Set the register masks for an ECOFF file. This is a hook used by
2346 bfd_ecoff_set_regmasks (abfd
, gprmask
, fprmask
, cprmask
)
2348 unsigned long gprmask
;
2349 unsigned long fprmask
;
2350 unsigned long *cprmask
;
2352 ecoff_data_type
*tdata
;
2354 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2355 || bfd_get_format (abfd
) != bfd_object
)
2357 bfd_set_error (bfd_error_invalid_operation
);
2361 tdata
= ecoff_data (abfd
);
2362 tdata
->gprmask
= gprmask
;
2363 tdata
->fprmask
= fprmask
;
2364 if (cprmask
!= (unsigned long *) NULL
)
2368 for (i
= 0; i
< 3; i
++)
2369 tdata
->cprmask
[i
] = cprmask
[i
];
2375 /* Get ECOFF EXTR information for an external symbol. This function
2376 is passed to bfd_ecoff_debug_externals. */
2379 ecoff_get_extr (sym
, esym
)
2383 ecoff_symbol_type
*ecoff_sym_ptr
;
2386 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2387 || ecoffsymbol (sym
)->native
== NULL
)
2389 /* Don't include debugging, local, or section symbols. */
2390 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2391 || (sym
->flags
& BSF_LOCAL
) != 0
2392 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2396 esym
->cobol_main
= 0;
2397 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2400 /* FIXME: we can do better than this for st and sc. */
2401 esym
->asym
.st
= stGlobal
;
2402 esym
->asym
.sc
= scAbs
;
2403 esym
->asym
.reserved
= 0;
2404 esym
->asym
.index
= indexNil
;
2408 ecoff_sym_ptr
= ecoffsymbol (sym
);
2410 if (ecoff_sym_ptr
->local
)
2413 input_bfd
= bfd_asymbol_bfd (sym
);
2414 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2415 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2417 /* If the symbol was defined by the linker, then esym will be
2418 undefined but sym will not be. Get a better class for such a
2420 if ((esym
->asym
.sc
== scUndefined
2421 || esym
->asym
.sc
== scSUndefined
)
2422 && ! bfd_is_und_section (bfd_get_section (sym
)))
2423 esym
->asym
.sc
= scAbs
;
2425 /* Adjust the FDR index for the symbol by that used for the input
2427 if (esym
->ifd
!= -1)
2429 struct ecoff_debug_info
*input_debug
;
2431 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2432 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2433 if (input_debug
->ifdmap
!= (RFDT
*) NULL
)
2434 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2440 /* Set the external symbol index. This routine is passed to
2441 bfd_ecoff_debug_externals. */
2444 ecoff_set_index (sym
, indx
)
2448 ecoff_set_sym_index (sym
, indx
);
2451 /* Write out an ECOFF file. */
2454 _bfd_ecoff_write_object_contents (abfd
)
2457 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2458 const bfd_vma round
= backend
->round
;
2459 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2460 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2461 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2462 const bfd_size_type external_hdr_size
2463 = backend
->debug_swap
.external_hdr_size
;
2464 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2465 void (* const adjust_reloc_out
)
2466 PARAMS ((bfd
*, const arelent
*, struct internal_reloc
*))
2467 = backend
->adjust_reloc_out
;
2468 void (* const swap_reloc_out
)
2469 PARAMS ((bfd
*, const struct internal_reloc
*, PTR
))
2470 = backend
->swap_reloc_out
;
2471 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2472 HDRR
* const symhdr
= &debug
->symbolic_header
;
2475 bfd_size_type reloc_size
;
2476 bfd_size_type text_size
;
2478 bfd_boolean set_text_start
;
2479 bfd_size_type data_size
;
2481 bfd_boolean set_data_start
;
2482 bfd_size_type bss_size
;
2484 PTR reloc_buff
= NULL
;
2485 struct internal_filehdr internal_f
;
2486 struct internal_aouthdr internal_a
;
2489 /* Determine where the sections and relocs will go in the output
2491 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2494 for (current
= abfd
->sections
;
2495 current
!= (asection
*)NULL
;
2496 current
= current
->next
)
2498 current
->target_index
= count
;
2502 if ((abfd
->flags
& D_PAGED
) != 0)
2503 text_size
= _bfd_ecoff_sizeof_headers (abfd
, FALSE
);
2507 set_text_start
= FALSE
;
2510 set_data_start
= FALSE
;
2513 /* Write section headers to the file. */
2515 /* Allocate buff big enough to hold a section header,
2516 file header, or a.out header. */
2524 buff
= (PTR
) bfd_malloc (siz
);
2529 internal_f
.f_nscns
= 0;
2530 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2532 for (current
= abfd
->sections
;
2533 current
!= (asection
*) NULL
;
2534 current
= current
->next
)
2536 struct internal_scnhdr section
;
2539 ++internal_f
.f_nscns
;
2541 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2543 /* This seems to be correct for Irix 4 shared libraries. */
2544 vma
= bfd_get_section_vma (abfd
, current
);
2545 if (strcmp (current
->name
, _LIB
) == 0)
2546 section
.s_vaddr
= 0;
2548 section
.s_vaddr
= vma
;
2550 section
.s_paddr
= current
->lma
;
2551 section
.s_size
= bfd_get_section_size_before_reloc (current
);
2553 /* If this section is unloadable then the scnptr will be 0. */
2554 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2555 section
.s_scnptr
= 0;
2557 section
.s_scnptr
= current
->filepos
;
2558 section
.s_relptr
= current
->rel_filepos
;
2560 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2561 object file produced by the assembler is supposed to point to
2562 information about how much room is required by objects of
2563 various different sizes. I think this only matters if we
2564 want the linker to compute the best size to use, or
2565 something. I don't know what happens if the information is
2567 if (strcmp (current
->name
, _PDATA
) != 0)
2568 section
.s_lnnoptr
= 0;
2571 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2572 hold the number of entries in the section (each entry is
2573 8 bytes). We stored this in the line_filepos field in
2574 ecoff_compute_section_file_positions. */
2575 section
.s_lnnoptr
= current
->line_filepos
;
2578 section
.s_nreloc
= current
->reloc_count
;
2579 section
.s_nlnno
= 0;
2580 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2583 if (bfd_coff_swap_scnhdr_out (abfd
, (PTR
) §ion
, buff
) == 0
2584 || bfd_bwrite (buff
, scnhsz
, abfd
) != scnhsz
)
2587 if ((section
.s_flags
& STYP_TEXT
) != 0
2588 || ((section
.s_flags
& STYP_RDATA
) != 0
2589 && ecoff_data (abfd
)->rdata_in_text
)
2590 || section
.s_flags
== STYP_PDATA
2591 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2592 || (section
.s_flags
& STYP_LIBLIST
) != 0
2593 || (section
.s_flags
& STYP_RELDYN
) != 0
2594 || section
.s_flags
== STYP_CONFLIC
2595 || (section
.s_flags
& STYP_DYNSTR
) != 0
2596 || (section
.s_flags
& STYP_DYNSYM
) != 0
2597 || (section
.s_flags
& STYP_HASH
) != 0
2598 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2599 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2600 || section
.s_flags
== STYP_RCONST
)
2602 text_size
+= bfd_get_section_size_before_reloc (current
);
2603 if (! set_text_start
|| text_start
> vma
)
2606 set_text_start
= TRUE
;
2609 else if ((section
.s_flags
& STYP_RDATA
) != 0
2610 || (section
.s_flags
& STYP_DATA
) != 0
2611 || (section
.s_flags
& STYP_LITA
) != 0
2612 || (section
.s_flags
& STYP_LIT8
) != 0
2613 || (section
.s_flags
& STYP_LIT4
) != 0
2614 || (section
.s_flags
& STYP_SDATA
) != 0
2615 || section
.s_flags
== STYP_XDATA
2616 || (section
.s_flags
& STYP_GOT
) != 0)
2618 data_size
+= bfd_get_section_size_before_reloc (current
);
2619 if (! set_data_start
|| data_start
> vma
)
2622 set_data_start
= TRUE
;
2625 else if ((section
.s_flags
& STYP_BSS
) != 0
2626 || (section
.s_flags
& STYP_SBSS
) != 0)
2627 bss_size
+= bfd_get_section_size_before_reloc (current
);
2628 else if (section
.s_flags
== 0
2629 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2630 || section
.s_flags
== STYP_COMMENT
)
2636 /* Set up the file header. */
2637 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2639 /* We will NOT put a fucking timestamp in the header here. Every
2640 time you put it back, I will come in and take it out again. I'm
2641 sorry. This field does not belong here. We fill it with a 0 so
2642 it compares the same but is not a reasonable time. --
2644 internal_f
.f_timdat
= 0;
2646 if (bfd_get_symcount (abfd
) != 0)
2648 /* The ECOFF f_nsyms field is not actually the number of
2649 symbols, it's the size of symbolic information header. */
2650 internal_f
.f_nsyms
= external_hdr_size
;
2651 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2655 internal_f
.f_nsyms
= 0;
2656 internal_f
.f_symptr
= 0;
2659 internal_f
.f_opthdr
= aoutsz
;
2661 internal_f
.f_flags
= F_LNNO
;
2662 if (reloc_size
== 0)
2663 internal_f
.f_flags
|= F_RELFLG
;
2664 if (bfd_get_symcount (abfd
) == 0)
2665 internal_f
.f_flags
|= F_LSYMS
;
2666 if (abfd
->flags
& EXEC_P
)
2667 internal_f
.f_flags
|= F_EXEC
;
2669 if (bfd_little_endian (abfd
))
2670 internal_f
.f_flags
|= F_AR32WR
;
2672 internal_f
.f_flags
|= F_AR32W
;
2674 /* Set up the ``optional'' header. */
2675 if ((abfd
->flags
& D_PAGED
) != 0)
2676 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2678 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2680 /* FIXME: Is this really correct? */
2681 internal_a
.vstamp
= symhdr
->vstamp
;
2683 /* At least on Ultrix, these have to be rounded to page boundaries.
2684 FIXME: Is this true on other platforms? */
2685 if ((abfd
->flags
& D_PAGED
) != 0)
2687 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2688 internal_a
.text_start
= text_start
&~ (round
- 1);
2689 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2690 internal_a
.data_start
= data_start
&~ (round
- 1);
2694 internal_a
.tsize
= text_size
;
2695 internal_a
.text_start
= text_start
;
2696 internal_a
.dsize
= data_size
;
2697 internal_a
.data_start
= data_start
;
2700 /* On Ultrix, the initial portions of the .sbss and .bss segments
2701 are at the end of the data section. The bsize field in the
2702 optional header records how many bss bytes are required beyond
2703 those in the data section. The value is not rounded to a page
2705 if (bss_size
< internal_a
.dsize
- data_size
)
2708 bss_size
-= internal_a
.dsize
- data_size
;
2709 internal_a
.bsize
= bss_size
;
2710 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2712 internal_a
.entry
= bfd_get_start_address (abfd
);
2714 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2716 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2717 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2718 for (i
= 0; i
< 4; i
++)
2719 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2721 /* Let the backend adjust the headers if necessary. */
2722 if (backend
->adjust_headers
)
2724 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2728 /* Write out the file header and the optional header. */
2729 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2732 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, buff
);
2733 if (bfd_bwrite (buff
, filhsz
, abfd
) != filhsz
)
2736 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) &internal_a
, buff
);
2737 if (bfd_bwrite (buff
, aoutsz
, abfd
) != aoutsz
)
2740 /* Build the external symbol information. This must be done before
2741 writing out the relocs so that we know the symbol indices. We
2742 don't do this if this BFD was created by the backend linker,
2743 since it will have already handled the symbols and relocs. */
2744 if (! ecoff_data (abfd
)->linker
)
2746 symhdr
->iextMax
= 0;
2747 symhdr
->issExtMax
= 0;
2748 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2749 debug
->ssext
= debug
->ssext_end
= NULL
;
2750 if (! bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2751 (abfd
->flags
& EXEC_P
) == 0,
2752 ecoff_get_extr
, ecoff_set_index
))
2755 /* Write out the relocs. */
2756 for (current
= abfd
->sections
;
2757 current
!= (asection
*) NULL
;
2758 current
= current
->next
)
2760 arelent
**reloc_ptr_ptr
;
2761 arelent
**reloc_end
;
2765 if (current
->reloc_count
== 0)
2768 amt
= current
->reloc_count
* external_reloc_size
;
2769 reloc_buff
= bfd_alloc (abfd
, amt
);
2770 if (reloc_buff
== NULL
)
2773 reloc_ptr_ptr
= current
->orelocation
;
2774 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2775 out_ptr
= (char *) reloc_buff
;
2777 reloc_ptr_ptr
< reloc_end
;
2778 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2782 struct internal_reloc in
;
2784 memset ((PTR
) &in
, 0, sizeof in
);
2786 reloc
= *reloc_ptr_ptr
;
2787 sym
= *reloc
->sym_ptr_ptr
;
2789 in
.r_vaddr
= (reloc
->address
2790 + bfd_get_section_vma (abfd
, current
));
2791 in
.r_type
= reloc
->howto
->type
;
2793 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2795 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2802 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2803 if (strcmp (name
, ".text") == 0)
2804 in
.r_symndx
= RELOC_SECTION_TEXT
;
2805 else if (strcmp (name
, ".rdata") == 0)
2806 in
.r_symndx
= RELOC_SECTION_RDATA
;
2807 else if (strcmp (name
, ".data") == 0)
2808 in
.r_symndx
= RELOC_SECTION_DATA
;
2809 else if (strcmp (name
, ".sdata") == 0)
2810 in
.r_symndx
= RELOC_SECTION_SDATA
;
2811 else if (strcmp (name
, ".sbss") == 0)
2812 in
.r_symndx
= RELOC_SECTION_SBSS
;
2813 else if (strcmp (name
, ".bss") == 0)
2814 in
.r_symndx
= RELOC_SECTION_BSS
;
2815 else if (strcmp (name
, ".init") == 0)
2816 in
.r_symndx
= RELOC_SECTION_INIT
;
2817 else if (strcmp (name
, ".lit8") == 0)
2818 in
.r_symndx
= RELOC_SECTION_LIT8
;
2819 else if (strcmp (name
, ".lit4") == 0)
2820 in
.r_symndx
= RELOC_SECTION_LIT4
;
2821 else if (strcmp (name
, ".xdata") == 0)
2822 in
.r_symndx
= RELOC_SECTION_XDATA
;
2823 else if (strcmp (name
, ".pdata") == 0)
2824 in
.r_symndx
= RELOC_SECTION_PDATA
;
2825 else if (strcmp (name
, ".fini") == 0)
2826 in
.r_symndx
= RELOC_SECTION_FINI
;
2827 else if (strcmp (name
, ".lita") == 0)
2828 in
.r_symndx
= RELOC_SECTION_LITA
;
2829 else if (strcmp (name
, "*ABS*") == 0)
2830 in
.r_symndx
= RELOC_SECTION_ABS
;
2831 else if (strcmp (name
, ".rconst") == 0)
2832 in
.r_symndx
= RELOC_SECTION_RCONST
;
2838 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2840 (*swap_reloc_out
) (abfd
, &in
, (PTR
) out_ptr
);
2843 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2845 amt
= current
->reloc_count
* external_reloc_size
;
2846 if (bfd_bwrite (reloc_buff
, amt
, abfd
) != amt
)
2848 bfd_release (abfd
, reloc_buff
);
2852 /* Write out the symbolic debugging information. */
2853 if (bfd_get_symcount (abfd
) > 0)
2855 /* Write out the debugging information. */
2856 if (! bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2857 ecoff_data (abfd
)->sym_filepos
))
2862 /* The .bss section of a demand paged executable must receive an
2863 entire page. If there are symbols, the symbols will start on the
2864 next page. If there are no symbols, we must fill out the page by
2866 if (bfd_get_symcount (abfd
) == 0
2867 && (abfd
->flags
& EXEC_P
) != 0
2868 && (abfd
->flags
& D_PAGED
) != 0)
2872 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2875 if (bfd_bread (&c
, (bfd_size_type
) 1, abfd
) == 0)
2877 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2880 if (bfd_bwrite (&c
, (bfd_size_type
) 1, abfd
) != 1)
2884 if (reloc_buff
!= NULL
)
2885 bfd_release (abfd
, reloc_buff
);
2890 if (reloc_buff
!= NULL
)
2891 bfd_release (abfd
, reloc_buff
);
2897 /* Archive handling. ECOFF uses what appears to be a unique type of
2898 archive header (armap). The byte ordering of the armap and the
2899 contents are encoded in the name of the armap itself. At least for
2900 now, we only support archives with the same byte ordering in the
2901 armap and the contents.
2903 The first four bytes in the armap are the number of symbol
2904 definitions. This is always a power of two.
2906 This is followed by the symbol definitions. Each symbol definition
2907 occupies 8 bytes. The first four bytes are the offset from the
2908 start of the armap strings to the null-terminated string naming
2909 this symbol. The second four bytes are the file offset to the
2910 archive member which defines this symbol. If the second four bytes
2911 are 0, then this is not actually a symbol definition, and it should
2914 The symbols are hashed into the armap with a closed hashing scheme.
2915 See the functions below for the details of the algorithm.
2917 After the symbol definitions comes four bytes holding the size of
2918 the string table, followed by the string table itself. */
2920 /* The name of an archive headers looks like this:
2921 __________E[BL]E[BL]_ (with a trailing space).
2922 The trailing space is changed to an X if the archive is changed to
2923 indicate that the armap is out of date.
2925 The Alpha seems to use ________64E[BL]E[BL]_. */
2927 #define ARMAP_BIG_ENDIAN 'B'
2928 #define ARMAP_LITTLE_ENDIAN 'L'
2929 #define ARMAP_MARKER 'E'
2930 #define ARMAP_START_LENGTH 10
2931 #define ARMAP_HEADER_MARKER_INDEX 10
2932 #define ARMAP_HEADER_ENDIAN_INDEX 11
2933 #define ARMAP_OBJECT_MARKER_INDEX 12
2934 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2935 #define ARMAP_END_INDEX 14
2936 #define ARMAP_END "_ "
2938 /* This is a magic number used in the hashing algorithm. */
2939 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2941 /* This returns the hash value to use for a string. It also sets
2942 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2943 is the number of entries in the hash table, and HLOG is the log
2947 ecoff_armap_hash (s
, rehash
, size
, hlog
)
2949 unsigned int *rehash
;
2959 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2960 hash
*= ARMAP_HASH_MAGIC
;
2961 *rehash
= (hash
& (size
- 1)) | 1;
2962 return hash
>> (32 - hlog
);
2965 /* Read in the armap. */
2968 _bfd_ecoff_slurp_armap (abfd
)
2973 struct areltdata
*mapdata
;
2974 bfd_size_type parsed_size
;
2976 struct artdata
*ardata
;
2979 struct symdef
*symdef_ptr
;
2983 /* Get the name of the first element. */
2984 i
= bfd_bread ((PTR
) nextname
, (bfd_size_type
) 16, abfd
);
2990 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2993 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2994 standard COFF armap. We could move the ECOFF armap stuff into
2995 bfd_slurp_armap, but that seems inappropriate since no other
2996 target uses this format. Instead, we check directly for a COFF
2998 if (strncmp (nextname
, "/ ", 16) == 0)
2999 return bfd_slurp_armap (abfd
);
3001 /* See if the first element is an armap. */
3002 if (strncmp (nextname
, ecoff_backend (abfd
)->armap_start
,
3003 ARMAP_START_LENGTH
) != 0
3004 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
3005 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3006 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3007 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
3008 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3009 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3010 || strncmp (nextname
+ ARMAP_END_INDEX
,
3011 ARMAP_END
, sizeof ARMAP_END
- 1) != 0)
3013 bfd_has_map (abfd
) = FALSE
;
3017 /* Make sure we have the right byte ordering. */
3018 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3019 ^ (bfd_header_big_endian (abfd
)))
3020 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3021 ^ (bfd_big_endian (abfd
))))
3023 bfd_set_error (bfd_error_wrong_format
);
3027 /* Read in the armap. */
3028 ardata
= bfd_ardata (abfd
);
3029 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
3030 if (mapdata
== (struct areltdata
*) NULL
)
3032 parsed_size
= mapdata
->parsed_size
;
3033 bfd_release (abfd
, (PTR
) mapdata
);
3035 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
3036 if (raw_armap
== (char *) NULL
)
3039 if (bfd_bread ((PTR
) raw_armap
, parsed_size
, abfd
) != parsed_size
)
3041 if (bfd_get_error () != bfd_error_system_call
)
3042 bfd_set_error (bfd_error_malformed_archive
);
3043 bfd_release (abfd
, (PTR
) raw_armap
);
3047 ardata
->tdata
= (PTR
) raw_armap
;
3049 count
= H_GET_32 (abfd
, raw_armap
);
3051 ardata
->symdef_count
= 0;
3052 ardata
->cache
= (struct ar_cache
*) NULL
;
3054 /* This code used to overlay the symdefs over the raw archive data,
3055 but that doesn't work on a 64 bit host. */
3056 stringbase
= raw_armap
+ count
* 8 + 8;
3058 #ifdef CHECK_ARMAP_HASH
3062 /* Double check that I have the hashing algorithm right by making
3063 sure that every symbol can be looked up successfully. */
3065 for (i
= 1; i
< count
; i
<<= 1)
3067 BFD_ASSERT (i
== count
);
3069 raw_ptr
= raw_armap
+ 4;
3070 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3072 unsigned int name_offset
, file_offset
;
3073 unsigned int hash
, rehash
, srch
;
3075 name_offset
= H_GET_32 (abfd
, raw_ptr
);
3076 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
3077 if (file_offset
== 0)
3079 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
3084 /* See if we can rehash to this location. */
3085 for (srch
= (hash
+ rehash
) & (count
- 1);
3086 srch
!= hash
&& srch
!= i
;
3087 srch
= (srch
+ rehash
) & (count
- 1))
3088 BFD_ASSERT (H_GET_32 (abfd
, (raw_armap
+ 8 + srch
* 8)) != 0);
3089 BFD_ASSERT (srch
== i
);
3093 #endif /* CHECK_ARMAP_HASH */
3095 raw_ptr
= raw_armap
+ 4;
3096 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3097 if (H_GET_32 (abfd
, (raw_ptr
+ 4)) != 0)
3098 ++ardata
->symdef_count
;
3100 amt
= ardata
->symdef_count
;
3101 amt
*= sizeof (struct symdef
);
3102 symdef_ptr
= (struct symdef
*) bfd_alloc (abfd
, amt
);
3106 ardata
->symdefs
= (carsym
*) symdef_ptr
;
3108 raw_ptr
= raw_armap
+ 4;
3109 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3111 unsigned int name_offset
, file_offset
;
3113 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
3114 if (file_offset
== 0)
3116 name_offset
= H_GET_32 (abfd
, raw_ptr
);
3117 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
3118 symdef_ptr
->file_offset
= file_offset
;
3122 ardata
->first_file_filepos
= bfd_tell (abfd
);
3123 /* Pad to an even boundary. */
3124 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3126 bfd_has_map (abfd
) = TRUE
;
3131 /* Write out an armap. */
3134 _bfd_ecoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
3136 unsigned int elength
;
3138 unsigned int orl_count
;
3141 unsigned int hashsize
, hashlog
;
3142 bfd_size_type symdefsize
;
3144 unsigned int stringsize
;
3145 unsigned int mapsize
;
3148 struct stat statbuf
;
3151 bfd_byte
*hashtable
;
3155 /* Ultrix appears to use as a hash table size the least power of two
3156 greater than twice the number of entries. */
3157 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3159 hashsize
= 1 << hashlog
;
3161 symdefsize
= hashsize
* 8;
3163 stringsize
= stridx
+ padit
;
3165 /* Include 8 bytes to store symdefsize and stringsize in output. */
3166 mapsize
= symdefsize
+ stringsize
+ 8;
3168 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3170 memset ((PTR
) &hdr
, 0, sizeof hdr
);
3172 /* Work out the ECOFF armap name. */
3173 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3174 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3175 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3176 (bfd_header_big_endian (abfd
)
3178 : ARMAP_LITTLE_ENDIAN
);
3179 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3180 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3181 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3182 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3184 /* Write the timestamp of the archive header to be just a little bit
3185 later than the timestamp of the file, otherwise the linker will
3186 complain that the index is out of date. Actually, the Ultrix
3187 linker just checks the archive name; the GNU linker may check the
3189 stat (abfd
->filename
, &statbuf
);
3190 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3192 /* The DECstation uses zeroes for the uid, gid and mode of the
3194 hdr
.ar_uid
[0] = '0';
3195 hdr
.ar_gid
[0] = '0';
3197 hdr
.ar_mode
[0] = '0';
3199 /* Building gcc ends up extracting the armap as a file - twice. */
3200 hdr
.ar_mode
[0] = '6';
3201 hdr
.ar_mode
[1] = '4';
3202 hdr
.ar_mode
[2] = '4';
3205 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3207 hdr
.ar_fmag
[0] = '`';
3208 hdr
.ar_fmag
[1] = '\012';
3210 /* Turn all null bytes in the header into spaces. */
3211 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3212 if (((char *) (&hdr
))[i
] == '\0')
3213 (((char *) (&hdr
))[i
]) = ' ';
3215 if (bfd_bwrite ((PTR
) &hdr
, (bfd_size_type
) sizeof (struct ar_hdr
), abfd
)
3216 != sizeof (struct ar_hdr
))
3219 H_PUT_32 (abfd
, hashsize
, temp
);
3220 if (bfd_bwrite ((PTR
) temp
, (bfd_size_type
) 4, abfd
) != 4)
3223 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3227 current
= abfd
->archive_head
;
3229 for (i
= 0; i
< orl_count
; i
++)
3231 unsigned int hash
, rehash
;
3233 /* Advance firstreal to the file position of this archive
3235 if (map
[i
].u
.abfd
!= last_elt
)
3239 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3240 firstreal
+= firstreal
% 2;
3241 current
= current
->next
;
3243 while (current
!= map
[i
].u
.abfd
);
3248 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3249 if (H_GET_32 (abfd
, (hashtable
+ (hash
* 8) + 4)) != 0)
3253 /* The desired slot is already taken. */
3254 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3256 srch
= (srch
+ rehash
) & (hashsize
- 1))
3257 if (H_GET_32 (abfd
, (hashtable
+ (srch
* 8) + 4)) == 0)
3260 BFD_ASSERT (srch
!= hash
);
3265 H_PUT_32 (abfd
, map
[i
].namidx
, (hashtable
+ hash
* 8));
3266 H_PUT_32 (abfd
, firstreal
, (hashtable
+ hash
* 8 + 4));
3269 if (bfd_bwrite ((PTR
) hashtable
, symdefsize
, abfd
) != symdefsize
)
3272 bfd_release (abfd
, hashtable
);
3274 /* Now write the strings. */
3275 H_PUT_32 (abfd
, stringsize
, temp
);
3276 if (bfd_bwrite ((PTR
) temp
, (bfd_size_type
) 4, abfd
) != 4)
3278 for (i
= 0; i
< orl_count
; i
++)
3282 len
= strlen (*map
[i
].name
) + 1;
3283 if (bfd_bwrite ((PTR
) (*map
[i
].name
), len
, abfd
) != len
)
3287 /* The spec sez this should be a newline. But in order to be
3288 bug-compatible for DECstation ar we use a null. */
3291 if (bfd_bwrite ("", (bfd_size_type
) 1, abfd
) != 1)
3298 /* See whether this BFD is an archive. If it is, read in the armap
3299 and the extended name table. */
3302 _bfd_ecoff_archive_p (abfd
)
3305 struct artdata
*tdata_hold
;
3306 char armag
[SARMAG
+ 1];
3309 if (bfd_bread ((PTR
) armag
, (bfd_size_type
) SARMAG
, abfd
) != SARMAG
)
3311 if (bfd_get_error () != bfd_error_system_call
)
3312 bfd_set_error (bfd_error_wrong_format
);
3313 return (const bfd_target
*) NULL
;
3316 if (strncmp (armag
, ARMAG
, SARMAG
) != 0)
3318 bfd_set_error (bfd_error_wrong_format
);
3322 tdata_hold
= bfd_ardata (abfd
);
3324 amt
= sizeof (struct artdata
);
3325 bfd_ardata (abfd
) = (struct artdata
*) bfd_zalloc (abfd
, amt
);
3326 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
3328 bfd_ardata (abfd
) = tdata_hold
;
3329 return (const bfd_target
*) NULL
;
3332 bfd_ardata (abfd
)->first_file_filepos
= SARMAG
;
3333 bfd_ardata (abfd
)->cache
= NULL
;
3334 bfd_ardata (abfd
)->archive_head
= NULL
;
3335 bfd_ardata (abfd
)->symdefs
= NULL
;
3336 bfd_ardata (abfd
)->extended_names
= NULL
;
3337 bfd_ardata (abfd
)->tdata
= NULL
;
3339 if (! _bfd_ecoff_slurp_armap (abfd
)
3340 || ! _bfd_ecoff_slurp_extended_name_table (abfd
))
3342 bfd_release (abfd
, bfd_ardata (abfd
));
3343 bfd_ardata (abfd
) = tdata_hold
;
3344 return (const bfd_target
*) NULL
;
3347 if (bfd_has_map (abfd
))
3351 /* This archive has a map, so we may presume that the contents
3352 are object files. Make sure that if the first file in the
3353 archive can be recognized as an object file, it is for this
3354 target. If not, assume that this is the wrong format. If
3355 the first file is not an object file, somebody is doing
3356 something weird, and we permit it so that ar -t will work. */
3358 first
= bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
);
3361 first
->target_defaulted
= FALSE
;
3362 if (bfd_check_format (first
, bfd_object
)
3363 && first
->xvec
!= abfd
->xvec
)
3366 /* We ought to close `first' here, but we can't, because
3367 we have no way to remove it from the archive cache.
3368 It's close to impossible to figure out when we can
3369 release bfd_ardata. FIXME. */
3370 (void) bfd_close (first
);
3371 bfd_release (abfd
, bfd_ardata (abfd
));
3373 bfd_set_error (bfd_error_wrong_object_format
);
3374 bfd_ardata (abfd
) = tdata_hold
;
3377 /* And we ought to close `first' here too. */
3384 /* ECOFF linker code. */
3386 static struct bfd_hash_entry
*ecoff_link_hash_newfunc
3387 PARAMS ((struct bfd_hash_entry
*entry
,
3388 struct bfd_hash_table
*table
,
3389 const char *string
));
3390 static bfd_boolean ecoff_link_add_archive_symbols
3391 PARAMS ((bfd
*, struct bfd_link_info
*));
3392 static bfd_boolean ecoff_link_check_archive_element
3393 PARAMS ((bfd
*, struct bfd_link_info
*, bfd_boolean
*pneeded
));
3394 static bfd_boolean ecoff_link_add_object_symbols
3395 PARAMS ((bfd
*, struct bfd_link_info
*));
3396 static bfd_boolean ecoff_link_add_externals
3397 PARAMS ((bfd
*, struct bfd_link_info
*, PTR
, char *));
3399 /* Routine to create an entry in an ECOFF link hash table. */
3401 static struct bfd_hash_entry
*
3402 ecoff_link_hash_newfunc (entry
, table
, string
)
3403 struct bfd_hash_entry
*entry
;
3404 struct bfd_hash_table
*table
;
3407 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3409 /* Allocate the structure if it has not already been allocated by a
3411 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3412 ret
= ((struct ecoff_link_hash_entry
*)
3413 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3414 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3417 /* Call the allocation method of the superclass. */
3418 ret
= ((struct ecoff_link_hash_entry
*)
3419 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3424 /* Set local fields. */
3430 memset ((PTR
) &ret
->esym
, 0, sizeof ret
->esym
);
3432 return (struct bfd_hash_entry
*) ret
;
3435 /* Create an ECOFF link hash table. */
3437 struct bfd_link_hash_table
*
3438 _bfd_ecoff_bfd_link_hash_table_create (abfd
)
3441 struct ecoff_link_hash_table
*ret
;
3442 bfd_size_type amt
= sizeof (struct ecoff_link_hash_table
);
3444 ret
= (struct ecoff_link_hash_table
*) bfd_malloc (amt
);
3447 if (! _bfd_link_hash_table_init (&ret
->root
, abfd
,
3448 ecoff_link_hash_newfunc
))
3451 return (struct bfd_link_hash_table
*) NULL
;
3456 /* Look up an entry in an ECOFF link hash table. */
3458 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3459 ((struct ecoff_link_hash_entry *) \
3460 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3462 /* Traverse an ECOFF link hash table. */
3464 #define ecoff_link_hash_traverse(table, func, info) \
3465 (bfd_link_hash_traverse \
3467 (bfd_boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3470 /* Get the ECOFF link hash table from the info structure. This is
3473 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3475 /* Given an ECOFF BFD, add symbols to the global hash table as
3479 _bfd_ecoff_bfd_link_add_symbols (abfd
, info
)
3481 struct bfd_link_info
*info
;
3483 switch (bfd_get_format (abfd
))
3486 return ecoff_link_add_object_symbols (abfd
, info
);
3488 return ecoff_link_add_archive_symbols (abfd
, info
);
3490 bfd_set_error (bfd_error_wrong_format
);
3495 /* Add the symbols from an archive file to the global hash table.
3496 This looks through the undefined symbols, looks each one up in the
3497 archive hash table, and adds any associated object file. We do not
3498 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3499 already have a hash table, so there is no reason to construct
3503 ecoff_link_add_archive_symbols (abfd
, info
)
3505 struct bfd_link_info
*info
;
3507 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3508 const bfd_byte
*raw_armap
;
3509 struct bfd_link_hash_entry
**pundef
;
3510 unsigned int armap_count
;
3511 unsigned int armap_log
;
3513 const bfd_byte
*hashtable
;
3514 const char *stringbase
;
3516 if (! bfd_has_map (abfd
))
3518 /* An empty archive is a special case. */
3519 if (bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
) == NULL
)
3521 bfd_set_error (bfd_error_no_armap
);
3525 /* If we don't have any raw data for this archive, as can happen on
3526 Irix 4.0.5F, we call the generic routine.
3527 FIXME: We should be more clever about this, since someday tdata
3528 may get to something for a generic archive. */
3529 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3530 if (raw_armap
== (bfd_byte
*) NULL
)
3531 return (_bfd_generic_link_add_archive_symbols
3532 (abfd
, info
, ecoff_link_check_archive_element
));
3534 armap_count
= H_GET_32 (abfd
, raw_armap
);
3537 for (i
= 1; i
< armap_count
; i
<<= 1)
3539 BFD_ASSERT (i
== armap_count
);
3541 hashtable
= raw_armap
+ 4;
3542 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3544 /* Look through the list of undefined symbols. */
3545 pundef
= &info
->hash
->undefs
;
3546 while (*pundef
!= (struct bfd_link_hash_entry
*) NULL
)
3548 struct bfd_link_hash_entry
*h
;
3549 unsigned int hash
, rehash
;
3550 unsigned int file_offset
;
3556 /* When a symbol is defined, it is not necessarily removed from
3558 if (h
->type
!= bfd_link_hash_undefined
3559 && h
->type
!= bfd_link_hash_common
)
3561 /* Remove this entry from the list, for general cleanliness
3562 and because we are going to look through the list again
3563 if we search any more libraries. We can't remove the
3564 entry if it is the tail, because that would lose any
3565 entries we add to the list later on. */
3566 if (*pundef
!= info
->hash
->undefs_tail
)
3567 *pundef
= (*pundef
)->next
;
3569 pundef
= &(*pundef
)->next
;
3573 /* Native ECOFF linkers do not pull in archive elements merely
3574 to satisfy common definitions, so neither do we. We leave
3575 them on the list, though, in case we are linking against some
3576 other object format. */
3577 if (h
->type
!= bfd_link_hash_undefined
)
3579 pundef
= &(*pundef
)->next
;
3583 /* Look for this symbol in the archive hash table. */
3584 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3587 file_offset
= H_GET_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3588 if (file_offset
== 0)
3590 /* Nothing in this slot. */
3591 pundef
= &(*pundef
)->next
;
3595 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (hash
* 8));
3596 if (name
[0] != h
->root
.string
[0]
3597 || strcmp (name
, h
->root
.string
) != 0)
3602 /* That was the wrong symbol. Try rehashing. */
3604 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3606 srch
= (srch
+ rehash
) & (armap_count
- 1))
3608 file_offset
= H_GET_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3609 if (file_offset
== 0)
3611 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (srch
* 8));
3612 if (name
[0] == h
->root
.string
[0]
3613 && strcmp (name
, h
->root
.string
) == 0)
3622 pundef
= &(*pundef
)->next
;
3629 element
= (*backend
->get_elt_at_filepos
) (abfd
, (file_ptr
) file_offset
);
3630 if (element
== (bfd
*) NULL
)
3633 if (! bfd_check_format (element
, bfd_object
))
3636 /* Unlike the generic linker, we know that this element provides
3637 a definition for an undefined symbol and we know that we want
3638 to include it. We don't need to check anything. */
3639 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3641 if (! ecoff_link_add_object_symbols (element
, info
))
3644 pundef
= &(*pundef
)->next
;
3650 /* This is called if we used _bfd_generic_link_add_archive_symbols
3651 because we were not dealing with an ECOFF archive. */
3654 ecoff_link_check_archive_element (abfd
, info
, pneeded
)
3656 struct bfd_link_info
*info
;
3657 bfd_boolean
*pneeded
;
3659 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3660 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3661 = backend
->debug_swap
.swap_ext_in
;
3663 bfd_size_type external_ext_size
;
3664 PTR external_ext
= NULL
;
3665 bfd_size_type esize
;
3672 if (! ecoff_slurp_symbolic_header (abfd
))
3675 /* If there are no symbols, we don't want it. */
3676 if (bfd_get_symcount (abfd
) == 0)
3677 goto successful_return
;
3679 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3681 /* Read in the external symbols and external strings. */
3682 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3683 esize
= symhdr
->iextMax
* external_ext_size
;
3684 external_ext
= (PTR
) bfd_malloc (esize
);
3685 if (external_ext
== NULL
&& esize
!= 0)
3688 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3689 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3692 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3693 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3696 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3697 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3698 != (bfd_size_type
) symhdr
->issExtMax
))
3701 /* Look through the external symbols to see if they define some
3702 symbol that is currently undefined. */
3703 ext_ptr
= (char *) external_ext
;
3704 ext_end
= ext_ptr
+ esize
;
3705 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3710 struct bfd_link_hash_entry
*h
;
3712 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3714 /* See if this symbol defines something. */
3715 if (esym
.asym
.st
!= stGlobal
3716 && esym
.asym
.st
!= stLabel
3717 && esym
.asym
.st
!= stProc
)
3720 switch (esym
.asym
.sc
)
3744 name
= ssext
+ esym
.asym
.iss
;
3745 h
= bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
3747 /* Unlike the generic linker, we do not pull in elements because
3748 of common symbols. */
3749 if (h
== (struct bfd_link_hash_entry
*) NULL
3750 || h
->type
!= bfd_link_hash_undefined
)
3753 /* Include this element. */
3754 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3756 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3760 goto successful_return
;
3764 if (external_ext
!= NULL
)
3765 free (external_ext
);
3770 if (external_ext
!= NULL
)
3771 free (external_ext
);
3777 /* Add symbols from an ECOFF object file to the global linker hash
3781 ecoff_link_add_object_symbols (abfd
, info
)
3783 struct bfd_link_info
*info
;
3786 bfd_size_type external_ext_size
;
3787 PTR external_ext
= NULL
;
3788 bfd_size_type esize
;
3792 if (! ecoff_slurp_symbolic_header (abfd
))
3795 /* If there are no symbols, we don't want it. */
3796 if (bfd_get_symcount (abfd
) == 0)
3799 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3801 /* Read in the external symbols and external strings. */
3802 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3803 esize
= symhdr
->iextMax
* external_ext_size
;
3804 external_ext
= (PTR
) bfd_malloc (esize
);
3805 if (external_ext
== NULL
&& esize
!= 0)
3808 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3809 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3812 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3813 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3816 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3817 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3818 != (bfd_size_type
) symhdr
->issExtMax
))
3821 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3825 if (external_ext
!= NULL
)
3826 free (external_ext
);
3832 if (external_ext
!= NULL
)
3833 free (external_ext
);
3837 /* Add the external symbols of an object file to the global linker
3838 hash table. The external symbols and strings we are passed are
3839 just allocated on the stack, and will be discarded. We must
3840 explicitly save any information we may need later on in the link.
3841 We do not want to read the external symbol information again. */
3844 ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
)
3846 struct bfd_link_info
*info
;
3850 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3851 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3852 = backend
->debug_swap
.swap_ext_in
;
3853 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3854 unsigned long ext_count
;
3855 struct bfd_link_hash_entry
**sym_hash
;
3860 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3863 amt
*= sizeof (struct bfd_link_hash_entry
*);
3864 sym_hash
= (struct bfd_link_hash_entry
**) bfd_alloc (abfd
, amt
);
3867 ecoff_data (abfd
)->sym_hashes
= (struct ecoff_link_hash_entry
**) sym_hash
;
3869 ext_ptr
= (char *) external_ext
;
3870 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3871 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3878 struct ecoff_link_hash_entry
*h
;
3882 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3884 /* Skip debugging symbols. */
3886 switch (esym
.asym
.st
)
3902 /* Get the information for this symbol. */
3903 value
= esym
.asym
.value
;
3904 switch (esym
.asym
.sc
)
3924 section
= bfd_make_section_old_way (abfd
, ".text");
3925 value
-= section
->vma
;
3928 section
= bfd_make_section_old_way (abfd
, ".data");
3929 value
-= section
->vma
;
3932 section
= bfd_make_section_old_way (abfd
, ".bss");
3933 value
-= section
->vma
;
3936 section
= bfd_abs_section_ptr
;
3939 section
= bfd_und_section_ptr
;
3942 section
= bfd_make_section_old_way (abfd
, ".sdata");
3943 value
-= section
->vma
;
3946 section
= bfd_make_section_old_way (abfd
, ".sbss");
3947 value
-= section
->vma
;
3950 section
= bfd_make_section_old_way (abfd
, ".rdata");
3951 value
-= section
->vma
;
3954 if (value
> ecoff_data (abfd
)->gp_size
)
3956 section
= bfd_com_section_ptr
;
3961 if (ecoff_scom_section
.name
== NULL
)
3963 /* Initialize the small common section. */
3964 ecoff_scom_section
.name
= SCOMMON
;
3965 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3966 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3967 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3968 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3969 ecoff_scom_symbol
.name
= SCOMMON
;
3970 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3971 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3972 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3974 section
= &ecoff_scom_section
;
3977 section
= bfd_und_section_ptr
;
3980 section
= bfd_make_section_old_way (abfd
, ".init");
3981 value
-= section
->vma
;
3984 section
= bfd_make_section_old_way (abfd
, ".fini");
3985 value
-= section
->vma
;
3988 section
= bfd_make_section_old_way (abfd
, ".rconst");
3989 value
-= section
->vma
;
3993 if (section
== (asection
*) NULL
)
3996 name
= ssext
+ esym
.asym
.iss
;
3998 if (! (_bfd_generic_link_add_one_symbol
4000 (flagword
) (esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
),
4001 section
, value
, (const char *) NULL
, TRUE
, TRUE
, sym_hash
)))
4004 h
= (struct ecoff_link_hash_entry
*) *sym_hash
;
4006 /* If we are building an ECOFF hash table, save the external
4007 symbol information. */
4008 if (info
->hash
->creator
->flavour
== bfd_get_flavour (abfd
))
4010 if (h
->abfd
== (bfd
*) NULL
4011 || (! bfd_is_und_section (section
)
4012 && (! bfd_is_com_section (section
)
4013 || (h
->root
.type
!= bfd_link_hash_defined
4014 && h
->root
.type
!= bfd_link_hash_defweak
))))
4020 /* Remember whether this symbol was small undefined. */
4021 if (esym
.asym
.sc
== scSUndefined
)
4024 /* If this symbol was ever small undefined, it needs to wind
4025 up in a GP relative section. We can't control the
4026 section of a defined symbol, but we can control the
4027 section of a common symbol. This case is actually needed
4028 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4030 && h
->root
.type
== bfd_link_hash_common
4031 && strcmp (h
->root
.u
.c
.p
->section
->name
, SCOMMON
) != 0)
4033 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
4035 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
4036 if (h
->esym
.asym
.sc
== scCommon
)
4037 h
->esym
.asym
.sc
= scSCommon
;
4045 /* ECOFF final link routines. */
4047 static bfd_boolean ecoff_final_link_debug_accumulate
4048 PARAMS ((bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*,
4050 static bfd_boolean ecoff_link_write_external
4051 PARAMS ((struct ecoff_link_hash_entry
*, PTR
));
4052 static bfd_boolean ecoff_indirect_link_order
4053 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4054 struct bfd_link_order
*));
4055 static bfd_boolean ecoff_reloc_link_order
4056 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4057 struct bfd_link_order
*));
4059 /* Structure used to pass information to ecoff_link_write_external. */
4064 struct bfd_link_info
*info
;
4067 /* ECOFF final link routine. This looks through all the input BFDs
4068 and gathers together all the debugging information, and then
4069 processes all the link order information. This may cause it to
4070 close and reopen some input BFDs; I'll see how bad this is. */
4073 _bfd_ecoff_bfd_final_link (abfd
, info
)
4075 struct bfd_link_info
*info
;
4077 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4078 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4081 register bfd
*input_bfd
;
4083 struct bfd_link_order
*p
;
4084 struct extsym_info einfo
;
4086 /* We accumulate the debugging information counts in the symbolic
4088 symhdr
= &debug
->symbolic_header
;
4090 symhdr
->ilineMax
= 0;
4094 symhdr
->isymMax
= 0;
4095 symhdr
->ioptMax
= 0;
4096 symhdr
->iauxMax
= 0;
4098 symhdr
->issExtMax
= 0;
4101 symhdr
->iextMax
= 0;
4103 /* We accumulate the debugging information itself in the debug_info
4106 debug
->external_dnr
= NULL
;
4107 debug
->external_pdr
= NULL
;
4108 debug
->external_sym
= NULL
;
4109 debug
->external_opt
= NULL
;
4110 debug
->external_aux
= NULL
;
4112 debug
->ssext
= debug
->ssext_end
= NULL
;
4113 debug
->external_fdr
= NULL
;
4114 debug
->external_rfd
= NULL
;
4115 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4117 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4118 if (handle
== (PTR
) NULL
)
4121 /* Accumulate the debugging symbols from each input BFD. */
4122 for (input_bfd
= info
->input_bfds
;
4123 input_bfd
!= (bfd
*) NULL
;
4124 input_bfd
= input_bfd
->link_next
)
4128 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4130 /* Abitrarily set the symbolic header vstamp to the vstamp
4131 of the first object file in the link. */
4132 if (symhdr
->vstamp
== 0)
4134 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4135 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4139 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4140 debug
, &backend
->debug_swap
,
4145 /* Combine the register masks. */
4146 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4147 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4148 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4149 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4150 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4151 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4154 /* Write out the external symbols. */
4157 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4158 ecoff_link_write_external
,
4161 if (info
->relocateable
)
4163 /* We need to make a pass over the link_orders to count up the
4164 number of relocations we will need to output, so that we know
4165 how much space they will take up. */
4166 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4169 for (p
= o
->link_order_head
;
4170 p
!= (struct bfd_link_order
*) NULL
;
4172 if (p
->type
== bfd_indirect_link_order
)
4173 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4174 else if (p
->type
== bfd_section_reloc_link_order
4175 || p
->type
== bfd_symbol_reloc_link_order
)
4180 /* Compute the reloc and symbol file positions. */
4181 ecoff_compute_reloc_file_positions (abfd
);
4183 /* Write out the debugging information. */
4184 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4185 &backend
->debug_swap
, info
,
4186 ecoff_data (abfd
)->sym_filepos
))
4189 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4191 if (info
->relocateable
)
4193 /* Now reset the reloc_count field of the sections in the output
4194 BFD to 0, so that we can use them to keep track of how many
4195 relocs we have output thus far. */
4196 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4200 /* Get a value for the GP register. */
4201 if (ecoff_data (abfd
)->gp
== 0)
4203 struct bfd_link_hash_entry
*h
;
4205 h
= bfd_link_hash_lookup (info
->hash
, "_gp", FALSE
, FALSE
, TRUE
);
4206 if (h
!= (struct bfd_link_hash_entry
*) NULL
4207 && h
->type
== bfd_link_hash_defined
)
4208 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4209 + h
->u
.def
.section
->output_section
->vma
4210 + h
->u
.def
.section
->output_offset
);
4211 else if (info
->relocateable
)
4215 /* Make up a value. */
4217 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4220 && (strcmp (o
->name
, _SBSS
) == 0
4221 || strcmp (o
->name
, _SDATA
) == 0
4222 || strcmp (o
->name
, _LIT4
) == 0
4223 || strcmp (o
->name
, _LIT8
) == 0
4224 || strcmp (o
->name
, _LITA
) == 0))
4227 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4231 /* If the relocate_section function needs to do a reloc
4232 involving the GP value, it should make a reloc_dangerous
4233 callback to warn that GP is not defined. */
4237 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4239 for (p
= o
->link_order_head
;
4240 p
!= (struct bfd_link_order
*) NULL
;
4243 if (p
->type
== bfd_indirect_link_order
4244 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4245 == bfd_target_ecoff_flavour
))
4247 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4250 else if (p
->type
== bfd_section_reloc_link_order
4251 || p
->type
== bfd_symbol_reloc_link_order
)
4253 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4258 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4264 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4266 ecoff_data (abfd
)->linker
= TRUE
;
4271 /* Accumulate the debugging information for an input BFD into the
4272 output BFD. This must read in the symbolic information of the
4276 ecoff_final_link_debug_accumulate (output_bfd
, input_bfd
, info
, handle
)
4279 struct bfd_link_info
*info
;
4282 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
4283 const struct ecoff_debug_swap
* const swap
=
4284 &ecoff_backend (input_bfd
)->debug_swap
;
4285 HDRR
*symhdr
= &debug
->symbolic_header
;
4288 #define READ(ptr, offset, count, size, type) \
4289 if (symhdr->count == 0) \
4290 debug->ptr = NULL; \
4293 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
4294 debug->ptr = (type) bfd_malloc (amt); \
4295 if (debug->ptr == NULL) \
4298 goto return_something; \
4300 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
4301 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
4304 goto return_something; \
4308 /* If raw_syments is not NULL, then the data was already by read by
4309 _bfd_ecoff_slurp_symbolic_info. */
4310 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4312 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
4314 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
4315 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
4316 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
4317 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
4318 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
4320 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
4321 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
4322 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
4326 /* We do not read the external strings or the external symbols. */
4328 ret
= (bfd_ecoff_debug_accumulate
4329 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4330 &ecoff_backend (output_bfd
)->debug_swap
,
4331 input_bfd
, debug
, swap
, info
));
4334 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4336 if (debug
->line
!= NULL
)
4338 if (debug
->external_dnr
!= NULL
)
4339 free (debug
->external_dnr
);
4340 if (debug
->external_pdr
!= NULL
)
4341 free (debug
->external_pdr
);
4342 if (debug
->external_sym
!= NULL
)
4343 free (debug
->external_sym
);
4344 if (debug
->external_opt
!= NULL
)
4345 free (debug
->external_opt
);
4346 if (debug
->external_aux
!= NULL
)
4347 free (debug
->external_aux
);
4348 if (debug
->ss
!= NULL
)
4350 if (debug
->external_fdr
!= NULL
)
4351 free (debug
->external_fdr
);
4352 if (debug
->external_rfd
!= NULL
)
4353 free (debug
->external_rfd
);
4355 /* Make sure we don't accidentally follow one of these pointers
4356 into freed memory. */
4358 debug
->external_dnr
= NULL
;
4359 debug
->external_pdr
= NULL
;
4360 debug
->external_sym
= NULL
;
4361 debug
->external_opt
= NULL
;
4362 debug
->external_aux
= NULL
;
4364 debug
->external_fdr
= NULL
;
4365 debug
->external_rfd
= NULL
;
4371 /* Put out information for an external symbol. These come only from
4375 ecoff_link_write_external (h
, data
)
4376 struct ecoff_link_hash_entry
*h
;
4379 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4380 bfd
*output_bfd
= einfo
->abfd
;
4383 if (h
->root
.type
== bfd_link_hash_warning
)
4385 h
= (struct ecoff_link_hash_entry
*) h
->root
.u
.i
.link
;
4386 if (h
->root
.type
== bfd_link_hash_new
)
4390 /* We need to check if this symbol is being stripped. */
4391 if (h
->root
.type
== bfd_link_hash_undefined
4392 || h
->root
.type
== bfd_link_hash_undefweak
)
4394 else if (einfo
->info
->strip
== strip_all
4395 || (einfo
->info
->strip
== strip_some
4396 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4397 h
->root
.root
.string
,
4398 FALSE
, FALSE
) == NULL
))
4403 if (strip
|| h
->written
)
4406 if (h
->abfd
== (bfd
*) NULL
)
4409 h
->esym
.cobol_main
= 0;
4410 h
->esym
.weakext
= 0;
4411 h
->esym
.reserved
= 0;
4412 h
->esym
.ifd
= ifdNil
;
4413 h
->esym
.asym
.value
= 0;
4414 h
->esym
.asym
.st
= stGlobal
;
4416 if (h
->root
.type
!= bfd_link_hash_defined
4417 && h
->root
.type
!= bfd_link_hash_defweak
)
4418 h
->esym
.asym
.sc
= scAbs
;
4421 asection
*output_section
;
4424 output_section
= h
->root
.u
.def
.section
->output_section
;
4425 name
= bfd_section_name (output_section
->owner
, output_section
);
4427 if (strcmp (name
, _TEXT
) == 0)
4428 h
->esym
.asym
.sc
= scText
;
4429 else if (strcmp (name
, _DATA
) == 0)
4430 h
->esym
.asym
.sc
= scData
;
4431 else if (strcmp (name
, _SDATA
) == 0)
4432 h
->esym
.asym
.sc
= scSData
;
4433 else if (strcmp (name
, _RDATA
) == 0)
4434 h
->esym
.asym
.sc
= scRData
;
4435 else if (strcmp (name
, _BSS
) == 0)
4436 h
->esym
.asym
.sc
= scBss
;
4437 else if (strcmp (name
, _SBSS
) == 0)
4438 h
->esym
.asym
.sc
= scSBss
;
4439 else if (strcmp (name
, _INIT
) == 0)
4440 h
->esym
.asym
.sc
= scInit
;
4441 else if (strcmp (name
, _FINI
) == 0)
4442 h
->esym
.asym
.sc
= scFini
;
4443 else if (strcmp (name
, _PDATA
) == 0)
4444 h
->esym
.asym
.sc
= scPData
;
4445 else if (strcmp (name
, _XDATA
) == 0)
4446 h
->esym
.asym
.sc
= scXData
;
4447 else if (strcmp (name
, _RCONST
) == 0)
4448 h
->esym
.asym
.sc
= scRConst
;
4450 h
->esym
.asym
.sc
= scAbs
;
4453 h
->esym
.asym
.reserved
= 0;
4454 h
->esym
.asym
.index
= indexNil
;
4456 else if (h
->esym
.ifd
!= -1)
4458 struct ecoff_debug_info
*debug
;
4460 /* Adjust the FDR index for the symbol by that used for the
4462 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4463 BFD_ASSERT (h
->esym
.ifd
>= 0
4464 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4465 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4468 switch (h
->root
.type
)
4471 case bfd_link_hash_warning
:
4472 case bfd_link_hash_new
:
4474 case bfd_link_hash_undefined
:
4475 case bfd_link_hash_undefweak
:
4476 if (h
->esym
.asym
.sc
!= scUndefined
4477 && h
->esym
.asym
.sc
!= scSUndefined
)
4478 h
->esym
.asym
.sc
= scUndefined
;
4480 case bfd_link_hash_defined
:
4481 case bfd_link_hash_defweak
:
4482 if (h
->esym
.asym
.sc
== scUndefined
4483 || h
->esym
.asym
.sc
== scSUndefined
)
4484 h
->esym
.asym
.sc
= scAbs
;
4485 else if (h
->esym
.asym
.sc
== scCommon
)
4486 h
->esym
.asym
.sc
= scBss
;
4487 else if (h
->esym
.asym
.sc
== scSCommon
)
4488 h
->esym
.asym
.sc
= scSBss
;
4489 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4490 + h
->root
.u
.def
.section
->output_section
->vma
4491 + h
->root
.u
.def
.section
->output_offset
);
4493 case bfd_link_hash_common
:
4494 if (h
->esym
.asym
.sc
!= scCommon
4495 && h
->esym
.asym
.sc
!= scSCommon
)
4496 h
->esym
.asym
.sc
= scCommon
;
4497 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4499 case bfd_link_hash_indirect
:
4500 /* We ignore these symbols, since the indirected symbol is
4501 already in the hash table. */
4505 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4507 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4510 return (bfd_ecoff_debug_one_external
4511 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4512 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4516 /* Relocate and write an ECOFF section into an ECOFF output file. */
4519 ecoff_indirect_link_order (output_bfd
, info
, output_section
, link_order
)
4521 struct bfd_link_info
*info
;
4522 asection
*output_section
;
4523 struct bfd_link_order
*link_order
;
4525 asection
*input_section
;
4527 struct ecoff_section_tdata
*section_tdata
;
4528 bfd_size_type raw_size
;
4529 bfd_size_type cooked_size
;
4530 bfd_byte
*contents
= NULL
;
4531 bfd_size_type external_reloc_size
;
4532 bfd_size_type external_relocs_size
;
4533 PTR external_relocs
= NULL
;
4536 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
4538 if (link_order
->size
== 0)
4541 input_section
= link_order
->u
.indirect
.section
;
4542 input_bfd
= input_section
->owner
;
4543 section_tdata
= ecoff_section_data (input_bfd
, input_section
);
4545 raw_size
= input_section
->_raw_size
;
4546 cooked_size
= input_section
->_cooked_size
;
4547 if (cooked_size
== 0)
4548 cooked_size
= raw_size
;
4550 BFD_ASSERT (input_section
->output_section
== output_section
);
4551 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
4552 BFD_ASSERT (cooked_size
== link_order
->size
);
4554 /* Get the section contents. We allocate memory for the larger of
4555 the size before relocating and the size after relocating. */
4556 amt
= raw_size
>= cooked_size
? raw_size
: cooked_size
;
4557 contents
= (bfd_byte
*) bfd_malloc (amt
);
4558 if (contents
== NULL
&& amt
!= 0)
4561 /* If we are relaxing, the contents may have already been read into
4562 memory, in which case we copy them into our new buffer. We don't
4563 simply reuse the old buffer in case cooked_size > raw_size. */
4564 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4565 && section_tdata
->contents
!= (bfd_byte
*) NULL
)
4566 memcpy (contents
, section_tdata
->contents
, (size_t) raw_size
);
4569 if (! bfd_get_section_contents (input_bfd
, input_section
,
4571 (file_ptr
) 0, raw_size
))
4575 /* Get the relocs. If we are relaxing MIPS code, they will already
4576 have been read in. Otherwise, we read them in now. */
4577 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
4578 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
4580 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4581 && section_tdata
->external_relocs
!= NULL
)
4582 external_relocs
= section_tdata
->external_relocs
;
4585 external_relocs
= (PTR
) bfd_malloc (external_relocs_size
);
4586 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
4589 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
4590 || (bfd_bread (external_relocs
, external_relocs_size
, input_bfd
)
4591 != external_relocs_size
))
4595 /* Relocate the section contents. */
4596 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4597 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4601 /* Write out the relocated section. */
4602 if (! bfd_set_section_contents (output_bfd
,
4605 (file_ptr
) input_section
->output_offset
,
4609 /* If we are producing relocateable output, the relocs were
4610 modified, and we write them out now. We use the reloc_count
4611 field of output_section to keep track of the number of relocs we
4612 have output so far. */
4613 if (info
->relocateable
)
4615 file_ptr pos
= (output_section
->rel_filepos
4616 + output_section
->reloc_count
* external_reloc_size
);
4617 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
4618 || (bfd_bwrite (external_relocs
, external_relocs_size
, output_bfd
)
4619 != external_relocs_size
))
4621 output_section
->reloc_count
+= input_section
->reloc_count
;
4624 if (contents
!= NULL
)
4626 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4627 free (external_relocs
);
4631 if (contents
!= NULL
)
4633 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4634 free (external_relocs
);
4638 /* Generate a reloc when linking an ECOFF file. This is a reloc
4639 requested by the linker, and does come from any input file. This
4640 is used to build constructor and destructor tables when linking
4644 ecoff_reloc_link_order (output_bfd
, info
, output_section
, link_order
)
4646 struct bfd_link_info
*info
;
4647 asection
*output_section
;
4648 struct bfd_link_order
*link_order
;
4650 enum bfd_link_order_type type
;
4654 struct internal_reloc in
;
4655 bfd_size_type external_reloc_size
;
4660 type
= link_order
->type
;
4662 addend
= link_order
->u
.reloc
.p
->addend
;
4664 /* We set up an arelent to pass to the backend adjust_reloc_out
4666 rel
.address
= link_order
->offset
;
4668 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4671 bfd_set_error (bfd_error_bad_value
);
4675 if (type
== bfd_section_reloc_link_order
)
4677 section
= link_order
->u
.reloc
.p
->u
.section
;
4678 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4682 struct bfd_link_hash_entry
*h
;
4684 /* Treat a reloc against a defined symbol as though it were
4685 actually against the section. */
4686 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4687 link_order
->u
.reloc
.p
->u
.name
,
4688 FALSE
, FALSE
, FALSE
);
4690 && (h
->type
== bfd_link_hash_defined
4691 || h
->type
== bfd_link_hash_defweak
))
4693 type
= bfd_section_reloc_link_order
;
4694 section
= h
->u
.def
.section
->output_section
;
4695 /* It seems that we ought to add the symbol value to the
4696 addend here, but in practice it has already been added
4697 because it was passed to constructor_callback. */
4698 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4702 /* We can't set up a reloc against a symbol correctly,
4703 because we have no asymbol structure. Currently no
4704 adjust_reloc_out routine cares. */
4705 rel
.sym_ptr_ptr
= (asymbol
**) NULL
;
4709 /* All ECOFF relocs are in-place. Put the addend into the object
4712 BFD_ASSERT (rel
.howto
->partial_inplace
);
4716 bfd_reloc_status_type rstat
;
4719 size
= bfd_get_reloc_size (rel
.howto
);
4720 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4721 if (buf
== (bfd_byte
*) NULL
)
4723 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
,
4724 (bfd_vma
) addend
, buf
);
4730 case bfd_reloc_outofrange
:
4732 case bfd_reloc_overflow
:
4733 if (! ((*info
->callbacks
->reloc_overflow
)
4735 (link_order
->type
== bfd_section_reloc_link_order
4736 ? bfd_section_name (output_bfd
, section
)
4737 : link_order
->u
.reloc
.p
->u
.name
),
4738 rel
.howto
->name
, addend
, (bfd
*) NULL
,
4739 (asection
*) NULL
, (bfd_vma
) 0)))
4746 ok
= bfd_set_section_contents (output_bfd
, output_section
, (PTR
) buf
,
4747 (file_ptr
) link_order
->offset
, size
);
4755 /* Move the information into an internal_reloc structure. */
4756 in
.r_vaddr
= (rel
.address
4757 + bfd_get_section_vma (output_bfd
, output_section
));
4758 in
.r_type
= rel
.howto
->type
;
4760 if (type
== bfd_symbol_reloc_link_order
)
4762 struct ecoff_link_hash_entry
*h
;
4764 h
= ((struct ecoff_link_hash_entry
*)
4765 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4766 link_order
->u
.reloc
.p
->u
.name
,
4767 FALSE
, FALSE
, TRUE
));
4768 if (h
!= (struct ecoff_link_hash_entry
*) NULL
4770 in
.r_symndx
= h
->indx
;
4773 if (! ((*info
->callbacks
->unattached_reloc
)
4774 (info
, link_order
->u
.reloc
.p
->u
.name
, (bfd
*) NULL
,
4775 (asection
*) NULL
, (bfd_vma
) 0)))
4785 name
= bfd_get_section_name (output_bfd
, section
);
4786 if (strcmp (name
, ".text") == 0)
4787 in
.r_symndx
= RELOC_SECTION_TEXT
;
4788 else if (strcmp (name
, ".rdata") == 0)
4789 in
.r_symndx
= RELOC_SECTION_RDATA
;
4790 else if (strcmp (name
, ".data") == 0)
4791 in
.r_symndx
= RELOC_SECTION_DATA
;
4792 else if (strcmp (name
, ".sdata") == 0)
4793 in
.r_symndx
= RELOC_SECTION_SDATA
;
4794 else if (strcmp (name
, ".sbss") == 0)
4795 in
.r_symndx
= RELOC_SECTION_SBSS
;
4796 else if (strcmp (name
, ".bss") == 0)
4797 in
.r_symndx
= RELOC_SECTION_BSS
;
4798 else if (strcmp (name
, ".init") == 0)
4799 in
.r_symndx
= RELOC_SECTION_INIT
;
4800 else if (strcmp (name
, ".lit8") == 0)
4801 in
.r_symndx
= RELOC_SECTION_LIT8
;
4802 else if (strcmp (name
, ".lit4") == 0)
4803 in
.r_symndx
= RELOC_SECTION_LIT4
;
4804 else if (strcmp (name
, ".xdata") == 0)
4805 in
.r_symndx
= RELOC_SECTION_XDATA
;
4806 else if (strcmp (name
, ".pdata") == 0)
4807 in
.r_symndx
= RELOC_SECTION_PDATA
;
4808 else if (strcmp (name
, ".fini") == 0)
4809 in
.r_symndx
= RELOC_SECTION_FINI
;
4810 else if (strcmp (name
, ".lita") == 0)
4811 in
.r_symndx
= RELOC_SECTION_LITA
;
4812 else if (strcmp (name
, "*ABS*") == 0)
4813 in
.r_symndx
= RELOC_SECTION_ABS
;
4814 else if (strcmp (name
, ".rconst") == 0)
4815 in
.r_symndx
= RELOC_SECTION_RCONST
;
4821 /* Let the BFD backend adjust the reloc. */
4822 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4824 /* Get some memory and swap out the reloc. */
4825 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4826 rbuf
= (bfd_byte
*) bfd_malloc (external_reloc_size
);
4827 if (rbuf
== (bfd_byte
*) NULL
)
4830 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (PTR
) rbuf
);
4832 pos
= (output_section
->rel_filepos
4833 + output_section
->reloc_count
* external_reloc_size
);
4834 ok
= (bfd_seek (output_bfd
, pos
, SEEK_SET
) == 0
4835 && (bfd_bwrite ((PTR
) rbuf
, external_reloc_size
, output_bfd
)
4836 == external_reloc_size
));
4839 ++output_section
->reloc_count
;