1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
4 Original version by Per Bothner.
5 Full support added by Ian Lance Taylor, ian@cygnus.com.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #include "aout/ranlib.h"
29 #include "aout/stab_gnu.h"
31 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
32 some other stuff which we don't want and which conflicts with stuff
35 #include "aout/aout64.h"
38 #undef obj_sym_filepos
40 #include "coff/internal.h"
42 #include "coff/symconst.h"
43 #include "coff/ecoff.h"
47 /* Prototypes for static functions. */
49 static int ecoff_get_magic
PARAMS ((bfd
*abfd
));
50 static long ecoff_sec_to_styp_flags
PARAMS ((const char *name
,
52 static boolean ecoff_slurp_symbolic_header
PARAMS ((bfd
*abfd
));
53 static boolean ecoff_set_symbol_info
PARAMS ((bfd
*abfd
, SYMR
*ecoff_sym
,
54 asymbol
*asym
, int ext
, int weak
));
55 static void ecoff_emit_aggregate
PARAMS ((bfd
*abfd
, FDR
*fdr
,
57 RNDXR
*rndx
, long isym
,
59 static char *ecoff_type_to_string
PARAMS ((bfd
*abfd
, FDR
*fdr
,
61 static boolean ecoff_slurp_reloc_table
PARAMS ((bfd
*abfd
, asection
*section
,
63 static int ecoff_sort_hdrs
PARAMS ((const PTR
, const PTR
));
64 static boolean ecoff_compute_section_file_positions
PARAMS ((bfd
*abfd
));
65 static bfd_size_type ecoff_compute_reloc_file_positions
PARAMS ((bfd
*abfd
));
66 static boolean ecoff_get_extr
PARAMS ((asymbol
*, EXTR
*));
67 static void ecoff_set_index
PARAMS ((asymbol
*, bfd_size_type
));
68 static unsigned int ecoff_armap_hash
PARAMS ((CONST
char *s
,
73 /* This stuff is somewhat copied from coffcode.h. */
75 static asection bfd_debug_section
=
77 "*DEBUG*", 0, NULL
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, 0, NULL
, NULL
,
78 0, 0, 0, 0, NULL
, NULL
, NULL
, 0, 0, 0, NULL
, NULL
, NULL
, NULL
, NULL
,
82 /* Create an ECOFF object. */
85 _bfd_ecoff_mkobject (abfd
)
88 abfd
->tdata
.ecoff_obj_data
= ((struct ecoff_tdata
*)
89 bfd_zalloc (abfd
, sizeof (ecoff_data_type
)));
90 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
96 /* This is a hook called by coff_real_object_p to create any backend
97 specific information. */
100 _bfd_ecoff_mkobject_hook (abfd
, filehdr
, aouthdr
)
105 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
106 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
107 ecoff_data_type
*ecoff
;
109 if (_bfd_ecoff_mkobject (abfd
) == false)
112 ecoff
= ecoff_data (abfd
);
114 ecoff
->sym_filepos
= internal_f
->f_symptr
;
116 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
120 ecoff
->text_start
= internal_a
->text_start
;
121 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
122 ecoff
->gp
= internal_a
->gp_value
;
123 ecoff
->gprmask
= internal_a
->gprmask
;
124 for (i
= 0; i
< 4; i
++)
125 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
126 ecoff
->fprmask
= internal_a
->fprmask
;
127 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
128 abfd
->flags
|= D_PAGED
;
130 abfd
->flags
&=~ D_PAGED
;
133 /* It turns out that no special action is required by the MIPS or
134 Alpha ECOFF backends. They have different information in the
135 a.out header, but we just copy it all (e.g., gprmask, cprmask and
136 fprmask) and let the swapping routines ensure that only relevant
137 information is written out. */
142 /* Initialize a new section. */
145 _bfd_ecoff_new_section_hook (abfd
, section
)
146 bfd
*abfd ATTRIBUTE_UNUSED
;
149 section
->alignment_power
= 4;
151 if (strcmp (section
->name
, _TEXT
) == 0
152 || strcmp (section
->name
, _INIT
) == 0
153 || strcmp (section
->name
, _FINI
) == 0)
154 section
->flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
155 else if (strcmp (section
->name
, _DATA
) == 0
156 || strcmp (section
->name
, _SDATA
) == 0)
157 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
158 else if (strcmp (section
->name
, _RDATA
) == 0
159 || strcmp (section
->name
, _LIT8
) == 0
160 || strcmp (section
->name
, _LIT4
) == 0
161 || strcmp (section
->name
, _RCONST
) == 0
162 || strcmp (section
->name
, _PDATA
) == 0)
163 section
->flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
164 else if (strcmp (section
->name
, _BSS
) == 0
165 || strcmp (section
->name
, _SBSS
) == 0)
166 section
->flags
|= SEC_ALLOC
;
167 else if (strcmp (section
->name
, _LIB
) == 0)
169 /* An Irix 4 shared libary. */
170 section
->flags
|= SEC_COFF_SHARED_LIBRARY
;
173 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
174 uncertain about .init on some systems and I don't know how shared
180 /* Determine the machine architecture and type. This is called from
181 the generic COFF routines. It is the inverse of ecoff_get_magic,
182 below. This could be an ECOFF backend routine, with one version
183 for each target, but there aren't all that many ECOFF targets. */
186 _bfd_ecoff_set_arch_mach_hook (abfd
, filehdr
)
190 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
191 enum bfd_architecture arch
;
194 switch (internal_f
->f_magic
)
197 case MIPS_MAGIC_LITTLE
:
199 arch
= bfd_arch_mips
;
203 case MIPS_MAGIC_LITTLE2
:
204 case MIPS_MAGIC_BIG2
:
205 /* MIPS ISA level 2: the r6000 */
206 arch
= bfd_arch_mips
;
210 case MIPS_MAGIC_LITTLE3
:
211 case MIPS_MAGIC_BIG3
:
212 /* MIPS ISA level 3: the r4000 */
213 arch
= bfd_arch_mips
;
218 arch
= bfd_arch_alpha
;
223 arch
= bfd_arch_obscure
;
228 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
231 /* Get the magic number to use based on the architecture and machine.
232 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
235 ecoff_get_magic (abfd
)
240 switch (bfd_get_arch (abfd
))
243 switch (bfd_get_mach (abfd
))
248 big
= MIPS_MAGIC_BIG
;
249 little
= MIPS_MAGIC_LITTLE
;
253 big
= MIPS_MAGIC_BIG2
;
254 little
= MIPS_MAGIC_LITTLE2
;
258 big
= MIPS_MAGIC_BIG3
;
259 little
= MIPS_MAGIC_LITTLE3
;
263 return bfd_big_endian (abfd
) ? big
: little
;
274 /* Get the section s_flags to use for a section. */
277 ecoff_sec_to_styp_flags (name
, flags
)
285 if (strcmp (name
, _TEXT
) == 0)
287 else if (strcmp (name
, _DATA
) == 0)
289 else if (strcmp (name
, _SDATA
) == 0)
291 else if (strcmp (name
, _RDATA
) == 0)
293 else if (strcmp (name
, _LITA
) == 0)
295 else if (strcmp (name
, _LIT8
) == 0)
297 else if (strcmp (name
, _LIT4
) == 0)
299 else if (strcmp (name
, _BSS
) == 0)
301 else if (strcmp (name
, _SBSS
) == 0)
303 else if (strcmp (name
, _INIT
) == 0)
304 styp
= STYP_ECOFF_INIT
;
305 else if (strcmp (name
, _FINI
) == 0)
306 styp
= STYP_ECOFF_FINI
;
307 else if (strcmp (name
, _PDATA
) == 0)
309 else if (strcmp (name
, _XDATA
) == 0)
311 else if (strcmp (name
, _LIB
) == 0)
312 styp
= STYP_ECOFF_LIB
;
313 else if (strcmp (name
, _GOT
) == 0)
315 else if (strcmp (name
, _HASH
) == 0)
317 else if (strcmp (name
, _DYNAMIC
) == 0)
319 else if (strcmp (name
, _LIBLIST
) == 0)
321 else if (strcmp (name
, _RELDYN
) == 0)
323 else if (strcmp (name
, _CONFLIC
) == 0)
325 else if (strcmp (name
, _DYNSTR
) == 0)
327 else if (strcmp (name
, _DYNSYM
) == 0)
329 else if (strcmp (name
, _COMMENT
) == 0)
332 flags
&=~ SEC_NEVER_LOAD
;
334 else if (strcmp (name
, _RCONST
) == 0)
336 else if (flags
& SEC_CODE
)
338 else if (flags
& SEC_DATA
)
340 else if (flags
& SEC_READONLY
)
342 else if (flags
& SEC_LOAD
)
347 if (flags
& SEC_NEVER_LOAD
)
353 /* Get the BFD flags to use for a section. */
357 _bfd_ecoff_styp_to_sec_flags (abfd
, hdr
, name
)
358 bfd
*abfd ATTRIBUTE_UNUSED
;
360 const char *name ATTRIBUTE_UNUSED
;
362 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
363 long styp_flags
= internal_s
->s_flags
;
364 flagword sec_flags
=0;
366 if (styp_flags
& STYP_NOLOAD
)
367 sec_flags
|= SEC_NEVER_LOAD
;
369 /* For 386 COFF, at least, an unloadable text or data section is
370 actually a shared library section. */
371 if ((styp_flags
& STYP_TEXT
)
372 || (styp_flags
& STYP_ECOFF_INIT
)
373 || (styp_flags
& STYP_ECOFF_FINI
)
374 || (styp_flags
& STYP_DYNAMIC
)
375 || (styp_flags
& STYP_LIBLIST
)
376 || (styp_flags
& STYP_RELDYN
)
377 || styp_flags
== STYP_CONFLIC
378 || (styp_flags
& STYP_DYNSTR
)
379 || (styp_flags
& STYP_DYNSYM
)
380 || (styp_flags
& STYP_HASH
))
382 if (sec_flags
& SEC_NEVER_LOAD
)
383 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
385 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
387 else if ((styp_flags
& STYP_DATA
)
388 || (styp_flags
& STYP_RDATA
)
389 || (styp_flags
& STYP_SDATA
)
390 || styp_flags
== STYP_PDATA
391 || styp_flags
== STYP_XDATA
392 || (styp_flags
& STYP_GOT
)
393 || styp_flags
== STYP_RCONST
)
395 if (sec_flags
& SEC_NEVER_LOAD
)
396 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
398 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
399 if ((styp_flags
& STYP_RDATA
)
400 || styp_flags
== STYP_PDATA
401 || styp_flags
== STYP_RCONST
)
402 sec_flags
|= SEC_READONLY
;
404 else if ((styp_flags
& STYP_BSS
)
405 || (styp_flags
& STYP_SBSS
))
407 sec_flags
|= SEC_ALLOC
;
409 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
411 sec_flags
|= SEC_NEVER_LOAD
;
413 else if ((styp_flags
& STYP_LITA
)
414 || (styp_flags
& STYP_LIT8
)
415 || (styp_flags
& STYP_LIT4
))
417 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
419 else if (styp_flags
& STYP_ECOFF_LIB
)
421 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
425 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
431 /* Read in the symbolic header for an ECOFF object file. */
434 ecoff_slurp_symbolic_header (abfd
)
437 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
438 bfd_size_type external_hdr_size
;
440 HDRR
*internal_symhdr
;
442 /* See if we've already read it in. */
443 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
444 backend
->debug_swap
.sym_magic
)
447 /* See whether there is a symbolic header. */
448 if (ecoff_data (abfd
)->sym_filepos
== 0)
450 bfd_get_symcount (abfd
) = 0;
454 /* At this point bfd_get_symcount (abfd) holds the number of symbols
455 as read from the file header, but on ECOFF this is always the
456 size of the symbolic information header. It would be cleaner to
457 handle this when we first read the file in coffgen.c. */
458 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
459 if (bfd_get_symcount (abfd
) != external_hdr_size
)
461 bfd_set_error (bfd_error_bad_value
);
465 /* Read the symbolic information header. */
466 raw
= (PTR
) bfd_malloc ((size_t) external_hdr_size
);
470 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) == -1
471 || (bfd_read (raw
, external_hdr_size
, 1, abfd
)
472 != external_hdr_size
))
474 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
475 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
477 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
479 bfd_set_error (bfd_error_bad_value
);
483 /* Now we can get the correct number of symbols. */
484 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
485 + internal_symhdr
->iextMax
);
496 /* Read in and swap the important symbolic information for an ECOFF
497 object file. This is called by gdb via the read_debug_info entry
498 point in the backend structure. */
502 _bfd_ecoff_slurp_symbolic_info (abfd
, ignore
, debug
)
504 asection
*ignore ATTRIBUTE_UNUSED
;
505 struct ecoff_debug_info
*debug
;
507 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
508 HDRR
*internal_symhdr
;
509 bfd_size_type raw_base
;
510 bfd_size_type raw_size
;
512 bfd_size_type external_fdr_size
;
516 bfd_size_type raw_end
;
517 bfd_size_type cb_end
;
519 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
521 /* Check whether we've already gotten it, and whether there's any to
523 if (ecoff_data (abfd
)->raw_syments
!= (PTR
) NULL
)
525 if (ecoff_data (abfd
)->sym_filepos
== 0)
527 bfd_get_symcount (abfd
) = 0;
531 if (! ecoff_slurp_symbolic_header (abfd
))
534 internal_symhdr
= &debug
->symbolic_header
;
536 /* Read all the symbolic information at once. */
537 raw_base
= (ecoff_data (abfd
)->sym_filepos
538 + backend
->debug_swap
.external_hdr_size
);
540 /* Alpha ecoff makes the determination of raw_size difficult. It has
541 an undocumented debug data section between the symhdr and the first
542 documented section. And the ordering of the sections varies between
543 statically and dynamically linked executables.
544 If bfd supports SEEK_END someday, this code could be simplified. */
548 #define UPDATE_RAW_END(start, count, size) \
549 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
550 if (cb_end > raw_end) \
553 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
554 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
555 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
556 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
557 UPDATE_RAW_END (cbOptOffset
, ioptMax
, backend
->debug_swap
.external_opt_size
);
558 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
559 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
560 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
561 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
562 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
563 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
565 #undef UPDATE_RAW_END
567 raw_size
= raw_end
- raw_base
;
570 ecoff_data (abfd
)->sym_filepos
= 0;
573 raw
= (PTR
) bfd_alloc (abfd
, raw_size
);
577 (ecoff_data (abfd
)->sym_filepos
578 + backend
->debug_swap
.external_hdr_size
),
580 || bfd_read (raw
, raw_size
, 1, abfd
) != raw_size
)
582 bfd_release (abfd
, raw
);
586 ecoff_data (abfd
)->raw_syments
= raw
;
588 /* Get pointers for the numeric offsets in the HDRR structure. */
589 #define FIX(off1, off2, type) \
590 if (internal_symhdr->off1 == 0) \
591 debug->off2 = (type) NULL; \
593 debug->off2 = (type) ((char *) raw \
594 + (internal_symhdr->off1 \
596 FIX (cbLineOffset
, line
, unsigned char *);
597 FIX (cbDnOffset
, external_dnr
, PTR
);
598 FIX (cbPdOffset
, external_pdr
, PTR
);
599 FIX (cbSymOffset
, external_sym
, PTR
);
600 FIX (cbOptOffset
, external_opt
, PTR
);
601 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
602 FIX (cbSsOffset
, ss
, char *);
603 FIX (cbSsExtOffset
, ssext
, char *);
604 FIX (cbFdOffset
, external_fdr
, PTR
);
605 FIX (cbRfdOffset
, external_rfd
, PTR
);
606 FIX (cbExtOffset
, external_ext
, PTR
);
609 /* I don't want to always swap all the data, because it will just
610 waste time and most programs will never look at it. The only
611 time the linker needs most of the debugging information swapped
612 is when linking big-endian and little-endian MIPS object files
613 together, which is not a common occurrence.
615 We need to look at the fdr to deal with a lot of information in
616 the symbols, so we swap them here. */
617 debug
->fdr
= (struct fdr
*) bfd_alloc (abfd
,
618 (internal_symhdr
->ifdMax
*
619 sizeof (struct fdr
)));
620 if (debug
->fdr
== NULL
)
622 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
623 fdr_ptr
= debug
->fdr
;
624 fraw_src
= (char *) debug
->external_fdr
;
625 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
626 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
627 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
632 /* ECOFF symbol table routines. The ECOFF symbol table is described
633 in gcc/mips-tfile.c. */
635 /* ECOFF uses two common sections. One is the usual one, and the
636 other is for small objects. All the small objects are kept
637 together, and then referenced via the gp pointer, which yields
638 faster assembler code. This is what we use for the small common
640 static asection ecoff_scom_section
;
641 static asymbol ecoff_scom_symbol
;
642 static asymbol
*ecoff_scom_symbol_ptr
;
644 /* Create an empty symbol. */
647 _bfd_ecoff_make_empty_symbol (abfd
)
650 ecoff_symbol_type
*new;
652 new = (ecoff_symbol_type
*) bfd_alloc (abfd
, sizeof (ecoff_symbol_type
));
653 if (new == (ecoff_symbol_type
*) NULL
)
654 return (asymbol
*) NULL
;
655 memset ((PTR
) new, 0, sizeof *new);
656 new->symbol
.section
= (asection
*) NULL
;
657 new->fdr
= (FDR
*) NULL
;
660 new->symbol
.the_bfd
= abfd
;
664 /* Set the BFD flags and section for an ECOFF symbol. */
667 ecoff_set_symbol_info (abfd
, ecoff_sym
, asym
, ext
, weak
)
674 asym
->the_bfd
= abfd
;
675 asym
->value
= ecoff_sym
->value
;
676 asym
->section
= &bfd_debug_section
;
679 /* Most symbol types are just for debugging. */
680 switch (ecoff_sym
->st
)
689 if (ECOFF_IS_STAB (ecoff_sym
))
691 asym
->flags
= BSF_DEBUGGING
;
696 asym
->flags
= BSF_DEBUGGING
;
701 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
703 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
706 asym
->flags
= BSF_LOCAL
;
707 /* Normally, a local stProc symbol will have a corresponding
708 external symbol. We mark the local symbol as a debugging
709 symbol, in order to prevent nm from printing both out.
710 Similarly, we mark stLabel and stabs symbols as debugging
711 symbols. In both cases, we do want to set the value
712 correctly based on the symbol class. */
713 if (ecoff_sym
->st
== stProc
714 || ecoff_sym
->st
== stLabel
715 || ECOFF_IS_STAB (ecoff_sym
))
716 asym
->flags
|= BSF_DEBUGGING
;
718 switch (ecoff_sym
->sc
)
721 /* Used for compiler generated labels. Leave them in the
722 debugging section, and mark them as local. If BSF_DEBUGGING
723 is set, then nm does not display them for some reason. If no
724 flags are set then the linker whines about them. */
725 asym
->flags
= BSF_LOCAL
;
728 asym
->section
= bfd_make_section_old_way (abfd
, ".text");
729 asym
->value
-= asym
->section
->vma
;
732 asym
->section
= bfd_make_section_old_way (abfd
, ".data");
733 asym
->value
-= asym
->section
->vma
;
736 asym
->section
= bfd_make_section_old_way (abfd
, ".bss");
737 asym
->value
-= asym
->section
->vma
;
740 asym
->flags
= BSF_DEBUGGING
;
743 asym
->section
= bfd_abs_section_ptr
;
746 asym
->section
= bfd_und_section_ptr
;
756 asym
->flags
= BSF_DEBUGGING
;
759 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
760 asym
->value
-= asym
->section
->vma
;
763 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
764 asym
->value
-= asym
->section
->vma
;
767 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
768 asym
->value
-= asym
->section
->vma
;
771 asym
->flags
= BSF_DEBUGGING
;
774 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
776 asym
->section
= bfd_com_section_ptr
;
782 if (ecoff_scom_section
.name
== NULL
)
784 /* Initialize the small common section. */
785 ecoff_scom_section
.name
= SCOMMON
;
786 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
787 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
788 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
789 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
790 ecoff_scom_symbol
.name
= SCOMMON
;
791 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
792 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
793 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
795 asym
->section
= &ecoff_scom_section
;
800 asym
->flags
= BSF_DEBUGGING
;
803 asym
->section
= bfd_und_section_ptr
;
808 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
809 asym
->value
-= asym
->section
->vma
;
814 asym
->flags
= BSF_DEBUGGING
;
817 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
818 asym
->value
-= asym
->section
->vma
;
821 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
822 asym
->value
-= asym
->section
->vma
;
828 /* Look for special constructors symbols and make relocation entries
829 in a special construction section. These are produced by the
830 -fgnu-linker argument to g++. */
831 if (ECOFF_IS_STAB (ecoff_sym
))
833 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
843 /* This code is no longer needed. It used to be used to
844 make the linker handle set symbols, but they are now
845 handled in the add_symbols routine instead. */
849 arelent_chain
*reloc_chain
;
850 unsigned int bitsize
;
852 /* Get a section with the same name as the symbol (usually
853 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
854 name ___CTOR_LIST (three underscores). We need
855 __CTOR_LIST (two underscores), since ECOFF doesn't use
856 a leading underscore. This should be handled by gcc,
857 but instead we do it here. Actually, this should all
858 be done differently anyhow. */
859 name
= bfd_asymbol_name (asym
);
860 if (name
[0] == '_' && name
[1] == '_' && name
[2] == '_')
865 section
= bfd_get_section_by_name (abfd
, name
);
866 if (section
== (asection
*) NULL
)
870 copy
= (char *) bfd_alloc (abfd
, strlen (name
) + 1);
874 section
= bfd_make_section (abfd
, copy
);
877 /* Build a reloc pointing to this constructor. */
879 (arelent_chain
*) bfd_alloc (abfd
, sizeof (arelent_chain
));
882 reloc_chain
->relent
.sym_ptr_ptr
=
883 bfd_get_section (asym
)->symbol_ptr_ptr
;
884 reloc_chain
->relent
.address
= section
->_raw_size
;
885 reloc_chain
->relent
.addend
= asym
->value
;
886 reloc_chain
->relent
.howto
=
887 ecoff_backend (abfd
)->constructor_reloc
;
889 /* Set up the constructor section to hold the reloc. */
890 section
->flags
= SEC_CONSTRUCTOR
;
891 ++section
->reloc_count
;
893 /* Constructor sections must be rounded to a boundary
894 based on the bitsize. These are not real sections--
895 they are handled specially by the linker--so the ECOFF
896 16 byte alignment restriction does not apply. */
897 bitsize
= ecoff_backend (abfd
)->constructor_bitsize
;
898 section
->alignment_power
= 1;
899 while ((1 << section
->alignment_power
) < bitsize
/ 8)
900 ++section
->alignment_power
;
902 reloc_chain
->next
= section
->constructor_chain
;
903 section
->constructor_chain
= reloc_chain
;
904 section
->_raw_size
+= bitsize
/ 8;
908 /* Mark the symbol as a constructor. */
909 asym
->flags
|= BSF_CONSTRUCTOR
;
917 /* Read an ECOFF symbol table. */
920 _bfd_ecoff_slurp_symbol_table (abfd
)
923 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
924 const bfd_size_type external_ext_size
925 = backend
->debug_swap
.external_ext_size
;
926 const bfd_size_type external_sym_size
927 = backend
->debug_swap
.external_sym_size
;
928 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
929 = backend
->debug_swap
.swap_ext_in
;
930 void (* const swap_sym_in
) PARAMS ((bfd
*, PTR
, SYMR
*))
931 = backend
->debug_swap
.swap_sym_in
;
932 bfd_size_type internal_size
;
933 ecoff_symbol_type
*internal
;
934 ecoff_symbol_type
*internal_ptr
;
940 /* If we've already read in the symbol table, do nothing. */
941 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
944 /* Get the symbolic information. */
945 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
946 &ecoff_data (abfd
)->debug_info
))
948 if (bfd_get_symcount (abfd
) == 0)
951 internal_size
= bfd_get_symcount (abfd
) * sizeof (ecoff_symbol_type
);
952 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
953 if (internal
== NULL
)
956 internal_ptr
= internal
;
957 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
959 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
960 * external_ext_size
));
961 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
965 (*swap_ext_in
) (abfd
, (PTR
) eraw_src
, &internal_esym
);
966 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
967 + internal_esym
.asym
.iss
);
968 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
969 &internal_ptr
->symbol
, 1,
970 internal_esym
.weakext
))
972 /* The alpha uses a negative ifd field for section symbols. */
973 if (internal_esym
.ifd
>= 0)
974 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
975 + internal_esym
.ifd
);
977 internal_ptr
->fdr
= NULL
;
978 internal_ptr
->local
= false;
979 internal_ptr
->native
= (PTR
) eraw_src
;
982 /* The local symbols must be accessed via the fdr's, because the
983 string and aux indices are relative to the fdr information. */
984 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
985 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
986 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
991 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
992 + fdr_ptr
->isymBase
* external_sym_size
);
993 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
996 lraw_src
+= external_sym_size
, internal_ptr
++)
1000 (*swap_sym_in
) (abfd
, (PTR
) lraw_src
, &internal_sym
);
1001 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
1003 + internal_sym
.iss
);
1004 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
1005 &internal_ptr
->symbol
, 0, 0))
1007 internal_ptr
->fdr
= fdr_ptr
;
1008 internal_ptr
->local
= true;
1009 internal_ptr
->native
= (PTR
) lraw_src
;
1013 ecoff_data (abfd
)->canonical_symbols
= internal
;
1018 /* Return the amount of space needed for the canonical symbols. */
1021 _bfd_ecoff_get_symtab_upper_bound (abfd
)
1024 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
,
1025 &ecoff_data (abfd
)->debug_info
))
1028 if (bfd_get_symcount (abfd
) == 0)
1031 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
1034 /* Get the canonical symbols. */
1037 _bfd_ecoff_get_symtab (abfd
, alocation
)
1039 asymbol
**alocation
;
1041 unsigned int counter
= 0;
1042 ecoff_symbol_type
*symbase
;
1043 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
1045 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1047 if (bfd_get_symcount (abfd
) == 0)
1050 symbase
= ecoff_data (abfd
)->canonical_symbols
;
1051 while (counter
< bfd_get_symcount (abfd
))
1053 *(location
++) = symbase
++;
1056 *location
++ = (ecoff_symbol_type
*) NULL
;
1057 return bfd_get_symcount (abfd
);
1060 /* Turn ECOFF type information into a printable string.
1061 ecoff_emit_aggregate and ecoff_type_to_string are from
1062 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1064 /* Write aggregate information to a string. */
1067 ecoff_emit_aggregate (abfd
, fdr
, string
, rndx
, isym
, which
)
1075 const struct ecoff_debug_swap
* const debug_swap
=
1076 &ecoff_backend (abfd
)->debug_swap
;
1077 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1078 unsigned int ifd
= rndx
->rfd
;
1079 unsigned int indx
= rndx
->index
;
1085 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1086 struct return type of a procedure compiled without -g. */
1087 if (ifd
== 0xffffffff
1088 || (rndx
->rfd
== 0xfff && indx
== 0))
1089 name
= "<undefined>";
1090 else if (indx
== indexNil
)
1096 if (debug_info
->external_rfd
== NULL
)
1097 fdr
= debug_info
->fdr
+ ifd
;
1102 (*debug_swap
->swap_rfd_in
) (abfd
,
1103 ((char *) debug_info
->external_rfd
1104 + ((fdr
->rfdBase
+ ifd
)
1105 * debug_swap
->external_rfd_size
)),
1107 fdr
= debug_info
->fdr
+ rfd
;
1110 indx
+= fdr
->isymBase
;
1112 (*debug_swap
->swap_sym_in
) (abfd
,
1113 ((char *) debug_info
->external_sym
1114 + indx
* debug_swap
->external_sym_size
),
1117 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1121 "%s %s { ifd = %u, index = %lu }",
1124 + debug_info
->symbolic_header
.iextMax
));
1127 /* Convert the type information to string format. */
1130 ecoff_type_to_string (abfd
, fdr
, indx
)
1135 union aux_ext
*aux_ptr
;
1144 unsigned int basic_type
;
1147 static char buffer2
[1024];
1152 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1153 bigendian
= fdr
->fBigendian
;
1155 for (i
= 0; i
< 7; i
++)
1157 qualifiers
[i
].low_bound
= 0;
1158 qualifiers
[i
].high_bound
= 0;
1159 qualifiers
[i
].stride
= 0;
1162 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1163 return "-1 (no type)";
1164 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1166 basic_type
= u
.ti
.bt
;
1167 qualifiers
[0].type
= u
.ti
.tq0
;
1168 qualifiers
[1].type
= u
.ti
.tq1
;
1169 qualifiers
[2].type
= u
.ti
.tq2
;
1170 qualifiers
[3].type
= u
.ti
.tq3
;
1171 qualifiers
[4].type
= u
.ti
.tq4
;
1172 qualifiers
[5].type
= u
.ti
.tq5
;
1173 qualifiers
[6].type
= tqNil
;
1176 * Go get the basic type.
1180 case btNil
: /* undefined */
1184 case btAdr
: /* address - integer same size as pointer */
1185 strcpy (p1
, "address");
1188 case btChar
: /* character */
1189 strcpy (p1
, "char");
1192 case btUChar
: /* unsigned character */
1193 strcpy (p1
, "unsigned char");
1196 case btShort
: /* short */
1197 strcpy (p1
, "short");
1200 case btUShort
: /* unsigned short */
1201 strcpy (p1
, "unsigned short");
1204 case btInt
: /* int */
1208 case btUInt
: /* unsigned int */
1209 strcpy (p1
, "unsigned int");
1212 case btLong
: /* long */
1213 strcpy (p1
, "long");
1216 case btULong
: /* unsigned long */
1217 strcpy (p1
, "unsigned long");
1220 case btFloat
: /* float (real) */
1221 strcpy (p1
, "float");
1224 case btDouble
: /* Double (real) */
1225 strcpy (p1
, "double");
1228 /* Structures add 1-2 aux words:
1229 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1230 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1232 case btStruct
: /* Structure (Record) */
1233 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1234 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1235 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1237 indx
++; /* skip aux words */
1240 /* Unions add 1-2 aux words:
1241 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1242 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1244 case btUnion
: /* Union */
1245 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1246 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1247 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1249 indx
++; /* skip aux words */
1252 /* Enumerations add 1-2 aux words:
1253 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1254 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1256 case btEnum
: /* Enumeration */
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 case btTypedef
: /* defined via a typedef, isymRef points */
1265 strcpy (p1
, "typedef");
1268 case btRange
: /* subrange of int */
1269 strcpy (p1
, "subrange");
1272 case btSet
: /* pascal sets */
1276 case btComplex
: /* fortran complex */
1277 strcpy (p1
, "complex");
1280 case btDComplex
: /* fortran double complex */
1281 strcpy (p1
, "double complex");
1284 case btIndirect
: /* forward or unnamed typedef */
1285 strcpy (p1
, "forward/unamed typedef");
1288 case btFixedDec
: /* Fixed Decimal */
1289 strcpy (p1
, "fixed decimal");
1292 case btFloatDec
: /* Float Decimal */
1293 strcpy (p1
, "float decimal");
1296 case btString
: /* Varying Length Character String */
1297 strcpy (p1
, "string");
1300 case btBit
: /* Aligned Bit String */
1304 case btPicture
: /* Picture */
1305 strcpy (p1
, "picture");
1308 case btVoid
: /* Void */
1309 strcpy (p1
, "void");
1313 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1317 p1
+= strlen (buffer1
);
1320 * If this is a bitfield, get the bitsize.
1326 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1327 sprintf (p1
, " : %d", bitsize
);
1328 p1
+= strlen (buffer1
);
1333 * Deal with any qualifiers.
1335 if (qualifiers
[0].type
!= tqNil
)
1338 * Snarf up any array bounds in the correct order. Arrays
1339 * store 5 successive words in the aux. table:
1340 * word 0 RNDXR to type of the bounds (ie, int)
1341 * word 1 Current file descriptor index
1343 * word 3 high bound (or -1 if [])
1344 * word 4 stride size in bits
1346 for (i
= 0; i
< 7; i
++)
1348 if (qualifiers
[i
].type
== tqArray
)
1350 qualifiers
[i
].low_bound
=
1351 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1352 qualifiers
[i
].high_bound
=
1353 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1354 qualifiers
[i
].stride
=
1355 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1361 * Now print out the qualifiers.
1363 for (i
= 0; i
< 6; i
++)
1365 switch (qualifiers
[i
].type
)
1372 strcpy (p2
, "ptr to ");
1373 p2
+= sizeof ("ptr to ")-1;
1377 strcpy (p2
, "volatile ");
1378 p2
+= sizeof ("volatile ")-1;
1382 strcpy (p2
, "far ");
1383 p2
+= sizeof ("far ")-1;
1387 strcpy (p2
, "func. ret. ");
1388 p2
+= sizeof ("func. ret. ");
1393 int first_array
= i
;
1396 /* Print array bounds reversed (ie, in the order the C
1397 programmer writes them). C is such a fun language.... */
1399 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1402 for (j
= i
; j
>= first_array
; j
--)
1404 strcpy (p2
, "array [");
1405 p2
+= sizeof ("array [")-1;
1406 if (qualifiers
[j
].low_bound
!= 0)
1408 "%ld:%ld {%ld bits}",
1409 (long) qualifiers
[j
].low_bound
,
1410 (long) qualifiers
[j
].high_bound
,
1411 (long) qualifiers
[j
].stride
);
1413 else if (qualifiers
[j
].high_bound
!= -1)
1416 (long) (qualifiers
[j
].high_bound
+ 1),
1417 (long) (qualifiers
[j
].stride
));
1420 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1423 strcpy (p2
, "] of ");
1424 p2
+= sizeof ("] of ")-1;
1432 strcpy (p2
, buffer1
);
1436 /* Return information about ECOFF symbol SYMBOL in RET. */
1440 _bfd_ecoff_get_symbol_info (abfd
, symbol
, ret
)
1441 bfd
*abfd ATTRIBUTE_UNUSED
;
1445 bfd_symbol_info (symbol
, ret
);
1448 /* Return whether this is a local label. */
1452 _bfd_ecoff_bfd_is_local_label_name (abfd
, name
)
1453 bfd
*abfd ATTRIBUTE_UNUSED
;
1456 return name
[0] == '$';
1459 /* Print information about an ECOFF symbol. */
1462 _bfd_ecoff_print_symbol (abfd
, filep
, symbol
, how
)
1466 bfd_print_symbol_type how
;
1468 const struct ecoff_debug_swap
* const debug_swap
1469 = &ecoff_backend (abfd
)->debug_swap
;
1470 FILE *file
= (FILE *)filep
;
1474 case bfd_print_symbol_name
:
1475 fprintf (file
, "%s", symbol
->name
);
1477 case bfd_print_symbol_more
:
1478 if (ecoffsymbol (symbol
)->local
)
1482 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1484 fprintf (file
, "ecoff local ");
1485 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1486 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1487 (unsigned) ecoff_sym
.sc
);
1493 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1495 fprintf (file
, "ecoff extern ");
1496 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1497 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1498 (unsigned) ecoff_ext
.asym
.sc
);
1501 case bfd_print_symbol_all
:
1502 /* Print out the symbols in a reasonable way */
1511 if (ecoffsymbol (symbol
)->local
)
1513 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1516 pos
= ((((char *) ecoffsymbol (symbol
)->native
1517 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1518 / debug_swap
->external_sym_size
)
1519 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1526 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1529 pos
= (((char *) ecoffsymbol (symbol
)->native
1530 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1531 / debug_swap
->external_ext_size
);
1532 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1533 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1534 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1537 fprintf (file
, "[%3d] %c ",
1539 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1540 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1541 (unsigned) ecoff_ext
.asym
.st
,
1542 (unsigned) ecoff_ext
.asym
.sc
,
1543 (unsigned) ecoff_ext
.asym
.index
,
1544 jmptbl
, cobol_main
, weakext
,
1547 if (ecoffsymbol (symbol
)->fdr
!= NULL
1548 && ecoff_ext
.asym
.index
!= indexNil
)
1553 bfd_size_type sym_base
;
1554 union aux_ext
*aux_base
;
1556 fdr
= ecoffsymbol (symbol
)->fdr
;
1557 indx
= ecoff_ext
.asym
.index
;
1559 /* sym_base is used to map the fdr relative indices which
1560 appear in the file to the position number which we are
1562 sym_base
= fdr
->isymBase
;
1563 if (ecoffsymbol (symbol
)->local
)
1565 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1567 /* aux_base is the start of the aux entries for this file;
1568 asym.index is an offset from this. */
1569 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1572 /* The aux entries are stored in host byte order; the
1573 order is indicated by a bit in the fdr. */
1574 bigendian
= fdr
->fBigendian
;
1576 /* This switch is basically from gcc/mips-tdump.c */
1577 switch (ecoff_ext
.asym
.st
)
1585 fprintf (file
, _("\n End+1 symbol: %ld"),
1586 (long) (indx
+ sym_base
));
1590 if (ecoff_ext
.asym
.sc
== scText
1591 || ecoff_ext
.asym
.sc
== scInfo
)
1592 fprintf (file
, _("\n First symbol: %ld"),
1593 (long) (indx
+ sym_base
));
1595 fprintf (file
, _("\n First symbol: %ld"),
1597 (AUX_GET_ISYM (bigendian
,
1598 &aux_base
[ecoff_ext
.asym
.index
])
1604 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1606 else if (ecoffsymbol (symbol
)->local
)
1607 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1609 (AUX_GET_ISYM (bigendian
,
1610 &aux_base
[ecoff_ext
.asym
.index
])
1612 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1614 fprintf (file
, _("\n Local symbol: %ld"),
1617 + (ecoff_data (abfd
)
1618 ->debug_info
.symbolic_header
.iextMax
)));
1622 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1623 (long) (indx
+ sym_base
));
1627 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1628 (long) (indx
+ sym_base
));
1632 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1633 (long) (indx
+ sym_base
));
1637 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1638 fprintf (file
, _("\n Type: %s"),
1639 ecoff_type_to_string (abfd
, fdr
, indx
));
1648 /* Read in the relocs for a section. */
1651 ecoff_slurp_reloc_table (abfd
, section
, symbols
)
1656 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1657 arelent
*internal_relocs
;
1658 bfd_size_type external_reloc_size
;
1659 bfd_size_type external_relocs_size
;
1660 char *external_relocs
;
1664 if (section
->relocation
!= (arelent
*) NULL
1665 || section
->reloc_count
== 0
1666 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1669 if (_bfd_ecoff_slurp_symbol_table (abfd
) == false)
1672 internal_relocs
= (arelent
*) bfd_alloc (abfd
,
1674 * section
->reloc_count
));
1675 external_reloc_size
= backend
->external_reloc_size
;
1676 external_relocs_size
= external_reloc_size
* section
->reloc_count
;
1677 external_relocs
= (char *) bfd_alloc (abfd
, external_relocs_size
);
1678 if (internal_relocs
== (arelent
*) NULL
1679 || external_relocs
== (char *) NULL
)
1681 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1683 if (bfd_read (external_relocs
, 1, external_relocs_size
, abfd
)
1684 != external_relocs_size
)
1687 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1689 struct internal_reloc intern
;
1691 (*backend
->swap_reloc_in
) (abfd
,
1692 external_relocs
+ i
* external_reloc_size
,
1695 if (intern
.r_extern
)
1697 /* r_symndx is an index into the external symbols. */
1698 BFD_ASSERT (intern
.r_symndx
>= 0
1700 < (ecoff_data (abfd
)
1701 ->debug_info
.symbolic_header
.iextMax
)));
1702 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1705 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1706 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1708 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1713 CONST
char *sec_name
;
1716 /* r_symndx is a section key. */
1717 switch (intern
.r_symndx
)
1719 case RELOC_SECTION_TEXT
: sec_name
= ".text"; break;
1720 case RELOC_SECTION_RDATA
: sec_name
= ".rdata"; break;
1721 case RELOC_SECTION_DATA
: sec_name
= ".data"; break;
1722 case RELOC_SECTION_SDATA
: sec_name
= ".sdata"; break;
1723 case RELOC_SECTION_SBSS
: sec_name
= ".sbss"; break;
1724 case RELOC_SECTION_BSS
: sec_name
= ".bss"; break;
1725 case RELOC_SECTION_INIT
: sec_name
= ".init"; break;
1726 case RELOC_SECTION_LIT8
: sec_name
= ".lit8"; break;
1727 case RELOC_SECTION_LIT4
: sec_name
= ".lit4"; break;
1728 case RELOC_SECTION_XDATA
: sec_name
= ".xdata"; break;
1729 case RELOC_SECTION_PDATA
: sec_name
= ".pdata"; break;
1730 case RELOC_SECTION_FINI
: sec_name
= ".fini"; break;
1731 case RELOC_SECTION_LITA
: sec_name
= ".lita"; break;
1732 case RELOC_SECTION_RCONST
: sec_name
= ".rconst"; break;
1736 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1737 if (sec
== (asection
*) NULL
)
1739 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1741 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1744 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1746 /* Let the backend select the howto field and do any other
1747 required processing. */
1748 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1751 bfd_release (abfd
, external_relocs
);
1753 section
->relocation
= internal_relocs
;
1758 /* Get a canonical list of relocs. */
1761 _bfd_ecoff_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
1769 if (section
->flags
& SEC_CONSTRUCTOR
)
1771 arelent_chain
*chain
;
1773 /* This section has relocs made up by us, not the file, so take
1774 them out of their chain and place them into the data area
1776 for (count
= 0, chain
= section
->constructor_chain
;
1777 count
< section
->reloc_count
;
1778 count
++, chain
= chain
->next
)
1779 *relptr
++ = &chain
->relent
;
1785 if (ecoff_slurp_reloc_table (abfd
, section
, symbols
) == false)
1788 tblptr
= section
->relocation
;
1790 for (count
= 0; count
< section
->reloc_count
; count
++)
1791 *relptr
++ = tblptr
++;
1794 *relptr
= (arelent
*) NULL
;
1796 return section
->reloc_count
;
1799 /* Provided a BFD, a section and an offset into the section, calculate
1800 and return the name of the source file and the line nearest to the
1805 _bfd_ecoff_find_nearest_line (abfd
, section
, ignore_symbols
, offset
,
1806 filename_ptr
, functionname_ptr
, retline_ptr
)
1809 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
;
1811 CONST
char **filename_ptr
;
1812 CONST
char **functionname_ptr
;
1813 unsigned int *retline_ptr
;
1815 const struct ecoff_debug_swap
* const debug_swap
1816 = &ecoff_backend (abfd
)->debug_swap
;
1817 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1818 struct ecoff_find_line
*line_info
;
1820 /* Make sure we have the FDR's. */
1821 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, (asection
*) NULL
, debug_info
)
1822 || bfd_get_symcount (abfd
) == 0)
1825 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1827 ecoff_data (abfd
)->find_line_info
=
1828 ((struct ecoff_find_line
*)
1829 bfd_zalloc (abfd
, sizeof (struct ecoff_find_line
)));
1830 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1833 line_info
= ecoff_data (abfd
)->find_line_info
;
1835 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1836 debug_swap
, line_info
, filename_ptr
,
1837 functionname_ptr
, retline_ptr
);
1840 /* Copy private BFD data. This is called by objcopy and strip. We
1841 use it to copy the ECOFF debugging information from one BFD to the
1842 other. It would be theoretically possible to represent the ECOFF
1843 debugging information in the symbol table. However, it would be a
1844 lot of work, and there would be little gain (gas, gdb, and ld
1845 already access the ECOFF debugging information via the
1846 ecoff_debug_info structure, and that structure would have to be
1847 retained in order to support ECOFF debugging in MIPS ELF).
1849 The debugging information for the ECOFF external symbols comes from
1850 the symbol table, so this function only handles the other debugging
1854 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd
, obfd
)
1858 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1859 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1861 asymbol
**sym_ptr_ptr
;
1865 /* We only want to copy information over if both BFD's use ECOFF
1867 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1868 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1871 /* Copy the GP value and the register masks. */
1872 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1873 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1874 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1875 for (i
= 0; i
< 3; i
++)
1876 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1878 /* Copy the version stamp. */
1879 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1881 /* If there are no symbols, don't copy any debugging information. */
1882 c
= bfd_get_symcount (obfd
);
1883 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1884 if (c
== 0 || sym_ptr_ptr
== (asymbol
**) NULL
)
1887 /* See if there are any local symbols. */
1889 for (; c
> 0; c
--, sym_ptr_ptr
++)
1891 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1900 /* There are some local symbols. We just bring over all the
1901 debugging information. FIXME: This is not quite the right
1902 thing to do. If the user has asked us to discard all
1903 debugging information, then we are probably going to wind up
1904 keeping it because there will probably be some local symbol
1905 which objcopy did not discard. We should actually break
1906 apart the debugging information and only keep that which
1907 applies to the symbols we want to keep. */
1908 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1909 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1910 oinfo
->line
= iinfo
->line
;
1912 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1913 oinfo
->external_dnr
= iinfo
->external_dnr
;
1915 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1916 oinfo
->external_pdr
= iinfo
->external_pdr
;
1918 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1919 oinfo
->external_sym
= iinfo
->external_sym
;
1921 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1922 oinfo
->external_opt
= iinfo
->external_opt
;
1924 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1925 oinfo
->external_aux
= iinfo
->external_aux
;
1927 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1928 oinfo
->ss
= iinfo
->ss
;
1930 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1931 oinfo
->external_fdr
= iinfo
->external_fdr
;
1933 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1934 oinfo
->external_rfd
= iinfo
->external_rfd
;
1938 /* We are discarding all the local symbol information. Look
1939 through the external symbols and remove all references to FDR
1940 or aux information. */
1941 c
= bfd_get_symcount (obfd
);
1942 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1943 for (; c
> 0; c
--, sym_ptr_ptr
++)
1947 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1948 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1950 esym
.asym
.index
= indexNil
;
1951 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1952 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1959 /* Set the architecture. The supported architecture is stored in the
1960 backend pointer. We always set the architecture anyhow, since many
1961 callers ignore the return value. */
1964 _bfd_ecoff_set_arch_mach (abfd
, arch
, machine
)
1966 enum bfd_architecture arch
;
1967 unsigned long machine
;
1969 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1970 return arch
== ecoff_backend (abfd
)->arch
;
1973 /* Get the size of the section headers. */
1977 _bfd_ecoff_sizeof_headers (abfd
, reloc
)
1979 boolean reloc ATTRIBUTE_UNUSED
;
1986 for (current
= abfd
->sections
;
1987 current
!= (asection
*)NULL
;
1988 current
= current
->next
)
1991 ret
= (bfd_coff_filhsz (abfd
)
1992 + bfd_coff_aoutsz (abfd
)
1993 + c
* bfd_coff_scnhsz (abfd
));
1994 return BFD_ALIGN (ret
, 16);
1997 /* Get the contents of a section. */
2000 _bfd_ecoff_get_section_contents (abfd
, section
, location
, offset
, count
)
2005 bfd_size_type count
;
2007 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2011 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2012 called via qsort. */
2015 ecoff_sort_hdrs (arg1
, arg2
)
2019 const asection
*hdr1
= *(const asection
**) arg1
;
2020 const asection
*hdr2
= *(const asection
**) arg2
;
2022 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
2024 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
2029 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
2032 if (hdr1
->vma
< hdr2
->vma
)
2034 else if (hdr1
->vma
> hdr2
->vma
)
2040 /* Calculate the file position for each section, and set
2044 ecoff_compute_section_file_positions (abfd
)
2047 file_ptr sofar
, file_sofar
;
2048 asection
**sorted_hdrs
;
2052 boolean rdata_in_text
;
2053 boolean first_data
, first_nonalloc
;
2054 const bfd_vma round
= ecoff_backend (abfd
)->round
;
2056 sofar
= _bfd_ecoff_sizeof_headers (abfd
, false);
2059 /* Sort the sections by VMA. */
2060 sorted_hdrs
= (asection
**) bfd_malloc (abfd
->section_count
2061 * sizeof (asection
*));
2062 if (sorted_hdrs
== NULL
)
2064 for (current
= abfd
->sections
, i
= 0;
2066 current
= current
->next
, i
++)
2067 sorted_hdrs
[i
] = current
;
2068 BFD_ASSERT (i
== abfd
->section_count
);
2070 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
2073 /* Some versions of the OSF linker put the .rdata section in the
2074 text segment, and some do not. */
2075 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
2078 for (i
= 0; i
< abfd
->section_count
; i
++)
2080 current
= sorted_hdrs
[i
];
2081 if (strcmp (current
->name
, _RDATA
) == 0)
2083 if ((current
->flags
& SEC_CODE
) == 0
2084 && strcmp (current
->name
, _PDATA
) != 0
2085 && strcmp (current
->name
, _RCONST
) != 0)
2087 rdata_in_text
= false;
2092 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2095 first_nonalloc
= true;
2096 for (i
= 0; i
< abfd
->section_count
; i
++)
2098 unsigned int alignment_power
;
2100 current
= sorted_hdrs
[i
];
2102 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2103 supposed to indicate the number of .pdata entries that are
2104 really in the section. Each entry is 8 bytes. We store this
2105 away in line_filepos before increasing the section size. */
2106 if (strcmp (current
->name
, _PDATA
) == 0)
2107 current
->line_filepos
= current
->_raw_size
/ 8;
2109 alignment_power
= current
->alignment_power
;
2111 /* On Ultrix, the data sections in an executable file must be
2112 aligned to a page boundary within the file. This does not
2113 affect the section size, though. FIXME: Does this work for
2114 other platforms? It requires some modification for the
2115 Alpha, because .rdata on the Alpha goes with the text, not
2117 if ((abfd
->flags
& EXEC_P
) != 0
2118 && (abfd
->flags
& D_PAGED
) != 0
2120 && (current
->flags
& SEC_CODE
) == 0
2122 || strcmp (current
->name
, _RDATA
) != 0)
2123 && strcmp (current
->name
, _PDATA
) != 0
2124 && strcmp (current
->name
, _RCONST
) != 0)
2126 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2127 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2130 else if (strcmp (current
->name
, _LIB
) == 0)
2132 /* On Irix 4, the location of contents of the .lib section
2133 from a shared library section is also rounded up to a
2136 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2137 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2139 else if (first_nonalloc
2140 && (current
->flags
& SEC_ALLOC
) == 0
2141 && (abfd
->flags
& D_PAGED
) != 0)
2143 /* Skip up to the next page for an unallocated section, such
2144 as the .comment section on the Alpha. This leaves room
2145 for the .bss section. */
2146 first_nonalloc
= false;
2147 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2148 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2151 /* Align the sections in the file to the same boundary on
2152 which they are aligned in virtual memory. */
2153 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2154 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2155 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2157 if ((abfd
->flags
& D_PAGED
) != 0
2158 && (current
->flags
& SEC_ALLOC
) != 0)
2160 sofar
+= (current
->vma
- sofar
) % round
;
2161 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2162 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2165 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2166 current
->filepos
= file_sofar
;
2168 sofar
+= current
->_raw_size
;
2169 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2170 file_sofar
+= current
->_raw_size
;
2172 /* make sure that this section is of the right size too */
2174 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2175 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2176 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2177 current
->_raw_size
+= sofar
- old_sofar
;
2183 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2188 /* Determine the location of the relocs for all the sections in the
2189 output file, as well as the location of the symbolic debugging
2192 static bfd_size_type
2193 ecoff_compute_reloc_file_positions (abfd
)
2196 const bfd_size_type external_reloc_size
=
2197 ecoff_backend (abfd
)->external_reloc_size
;
2198 file_ptr reloc_base
;
2199 bfd_size_type reloc_size
;
2203 if (! abfd
->output_has_begun
)
2205 if (! ecoff_compute_section_file_positions (abfd
))
2207 abfd
->output_has_begun
= true;
2210 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2213 for (current
= abfd
->sections
;
2214 current
!= (asection
*)NULL
;
2215 current
= current
->next
)
2217 if (current
->reloc_count
== 0)
2218 current
->rel_filepos
= 0;
2221 bfd_size_type relsize
;
2223 current
->rel_filepos
= reloc_base
;
2224 relsize
= current
->reloc_count
* external_reloc_size
;
2225 reloc_size
+= relsize
;
2226 reloc_base
+= relsize
;
2230 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2232 /* At least on Ultrix, the symbol table of an executable file must
2233 be aligned to a page boundary. FIXME: Is this true on other
2235 if ((abfd
->flags
& EXEC_P
) != 0
2236 && (abfd
->flags
& D_PAGED
) != 0)
2237 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2238 &~ (ecoff_backend (abfd
)->round
- 1));
2240 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2245 /* Set the contents of a section. */
2248 _bfd_ecoff_set_section_contents (abfd
, section
, location
, offset
, count
)
2253 bfd_size_type count
;
2255 /* This must be done first, because bfd_set_section_contents is
2256 going to set output_has_begun to true. */
2257 if (abfd
->output_has_begun
== false)
2259 if (! ecoff_compute_section_file_positions (abfd
))
2263 /* Handle the .lib section specially so that Irix 4 shared libraries
2264 work out. See coff_set_section_contents in coffcode.h. */
2265 if (strcmp (section
->name
, _LIB
) == 0)
2267 bfd_byte
*rec
, *recend
;
2269 rec
= (bfd_byte
*) location
;
2270 recend
= rec
+ count
;
2271 while (rec
< recend
)
2274 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2277 BFD_ASSERT (rec
== recend
);
2283 if (bfd_seek (abfd
, (file_ptr
) (section
->filepos
+ offset
), SEEK_SET
) != 0
2284 || bfd_write (location
, 1, count
, abfd
) != count
)
2290 /* Get the GP value for an ECOFF file. This is a hook used by
2294 bfd_ecoff_get_gp_value (abfd
)
2297 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2298 || bfd_get_format (abfd
) != bfd_object
)
2300 bfd_set_error (bfd_error_invalid_operation
);
2304 return ecoff_data (abfd
)->gp
;
2307 /* Set the GP value for an ECOFF file. This is a hook used by the
2311 bfd_ecoff_set_gp_value (abfd
, gp_value
)
2315 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2316 || bfd_get_format (abfd
) != bfd_object
)
2318 bfd_set_error (bfd_error_invalid_operation
);
2322 ecoff_data (abfd
)->gp
= gp_value
;
2327 /* Set the register masks for an ECOFF file. This is a hook used by
2331 bfd_ecoff_set_regmasks (abfd
, gprmask
, fprmask
, cprmask
)
2333 unsigned long gprmask
;
2334 unsigned long fprmask
;
2335 unsigned long *cprmask
;
2337 ecoff_data_type
*tdata
;
2339 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2340 || bfd_get_format (abfd
) != bfd_object
)
2342 bfd_set_error (bfd_error_invalid_operation
);
2346 tdata
= ecoff_data (abfd
);
2347 tdata
->gprmask
= gprmask
;
2348 tdata
->fprmask
= fprmask
;
2349 if (cprmask
!= (unsigned long *) NULL
)
2353 for (i
= 0; i
< 3; i
++)
2354 tdata
->cprmask
[i
] = cprmask
[i
];
2360 /* Get ECOFF EXTR information for an external symbol. This function
2361 is passed to bfd_ecoff_debug_externals. */
2364 ecoff_get_extr (sym
, esym
)
2368 ecoff_symbol_type
*ecoff_sym_ptr
;
2371 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2372 || ecoffsymbol (sym
)->native
== NULL
)
2374 /* Don't include debugging, local, or section symbols. */
2375 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2376 || (sym
->flags
& BSF_LOCAL
) != 0
2377 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2381 esym
->cobol_main
= 0;
2382 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2385 /* FIXME: we can do better than this for st and sc. */
2386 esym
->asym
.st
= stGlobal
;
2387 esym
->asym
.sc
= scAbs
;
2388 esym
->asym
.reserved
= 0;
2389 esym
->asym
.index
= indexNil
;
2393 ecoff_sym_ptr
= ecoffsymbol (sym
);
2395 if (ecoff_sym_ptr
->local
)
2398 input_bfd
= bfd_asymbol_bfd (sym
);
2399 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2400 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2402 /* If the symbol was defined by the linker, then esym will be
2403 undefined but sym will not be. Get a better class for such a
2405 if ((esym
->asym
.sc
== scUndefined
2406 || esym
->asym
.sc
== scSUndefined
)
2407 && ! bfd_is_und_section (bfd_get_section (sym
)))
2408 esym
->asym
.sc
= scAbs
;
2410 /* Adjust the FDR index for the symbol by that used for the input
2412 if (esym
->ifd
!= -1)
2414 struct ecoff_debug_info
*input_debug
;
2416 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2417 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2418 if (input_debug
->ifdmap
!= (RFDT
*) NULL
)
2419 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2425 /* Set the external symbol index. This routine is passed to
2426 bfd_ecoff_debug_externals. */
2429 ecoff_set_index (sym
, indx
)
2433 ecoff_set_sym_index (sym
, indx
);
2436 /* Write out an ECOFF file. */
2439 _bfd_ecoff_write_object_contents (abfd
)
2442 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2443 const bfd_vma round
= backend
->round
;
2444 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2445 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2446 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2447 const bfd_size_type external_hdr_size
2448 = backend
->debug_swap
.external_hdr_size
;
2449 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2450 void (* const adjust_reloc_out
) PARAMS ((bfd
*,
2452 struct internal_reloc
*))
2453 = backend
->adjust_reloc_out
;
2454 void (* const swap_reloc_out
) PARAMS ((bfd
*,
2455 const struct internal_reloc
*,
2457 = backend
->swap_reloc_out
;
2458 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2459 HDRR
* const symhdr
= &debug
->symbolic_header
;
2462 bfd_size_type reloc_size
;
2463 bfd_size_type text_size
;
2465 boolean set_text_start
;
2466 bfd_size_type data_size
;
2468 boolean set_data_start
;
2469 bfd_size_type bss_size
;
2471 PTR reloc_buff
= NULL
;
2472 struct internal_filehdr internal_f
;
2473 struct internal_aouthdr internal_a
;
2476 /* Determine where the sections and relocs will go in the output
2478 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2481 for (current
= abfd
->sections
;
2482 current
!= (asection
*)NULL
;
2483 current
= current
->next
)
2485 current
->target_index
= count
;
2489 if ((abfd
->flags
& D_PAGED
) != 0)
2490 text_size
= _bfd_ecoff_sizeof_headers (abfd
, false);
2494 set_text_start
= false;
2497 set_data_start
= false;
2500 /* Write section headers to the file. */
2502 /* Allocate buff big enough to hold a section header,
2503 file header, or a.out header. */
2511 buff
= (PTR
) bfd_malloc ((size_t) siz
);
2516 internal_f
.f_nscns
= 0;
2517 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2519 for (current
= abfd
->sections
;
2520 current
!= (asection
*) NULL
;
2521 current
= current
->next
)
2523 struct internal_scnhdr section
;
2526 ++internal_f
.f_nscns
;
2528 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2530 /* This seems to be correct for Irix 4 shared libraries. */
2531 vma
= bfd_get_section_vma (abfd
, current
);
2532 if (strcmp (current
->name
, _LIB
) == 0)
2533 section
.s_vaddr
= 0;
2535 section
.s_vaddr
= vma
;
2537 section
.s_paddr
= current
->lma
;
2538 section
.s_size
= bfd_get_section_size_before_reloc (current
);
2540 /* If this section is unloadable then the scnptr will be 0. */
2541 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2542 section
.s_scnptr
= 0;
2544 section
.s_scnptr
= current
->filepos
;
2545 section
.s_relptr
= current
->rel_filepos
;
2547 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2548 object file produced by the assembler is supposed to point to
2549 information about how much room is required by objects of
2550 various different sizes. I think this only matters if we
2551 want the linker to compute the best size to use, or
2552 something. I don't know what happens if the information is
2554 if (strcmp (current
->name
, _PDATA
) != 0)
2555 section
.s_lnnoptr
= 0;
2558 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2559 hold the number of entries in the section (each entry is
2560 8 bytes). We stored this in the line_filepos field in
2561 ecoff_compute_section_file_positions. */
2562 section
.s_lnnoptr
= current
->line_filepos
;
2565 section
.s_nreloc
= current
->reloc_count
;
2566 section
.s_nlnno
= 0;
2567 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2570 if (bfd_coff_swap_scnhdr_out (abfd
, (PTR
) §ion
, buff
) == 0
2571 || bfd_write (buff
, 1, scnhsz
, abfd
) != scnhsz
)
2574 if ((section
.s_flags
& STYP_TEXT
) != 0
2575 || ((section
.s_flags
& STYP_RDATA
) != 0
2576 && ecoff_data (abfd
)->rdata_in_text
)
2577 || section
.s_flags
== STYP_PDATA
2578 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2579 || (section
.s_flags
& STYP_LIBLIST
) != 0
2580 || (section
.s_flags
& STYP_RELDYN
) != 0
2581 || section
.s_flags
== STYP_CONFLIC
2582 || (section
.s_flags
& STYP_DYNSTR
) != 0
2583 || (section
.s_flags
& STYP_DYNSYM
) != 0
2584 || (section
.s_flags
& STYP_HASH
) != 0
2585 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2586 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2587 || section
.s_flags
== STYP_RCONST
)
2589 text_size
+= bfd_get_section_size_before_reloc (current
);
2590 if (! set_text_start
|| text_start
> vma
)
2593 set_text_start
= true;
2596 else if ((section
.s_flags
& STYP_RDATA
) != 0
2597 || (section
.s_flags
& STYP_DATA
) != 0
2598 || (section
.s_flags
& STYP_LITA
) != 0
2599 || (section
.s_flags
& STYP_LIT8
) != 0
2600 || (section
.s_flags
& STYP_LIT4
) != 0
2601 || (section
.s_flags
& STYP_SDATA
) != 0
2602 || section
.s_flags
== STYP_XDATA
2603 || (section
.s_flags
& STYP_GOT
) != 0)
2605 data_size
+= bfd_get_section_size_before_reloc (current
);
2606 if (! set_data_start
|| data_start
> vma
)
2609 set_data_start
= true;
2612 else if ((section
.s_flags
& STYP_BSS
) != 0
2613 || (section
.s_flags
& STYP_SBSS
) != 0)
2614 bss_size
+= bfd_get_section_size_before_reloc (current
);
2615 else if (section
.s_flags
== 0
2616 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2617 || section
.s_flags
== STYP_COMMENT
)
2623 /* Set up the file header. */
2625 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2627 /* We will NOT put a fucking timestamp in the header here. Every
2628 time you put it back, I will come in and take it out again. I'm
2629 sorry. This field does not belong here. We fill it with a 0 so
2630 it compares the same but is not a reasonable time. --
2632 internal_f
.f_timdat
= 0;
2634 if (bfd_get_symcount (abfd
) != 0)
2636 /* The ECOFF f_nsyms field is not actually the number of
2637 symbols, it's the size of symbolic information header. */
2638 internal_f
.f_nsyms
= external_hdr_size
;
2639 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2643 internal_f
.f_nsyms
= 0;
2644 internal_f
.f_symptr
= 0;
2647 internal_f
.f_opthdr
= aoutsz
;
2649 internal_f
.f_flags
= F_LNNO
;
2650 if (reloc_size
== 0)
2651 internal_f
.f_flags
|= F_RELFLG
;
2652 if (bfd_get_symcount (abfd
) == 0)
2653 internal_f
.f_flags
|= F_LSYMS
;
2654 if (abfd
->flags
& EXEC_P
)
2655 internal_f
.f_flags
|= F_EXEC
;
2657 if (bfd_little_endian (abfd
))
2658 internal_f
.f_flags
|= F_AR32WR
;
2660 internal_f
.f_flags
|= F_AR32W
;
2662 /* Set up the ``optional'' header. */
2663 if ((abfd
->flags
& D_PAGED
) != 0)
2664 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2666 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2668 /* FIXME: Is this really correct? */
2669 internal_a
.vstamp
= symhdr
->vstamp
;
2671 /* At least on Ultrix, these have to be rounded to page boundaries.
2672 FIXME: Is this true on other platforms? */
2673 if ((abfd
->flags
& D_PAGED
) != 0)
2675 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2676 internal_a
.text_start
= text_start
&~ (round
- 1);
2677 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2678 internal_a
.data_start
= data_start
&~ (round
- 1);
2682 internal_a
.tsize
= text_size
;
2683 internal_a
.text_start
= text_start
;
2684 internal_a
.dsize
= data_size
;
2685 internal_a
.data_start
= data_start
;
2688 /* On Ultrix, the initial portions of the .sbss and .bss segments
2689 are at the end of the data section. The bsize field in the
2690 optional header records how many bss bytes are required beyond
2691 those in the data section. The value is not rounded to a page
2693 if (bss_size
< internal_a
.dsize
- data_size
)
2696 bss_size
-= internal_a
.dsize
- data_size
;
2697 internal_a
.bsize
= bss_size
;
2698 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2700 internal_a
.entry
= bfd_get_start_address (abfd
);
2702 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2704 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2705 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2706 for (i
= 0; i
< 4; i
++)
2707 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2709 /* Let the backend adjust the headers if necessary. */
2710 if (backend
->adjust_headers
)
2712 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2716 /* Write out the file header and the optional header. */
2718 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2721 bfd_coff_swap_filehdr_out (abfd
, (PTR
) &internal_f
, buff
);
2722 if (bfd_write (buff
, 1, filhsz
, abfd
) != filhsz
)
2725 bfd_coff_swap_aouthdr_out (abfd
, (PTR
) &internal_a
, buff
);
2726 if (bfd_write (buff
, 1, aoutsz
, abfd
) != aoutsz
)
2729 /* Build the external symbol information. This must be done before
2730 writing out the relocs so that we know the symbol indices. We
2731 don't do this if this BFD was created by the backend linker,
2732 since it will have already handled the symbols and relocs. */
2733 if (! ecoff_data (abfd
)->linker
)
2735 symhdr
->iextMax
= 0;
2736 symhdr
->issExtMax
= 0;
2737 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2738 debug
->ssext
= debug
->ssext_end
= NULL
;
2739 if (bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2740 (((abfd
->flags
& EXEC_P
) == 0)
2742 ecoff_get_extr
, ecoff_set_index
)
2746 /* Write out the relocs. */
2747 for (current
= abfd
->sections
;
2748 current
!= (asection
*) NULL
;
2749 current
= current
->next
)
2751 arelent
**reloc_ptr_ptr
;
2752 arelent
**reloc_end
;
2755 if (current
->reloc_count
== 0)
2759 bfd_alloc (abfd
, current
->reloc_count
* external_reloc_size
);
2760 if (reloc_buff
== NULL
)
2763 reloc_ptr_ptr
= current
->orelocation
;
2764 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2765 out_ptr
= (char *) reloc_buff
;
2767 reloc_ptr_ptr
< reloc_end
;
2768 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2772 struct internal_reloc in
;
2774 memset ((PTR
) &in
, 0, sizeof in
);
2776 reloc
= *reloc_ptr_ptr
;
2777 sym
= *reloc
->sym_ptr_ptr
;
2779 in
.r_vaddr
= (reloc
->address
2780 + bfd_get_section_vma (abfd
, current
));
2781 in
.r_type
= reloc
->howto
->type
;
2783 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2785 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2792 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2793 if (strcmp (name
, ".text") == 0)
2794 in
.r_symndx
= RELOC_SECTION_TEXT
;
2795 else if (strcmp (name
, ".rdata") == 0)
2796 in
.r_symndx
= RELOC_SECTION_RDATA
;
2797 else if (strcmp (name
, ".data") == 0)
2798 in
.r_symndx
= RELOC_SECTION_DATA
;
2799 else if (strcmp (name
, ".sdata") == 0)
2800 in
.r_symndx
= RELOC_SECTION_SDATA
;
2801 else if (strcmp (name
, ".sbss") == 0)
2802 in
.r_symndx
= RELOC_SECTION_SBSS
;
2803 else if (strcmp (name
, ".bss") == 0)
2804 in
.r_symndx
= RELOC_SECTION_BSS
;
2805 else if (strcmp (name
, ".init") == 0)
2806 in
.r_symndx
= RELOC_SECTION_INIT
;
2807 else if (strcmp (name
, ".lit8") == 0)
2808 in
.r_symndx
= RELOC_SECTION_LIT8
;
2809 else if (strcmp (name
, ".lit4") == 0)
2810 in
.r_symndx
= RELOC_SECTION_LIT4
;
2811 else if (strcmp (name
, ".xdata") == 0)
2812 in
.r_symndx
= RELOC_SECTION_XDATA
;
2813 else if (strcmp (name
, ".pdata") == 0)
2814 in
.r_symndx
= RELOC_SECTION_PDATA
;
2815 else if (strcmp (name
, ".fini") == 0)
2816 in
.r_symndx
= RELOC_SECTION_FINI
;
2817 else if (strcmp (name
, ".lita") == 0)
2818 in
.r_symndx
= RELOC_SECTION_LITA
;
2819 else if (strcmp (name
, "*ABS*") == 0)
2820 in
.r_symndx
= RELOC_SECTION_ABS
;
2821 else if (strcmp (name
, ".rconst") == 0)
2822 in
.r_symndx
= RELOC_SECTION_RCONST
;
2828 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2830 (*swap_reloc_out
) (abfd
, &in
, (PTR
) out_ptr
);
2833 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2835 if (bfd_write (reloc_buff
,
2836 external_reloc_size
, current
->reloc_count
, abfd
)
2837 != external_reloc_size
* current
->reloc_count
)
2839 bfd_release (abfd
, reloc_buff
);
2843 /* Write out the symbolic debugging information. */
2844 if (bfd_get_symcount (abfd
) > 0)
2846 /* Write out the debugging information. */
2847 if (bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2848 ecoff_data (abfd
)->sym_filepos
)
2854 /* The .bss section of a demand paged executable must receive an
2855 entire page. If there are symbols, the symbols will start on the
2856 next page. If there are no symbols, we must fill out the page by
2858 if (bfd_get_symcount (abfd
) == 0
2859 && (abfd
->flags
& EXEC_P
) != 0
2860 && (abfd
->flags
& D_PAGED
) != 0)
2864 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2867 if (bfd_read (&c
, 1, 1, abfd
) == 0)
2869 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2872 if (bfd_write (&c
, 1, 1, abfd
) != 1)
2876 if (reloc_buff
!= NULL
)
2877 bfd_release (abfd
, reloc_buff
);
2882 if (reloc_buff
!= NULL
)
2883 bfd_release (abfd
, reloc_buff
);
2889 /* Archive handling. ECOFF uses what appears to be a unique type of
2890 archive header (armap). The byte ordering of the armap and the
2891 contents are encoded in the name of the armap itself. At least for
2892 now, we only support archives with the same byte ordering in the
2893 armap and the contents.
2895 The first four bytes in the armap are the number of symbol
2896 definitions. This is always a power of two.
2898 This is followed by the symbol definitions. Each symbol definition
2899 occupies 8 bytes. The first four bytes are the offset from the
2900 start of the armap strings to the null-terminated string naming
2901 this symbol. The second four bytes are the file offset to the
2902 archive member which defines this symbol. If the second four bytes
2903 are 0, then this is not actually a symbol definition, and it should
2906 The symbols are hashed into the armap with a closed hashing scheme.
2907 See the functions below for the details of the algorithm.
2909 After the symbol definitions comes four bytes holding the size of
2910 the string table, followed by the string table itself. */
2912 /* The name of an archive headers looks like this:
2913 __________E[BL]E[BL]_ (with a trailing space).
2914 The trailing space is changed to an X if the archive is changed to
2915 indicate that the armap is out of date.
2917 The Alpha seems to use ________64E[BL]E[BL]_. */
2919 #define ARMAP_BIG_ENDIAN 'B'
2920 #define ARMAP_LITTLE_ENDIAN 'L'
2921 #define ARMAP_MARKER 'E'
2922 #define ARMAP_START_LENGTH 10
2923 #define ARMAP_HEADER_MARKER_INDEX 10
2924 #define ARMAP_HEADER_ENDIAN_INDEX 11
2925 #define ARMAP_OBJECT_MARKER_INDEX 12
2926 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2927 #define ARMAP_END_INDEX 14
2928 #define ARMAP_END "_ "
2930 /* This is a magic number used in the hashing algorithm. */
2931 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2933 /* This returns the hash value to use for a string. It also sets
2934 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2935 is the number of entries in the hash table, and HLOG is the log
2939 ecoff_armap_hash (s
, rehash
, size
, hlog
)
2941 unsigned int *rehash
;
2951 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2952 hash
*= ARMAP_HASH_MAGIC
;
2953 *rehash
= (hash
& (size
- 1)) | 1;
2954 return hash
>> (32 - hlog
);
2957 /* Read in the armap. */
2960 _bfd_ecoff_slurp_armap (abfd
)
2965 struct areltdata
*mapdata
;
2966 bfd_size_type parsed_size
;
2968 struct artdata
*ardata
;
2971 struct symdef
*symdef_ptr
;
2974 /* Get the name of the first element. */
2975 i
= bfd_read ((PTR
) nextname
, 1, 16, abfd
);
2981 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2984 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2985 standard COFF armap. We could move the ECOFF armap stuff into
2986 bfd_slurp_armap, but that seems inappropriate since no other
2987 target uses this format. Instead, we check directly for a COFF
2989 if (strncmp (nextname
, "/ ", 16) == 0)
2990 return bfd_slurp_armap (abfd
);
2992 /* See if the first element is an armap. */
2993 if (strncmp (nextname
, ecoff_backend (abfd
)->armap_start
,
2994 ARMAP_START_LENGTH
) != 0
2995 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
2996 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2997 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2998 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
2999 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
3000 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
3001 || strncmp (nextname
+ ARMAP_END_INDEX
,
3002 ARMAP_END
, sizeof ARMAP_END
- 1) != 0)
3004 bfd_has_map (abfd
) = false;
3008 /* Make sure we have the right byte ordering. */
3009 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3010 ^ (bfd_header_big_endian (abfd
)))
3011 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
3012 ^ (bfd_big_endian (abfd
))))
3014 bfd_set_error (bfd_error_wrong_format
);
3018 /* Read in the armap. */
3019 ardata
= bfd_ardata (abfd
);
3020 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
3021 if (mapdata
== (struct areltdata
*) NULL
)
3023 parsed_size
= mapdata
->parsed_size
;
3024 bfd_release (abfd
, (PTR
) mapdata
);
3026 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
3027 if (raw_armap
== (char *) NULL
)
3030 if (bfd_read ((PTR
) raw_armap
, 1, parsed_size
, abfd
) != parsed_size
)
3032 if (bfd_get_error () != bfd_error_system_call
)
3033 bfd_set_error (bfd_error_malformed_archive
);
3034 bfd_release (abfd
, (PTR
) raw_armap
);
3038 ardata
->tdata
= (PTR
) raw_armap
;
3040 count
= bfd_h_get_32 (abfd
, (PTR
) raw_armap
);
3042 ardata
->symdef_count
= 0;
3043 ardata
->cache
= (struct ar_cache
*) NULL
;
3045 /* This code used to overlay the symdefs over the raw archive data,
3046 but that doesn't work on a 64 bit host. */
3048 stringbase
= raw_armap
+ count
* 8 + 8;
3050 #ifdef CHECK_ARMAP_HASH
3054 /* Double check that I have the hashing algorithm right by making
3055 sure that every symbol can be looked up successfully. */
3057 for (i
= 1; i
< count
; i
<<= 1)
3059 BFD_ASSERT (i
== count
);
3061 raw_ptr
= raw_armap
+ 4;
3062 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3064 unsigned int name_offset
, file_offset
;
3065 unsigned int hash
, rehash
, srch
;
3067 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3068 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3069 if (file_offset
== 0)
3071 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
3076 /* See if we can rehash to this location. */
3077 for (srch
= (hash
+ rehash
) & (count
- 1);
3078 srch
!= hash
&& srch
!= i
;
3079 srch
= (srch
+ rehash
) & (count
- 1))
3080 BFD_ASSERT (bfd_h_get_32 (abfd
, (PTR
) (raw_armap
+ 8 + srch
* 8))
3082 BFD_ASSERT (srch
== i
);
3086 #endif /* CHECK_ARMAP_HASH */
3088 raw_ptr
= raw_armap
+ 4;
3089 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3090 if (bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4)) != 0)
3091 ++ardata
->symdef_count
;
3093 symdef_ptr
= ((struct symdef
*)
3095 ardata
->symdef_count
* sizeof (struct symdef
)));
3099 ardata
->symdefs
= (carsym
*) symdef_ptr
;
3101 raw_ptr
= raw_armap
+ 4;
3102 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
3104 unsigned int name_offset
, file_offset
;
3106 file_offset
= bfd_h_get_32 (abfd
, (PTR
) (raw_ptr
+ 4));
3107 if (file_offset
== 0)
3109 name_offset
= bfd_h_get_32 (abfd
, (PTR
) raw_ptr
);
3110 symdef_ptr
->s
.name
= stringbase
+ name_offset
;
3111 symdef_ptr
->file_offset
= file_offset
;
3115 ardata
->first_file_filepos
= bfd_tell (abfd
);
3116 /* Pad to an even boundary. */
3117 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3119 bfd_has_map (abfd
) = true;
3124 /* Write out an armap. */
3127 _bfd_ecoff_write_armap (abfd
, elength
, map
, orl_count
, stridx
)
3129 unsigned int elength
;
3131 unsigned int orl_count
;
3134 unsigned int hashsize
, hashlog
;
3135 unsigned int symdefsize
;
3137 unsigned int stringsize
;
3138 unsigned int mapsize
;
3141 struct stat statbuf
;
3144 bfd_byte
*hashtable
;
3148 /* Ultrix appears to use as a hash table size the least power of two
3149 greater than twice the number of entries. */
3150 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3152 hashsize
= 1 << hashlog
;
3154 symdefsize
= hashsize
* 8;
3156 stringsize
= stridx
+ padit
;
3158 /* Include 8 bytes to store symdefsize and stringsize in output. */
3159 mapsize
= symdefsize
+ stringsize
+ 8;
3161 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3163 memset ((PTR
) &hdr
, 0, sizeof hdr
);
3165 /* Work out the ECOFF armap name. */
3166 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3167 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3168 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3169 (bfd_header_big_endian (abfd
)
3171 : ARMAP_LITTLE_ENDIAN
);
3172 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3173 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3174 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3175 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3177 /* Write the timestamp of the archive header to be just a little bit
3178 later than the timestamp of the file, otherwise the linker will
3179 complain that the index is out of date. Actually, the Ultrix
3180 linker just checks the archive name; the GNU linker may check the
3182 stat (abfd
->filename
, &statbuf
);
3183 sprintf (hdr
.ar_date
, "%ld", (long) (statbuf
.st_mtime
+ 60));
3185 /* The DECstation uses zeroes for the uid, gid and mode of the
3187 hdr
.ar_uid
[0] = '0';
3188 hdr
.ar_gid
[0] = '0';
3190 hdr
.ar_mode
[0] = '0';
3192 /* Building gcc ends up extracting the armap as a file - twice. */
3193 hdr
.ar_mode
[0] = '6';
3194 hdr
.ar_mode
[1] = '4';
3195 hdr
.ar_mode
[2] = '4';
3198 sprintf (hdr
.ar_size
, "%-10d", (int) mapsize
);
3200 hdr
.ar_fmag
[0] = '`';
3201 hdr
.ar_fmag
[1] = '\012';
3203 /* Turn all null bytes in the header into spaces. */
3204 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3205 if (((char *)(&hdr
))[i
] == '\0')
3206 (((char *)(&hdr
))[i
]) = ' ';
3208 if (bfd_write ((PTR
) &hdr
, 1, sizeof (struct ar_hdr
), abfd
)
3209 != sizeof (struct ar_hdr
))
3212 bfd_h_put_32 (abfd
, (bfd_vma
) hashsize
, temp
);
3213 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3216 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3220 current
= abfd
->archive_head
;
3222 for (i
= 0; i
< orl_count
; i
++)
3224 unsigned int hash
, rehash
;
3226 /* Advance firstreal to the file position of this archive
3228 if (((bfd
*) map
[i
].pos
) != last_elt
)
3232 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3233 firstreal
+= firstreal
% 2;
3234 current
= current
->next
;
3236 while (current
!= (bfd
*) map
[i
].pos
);
3241 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3242 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (hash
* 8) + 4)) != 0)
3246 /* The desired slot is already taken. */
3247 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3249 srch
= (srch
+ rehash
) & (hashsize
- 1))
3250 if (bfd_h_get_32 (abfd
, (PTR
) (hashtable
+ (srch
* 8) + 4)) == 0)
3253 BFD_ASSERT (srch
!= hash
);
3258 bfd_h_put_32 (abfd
, (bfd_vma
) map
[i
].namidx
,
3259 (PTR
) (hashtable
+ hash
* 8));
3260 bfd_h_put_32 (abfd
, (bfd_vma
) firstreal
,
3261 (PTR
) (hashtable
+ hash
* 8 + 4));
3264 if (bfd_write ((PTR
) hashtable
, 1, symdefsize
, abfd
) != symdefsize
)
3267 bfd_release (abfd
, hashtable
);
3269 /* Now write the strings. */
3270 bfd_h_put_32 (abfd
, (bfd_vma
) stringsize
, temp
);
3271 if (bfd_write ((PTR
) temp
, 1, 4, abfd
) != 4)
3273 for (i
= 0; i
< orl_count
; i
++)
3277 len
= strlen (*map
[i
].name
) + 1;
3278 if (bfd_write ((PTR
) (*map
[i
].name
), 1, len
, abfd
) != len
)
3282 /* The spec sez this should be a newline. But in order to be
3283 bug-compatible for DECstation ar we use a null. */
3286 if (bfd_write ("", 1, 1, abfd
) != 1)
3293 /* See whether this BFD is an archive. If it is, read in the armap
3294 and the extended name table. */
3297 _bfd_ecoff_archive_p (abfd
)
3300 struct artdata
*tdata_hold
;
3301 char armag
[SARMAG
+ 1];
3303 tdata_hold
= abfd
->tdata
.aout_ar_data
;
3305 if (bfd_read ((PTR
) armag
, 1, SARMAG
, abfd
) != SARMAG
)
3307 if (bfd_get_error () != bfd_error_system_call
)
3308 bfd_set_error (bfd_error_wrong_format
);
3309 return (const bfd_target
*) NULL
;
3312 if (strncmp (armag
, ARMAG
, SARMAG
) != 0)
3314 bfd_set_error (bfd_error_wrong_format
);
3318 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3319 involves a cast, we can't do it as the left operand of
3321 abfd
->tdata
.aout_ar_data
=
3322 (struct artdata
*) bfd_zalloc (abfd
, sizeof (struct artdata
));
3324 if (bfd_ardata (abfd
) == (struct artdata
*) NULL
)
3326 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3327 return (const bfd_target
*) NULL
;
3330 bfd_ardata (abfd
)->first_file_filepos
= SARMAG
;
3331 bfd_ardata (abfd
)->cache
= NULL
;
3332 bfd_ardata (abfd
)->archive_head
= NULL
;
3333 bfd_ardata (abfd
)->symdefs
= NULL
;
3334 bfd_ardata (abfd
)->extended_names
= NULL
;
3335 bfd_ardata (abfd
)->tdata
= NULL
;
3337 if (_bfd_ecoff_slurp_armap (abfd
) == false
3338 || _bfd_ecoff_slurp_extended_name_table (abfd
) == false)
3340 bfd_release (abfd
, bfd_ardata (abfd
));
3341 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3342 return (const bfd_target
*) NULL
;
3345 if (bfd_has_map (abfd
))
3349 /* This archive has a map, so we may presume that the contents
3350 are object files. Make sure that if the first file in the
3351 archive can be recognized as an object file, it is for this
3352 target. If not, assume that this is the wrong format. If
3353 the first file is not an object file, somebody is doing
3354 something weird, and we permit it so that ar -t will work. */
3356 first
= bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
);
3361 first
->target_defaulted
= false;
3363 if (bfd_check_format (first
, bfd_object
)
3364 && first
->xvec
!= abfd
->xvec
)
3366 (void) bfd_close (first
);
3367 bfd_release (abfd
, bfd_ardata (abfd
));
3368 abfd
->tdata
.aout_ar_data
= tdata_hold
;
3369 bfd_set_error (bfd_error_wrong_format
);
3373 /* We ought to close first here, but we can't, because we
3374 have no way to remove it from the archive cache. FIXME. */
3381 /* ECOFF linker code. */
3383 static struct bfd_hash_entry
*ecoff_link_hash_newfunc
3384 PARAMS ((struct bfd_hash_entry
*entry
,
3385 struct bfd_hash_table
*table
,
3386 const char *string
));
3387 static boolean ecoff_link_add_archive_symbols
3388 PARAMS ((bfd
*, struct bfd_link_info
*));
3389 static boolean ecoff_link_check_archive_element
3390 PARAMS ((bfd
*, struct bfd_link_info
*, boolean
*pneeded
));
3391 static boolean ecoff_link_add_object_symbols
3392 PARAMS ((bfd
*, struct bfd_link_info
*));
3393 static boolean ecoff_link_add_externals
3394 PARAMS ((bfd
*, struct bfd_link_info
*, PTR
, char *));
3396 /* Routine to create an entry in an ECOFF link hash table. */
3398 static struct bfd_hash_entry
*
3399 ecoff_link_hash_newfunc (entry
, table
, string
)
3400 struct bfd_hash_entry
*entry
;
3401 struct bfd_hash_table
*table
;
3404 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3406 /* Allocate the structure if it has not already been allocated by a
3408 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3409 ret
= ((struct ecoff_link_hash_entry
*)
3410 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3411 if (ret
== (struct ecoff_link_hash_entry
*) NULL
)
3414 /* Call the allocation method of the superclass. */
3415 ret
= ((struct ecoff_link_hash_entry
*)
3416 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3421 /* Set local fields. */
3427 memset ((PTR
) &ret
->esym
, 0, sizeof ret
->esym
);
3429 return (struct bfd_hash_entry
*) ret
;
3432 /* Create an ECOFF link hash table. */
3434 struct bfd_link_hash_table
*
3435 _bfd_ecoff_bfd_link_hash_table_create (abfd
)
3438 struct ecoff_link_hash_table
*ret
;
3440 ret
= ((struct ecoff_link_hash_table
*)
3441 bfd_alloc (abfd
, sizeof (struct ecoff_link_hash_table
)));
3444 if (! _bfd_link_hash_table_init (&ret
->root
, abfd
,
3445 ecoff_link_hash_newfunc
))
3448 return (struct bfd_link_hash_table
*) NULL
;
3453 /* Look up an entry in an ECOFF link hash table. */
3455 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3456 ((struct ecoff_link_hash_entry *) \
3457 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3459 /* Traverse an ECOFF link hash table. */
3461 #define ecoff_link_hash_traverse(table, func, info) \
3462 (bfd_link_hash_traverse \
3464 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3467 /* Get the ECOFF link hash table from the info structure. This is
3470 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3472 /* Given an ECOFF BFD, add symbols to the global hash table as
3476 _bfd_ecoff_bfd_link_add_symbols (abfd
, info
)
3478 struct bfd_link_info
*info
;
3480 switch (bfd_get_format (abfd
))
3483 return ecoff_link_add_object_symbols (abfd
, info
);
3485 return ecoff_link_add_archive_symbols (abfd
, info
);
3487 bfd_set_error (bfd_error_wrong_format
);
3492 /* Add the symbols from an archive file to the global hash table.
3493 This looks through the undefined symbols, looks each one up in the
3494 archive hash table, and adds any associated object file. We do not
3495 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3496 already have a hash table, so there is no reason to construct
3500 ecoff_link_add_archive_symbols (abfd
, info
)
3502 struct bfd_link_info
*info
;
3504 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3505 const bfd_byte
*raw_armap
;
3506 struct bfd_link_hash_entry
**pundef
;
3507 unsigned int armap_count
;
3508 unsigned int armap_log
;
3510 const bfd_byte
*hashtable
;
3511 const char *stringbase
;
3513 if (! bfd_has_map (abfd
))
3515 /* An empty archive is a special case. */
3516 if (bfd_openr_next_archived_file (abfd
, (bfd
*) NULL
) == NULL
)
3518 bfd_set_error (bfd_error_no_armap
);
3522 /* If we don't have any raw data for this archive, as can happen on
3523 Irix 4.0.5F, we call the generic routine.
3524 FIXME: We should be more clever about this, since someday tdata
3525 may get to something for a generic archive. */
3526 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3527 if (raw_armap
== (bfd_byte
*) NULL
)
3528 return (_bfd_generic_link_add_archive_symbols
3529 (abfd
, info
, ecoff_link_check_archive_element
));
3531 armap_count
= bfd_h_get_32 (abfd
, raw_armap
);
3534 for (i
= 1; i
< armap_count
; i
<<= 1)
3536 BFD_ASSERT (i
== armap_count
);
3538 hashtable
= raw_armap
+ 4;
3539 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3541 /* Look through the list of undefined symbols. */
3542 pundef
= &info
->hash
->undefs
;
3543 while (*pundef
!= (struct bfd_link_hash_entry
*) NULL
)
3545 struct bfd_link_hash_entry
*h
;
3546 unsigned int hash
, rehash
;
3547 unsigned int file_offset
;
3553 /* When a symbol is defined, it is not necessarily removed from
3555 if (h
->type
!= bfd_link_hash_undefined
3556 && h
->type
!= bfd_link_hash_common
)
3558 /* Remove this entry from the list, for general cleanliness
3559 and because we are going to look through the list again
3560 if we search any more libraries. We can't remove the
3561 entry if it is the tail, because that would lose any
3562 entries we add to the list later on. */
3563 if (*pundef
!= info
->hash
->undefs_tail
)
3564 *pundef
= (*pundef
)->next
;
3566 pundef
= &(*pundef
)->next
;
3570 /* Native ECOFF linkers do not pull in archive elements merely
3571 to satisfy common definitions, so neither do we. We leave
3572 them on the list, though, in case we are linking against some
3573 other object format. */
3574 if (h
->type
!= bfd_link_hash_undefined
)
3576 pundef
= &(*pundef
)->next
;
3580 /* Look for this symbol in the archive hash table. */
3581 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3584 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3585 if (file_offset
== 0)
3587 /* Nothing in this slot. */
3588 pundef
= &(*pundef
)->next
;
3592 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (hash
* 8));
3593 if (name
[0] != h
->root
.string
[0]
3594 || strcmp (name
, h
->root
.string
) != 0)
3599 /* That was the wrong symbol. Try rehashing. */
3601 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3603 srch
= (srch
+ rehash
) & (armap_count
- 1))
3605 file_offset
= bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3606 if (file_offset
== 0)
3608 name
= stringbase
+ bfd_h_get_32 (abfd
, hashtable
+ (srch
* 8));
3609 if (name
[0] == h
->root
.string
[0]
3610 && strcmp (name
, h
->root
.string
) == 0)
3619 pundef
= &(*pundef
)->next
;
3626 element
= (*backend
->get_elt_at_filepos
) (abfd
, file_offset
);
3627 if (element
== (bfd
*) NULL
)
3630 if (! bfd_check_format (element
, bfd_object
))
3633 /* Unlike the generic linker, we know that this element provides
3634 a definition for an undefined symbol and we know that we want
3635 to include it. We don't need to check anything. */
3636 if (! (*info
->callbacks
->add_archive_element
) (info
, element
, name
))
3638 if (! ecoff_link_add_object_symbols (element
, info
))
3641 pundef
= &(*pundef
)->next
;
3647 /* This is called if we used _bfd_generic_link_add_archive_symbols
3648 because we were not dealing with an ECOFF archive. */
3651 ecoff_link_check_archive_element (abfd
, info
, pneeded
)
3653 struct bfd_link_info
*info
;
3656 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3657 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3658 = backend
->debug_swap
.swap_ext_in
;
3660 bfd_size_type external_ext_size
;
3661 PTR external_ext
= NULL
;
3669 if (! ecoff_slurp_symbolic_header (abfd
))
3672 /* If there are no symbols, we don't want it. */
3673 if (bfd_get_symcount (abfd
) == 0)
3674 goto successful_return
;
3676 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3678 /* Read in the external symbols and external strings. */
3679 external_ext_size
= backend
->debug_swap
.external_ext_size
;
3680 esize
= symhdr
->iextMax
* external_ext_size
;
3681 external_ext
= (PTR
) bfd_malloc (esize
);
3682 if (external_ext
== NULL
&& esize
!= 0)
3685 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3686 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3689 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3690 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3693 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3694 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
) !=
3695 (bfd_size_type
) symhdr
->issExtMax
))
3698 /* Look through the external symbols to see if they define some
3699 symbol that is currently undefined. */
3700 ext_ptr
= (char *) external_ext
;
3701 ext_end
= ext_ptr
+ esize
;
3702 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3707 struct bfd_link_hash_entry
*h
;
3709 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3711 /* See if this symbol defines something. */
3712 if (esym
.asym
.st
!= stGlobal
3713 && esym
.asym
.st
!= stLabel
3714 && esym
.asym
.st
!= stProc
)
3717 switch (esym
.asym
.sc
)
3741 name
= ssext
+ esym
.asym
.iss
;
3742 h
= bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
3744 /* Unlike the generic linker, we do not pull in elements because
3745 of common symbols. */
3746 if (h
== (struct bfd_link_hash_entry
*) NULL
3747 || h
->type
!= bfd_link_hash_undefined
)
3750 /* Include this element. */
3751 if (! (*info
->callbacks
->add_archive_element
) (info
, abfd
, name
))
3753 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3757 goto successful_return
;
3761 if (external_ext
!= NULL
)
3762 free (external_ext
);
3767 if (external_ext
!= NULL
)
3768 free (external_ext
);
3774 /* Add symbols from an ECOFF object file to the global linker hash
3778 ecoff_link_add_object_symbols (abfd
, info
)
3780 struct bfd_link_info
*info
;
3783 bfd_size_type external_ext_size
;
3784 PTR external_ext
= NULL
;
3789 if (! ecoff_slurp_symbolic_header (abfd
))
3792 /* If there are no symbols, we don't want it. */
3793 if (bfd_get_symcount (abfd
) == 0)
3796 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3798 /* Read in the external symbols and external strings. */
3799 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3800 esize
= symhdr
->iextMax
* external_ext_size
;
3801 external_ext
= (PTR
) bfd_malloc (esize
);
3802 if (external_ext
== NULL
&& esize
!= 0)
3805 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0
3806 || bfd_read (external_ext
, 1, esize
, abfd
) != esize
)
3809 ssext
= (char *) bfd_malloc (symhdr
->issExtMax
);
3810 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3813 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3814 || (bfd_read (ssext
, 1, symhdr
->issExtMax
, abfd
)
3815 != (bfd_size_type
) symhdr
->issExtMax
))
3818 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3822 if (external_ext
!= NULL
)
3823 free (external_ext
);
3829 if (external_ext
!= NULL
)
3830 free (external_ext
);
3834 /* Add the external symbols of an object file to the global linker
3835 hash table. The external symbols and strings we are passed are
3836 just allocated on the stack, and will be discarded. We must
3837 explicitly save any information we may need later on in the link.
3838 We do not want to read the external symbol information again. */
3841 ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
)
3843 struct bfd_link_info
*info
;
3847 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3848 void (* const swap_ext_in
) PARAMS ((bfd
*, PTR
, EXTR
*))
3849 = backend
->debug_swap
.swap_ext_in
;
3850 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3851 unsigned long ext_count
;
3852 struct ecoff_link_hash_entry
**sym_hash
;
3856 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3858 sym_hash
= ((struct ecoff_link_hash_entry
**)
3860 ext_count
* sizeof (struct bfd_link_hash_entry
*)));
3863 ecoff_data (abfd
)->sym_hashes
= sym_hash
;
3865 ext_ptr
= (char *) external_ext
;
3866 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3867 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3874 struct ecoff_link_hash_entry
*h
;
3878 (*swap_ext_in
) (abfd
, (PTR
) ext_ptr
, &esym
);
3880 /* Skip debugging symbols. */
3882 switch (esym
.asym
.st
)
3898 /* Get the information for this symbol. */
3899 value
= esym
.asym
.value
;
3900 switch (esym
.asym
.sc
)
3920 section
= bfd_make_section_old_way (abfd
, ".text");
3921 value
-= section
->vma
;
3924 section
= bfd_make_section_old_way (abfd
, ".data");
3925 value
-= section
->vma
;
3928 section
= bfd_make_section_old_way (abfd
, ".bss");
3929 value
-= section
->vma
;
3932 section
= bfd_abs_section_ptr
;
3935 section
= bfd_und_section_ptr
;
3938 section
= bfd_make_section_old_way (abfd
, ".sdata");
3939 value
-= section
->vma
;
3942 section
= bfd_make_section_old_way (abfd
, ".sbss");
3943 value
-= section
->vma
;
3946 section
= bfd_make_section_old_way (abfd
, ".rdata");
3947 value
-= section
->vma
;
3950 if (value
> ecoff_data (abfd
)->gp_size
)
3952 section
= bfd_com_section_ptr
;
3957 if (ecoff_scom_section
.name
== NULL
)
3959 /* Initialize the small common section. */
3960 ecoff_scom_section
.name
= SCOMMON
;
3961 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3962 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3963 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3964 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3965 ecoff_scom_symbol
.name
= SCOMMON
;
3966 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3967 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3968 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3970 section
= &ecoff_scom_section
;
3973 section
= bfd_und_section_ptr
;
3976 section
= bfd_make_section_old_way (abfd
, ".init");
3977 value
-= section
->vma
;
3980 section
= bfd_make_section_old_way (abfd
, ".fini");
3981 value
-= section
->vma
;
3984 section
= bfd_make_section_old_way (abfd
, ".rconst");
3985 value
-= section
->vma
;
3989 if (section
== (asection
*) NULL
)
3992 name
= ssext
+ esym
.asym
.iss
;
3995 if (! (_bfd_generic_link_add_one_symbol
3997 esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
,
3998 section
, value
, (const char *) NULL
, true, true,
3999 (struct bfd_link_hash_entry
**) &h
)))
4004 /* If we are building an ECOFF hash table, save the external
4005 symbol information. */
4006 if (info
->hash
->creator
->flavour
== bfd_get_flavour (abfd
))
4008 if (h
->abfd
== (bfd
*) NULL
4009 || (! bfd_is_und_section (section
)
4010 && (! bfd_is_com_section (section
)
4011 || (h
->root
.type
!= bfd_link_hash_defined
4012 && h
->root
.type
!= bfd_link_hash_defweak
))))
4018 /* Remember whether this symbol was small undefined. */
4019 if (esym
.asym
.sc
== scSUndefined
)
4022 /* If this symbol was ever small undefined, it needs to wind
4023 up in a GP relative section. We can't control the
4024 section of a defined symbol, but we can control the
4025 section of a common symbol. This case is actually needed
4026 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4028 && h
->root
.type
== bfd_link_hash_common
4029 && strcmp (h
->root
.u
.c
.p
->section
->name
, SCOMMON
) != 0)
4031 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
4033 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
4034 if (h
->esym
.asym
.sc
== scCommon
)
4035 h
->esym
.asym
.sc
= scSCommon
;
4043 /* ECOFF final link routines. */
4045 static boolean ecoff_final_link_debug_accumulate
4046 PARAMS ((bfd
*output_bfd
, bfd
*input_bfd
, struct bfd_link_info
*,
4048 static boolean ecoff_link_write_external
4049 PARAMS ((struct ecoff_link_hash_entry
*, PTR
));
4050 static boolean ecoff_indirect_link_order
4051 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4052 struct bfd_link_order
*));
4053 static boolean ecoff_reloc_link_order
4054 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
4055 struct bfd_link_order
*));
4057 /* Structure used to pass information to ecoff_link_write_external. */
4062 struct bfd_link_info
*info
;
4065 /* ECOFF final link routine. This looks through all the input BFDs
4066 and gathers together all the debugging information, and then
4067 processes all the link order information. This may cause it to
4068 close and reopen some input BFDs; I'll see how bad this is. */
4071 _bfd_ecoff_bfd_final_link (abfd
, info
)
4073 struct bfd_link_info
*info
;
4075 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4076 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4079 register bfd
*input_bfd
;
4081 struct bfd_link_order
*p
;
4082 struct extsym_info einfo
;
4084 /* We accumulate the debugging information counts in the symbolic
4086 symhdr
= &debug
->symbolic_header
;
4088 symhdr
->ilineMax
= 0;
4092 symhdr
->isymMax
= 0;
4093 symhdr
->ioptMax
= 0;
4094 symhdr
->iauxMax
= 0;
4096 symhdr
->issExtMax
= 0;
4099 symhdr
->iextMax
= 0;
4101 /* We accumulate the debugging information itself in the debug_info
4104 debug
->external_dnr
= NULL
;
4105 debug
->external_pdr
= NULL
;
4106 debug
->external_sym
= NULL
;
4107 debug
->external_opt
= NULL
;
4108 debug
->external_aux
= NULL
;
4110 debug
->ssext
= debug
->ssext_end
= NULL
;
4111 debug
->external_fdr
= NULL
;
4112 debug
->external_rfd
= NULL
;
4113 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4115 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4116 if (handle
== (PTR
) NULL
)
4119 /* Accumulate the debugging symbols from each input BFD. */
4120 for (input_bfd
= info
->input_bfds
;
4121 input_bfd
!= (bfd
*) NULL
;
4122 input_bfd
= input_bfd
->link_next
)
4126 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4128 /* Abitrarily set the symbolic header vstamp to the vstamp
4129 of the first object file in the link. */
4130 if (symhdr
->vstamp
== 0)
4132 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4133 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4137 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4138 debug
, &backend
->debug_swap
,
4143 /* Combine the register masks. */
4144 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4145 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4146 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4147 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4148 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4149 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4152 /* Write out the external symbols. */
4155 ecoff_link_hash_traverse (ecoff_hash_table (info
),
4156 ecoff_link_write_external
,
4159 if (info
->relocateable
)
4161 /* We need to make a pass over the link_orders to count up the
4162 number of relocations we will need to output, so that we know
4163 how much space they will take up. */
4164 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4167 for (p
= o
->link_order_head
;
4168 p
!= (struct bfd_link_order
*) NULL
;
4170 if (p
->type
== bfd_indirect_link_order
)
4171 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4172 else if (p
->type
== bfd_section_reloc_link_order
4173 || p
->type
== bfd_symbol_reloc_link_order
)
4178 /* Compute the reloc and symbol file positions. */
4179 ecoff_compute_reloc_file_positions (abfd
);
4181 /* Write out the debugging information. */
4182 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4183 &backend
->debug_swap
, info
,
4184 ecoff_data (abfd
)->sym_filepos
))
4187 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4189 if (info
->relocateable
)
4191 /* Now reset the reloc_count field of the sections in the output
4192 BFD to 0, so that we can use them to keep track of how many
4193 relocs we have output thus far. */
4194 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4198 /* Get a value for the GP register. */
4199 if (ecoff_data (abfd
)->gp
== 0)
4201 struct bfd_link_hash_entry
*h
;
4203 h
= bfd_link_hash_lookup (info
->hash
, "_gp", false, false, true);
4204 if (h
!= (struct bfd_link_hash_entry
*) NULL
4205 && h
->type
== bfd_link_hash_defined
)
4206 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4207 + h
->u
.def
.section
->output_section
->vma
4208 + h
->u
.def
.section
->output_offset
);
4209 else if (info
->relocateable
)
4213 /* Make up a value. */
4215 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4218 && (strcmp (o
->name
, _SBSS
) == 0
4219 || strcmp (o
->name
, _SDATA
) == 0
4220 || strcmp (o
->name
, _LIT4
) == 0
4221 || strcmp (o
->name
, _LIT8
) == 0
4222 || strcmp (o
->name
, _LITA
) == 0))
4225 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4229 /* If the relocate_section function needs to do a reloc
4230 involving the GP value, it should make a reloc_dangerous
4231 callback to warn that GP is not defined. */
4235 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4237 for (p
= o
->link_order_head
;
4238 p
!= (struct bfd_link_order
*) NULL
;
4241 if (p
->type
== bfd_indirect_link_order
4242 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4243 == bfd_target_ecoff_flavour
))
4245 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4248 else if (p
->type
== bfd_section_reloc_link_order
4249 || p
->type
== bfd_symbol_reloc_link_order
)
4251 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4256 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4262 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4264 ecoff_data (abfd
)->linker
= true;
4269 /* Accumulate the debugging information for an input BFD into the
4270 output BFD. This must read in the symbolic information of the
4274 ecoff_final_link_debug_accumulate (output_bfd
, input_bfd
, info
, handle
)
4277 struct bfd_link_info
*info
;
4280 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
4281 const struct ecoff_debug_swap
* const swap
=
4282 &ecoff_backend (input_bfd
)->debug_swap
;
4283 HDRR
*symhdr
= &debug
->symbolic_header
;
4286 #define READ(ptr, offset, count, size, type) \
4287 if (symhdr->count == 0) \
4288 debug->ptr = NULL; \
4291 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
4292 if (debug->ptr == NULL) \
4295 goto return_something; \
4297 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4299 || (bfd_read (debug->ptr, size, symhdr->count, \
4300 input_bfd) != size * symhdr->count)) \
4303 goto return_something; \
4307 /* If raw_syments is not NULL, then the data was already by read by
4308 _bfd_ecoff_slurp_symbolic_info. */
4309 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4311 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
4313 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
4314 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
4315 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
4316 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
4317 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
4319 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
4320 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
4321 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
4325 /* We do not read the external strings or the external symbols. */
4327 ret
= (bfd_ecoff_debug_accumulate
4328 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4329 &ecoff_backend (output_bfd
)->debug_swap
,
4330 input_bfd
, debug
, swap
, info
));
4333 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
4335 if (debug
->line
!= NULL
)
4337 if (debug
->external_dnr
!= NULL
)
4338 free (debug
->external_dnr
);
4339 if (debug
->external_pdr
!= NULL
)
4340 free (debug
->external_pdr
);
4341 if (debug
->external_sym
!= NULL
)
4342 free (debug
->external_sym
);
4343 if (debug
->external_opt
!= NULL
)
4344 free (debug
->external_opt
);
4345 if (debug
->external_aux
!= NULL
)
4346 free (debug
->external_aux
);
4347 if (debug
->ss
!= NULL
)
4349 if (debug
->external_fdr
!= NULL
)
4350 free (debug
->external_fdr
);
4351 if (debug
->external_rfd
!= NULL
)
4352 free (debug
->external_rfd
);
4354 /* Make sure we don't accidentally follow one of these pointers
4355 into freed memory. */
4357 debug
->external_dnr
= NULL
;
4358 debug
->external_pdr
= NULL
;
4359 debug
->external_sym
= NULL
;
4360 debug
->external_opt
= NULL
;
4361 debug
->external_aux
= NULL
;
4363 debug
->external_fdr
= NULL
;
4364 debug
->external_rfd
= NULL
;
4370 /* Put out information for an external symbol. These come only from
4374 ecoff_link_write_external (h
, data
)
4375 struct ecoff_link_hash_entry
*h
;
4378 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4379 bfd
*output_bfd
= einfo
->abfd
;
4382 /* We need to check if this symbol is being stripped. */
4383 if (h
->root
.type
== bfd_link_hash_undefined
4384 || h
->root
.type
== bfd_link_hash_undefweak
)
4386 else if (einfo
->info
->strip
== strip_all
4387 || (einfo
->info
->strip
== strip_some
4388 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4389 h
->root
.root
.string
,
4390 false, false) == NULL
))
4395 if (strip
|| h
->written
)
4398 if (h
->abfd
== (bfd
*) NULL
)
4401 h
->esym
.cobol_main
= 0;
4402 h
->esym
.weakext
= 0;
4403 h
->esym
.reserved
= 0;
4404 h
->esym
.ifd
= ifdNil
;
4405 h
->esym
.asym
.value
= 0;
4406 h
->esym
.asym
.st
= stGlobal
;
4408 if (h
->root
.type
!= bfd_link_hash_defined
4409 && h
->root
.type
!= bfd_link_hash_defweak
)
4410 h
->esym
.asym
.sc
= scAbs
;
4413 asection
*output_section
;
4416 output_section
= h
->root
.u
.def
.section
->output_section
;
4417 name
= bfd_section_name (output_section
->owner
, output_section
);
4419 if (strcmp (name
, _TEXT
) == 0)
4420 h
->esym
.asym
.sc
= scText
;
4421 else if (strcmp (name
, _DATA
) == 0)
4422 h
->esym
.asym
.sc
= scData
;
4423 else if (strcmp (name
, _SDATA
) == 0)
4424 h
->esym
.asym
.sc
= scSData
;
4425 else if (strcmp (name
, _RDATA
) == 0)
4426 h
->esym
.asym
.sc
= scRData
;
4427 else if (strcmp (name
, _BSS
) == 0)
4428 h
->esym
.asym
.sc
= scBss
;
4429 else if (strcmp (name
, _SBSS
) == 0)
4430 h
->esym
.asym
.sc
= scSBss
;
4431 else if (strcmp (name
, _INIT
) == 0)
4432 h
->esym
.asym
.sc
= scInit
;
4433 else if (strcmp (name
, _FINI
) == 0)
4434 h
->esym
.asym
.sc
= scFini
;
4435 else if (strcmp (name
, _PDATA
) == 0)
4436 h
->esym
.asym
.sc
= scPData
;
4437 else if (strcmp (name
, _XDATA
) == 0)
4438 h
->esym
.asym
.sc
= scXData
;
4439 else if (strcmp (name
, _RCONST
) == 0)
4440 h
->esym
.asym
.sc
= scRConst
;
4442 h
->esym
.asym
.sc
= scAbs
;
4445 h
->esym
.asym
.reserved
= 0;
4446 h
->esym
.asym
.index
= indexNil
;
4448 else if (h
->esym
.ifd
!= -1)
4450 struct ecoff_debug_info
*debug
;
4452 /* Adjust the FDR index for the symbol by that used for the
4454 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4455 BFD_ASSERT (h
->esym
.ifd
>= 0
4456 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4457 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4460 switch (h
->root
.type
)
4463 case bfd_link_hash_new
:
4465 case bfd_link_hash_undefined
:
4466 case bfd_link_hash_undefweak
:
4467 if (h
->esym
.asym
.sc
!= scUndefined
4468 && h
->esym
.asym
.sc
!= scSUndefined
)
4469 h
->esym
.asym
.sc
= scUndefined
;
4471 case bfd_link_hash_defined
:
4472 case bfd_link_hash_defweak
:
4473 if (h
->esym
.asym
.sc
== scUndefined
4474 || h
->esym
.asym
.sc
== scSUndefined
)
4475 h
->esym
.asym
.sc
= scAbs
;
4476 else if (h
->esym
.asym
.sc
== scCommon
)
4477 h
->esym
.asym
.sc
= scBss
;
4478 else if (h
->esym
.asym
.sc
== scSCommon
)
4479 h
->esym
.asym
.sc
= scSBss
;
4480 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4481 + h
->root
.u
.def
.section
->output_section
->vma
4482 + h
->root
.u
.def
.section
->output_offset
);
4484 case bfd_link_hash_common
:
4485 if (h
->esym
.asym
.sc
!= scCommon
4486 && h
->esym
.asym
.sc
!= scSCommon
)
4487 h
->esym
.asym
.sc
= scCommon
;
4488 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4490 case bfd_link_hash_indirect
:
4491 case bfd_link_hash_warning
:
4492 /* FIXME: Ignore these for now. The circumstances under which
4493 they should be written out are not clear to me. */
4497 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4499 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4502 return (bfd_ecoff_debug_one_external
4503 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4504 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4508 /* Relocate and write an ECOFF section into an ECOFF output file. */
4511 ecoff_indirect_link_order (output_bfd
, info
, output_section
, link_order
)
4513 struct bfd_link_info
*info
;
4514 asection
*output_section
;
4515 struct bfd_link_order
*link_order
;
4517 asection
*input_section
;
4519 struct ecoff_section_tdata
*section_tdata
;
4520 bfd_size_type raw_size
;
4521 bfd_size_type cooked_size
;
4522 bfd_byte
*contents
= NULL
;
4523 bfd_size_type external_reloc_size
;
4524 bfd_size_type external_relocs_size
;
4525 PTR external_relocs
= NULL
;
4527 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
4529 if (link_order
->size
== 0)
4532 input_section
= link_order
->u
.indirect
.section
;
4533 input_bfd
= input_section
->owner
;
4534 section_tdata
= ecoff_section_data (input_bfd
, input_section
);
4536 raw_size
= input_section
->_raw_size
;
4537 cooked_size
= input_section
->_cooked_size
;
4538 if (cooked_size
== 0)
4539 cooked_size
= raw_size
;
4541 BFD_ASSERT (input_section
->output_section
== output_section
);
4542 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
4543 BFD_ASSERT (cooked_size
== link_order
->size
);
4545 /* Get the section contents. We allocate memory for the larger of
4546 the size before relocating and the size after relocating. */
4547 contents
= (bfd_byte
*) bfd_malloc (raw_size
>= cooked_size
4549 : (size_t) cooked_size
);
4550 if (contents
== NULL
&& raw_size
!= 0)
4553 /* If we are relaxing, the contents may have already been read into
4554 memory, in which case we copy them into our new buffer. We don't
4555 simply reuse the old buffer in case cooked_size > raw_size. */
4556 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4557 && section_tdata
->contents
!= (bfd_byte
*) NULL
)
4558 memcpy (contents
, section_tdata
->contents
, (size_t) raw_size
);
4561 if (! bfd_get_section_contents (input_bfd
, input_section
,
4563 (file_ptr
) 0, raw_size
))
4567 /* Get the relocs. If we are relaxing MIPS code, they will already
4568 have been read in. Otherwise, we read them in now. */
4569 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
4570 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
4572 if (section_tdata
!= (struct ecoff_section_tdata
*) NULL
4573 && section_tdata
->external_relocs
!= NULL
)
4574 external_relocs
= section_tdata
->external_relocs
;
4577 external_relocs
= (PTR
) bfd_malloc ((size_t) external_relocs_size
);
4578 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
4581 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
4582 || (bfd_read (external_relocs
, 1, external_relocs_size
, input_bfd
)
4583 != external_relocs_size
))
4587 /* Relocate the section contents. */
4588 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4589 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4593 /* Write out the relocated section. */
4594 if (! bfd_set_section_contents (output_bfd
,
4597 input_section
->output_offset
,
4601 /* If we are producing relocateable output, the relocs were
4602 modified, and we write them out now. We use the reloc_count
4603 field of output_section to keep track of the number of relocs we
4604 have output so far. */
4605 if (info
->relocateable
)
4607 if (bfd_seek (output_bfd
,
4608 (output_section
->rel_filepos
+
4609 output_section
->reloc_count
* external_reloc_size
),
4611 || (bfd_write (external_relocs
, 1, external_relocs_size
, output_bfd
)
4612 != external_relocs_size
))
4614 output_section
->reloc_count
+= input_section
->reloc_count
;
4617 if (contents
!= NULL
)
4619 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4620 free (external_relocs
);
4624 if (contents
!= NULL
)
4626 if (external_relocs
!= NULL
&& section_tdata
== NULL
)
4627 free (external_relocs
);
4631 /* Generate a reloc when linking an ECOFF file. This is a reloc
4632 requested by the linker, and does come from any input file. This
4633 is used to build constructor and destructor tables when linking
4637 ecoff_reloc_link_order (output_bfd
, info
, output_section
, link_order
)
4639 struct bfd_link_info
*info
;
4640 asection
*output_section
;
4641 struct bfd_link_order
*link_order
;
4643 enum bfd_link_order_type type
;
4647 struct internal_reloc in
;
4648 bfd_size_type external_reloc_size
;
4652 type
= link_order
->type
;
4654 addend
= link_order
->u
.reloc
.p
->addend
;
4656 /* We set up an arelent to pass to the backend adjust_reloc_out
4658 rel
.address
= link_order
->offset
;
4660 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4663 bfd_set_error (bfd_error_bad_value
);
4667 if (type
== bfd_section_reloc_link_order
)
4669 section
= link_order
->u
.reloc
.p
->u
.section
;
4670 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4674 struct bfd_link_hash_entry
*h
;
4676 /* Treat a reloc against a defined symbol as though it were
4677 actually against the section. */
4678 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4679 link_order
->u
.reloc
.p
->u
.name
,
4680 false, false, false);
4682 && (h
->type
== bfd_link_hash_defined
4683 || h
->type
== bfd_link_hash_defweak
))
4685 type
= bfd_section_reloc_link_order
;
4686 section
= h
->u
.def
.section
->output_section
;
4687 /* It seems that we ought to add the symbol value to the
4688 addend here, but in practice it has already been added
4689 because it was passed to constructor_callback. */
4690 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4694 /* We can't set up a reloc against a symbol correctly,
4695 because we have no asymbol structure. Currently no
4696 adjust_reloc_out routine cares. */
4697 rel
.sym_ptr_ptr
= (asymbol
**) NULL
;
4701 /* All ECOFF relocs are in-place. Put the addend into the object
4704 BFD_ASSERT (rel
.howto
->partial_inplace
);
4708 bfd_reloc_status_type rstat
;
4712 size
= bfd_get_reloc_size (rel
.howto
);
4713 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4714 if (buf
== (bfd_byte
*) NULL
)
4716 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
, addend
, buf
);
4722 case bfd_reloc_outofrange
:
4724 case bfd_reloc_overflow
:
4725 if (! ((*info
->callbacks
->reloc_overflow
)
4727 (link_order
->type
== bfd_section_reloc_link_order
4728 ? bfd_section_name (output_bfd
, section
)
4729 : link_order
->u
.reloc
.p
->u
.name
),
4730 rel
.howto
->name
, addend
, (bfd
*) NULL
,
4731 (asection
*) NULL
, (bfd_vma
) 0)))
4738 ok
= bfd_set_section_contents (output_bfd
, output_section
, (PTR
) buf
,
4739 (file_ptr
) link_order
->offset
, size
);
4747 /* Move the information into a internal_reloc structure. */
4748 in
.r_vaddr
= (rel
.address
4749 + bfd_get_section_vma (output_bfd
, output_section
));
4750 in
.r_type
= rel
.howto
->type
;
4752 if (type
== bfd_symbol_reloc_link_order
)
4754 struct ecoff_link_hash_entry
*h
;
4756 h
= ((struct ecoff_link_hash_entry
*)
4757 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4758 link_order
->u
.reloc
.p
->u
.name
,
4759 false, false, true));
4760 if (h
!= (struct ecoff_link_hash_entry
*) NULL
4762 in
.r_symndx
= h
->indx
;
4765 if (! ((*info
->callbacks
->unattached_reloc
)
4766 (info
, link_order
->u
.reloc
.p
->u
.name
, (bfd
*) NULL
,
4767 (asection
*) NULL
, (bfd_vma
) 0)))
4777 name
= bfd_get_section_name (output_bfd
, section
);
4778 if (strcmp (name
, ".text") == 0)
4779 in
.r_symndx
= RELOC_SECTION_TEXT
;
4780 else if (strcmp (name
, ".rdata") == 0)
4781 in
.r_symndx
= RELOC_SECTION_RDATA
;
4782 else if (strcmp (name
, ".data") == 0)
4783 in
.r_symndx
= RELOC_SECTION_DATA
;
4784 else if (strcmp (name
, ".sdata") == 0)
4785 in
.r_symndx
= RELOC_SECTION_SDATA
;
4786 else if (strcmp (name
, ".sbss") == 0)
4787 in
.r_symndx
= RELOC_SECTION_SBSS
;
4788 else if (strcmp (name
, ".bss") == 0)
4789 in
.r_symndx
= RELOC_SECTION_BSS
;
4790 else if (strcmp (name
, ".init") == 0)
4791 in
.r_symndx
= RELOC_SECTION_INIT
;
4792 else if (strcmp (name
, ".lit8") == 0)
4793 in
.r_symndx
= RELOC_SECTION_LIT8
;
4794 else if (strcmp (name
, ".lit4") == 0)
4795 in
.r_symndx
= RELOC_SECTION_LIT4
;
4796 else if (strcmp (name
, ".xdata") == 0)
4797 in
.r_symndx
= RELOC_SECTION_XDATA
;
4798 else if (strcmp (name
, ".pdata") == 0)
4799 in
.r_symndx
= RELOC_SECTION_PDATA
;
4800 else if (strcmp (name
, ".fini") == 0)
4801 in
.r_symndx
= RELOC_SECTION_FINI
;
4802 else if (strcmp (name
, ".lita") == 0)
4803 in
.r_symndx
= RELOC_SECTION_LITA
;
4804 else if (strcmp (name
, "*ABS*") == 0)
4805 in
.r_symndx
= RELOC_SECTION_ABS
;
4806 else if (strcmp (name
, ".rconst") == 0)
4807 in
.r_symndx
= RELOC_SECTION_RCONST
;
4813 /* Let the BFD backend adjust the reloc. */
4814 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4816 /* Get some memory and swap out the reloc. */
4817 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4818 rbuf
= (bfd_byte
*) bfd_malloc ((size_t) external_reloc_size
);
4819 if (rbuf
== (bfd_byte
*) NULL
)
4822 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (PTR
) rbuf
);
4824 ok
= (bfd_seek (output_bfd
,
4825 (output_section
->rel_filepos
+
4826 output_section
->reloc_count
* external_reloc_size
),
4828 && (bfd_write ((PTR
) rbuf
, 1, external_reloc_size
, output_bfd
)
4829 == external_reloc_size
));
4832 ++output_section
->reloc_count
;