1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
4 Free Software Foundation, Inc.
5 Original version by Per Bothner.
6 Full support added by Ian Lance Taylor, ian@cygnus.com.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
30 #include "aout/stab_gnu.h"
32 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
33 some other stuff which we don't want and which conflicts with stuff
36 #include "aout/aout64.h"
39 #undef obj_sym_filepos
41 #include "coff/internal.h"
43 #include "coff/symconst.h"
44 #include "coff/ecoff.h"
47 #include "libiberty.h"
49 #define streq(a, b) (strcmp ((a), (b)) == 0)
50 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0)
53 /* This stuff is somewhat copied from coffcode.h. */
54 static asection bfd_debug_section
=
56 /* name, id, index, next, prev, flags, user_set_vma, */
57 "*DEBUG*", 0, 0, NULL
, NULL
, 0, 0,
58 /* linker_mark, linker_has_input, gc_mark, compress_status, */
60 /* segment_mark, sec_info_type, use_rela_p, */
62 /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */
64 /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */
66 /* output_offset, output_section, alignment_power, */
68 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
70 /* line_filepos, userdata, contents, lineno, lineno_count, */
71 0, NULL
, NULL
, NULL
, 0,
72 /* entsize, kept_section, moving_line_filepos, */
74 /* target_index, used_by_bfd, constructor_chain, owner, */
82 /* map_head, map_tail */
86 /* Create an ECOFF object. */
89 _bfd_ecoff_mkobject (bfd
*abfd
)
91 bfd_size_type amt
= sizeof (ecoff_data_type
);
93 abfd
->tdata
.ecoff_obj_data
= (struct ecoff_tdata
*) bfd_zalloc (abfd
, amt
);
94 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
100 /* This is a hook called by coff_real_object_p to create any backend
101 specific information. */
104 _bfd_ecoff_mkobject_hook (bfd
*abfd
, void * filehdr
, void * aouthdr
)
106 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
107 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
108 ecoff_data_type
*ecoff
;
110 if (! _bfd_ecoff_mkobject (abfd
))
113 ecoff
= ecoff_data (abfd
);
115 ecoff
->sym_filepos
= internal_f
->f_symptr
;
117 if (internal_a
!= NULL
)
121 ecoff
->text_start
= internal_a
->text_start
;
122 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
123 ecoff
->gp
= internal_a
->gp_value
;
124 ecoff
->gprmask
= internal_a
->gprmask
;
125 for (i
= 0; i
< 4; i
++)
126 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
127 ecoff
->fprmask
= internal_a
->fprmask
;
128 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
129 abfd
->flags
|= D_PAGED
;
131 abfd
->flags
&=~ D_PAGED
;
134 /* It turns out that no special action is required by the MIPS or
135 Alpha ECOFF backends. They have different information in the
136 a.out header, but we just copy it all (e.g., gprmask, cprmask and
137 fprmask) and let the swapping routines ensure that only relevant
138 information is written out. */
140 return (void *) ecoff
;
143 /* Initialize a new section. */
146 _bfd_ecoff_new_section_hook (bfd
*abfd
, asection
*section
)
156 { _TEXT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
157 { _INIT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
158 { _FINI
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
159 { _DATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
160 { _SDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
161 { _RDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
162 { _LIT8
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
163 { _LIT4
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
164 { _RCONST
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
165 { _PDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
168 /* An Irix 4 shared libary. */
169 { _LIB
, SEC_COFF_SHARED_LIBRARY
}
172 section
->alignment_power
= 4;
174 for (i
= 0; i
< ARRAY_SIZE (section_flags
); i
++)
175 if (streq (section
->name
, section_flags
[i
].name
))
177 section
->flags
|= section_flags
[i
].flags
;
182 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
183 uncertain about .init on some systems and I don't know how shared
186 return _bfd_generic_new_section_hook (abfd
, section
);
189 /* Determine the machine architecture and type. This is called from
190 the generic COFF routines. It is the inverse of ecoff_get_magic,
191 below. This could be an ECOFF backend routine, with one version
192 for each target, but there aren't all that many ECOFF targets. */
195 _bfd_ecoff_set_arch_mach_hook (bfd
*abfd
, void * filehdr
)
197 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
198 enum bfd_architecture arch
;
201 switch (internal_f
->f_magic
)
204 case MIPS_MAGIC_LITTLE
:
206 arch
= bfd_arch_mips
;
207 mach
= bfd_mach_mips3000
;
210 case MIPS_MAGIC_LITTLE2
:
211 case MIPS_MAGIC_BIG2
:
212 /* MIPS ISA level 2: the r6000. */
213 arch
= bfd_arch_mips
;
214 mach
= bfd_mach_mips6000
;
217 case MIPS_MAGIC_LITTLE3
:
218 case MIPS_MAGIC_BIG3
:
219 /* MIPS ISA level 3: the r4000. */
220 arch
= bfd_arch_mips
;
221 mach
= bfd_mach_mips4000
;
225 arch
= bfd_arch_alpha
;
230 arch
= bfd_arch_obscure
;
235 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
239 _bfd_ecoff_no_long_sections (abfd
, enable
)
248 /* Get the magic number to use based on the architecture and machine.
249 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
252 ecoff_get_magic (bfd
*abfd
)
256 switch (bfd_get_arch (abfd
))
259 switch (bfd_get_mach (abfd
))
263 case bfd_mach_mips3000
:
264 big
= MIPS_MAGIC_BIG
;
265 little
= MIPS_MAGIC_LITTLE
;
268 case bfd_mach_mips6000
:
269 big
= MIPS_MAGIC_BIG2
;
270 little
= MIPS_MAGIC_LITTLE2
;
273 case bfd_mach_mips4000
:
274 big
= MIPS_MAGIC_BIG3
;
275 little
= MIPS_MAGIC_LITTLE3
;
279 return bfd_big_endian (abfd
) ? big
: little
;
290 /* Get the section s_flags to use for a section. */
293 ecoff_sec_to_styp_flags (const char *name
, flagword flags
)
303 { _TEXT
, STYP_TEXT
},
304 { _DATA
, STYP_DATA
},
305 { _SDATA
, STYP_SDATA
},
306 { _RDATA
, STYP_RDATA
},
307 { _LITA
, STYP_LITA
},
308 { _LIT8
, STYP_LIT8
},
309 { _LIT4
, STYP_LIT4
},
311 { _SBSS
, STYP_SBSS
},
312 { _INIT
, STYP_ECOFF_INIT
},
313 { _FINI
, STYP_ECOFF_FINI
},
314 { _PDATA
, STYP_PDATA
},
315 { _XDATA
, STYP_XDATA
},
316 { _LIB
, STYP_ECOFF_LIB
},
318 { _HASH
, STYP_HASH
},
319 { _DYNAMIC
, STYP_DYNAMIC
},
320 { _LIBLIST
, STYP_LIBLIST
},
321 { _RELDYN
, STYP_RELDYN
},
322 { _CONFLIC
, STYP_CONFLIC
},
323 { _DYNSTR
, STYP_DYNSTR
},
324 { _DYNSYM
, STYP_DYNSYM
},
325 { _RCONST
, STYP_RCONST
}
329 for (i
= 0; i
< ARRAY_SIZE (styp_flags
); i
++)
330 if (streq (name
, styp_flags
[i
].name
))
332 styp
= styp_flags
[i
].flags
;
338 if (streq (name
, _COMMENT
))
341 flags
&=~ SEC_NEVER_LOAD
;
343 else if (flags
& SEC_CODE
)
345 else if (flags
& SEC_DATA
)
347 else if (flags
& SEC_READONLY
)
349 else if (flags
& SEC_LOAD
)
355 if (flags
& SEC_NEVER_LOAD
)
361 /* Get the BFD flags to use for a section. */
364 _bfd_ecoff_styp_to_sec_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
366 const char *name ATTRIBUTE_UNUSED
,
367 asection
*section ATTRIBUTE_UNUSED
,
368 flagword
* flags_ptr
)
370 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
371 long styp_flags
= internal_s
->s_flags
;
372 flagword sec_flags
= 0;
374 if (styp_flags
& STYP_NOLOAD
)
375 sec_flags
|= SEC_NEVER_LOAD
;
377 /* For 386 COFF, at least, an unloadable text or data section is
378 actually a shared library section. */
379 if ((styp_flags
& STYP_TEXT
)
380 || (styp_flags
& STYP_ECOFF_INIT
)
381 || (styp_flags
& STYP_ECOFF_FINI
)
382 || (styp_flags
& STYP_DYNAMIC
)
383 || (styp_flags
& STYP_LIBLIST
)
384 || (styp_flags
& STYP_RELDYN
)
385 || styp_flags
== STYP_CONFLIC
386 || (styp_flags
& STYP_DYNSTR
)
387 || (styp_flags
& STYP_DYNSYM
)
388 || (styp_flags
& STYP_HASH
))
390 if (sec_flags
& SEC_NEVER_LOAD
)
391 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
393 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
395 else if ((styp_flags
& STYP_DATA
)
396 || (styp_flags
& STYP_RDATA
)
397 || (styp_flags
& STYP_SDATA
)
398 || styp_flags
== STYP_PDATA
399 || styp_flags
== STYP_XDATA
400 || (styp_flags
& STYP_GOT
)
401 || styp_flags
== STYP_RCONST
)
403 if (sec_flags
& SEC_NEVER_LOAD
)
404 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
406 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
407 if ((styp_flags
& STYP_RDATA
)
408 || styp_flags
== STYP_PDATA
409 || styp_flags
== STYP_RCONST
)
410 sec_flags
|= SEC_READONLY
;
412 else if ((styp_flags
& STYP_BSS
)
413 || (styp_flags
& STYP_SBSS
))
414 sec_flags
|= SEC_ALLOC
;
415 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
416 sec_flags
|= SEC_NEVER_LOAD
;
417 else if ((styp_flags
& STYP_LITA
)
418 || (styp_flags
& STYP_LIT8
)
419 || (styp_flags
& STYP_LIT4
))
420 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
421 else if (styp_flags
& STYP_ECOFF_LIB
)
422 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
424 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
426 * flags_ptr
= sec_flags
;
430 /* Read in the symbolic header for an ECOFF object file. */
433 ecoff_slurp_symbolic_header (bfd
*abfd
)
435 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
436 bfd_size_type external_hdr_size
;
438 HDRR
*internal_symhdr
;
440 /* See if we've already read it in. */
441 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
442 backend
->debug_swap
.sym_magic
)
445 /* See whether there is a symbolic header. */
446 if (ecoff_data (abfd
)->sym_filepos
== 0)
448 bfd_get_symcount (abfd
) = 0;
452 /* At this point bfd_get_symcount (abfd) holds the number of symbols
453 as read from the file header, but on ECOFF this is always the
454 size of the symbolic information header. It would be cleaner to
455 handle this when we first read the file in coffgen.c. */
456 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
457 if (bfd_get_symcount (abfd
) != external_hdr_size
)
459 bfd_set_error (bfd_error_bad_value
);
463 /* Read the symbolic information header. */
464 raw
= bfd_malloc (external_hdr_size
);
468 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) != 0
469 || bfd_bread (raw
, external_hdr_size
, abfd
) != external_hdr_size
)
471 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
472 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
474 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
476 bfd_set_error (bfd_error_bad_value
);
480 /* Now we can get the correct number of symbols. */
481 bfd_get_symcount (abfd
) = (internal_symhdr
->isymMax
482 + internal_symhdr
->iextMax
);
493 /* Read in and swap the important symbolic information for an ECOFF
494 object file. This is called by gdb via the read_debug_info entry
495 point in the backend structure. */
498 _bfd_ecoff_slurp_symbolic_info (bfd
*abfd
,
499 asection
*ignore ATTRIBUTE_UNUSED
,
500 struct ecoff_debug_info
*debug
)
502 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
503 HDRR
*internal_symhdr
;
504 bfd_size_type raw_base
;
505 bfd_size_type raw_size
;
507 bfd_size_type external_fdr_size
;
511 bfd_size_type raw_end
;
512 bfd_size_type cb_end
;
516 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
518 /* Check whether we've already gotten it, and whether there's any to
520 if (ecoff_data (abfd
)->raw_syments
!= NULL
)
522 if (ecoff_data (abfd
)->sym_filepos
== 0)
524 bfd_get_symcount (abfd
) = 0;
528 if (! ecoff_slurp_symbolic_header (abfd
))
531 internal_symhdr
= &debug
->symbolic_header
;
533 /* Read all the symbolic information at once. */
534 raw_base
= (ecoff_data (abfd
)->sym_filepos
535 + backend
->debug_swap
.external_hdr_size
);
537 /* Alpha ecoff makes the determination of raw_size difficult. It has
538 an undocumented debug data section between the symhdr and the first
539 documented section. And the ordering of the sections varies between
540 statically and dynamically linked executables.
541 If bfd supports SEEK_END someday, this code could be simplified. */
544 #define UPDATE_RAW_END(start, count, size) \
545 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
546 if (cb_end > raw_end) \
549 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
550 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
551 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
552 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
553 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
554 optimization symtab, not the number of entries. */
555 UPDATE_RAW_END (cbOptOffset
, ioptMax
, sizeof (char));
556 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
557 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
558 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
559 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
560 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
561 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
563 #undef UPDATE_RAW_END
565 raw_size
= raw_end
- raw_base
;
568 ecoff_data (abfd
)->sym_filepos
= 0;
571 raw
= bfd_alloc (abfd
, raw_size
);
575 pos
= ecoff_data (abfd
)->sym_filepos
;
576 pos
+= backend
->debug_swap
.external_hdr_size
;
577 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
578 || bfd_bread (raw
, raw_size
, abfd
) != raw_size
)
580 bfd_release (abfd
, raw
);
584 ecoff_data (abfd
)->raw_syments
= raw
;
586 /* Get pointers for the numeric offsets in the HDRR structure. */
587 #define FIX(off1, off2, type) \
588 if (internal_symhdr->off1 == 0) \
589 debug->off2 = NULL; \
591 debug->off2 = (type) ((char *) raw \
592 + (internal_symhdr->off1 \
595 FIX (cbLineOffset
, line
, unsigned char *);
596 FIX (cbDnOffset
, external_dnr
, void *);
597 FIX (cbPdOffset
, external_pdr
, void *);
598 FIX (cbSymOffset
, external_sym
, void *);
599 FIX (cbOptOffset
, external_opt
, void *);
600 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
601 FIX (cbSsOffset
, ss
, char *);
602 FIX (cbSsExtOffset
, ssext
, char *);
603 FIX (cbFdOffset
, external_fdr
, void *);
604 FIX (cbRfdOffset
, external_rfd
, void *);
605 FIX (cbExtOffset
, external_ext
, void *);
608 /* I don't want to always swap all the data, because it will just
609 waste time and most programs will never look at it. The only
610 time the linker needs most of the debugging information swapped
611 is when linking big-endian and little-endian MIPS object files
612 together, which is not a common occurrence.
614 We need to look at the fdr to deal with a lot of information in
615 the symbols, so we swap them here. */
616 amt
= internal_symhdr
->ifdMax
;
617 amt
*= sizeof (struct fdr
);
618 debug
->fdr
= (FDR
*) bfd_alloc (abfd
, amt
);
619 if (debug
->fdr
== NULL
)
621 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
622 fdr_ptr
= debug
->fdr
;
623 fraw_src
= (char *) debug
->external_fdr
;
624 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
625 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
626 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (void *) fraw_src
, fdr_ptr
);
631 /* ECOFF symbol table routines. The ECOFF symbol table is described
632 in gcc/mips-tfile.c. */
634 /* ECOFF uses two common sections. One is the usual one, and the
635 other is for small objects. All the small objects are kept
636 together, and then referenced via the gp pointer, which yields
637 faster assembler code. This is what we use for the small common
639 static asection ecoff_scom_section
;
640 static asymbol ecoff_scom_symbol
;
641 static asymbol
*ecoff_scom_symbol_ptr
;
643 /* Create an empty symbol. */
646 _bfd_ecoff_make_empty_symbol (bfd
*abfd
)
648 ecoff_symbol_type
*new_symbol
;
649 bfd_size_type amt
= sizeof (ecoff_symbol_type
);
651 new_symbol
= (ecoff_symbol_type
*) bfd_zalloc (abfd
, amt
);
652 if (new_symbol
== NULL
)
654 new_symbol
->symbol
.section
= NULL
;
655 new_symbol
->fdr
= NULL
;
656 new_symbol
->local
= FALSE
;
657 new_symbol
->native
= NULL
;
658 new_symbol
->symbol
.the_bfd
= abfd
;
659 return &new_symbol
->symbol
;
662 /* Set the BFD flags and section for an ECOFF symbol. */
665 ecoff_set_symbol_info (bfd
*abfd
,
671 asym
->the_bfd
= abfd
;
672 asym
->value
= ecoff_sym
->value
;
673 asym
->section
= &bfd_debug_section
;
676 /* Most symbol types are just for debugging. */
677 switch (ecoff_sym
->st
)
686 if (ECOFF_IS_STAB (ecoff_sym
))
688 asym
->flags
= BSF_DEBUGGING
;
693 asym
->flags
= BSF_DEBUGGING
;
698 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
700 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
703 asym
->flags
= BSF_LOCAL
;
704 /* Normally, a local stProc symbol will have a corresponding
705 external symbol. We mark the local symbol as a debugging
706 symbol, in order to prevent nm from printing both out.
707 Similarly, we mark stLabel and stabs symbols as debugging
708 symbols. In both cases, we do want to set the value
709 correctly based on the symbol class. */
710 if (ecoff_sym
->st
== stProc
711 || ecoff_sym
->st
== stLabel
712 || ECOFF_IS_STAB (ecoff_sym
))
713 asym
->flags
|= BSF_DEBUGGING
;
716 if (ecoff_sym
->st
== stProc
|| ecoff_sym
->st
== stStaticProc
)
717 asym
->flags
|= BSF_FUNCTION
;
719 switch (ecoff_sym
->sc
)
722 /* Used for compiler generated labels. Leave them in the
723 debugging section, and mark them as local. If BSF_DEBUGGING
724 is set, then nm does not display them for some reason. If no
725 flags are set then the linker whines about them. */
726 asym
->flags
= BSF_LOCAL
;
729 asym
->section
= bfd_make_section_old_way (abfd
, _TEXT
);
730 asym
->value
-= asym
->section
->vma
;
733 asym
->section
= bfd_make_section_old_way (abfd
, _DATA
);
734 asym
->value
-= asym
->section
->vma
;
737 asym
->section
= bfd_make_section_old_way (abfd
, _BSS
);
738 asym
->value
-= asym
->section
->vma
;
741 asym
->flags
= BSF_DEBUGGING
;
744 asym
->section
= bfd_abs_section_ptr
;
747 asym
->section
= bfd_und_section_ptr
;
757 asym
->flags
= BSF_DEBUGGING
;
760 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
761 asym
->value
-= asym
->section
->vma
;
764 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
765 asym
->value
-= asym
->section
->vma
;
768 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
769 asym
->value
-= asym
->section
->vma
;
772 asym
->flags
= BSF_DEBUGGING
;
775 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
777 asym
->section
= bfd_com_section_ptr
;
783 if (ecoff_scom_section
.name
== NULL
)
785 /* Initialize the small common section. */
786 ecoff_scom_section
.name
= SCOMMON
;
787 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
788 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
789 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
790 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
791 ecoff_scom_symbol
.name
= SCOMMON
;
792 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
793 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
794 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
796 asym
->section
= &ecoff_scom_section
;
801 asym
->flags
= BSF_DEBUGGING
;
804 asym
->section
= bfd_und_section_ptr
;
809 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
810 asym
->value
-= asym
->section
->vma
;
815 asym
->flags
= BSF_DEBUGGING
;
818 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
819 asym
->value
-= asym
->section
->vma
;
822 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
823 asym
->value
-= asym
->section
->vma
;
829 /* Look for special constructors symbols and make relocation entries
830 in a special construction section. These are produced by the
831 -fgnu-linker argument to g++. */
832 if (ECOFF_IS_STAB (ecoff_sym
))
834 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
843 /* Mark the symbol as a constructor. */
844 asym
->flags
|= BSF_CONSTRUCTOR
;
851 /* Read an ECOFF symbol table. */
854 _bfd_ecoff_slurp_symbol_table (bfd
*abfd
)
856 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
857 const bfd_size_type external_ext_size
858 = backend
->debug_swap
.external_ext_size
;
859 const bfd_size_type external_sym_size
860 = backend
->debug_swap
.external_sym_size
;
861 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
862 = backend
->debug_swap
.swap_ext_in
;
863 void (* const swap_sym_in
) (bfd
*, void *, SYMR
*)
864 = backend
->debug_swap
.swap_sym_in
;
865 bfd_size_type internal_size
;
866 ecoff_symbol_type
*internal
;
867 ecoff_symbol_type
*internal_ptr
;
873 /* If we've already read in the symbol table, do nothing. */
874 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
877 /* Get the symbolic information. */
878 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
879 &ecoff_data (abfd
)->debug_info
))
881 if (bfd_get_symcount (abfd
) == 0)
884 internal_size
= bfd_get_symcount (abfd
);
885 internal_size
*= sizeof (ecoff_symbol_type
);
886 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, internal_size
);
887 if (internal
== NULL
)
890 internal_ptr
= internal
;
891 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
893 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
894 * external_ext_size
));
895 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
899 (*swap_ext_in
) (abfd
, (void *) eraw_src
, &internal_esym
);
900 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
901 + internal_esym
.asym
.iss
);
902 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
903 &internal_ptr
->symbol
, 1,
904 internal_esym
.weakext
))
906 /* The alpha uses a negative ifd field for section symbols. */
907 if (internal_esym
.ifd
>= 0)
908 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
909 + internal_esym
.ifd
);
911 internal_ptr
->fdr
= NULL
;
912 internal_ptr
->local
= FALSE
;
913 internal_ptr
->native
= (void *) eraw_src
;
916 /* The local symbols must be accessed via the fdr's, because the
917 string and aux indices are relative to the fdr information. */
918 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
919 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
920 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
925 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
926 + fdr_ptr
->isymBase
* external_sym_size
);
927 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
930 lraw_src
+= external_sym_size
, internal_ptr
++)
934 (*swap_sym_in
) (abfd
, (void *) lraw_src
, &internal_sym
);
935 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
938 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
939 &internal_ptr
->symbol
, 0, 0))
941 internal_ptr
->fdr
= fdr_ptr
;
942 internal_ptr
->local
= TRUE
;
943 internal_ptr
->native
= (void *) lraw_src
;
947 ecoff_data (abfd
)->canonical_symbols
= internal
;
952 /* Return the amount of space needed for the canonical symbols. */
955 _bfd_ecoff_get_symtab_upper_bound (bfd
*abfd
)
957 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
958 &ecoff_data (abfd
)->debug_info
))
961 if (bfd_get_symcount (abfd
) == 0)
964 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
967 /* Get the canonical symbols. */
970 _bfd_ecoff_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
972 unsigned int counter
= 0;
973 ecoff_symbol_type
*symbase
;
974 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
976 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
978 if (bfd_get_symcount (abfd
) == 0)
981 symbase
= ecoff_data (abfd
)->canonical_symbols
;
982 while (counter
< bfd_get_symcount (abfd
))
984 *(location
++) = symbase
++;
988 return bfd_get_symcount (abfd
);
991 /* Turn ECOFF type information into a printable string.
992 ecoff_emit_aggregate and ecoff_type_to_string are from
993 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
995 /* Write aggregate information to a string. */
998 ecoff_emit_aggregate (bfd
*abfd
,
1005 const struct ecoff_debug_swap
* const debug_swap
=
1006 &ecoff_backend (abfd
)->debug_swap
;
1007 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1008 unsigned int ifd
= rndx
->rfd
;
1009 unsigned int indx
= rndx
->index
;
1015 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1016 struct return type of a procedure compiled without -g. */
1017 if (ifd
== 0xffffffff
1018 || (rndx
->rfd
== 0xfff && indx
== 0))
1019 name
= "<undefined>";
1020 else if (indx
== indexNil
)
1026 if (debug_info
->external_rfd
== NULL
)
1027 fdr
= debug_info
->fdr
+ ifd
;
1032 (*debug_swap
->swap_rfd_in
) (abfd
,
1033 ((char *) debug_info
->external_rfd
1034 + ((fdr
->rfdBase
+ ifd
)
1035 * debug_swap
->external_rfd_size
)),
1037 fdr
= debug_info
->fdr
+ rfd
;
1040 indx
+= fdr
->isymBase
;
1042 (*debug_swap
->swap_sym_in
) (abfd
,
1043 ((char *) debug_info
->external_sym
1044 + indx
* debug_swap
->external_sym_size
),
1047 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1051 "%s %s { ifd = %u, index = %lu }",
1053 ((unsigned long) indx
1054 + debug_info
->symbolic_header
.iextMax
));
1057 /* Convert the type information to string format. */
1060 ecoff_type_to_string (bfd
*abfd
, FDR
*fdr
, unsigned int indx
)
1062 union aux_ext
*aux_ptr
;
1072 unsigned int basic_type
;
1075 static char buffer2
[1024];
1080 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1081 bigendian
= fdr
->fBigendian
;
1083 for (i
= 0; i
< 7; i
++)
1085 qualifiers
[i
].low_bound
= 0;
1086 qualifiers
[i
].high_bound
= 0;
1087 qualifiers
[i
].stride
= 0;
1090 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1091 return "-1 (no type)";
1092 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1094 basic_type
= u
.ti
.bt
;
1095 qualifiers
[0].type
= u
.ti
.tq0
;
1096 qualifiers
[1].type
= u
.ti
.tq1
;
1097 qualifiers
[2].type
= u
.ti
.tq2
;
1098 qualifiers
[3].type
= u
.ti
.tq3
;
1099 qualifiers
[4].type
= u
.ti
.tq4
;
1100 qualifiers
[5].type
= u
.ti
.tq5
;
1101 qualifiers
[6].type
= tqNil
;
1103 /* Go get the basic type. */
1106 case btNil
: /* Undefined. */
1110 case btAdr
: /* Address - integer same size as pointer. */
1111 strcpy (p1
, "address");
1114 case btChar
: /* Character. */
1115 strcpy (p1
, "char");
1118 case btUChar
: /* Unsigned character. */
1119 strcpy (p1
, "unsigned char");
1122 case btShort
: /* Short. */
1123 strcpy (p1
, "short");
1126 case btUShort
: /* Unsigned short. */
1127 strcpy (p1
, "unsigned short");
1130 case btInt
: /* Int. */
1134 case btUInt
: /* Unsigned int. */
1135 strcpy (p1
, "unsigned int");
1138 case btLong
: /* Long. */
1139 strcpy (p1
, "long");
1142 case btULong
: /* Unsigned long. */
1143 strcpy (p1
, "unsigned long");
1146 case btFloat
: /* Float (real). */
1147 strcpy (p1
, "float");
1150 case btDouble
: /* Double (real). */
1151 strcpy (p1
, "double");
1154 /* Structures add 1-2 aux words:
1155 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1156 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1158 case btStruct
: /* Structure (Record). */
1159 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1160 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1161 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1163 indx
++; /* Skip aux words. */
1166 /* Unions add 1-2 aux words:
1167 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1168 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1170 case btUnion
: /* Union. */
1171 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1172 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1173 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1175 indx
++; /* Skip aux words. */
1178 /* Enumerations add 1-2 aux words:
1179 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1180 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1182 case btEnum
: /* Enumeration. */
1183 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1184 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1185 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1187 indx
++; /* Skip aux words. */
1190 case btTypedef
: /* Defined via a typedef, isymRef points. */
1191 strcpy (p1
, "typedef");
1194 case btRange
: /* Subrange of int. */
1195 strcpy (p1
, "subrange");
1198 case btSet
: /* Pascal sets. */
1202 case btComplex
: /* Fortran complex. */
1203 strcpy (p1
, "complex");
1206 case btDComplex
: /* Fortran double complex. */
1207 strcpy (p1
, "double complex");
1210 case btIndirect
: /* Forward or unnamed typedef. */
1211 strcpy (p1
, "forward/unamed typedef");
1214 case btFixedDec
: /* Fixed Decimal. */
1215 strcpy (p1
, "fixed decimal");
1218 case btFloatDec
: /* Float Decimal. */
1219 strcpy (p1
, "float decimal");
1222 case btString
: /* Varying Length Character String. */
1223 strcpy (p1
, "string");
1226 case btBit
: /* Aligned Bit String. */
1230 case btPicture
: /* Picture. */
1231 strcpy (p1
, "picture");
1234 case btVoid
: /* Void. */
1235 strcpy (p1
, "void");
1239 sprintf (p1
, _("Unknown basic type %d"), (int) basic_type
);
1243 p1
+= strlen (buffer1
);
1245 /* If this is a bitfield, get the bitsize. */
1250 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1251 sprintf (p1
, " : %d", bitsize
);
1252 p1
+= strlen (buffer1
);
1255 /* Deal with any qualifiers. */
1256 if (qualifiers
[0].type
!= tqNil
)
1258 /* Snarf up any array bounds in the correct order. Arrays
1259 store 5 successive words in the aux. table:
1260 word 0 RNDXR to type of the bounds (ie, int)
1261 word 1 Current file descriptor index
1263 word 3 high bound (or -1 if [])
1264 word 4 stride size in bits. */
1265 for (i
= 0; i
< 7; i
++)
1267 if (qualifiers
[i
].type
== tqArray
)
1269 qualifiers
[i
].low_bound
=
1270 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1271 qualifiers
[i
].high_bound
=
1272 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1273 qualifiers
[i
].stride
=
1274 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1279 /* Now print out the qualifiers. */
1280 for (i
= 0; i
< 6; i
++)
1282 switch (qualifiers
[i
].type
)
1289 strcpy (p2
, "ptr to ");
1290 p2
+= sizeof ("ptr to ")-1;
1294 strcpy (p2
, "volatile ");
1295 p2
+= sizeof ("volatile ")-1;
1299 strcpy (p2
, "far ");
1300 p2
+= sizeof ("far ")-1;
1304 strcpy (p2
, "func. ret. ");
1305 p2
+= sizeof ("func. ret. ");
1310 int first_array
= i
;
1313 /* Print array bounds reversed (ie, in the order the C
1314 programmer writes them). C is such a fun language.... */
1315 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1318 for (j
= i
; j
>= first_array
; j
--)
1320 strcpy (p2
, "array [");
1321 p2
+= sizeof ("array [")-1;
1322 if (qualifiers
[j
].low_bound
!= 0)
1324 "%ld:%ld {%ld bits}",
1325 (long) qualifiers
[j
].low_bound
,
1326 (long) qualifiers
[j
].high_bound
,
1327 (long) qualifiers
[j
].stride
);
1329 else if (qualifiers
[j
].high_bound
!= -1)
1332 (long) (qualifiers
[j
].high_bound
+ 1),
1333 (long) (qualifiers
[j
].stride
));
1336 sprintf (p2
, " {%ld bits}", (long) (qualifiers
[j
].stride
));
1339 strcpy (p2
, "] of ");
1340 p2
+= sizeof ("] of ")-1;
1348 strcpy (p2
, buffer1
);
1352 /* Return information about ECOFF symbol SYMBOL in RET. */
1355 _bfd_ecoff_get_symbol_info (bfd
*abfd ATTRIBUTE_UNUSED
,
1359 bfd_symbol_info (symbol
, ret
);
1362 /* Return whether this is a local label. */
1365 _bfd_ecoff_bfd_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
,
1368 return name
[0] == '$';
1371 /* Print information about an ECOFF symbol. */
1374 _bfd_ecoff_print_symbol (bfd
*abfd
,
1377 bfd_print_symbol_type how
)
1379 const struct ecoff_debug_swap
* const debug_swap
1380 = &ecoff_backend (abfd
)->debug_swap
;
1381 FILE *file
= (FILE *)filep
;
1385 case bfd_print_symbol_name
:
1386 fprintf (file
, "%s", symbol
->name
);
1388 case bfd_print_symbol_more
:
1389 if (ecoffsymbol (symbol
)->local
)
1393 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1395 fprintf (file
, "ecoff local ");
1396 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1397 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1398 (unsigned) ecoff_sym
.sc
);
1404 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1406 fprintf (file
, "ecoff extern ");
1407 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1408 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1409 (unsigned) ecoff_ext
.asym
.sc
);
1412 case bfd_print_symbol_all
:
1413 /* Print out the symbols in a reasonable way. */
1422 if (ecoffsymbol (symbol
)->local
)
1424 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1427 pos
= ((((char *) ecoffsymbol (symbol
)->native
1428 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1429 / debug_swap
->external_sym_size
)
1430 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1437 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1440 pos
= (((char *) ecoffsymbol (symbol
)->native
1441 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1442 / debug_swap
->external_ext_size
);
1443 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1444 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1445 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1448 fprintf (file
, "[%3d] %c ",
1450 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1451 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1452 (unsigned) ecoff_ext
.asym
.st
,
1453 (unsigned) ecoff_ext
.asym
.sc
,
1454 (unsigned) ecoff_ext
.asym
.index
,
1455 jmptbl
, cobol_main
, weakext
,
1458 if (ecoffsymbol (symbol
)->fdr
!= NULL
1459 && ecoff_ext
.asym
.index
!= indexNil
)
1464 bfd_size_type sym_base
;
1465 union aux_ext
*aux_base
;
1467 fdr
= ecoffsymbol (symbol
)->fdr
;
1468 indx
= ecoff_ext
.asym
.index
;
1470 /* sym_base is used to map the fdr relative indices which
1471 appear in the file to the position number which we are
1473 sym_base
= fdr
->isymBase
;
1474 if (ecoffsymbol (symbol
)->local
)
1476 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1478 /* aux_base is the start of the aux entries for this file;
1479 asym.index is an offset from this. */
1480 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1483 /* The aux entries are stored in host byte order; the
1484 order is indicated by a bit in the fdr. */
1485 bigendian
= fdr
->fBigendian
;
1487 /* This switch is basically from gcc/mips-tdump.c. */
1488 switch (ecoff_ext
.asym
.st
)
1496 fprintf (file
, _("\n End+1 symbol: %ld"),
1497 (long) (indx
+ sym_base
));
1501 if (ecoff_ext
.asym
.sc
== scText
1502 || ecoff_ext
.asym
.sc
== scInfo
)
1503 fprintf (file
, _("\n First symbol: %ld"),
1504 (long) (indx
+ sym_base
));
1506 fprintf (file
, _("\n First symbol: %ld"),
1508 (AUX_GET_ISYM (bigendian
,
1509 &aux_base
[ecoff_ext
.asym
.index
])
1515 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1517 else if (ecoffsymbol (symbol
)->local
)
1518 fprintf (file
, _("\n End+1 symbol: %-7ld Type: %s"),
1520 (AUX_GET_ISYM (bigendian
,
1521 &aux_base
[ecoff_ext
.asym
.index
])
1523 ecoff_type_to_string (abfd
, fdr
, indx
+ 1));
1525 fprintf (file
, _("\n Local symbol: %ld"),
1528 + (ecoff_data (abfd
)
1529 ->debug_info
.symbolic_header
.iextMax
)));
1533 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1534 (long) (indx
+ sym_base
));
1538 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1539 (long) (indx
+ sym_base
));
1543 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1544 (long) (indx
+ sym_base
));
1548 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1549 fprintf (file
, _("\n Type: %s"),
1550 ecoff_type_to_string (abfd
, fdr
, indx
));
1559 /* Read in the relocs for a section. */
1562 ecoff_slurp_reloc_table (bfd
*abfd
,
1566 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1567 arelent
*internal_relocs
;
1568 bfd_size_type external_reloc_size
;
1570 char *external_relocs
;
1574 if (section
->relocation
!= NULL
1575 || section
->reloc_count
== 0
1576 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1579 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1582 amt
= section
->reloc_count
;
1583 amt
*= sizeof (arelent
);
1584 internal_relocs
= (arelent
*) bfd_alloc (abfd
, amt
);
1586 external_reloc_size
= backend
->external_reloc_size
;
1587 amt
= external_reloc_size
* section
->reloc_count
;
1588 external_relocs
= (char *) bfd_alloc (abfd
, amt
);
1589 if (internal_relocs
== NULL
|| external_relocs
== NULL
)
1591 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1593 if (bfd_bread (external_relocs
, amt
, abfd
) != amt
)
1596 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1598 struct internal_reloc intern
;
1600 (*backend
->swap_reloc_in
) (abfd
,
1601 external_relocs
+ i
* external_reloc_size
,
1604 if (intern
.r_extern
)
1606 /* r_symndx is an index into the external symbols. */
1607 BFD_ASSERT (intern
.r_symndx
>= 0
1609 < (ecoff_data (abfd
)
1610 ->debug_info
.symbolic_header
.iextMax
)));
1611 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1614 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1615 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1617 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1622 const char *sec_name
;
1625 /* r_symndx is a section key. */
1626 switch (intern
.r_symndx
)
1628 case RELOC_SECTION_TEXT
: sec_name
= _TEXT
; break;
1629 case RELOC_SECTION_RDATA
: sec_name
= _RDATA
; break;
1630 case RELOC_SECTION_DATA
: sec_name
= _DATA
; break;
1631 case RELOC_SECTION_SDATA
: sec_name
= _SDATA
; break;
1632 case RELOC_SECTION_SBSS
: sec_name
= _SBSS
; break;
1633 case RELOC_SECTION_BSS
: sec_name
= _BSS
; break;
1634 case RELOC_SECTION_INIT
: sec_name
= _INIT
; break;
1635 case RELOC_SECTION_LIT8
: sec_name
= _LIT8
; break;
1636 case RELOC_SECTION_LIT4
: sec_name
= _LIT4
; break;
1637 case RELOC_SECTION_XDATA
: sec_name
= _XDATA
; break;
1638 case RELOC_SECTION_PDATA
: sec_name
= _PDATA
; break;
1639 case RELOC_SECTION_FINI
: sec_name
= _FINI
; break;
1640 case RELOC_SECTION_LITA
: sec_name
= _LITA
; break;
1641 case RELOC_SECTION_RCONST
: sec_name
= _RCONST
; break;
1645 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1648 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1650 rptr
->addend
= - bfd_get_section_vma (abfd
, sec
);
1653 rptr
->address
= intern
.r_vaddr
- bfd_get_section_vma (abfd
, section
);
1655 /* Let the backend select the howto field and do any other
1656 required processing. */
1657 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1660 bfd_release (abfd
, external_relocs
);
1662 section
->relocation
= internal_relocs
;
1667 /* Get a canonical list of relocs. */
1670 _bfd_ecoff_canonicalize_reloc (bfd
*abfd
,
1677 if (section
->flags
& SEC_CONSTRUCTOR
)
1679 arelent_chain
*chain
;
1681 /* This section has relocs made up by us, not the file, so take
1682 them out of their chain and place them into the data area
1684 for (count
= 0, chain
= section
->constructor_chain
;
1685 count
< section
->reloc_count
;
1686 count
++, chain
= chain
->next
)
1687 *relptr
++ = &chain
->relent
;
1693 if (! ecoff_slurp_reloc_table (abfd
, section
, symbols
))
1696 tblptr
= section
->relocation
;
1698 for (count
= 0; count
< section
->reloc_count
; count
++)
1699 *relptr
++ = tblptr
++;
1704 return section
->reloc_count
;
1707 /* Provided a BFD, a section and an offset into the section, calculate
1708 and return the name of the source file and the line nearest to the
1712 _bfd_ecoff_find_nearest_line (bfd
*abfd
,
1714 asymbol
**ignore_symbols ATTRIBUTE_UNUSED
,
1716 const char **filename_ptr
,
1717 const char **functionname_ptr
,
1718 unsigned int *retline_ptr
)
1720 const struct ecoff_debug_swap
* const debug_swap
1721 = &ecoff_backend (abfd
)->debug_swap
;
1722 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1723 struct ecoff_find_line
*line_info
;
1725 /* Make sure we have the FDR's. */
1726 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
, debug_info
)
1727 || bfd_get_symcount (abfd
) == 0)
1730 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1732 bfd_size_type amt
= sizeof (struct ecoff_find_line
);
1734 ecoff_data (abfd
)->find_line_info
=
1735 (struct ecoff_find_line
*) bfd_zalloc (abfd
, amt
);
1736 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1739 line_info
= ecoff_data (abfd
)->find_line_info
;
1741 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1742 debug_swap
, line_info
, filename_ptr
,
1743 functionname_ptr
, retline_ptr
);
1746 /* Copy private BFD data. This is called by objcopy and strip. We
1747 use it to copy the ECOFF debugging information from one BFD to the
1748 other. It would be theoretically possible to represent the ECOFF
1749 debugging information in the symbol table. However, it would be a
1750 lot of work, and there would be little gain (gas, gdb, and ld
1751 already access the ECOFF debugging information via the
1752 ecoff_debug_info structure, and that structure would have to be
1753 retained in order to support ECOFF debugging in MIPS ELF).
1755 The debugging information for the ECOFF external symbols comes from
1756 the symbol table, so this function only handles the other debugging
1760 _bfd_ecoff_bfd_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
1762 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1763 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1765 asymbol
**sym_ptr_ptr
;
1769 /* We only want to copy information over if both BFD's use ECOFF
1771 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1772 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1775 /* Copy the GP value and the register masks. */
1776 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1777 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1778 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1779 for (i
= 0; i
< 3; i
++)
1780 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1782 /* Copy the version stamp. */
1783 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1785 /* If there are no symbols, don't copy any debugging information. */
1786 c
= bfd_get_symcount (obfd
);
1787 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1788 if (c
== 0 || sym_ptr_ptr
== NULL
)
1791 /* See if there are any local symbols. */
1793 for (; c
> 0; c
--, sym_ptr_ptr
++)
1795 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1804 /* There are some local symbols. We just bring over all the
1805 debugging information. FIXME: This is not quite the right
1806 thing to do. If the user has asked us to discard all
1807 debugging information, then we are probably going to wind up
1808 keeping it because there will probably be some local symbol
1809 which objcopy did not discard. We should actually break
1810 apart the debugging information and only keep that which
1811 applies to the symbols we want to keep. */
1812 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1813 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1814 oinfo
->line
= iinfo
->line
;
1816 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1817 oinfo
->external_dnr
= iinfo
->external_dnr
;
1819 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1820 oinfo
->external_pdr
= iinfo
->external_pdr
;
1822 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1823 oinfo
->external_sym
= iinfo
->external_sym
;
1825 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1826 oinfo
->external_opt
= iinfo
->external_opt
;
1828 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1829 oinfo
->external_aux
= iinfo
->external_aux
;
1831 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1832 oinfo
->ss
= iinfo
->ss
;
1834 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1835 oinfo
->external_fdr
= iinfo
->external_fdr
;
1837 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1838 oinfo
->external_rfd
= iinfo
->external_rfd
;
1842 /* We are discarding all the local symbol information. Look
1843 through the external symbols and remove all references to FDR
1844 or aux information. */
1845 c
= bfd_get_symcount (obfd
);
1846 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1847 for (; c
> 0; c
--, sym_ptr_ptr
++)
1851 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1852 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1854 esym
.asym
.index
= indexNil
;
1855 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1856 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1863 /* Set the architecture. The supported architecture is stored in the
1864 backend pointer. We always set the architecture anyhow, since many
1865 callers ignore the return value. */
1868 _bfd_ecoff_set_arch_mach (bfd
*abfd
,
1869 enum bfd_architecture arch
,
1870 unsigned long machine
)
1872 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1873 return arch
== ecoff_backend (abfd
)->arch
;
1876 /* Get the size of the section headers. */
1879 _bfd_ecoff_sizeof_headers (bfd
*abfd
,
1880 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1887 for (current
= abfd
->sections
;
1889 current
= current
->next
)
1892 ret
= (bfd_coff_filhsz (abfd
)
1893 + bfd_coff_aoutsz (abfd
)
1894 + c
* bfd_coff_scnhsz (abfd
));
1895 return BFD_ALIGN (ret
, 16);
1898 /* Get the contents of a section. */
1901 _bfd_ecoff_get_section_contents (bfd
*abfd
,
1905 bfd_size_type count
)
1907 return _bfd_generic_get_section_contents (abfd
, section
, location
,
1911 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1912 called via qsort. */
1915 ecoff_sort_hdrs (const void * arg1
, const void * arg2
)
1917 const asection
*hdr1
= *(const asection
**) arg1
;
1918 const asection
*hdr2
= *(const asection
**) arg2
;
1920 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
1922 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
1927 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
1930 if (hdr1
->vma
< hdr2
->vma
)
1932 else if (hdr1
->vma
> hdr2
->vma
)
1938 /* Calculate the file position for each section, and set
1942 ecoff_compute_section_file_positions (bfd
*abfd
)
1944 file_ptr sofar
, file_sofar
;
1945 asection
**sorted_hdrs
;
1949 bfd_boolean rdata_in_text
;
1950 bfd_boolean first_data
, first_nonalloc
;
1951 const bfd_vma round
= ecoff_backend (abfd
)->round
;
1954 sofar
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
1957 /* Sort the sections by VMA. */
1958 amt
= abfd
->section_count
;
1959 amt
*= sizeof (asection
*);
1960 sorted_hdrs
= (asection
**) bfd_malloc (amt
);
1961 if (sorted_hdrs
== NULL
)
1963 for (current
= abfd
->sections
, i
= 0;
1965 current
= current
->next
, i
++)
1966 sorted_hdrs
[i
] = current
;
1967 BFD_ASSERT (i
== abfd
->section_count
);
1969 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
1972 /* Some versions of the OSF linker put the .rdata section in the
1973 text segment, and some do not. */
1974 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
1977 for (i
= 0; i
< abfd
->section_count
; i
++)
1979 current
= sorted_hdrs
[i
];
1980 if (streq (current
->name
, _RDATA
))
1982 if ((current
->flags
& SEC_CODE
) == 0
1983 && ! streq (current
->name
, _PDATA
)
1984 && ! streq (current
->name
, _RCONST
))
1986 rdata_in_text
= FALSE
;
1991 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
1994 first_nonalloc
= TRUE
;
1995 for (i
= 0; i
< abfd
->section_count
; i
++)
1997 unsigned int alignment_power
;
1999 current
= sorted_hdrs
[i
];
2001 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2002 supposed to indicate the number of .pdata entries that are
2003 really in the section. Each entry is 8 bytes. We store this
2004 away in line_filepos before increasing the section size. */
2005 if (streq (current
->name
, _PDATA
))
2006 current
->line_filepos
= current
->size
/ 8;
2008 alignment_power
= current
->alignment_power
;
2010 /* On Ultrix, the data sections in an executable file must be
2011 aligned to a page boundary within the file. This does not
2012 affect the section size, though. FIXME: Does this work for
2013 other platforms? It requires some modification for the
2014 Alpha, because .rdata on the Alpha goes with the text, not
2016 if ((abfd
->flags
& EXEC_P
) != 0
2017 && (abfd
->flags
& D_PAGED
) != 0
2019 && (current
->flags
& SEC_CODE
) == 0
2021 || ! streq (current
->name
, _RDATA
))
2022 && ! streq (current
->name
, _PDATA
)
2023 && ! streq (current
->name
, _RCONST
))
2025 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2026 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2029 else if (streq (current
->name
, _LIB
))
2031 /* On Irix 4, the location of contents of the .lib section
2032 from a shared library section is also rounded up to a
2035 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2036 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2038 else if (first_nonalloc
2039 && (current
->flags
& SEC_ALLOC
) == 0
2040 && (abfd
->flags
& D_PAGED
) != 0)
2042 /* Skip up to the next page for an unallocated section, such
2043 as the .comment section on the Alpha. This leaves room
2044 for the .bss section. */
2045 first_nonalloc
= FALSE
;
2046 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2047 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2050 /* Align the sections in the file to the same boundary on
2051 which they are aligned in virtual memory. */
2052 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2053 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2054 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2056 if ((abfd
->flags
& D_PAGED
) != 0
2057 && (current
->flags
& SEC_ALLOC
) != 0)
2059 sofar
+= (current
->vma
- sofar
) % round
;
2060 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2061 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2064 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2065 current
->filepos
= file_sofar
;
2067 sofar
+= current
->size
;
2068 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2069 file_sofar
+= current
->size
;
2071 /* Make sure that this section is of the right size too. */
2073 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2074 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2075 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2076 current
->size
+= sofar
- old_sofar
;
2082 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2087 /* Determine the location of the relocs for all the sections in the
2088 output file, as well as the location of the symbolic debugging
2091 static bfd_size_type
2092 ecoff_compute_reloc_file_positions (bfd
*abfd
)
2094 const bfd_size_type external_reloc_size
=
2095 ecoff_backend (abfd
)->external_reloc_size
;
2096 file_ptr reloc_base
;
2097 bfd_size_type reloc_size
;
2101 if (! abfd
->output_has_begun
)
2103 if (! ecoff_compute_section_file_positions (abfd
))
2105 abfd
->output_has_begun
= TRUE
;
2108 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2111 for (current
= abfd
->sections
;
2113 current
= current
->next
)
2115 if (current
->reloc_count
== 0)
2116 current
->rel_filepos
= 0;
2119 bfd_size_type relsize
;
2121 current
->rel_filepos
= reloc_base
;
2122 relsize
= current
->reloc_count
* external_reloc_size
;
2123 reloc_size
+= relsize
;
2124 reloc_base
+= relsize
;
2128 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2130 /* At least on Ultrix, the symbol table of an executable file must
2131 be aligned to a page boundary. FIXME: Is this true on other
2133 if ((abfd
->flags
& EXEC_P
) != 0
2134 && (abfd
->flags
& D_PAGED
) != 0)
2135 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2136 &~ (ecoff_backend (abfd
)->round
- 1));
2138 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2143 /* Set the contents of a section. */
2146 _bfd_ecoff_set_section_contents (bfd
*abfd
,
2148 const void * location
,
2150 bfd_size_type count
)
2154 /* This must be done first, because bfd_set_section_contents is
2155 going to set output_has_begun to TRUE. */
2156 if (! abfd
->output_has_begun
2157 && ! ecoff_compute_section_file_positions (abfd
))
2160 /* Handle the .lib section specially so that Irix 4 shared libraries
2161 work out. See coff_set_section_contents in coffcode.h. */
2162 if (streq (section
->name
, _LIB
))
2164 bfd_byte
*rec
, *recend
;
2166 rec
= (bfd_byte
*) location
;
2167 recend
= rec
+ count
;
2168 while (rec
< recend
)
2171 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2174 BFD_ASSERT (rec
== recend
);
2180 pos
= section
->filepos
+ offset
;
2181 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2182 || bfd_bwrite (location
, count
, abfd
) != count
)
2188 /* Get the GP value for an ECOFF file. This is a hook used by
2192 bfd_ecoff_get_gp_value (bfd
*abfd
)
2194 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2195 || bfd_get_format (abfd
) != bfd_object
)
2197 bfd_set_error (bfd_error_invalid_operation
);
2201 return ecoff_data (abfd
)->gp
;
2204 /* Set the GP value for an ECOFF file. This is a hook used by the
2208 bfd_ecoff_set_gp_value (bfd
*abfd
, bfd_vma gp_value
)
2210 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2211 || bfd_get_format (abfd
) != bfd_object
)
2213 bfd_set_error (bfd_error_invalid_operation
);
2217 ecoff_data (abfd
)->gp
= gp_value
;
2222 /* Set the register masks for an ECOFF file. This is a hook used by
2226 bfd_ecoff_set_regmasks (bfd
*abfd
,
2227 unsigned long gprmask
,
2228 unsigned long fprmask
,
2229 unsigned long *cprmask
)
2231 ecoff_data_type
*tdata
;
2233 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2234 || bfd_get_format (abfd
) != bfd_object
)
2236 bfd_set_error (bfd_error_invalid_operation
);
2240 tdata
= ecoff_data (abfd
);
2241 tdata
->gprmask
= gprmask
;
2242 tdata
->fprmask
= fprmask
;
2243 if (cprmask
!= NULL
)
2247 for (i
= 0; i
< 3; i
++)
2248 tdata
->cprmask
[i
] = cprmask
[i
];
2254 /* Get ECOFF EXTR information for an external symbol. This function
2255 is passed to bfd_ecoff_debug_externals. */
2258 ecoff_get_extr (asymbol
*sym
, EXTR
*esym
)
2260 ecoff_symbol_type
*ecoff_sym_ptr
;
2263 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2264 || ecoffsymbol (sym
)->native
== NULL
)
2266 /* Don't include debugging, local, or section symbols. */
2267 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2268 || (sym
->flags
& BSF_LOCAL
) != 0
2269 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2273 esym
->cobol_main
= 0;
2274 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2277 /* FIXME: we can do better than this for st and sc. */
2278 esym
->asym
.st
= stGlobal
;
2279 esym
->asym
.sc
= scAbs
;
2280 esym
->asym
.reserved
= 0;
2281 esym
->asym
.index
= indexNil
;
2285 ecoff_sym_ptr
= ecoffsymbol (sym
);
2287 if (ecoff_sym_ptr
->local
)
2290 input_bfd
= bfd_asymbol_bfd (sym
);
2291 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2292 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2294 /* If the symbol was defined by the linker, then esym will be
2295 undefined but sym will not be. Get a better class for such a
2297 if ((esym
->asym
.sc
== scUndefined
2298 || esym
->asym
.sc
== scSUndefined
)
2299 && ! bfd_is_und_section (bfd_get_section (sym
)))
2300 esym
->asym
.sc
= scAbs
;
2302 /* Adjust the FDR index for the symbol by that used for the input
2304 if (esym
->ifd
!= -1)
2306 struct ecoff_debug_info
*input_debug
;
2308 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2309 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2310 if (input_debug
->ifdmap
!= NULL
)
2311 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2317 /* Set the external symbol index. This routine is passed to
2318 bfd_ecoff_debug_externals. */
2321 ecoff_set_index (asymbol
*sym
, bfd_size_type indx
)
2323 ecoff_set_sym_index (sym
, indx
);
2326 /* Write out an ECOFF file. */
2329 _bfd_ecoff_write_object_contents (bfd
*abfd
)
2331 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2332 const bfd_vma round
= backend
->round
;
2333 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2334 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2335 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2336 const bfd_size_type external_hdr_size
2337 = backend
->debug_swap
.external_hdr_size
;
2338 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2339 void (* const adjust_reloc_out
) (bfd
*, const arelent
*, struct internal_reloc
*)
2340 = backend
->adjust_reloc_out
;
2341 void (* const swap_reloc_out
) (bfd
*, const struct internal_reloc
*, void *)
2342 = backend
->swap_reloc_out
;
2343 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2344 HDRR
* const symhdr
= &debug
->symbolic_header
;
2347 bfd_size_type reloc_size
;
2348 bfd_size_type text_size
;
2350 bfd_boolean set_text_start
;
2351 bfd_size_type data_size
;
2353 bfd_boolean set_data_start
;
2354 bfd_size_type bss_size
;
2356 void * reloc_buff
= NULL
;
2357 struct internal_filehdr internal_f
;
2358 struct internal_aouthdr internal_a
;
2361 /* Determine where the sections and relocs will go in the output
2363 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2366 for (current
= abfd
->sections
;
2368 current
= current
->next
)
2370 current
->target_index
= count
;
2374 if ((abfd
->flags
& D_PAGED
) != 0)
2375 text_size
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
2379 set_text_start
= FALSE
;
2382 set_data_start
= FALSE
;
2385 /* Write section headers to the file. */
2387 /* Allocate buff big enough to hold a section header,
2388 file header, or a.out header. */
2397 buff
= bfd_malloc (siz
);
2402 internal_f
.f_nscns
= 0;
2403 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2406 for (current
= abfd
->sections
;
2408 current
= current
->next
)
2410 struct internal_scnhdr section
;
2413 ++internal_f
.f_nscns
;
2415 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2417 /* This seems to be correct for Irix 4 shared libraries. */
2418 vma
= bfd_get_section_vma (abfd
, current
);
2419 if (streq (current
->name
, _LIB
))
2420 section
.s_vaddr
= 0;
2422 section
.s_vaddr
= vma
;
2424 section
.s_paddr
= current
->lma
;
2425 section
.s_size
= current
->size
;
2427 /* If this section is unloadable then the scnptr will be 0. */
2428 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2429 section
.s_scnptr
= 0;
2431 section
.s_scnptr
= current
->filepos
;
2432 section
.s_relptr
= current
->rel_filepos
;
2434 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2435 object file produced by the assembler is supposed to point to
2436 information about how much room is required by objects of
2437 various different sizes. I think this only matters if we
2438 want the linker to compute the best size to use, or
2439 something. I don't know what happens if the information is
2441 if (! streq (current
->name
, _PDATA
))
2442 section
.s_lnnoptr
= 0;
2445 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2446 hold the number of entries in the section (each entry is
2447 8 bytes). We stored this in the line_filepos field in
2448 ecoff_compute_section_file_positions. */
2449 section
.s_lnnoptr
= current
->line_filepos
;
2452 section
.s_nreloc
= current
->reloc_count
;
2453 section
.s_nlnno
= 0;
2454 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2457 if (bfd_coff_swap_scnhdr_out (abfd
, (void *) §ion
, buff
) == 0
2458 || bfd_bwrite (buff
, scnhsz
, abfd
) != scnhsz
)
2461 if ((section
.s_flags
& STYP_TEXT
) != 0
2462 || ((section
.s_flags
& STYP_RDATA
) != 0
2463 && ecoff_data (abfd
)->rdata_in_text
)
2464 || section
.s_flags
== STYP_PDATA
2465 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2466 || (section
.s_flags
& STYP_LIBLIST
) != 0
2467 || (section
.s_flags
& STYP_RELDYN
) != 0
2468 || section
.s_flags
== STYP_CONFLIC
2469 || (section
.s_flags
& STYP_DYNSTR
) != 0
2470 || (section
.s_flags
& STYP_DYNSYM
) != 0
2471 || (section
.s_flags
& STYP_HASH
) != 0
2472 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2473 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2474 || section
.s_flags
== STYP_RCONST
)
2476 text_size
+= current
->size
;
2477 if (! set_text_start
|| text_start
> vma
)
2480 set_text_start
= TRUE
;
2483 else if ((section
.s_flags
& STYP_RDATA
) != 0
2484 || (section
.s_flags
& STYP_DATA
) != 0
2485 || (section
.s_flags
& STYP_LITA
) != 0
2486 || (section
.s_flags
& STYP_LIT8
) != 0
2487 || (section
.s_flags
& STYP_LIT4
) != 0
2488 || (section
.s_flags
& STYP_SDATA
) != 0
2489 || section
.s_flags
== STYP_XDATA
2490 || (section
.s_flags
& STYP_GOT
) != 0)
2492 data_size
+= current
->size
;
2493 if (! set_data_start
|| data_start
> vma
)
2496 set_data_start
= TRUE
;
2499 else if ((section
.s_flags
& STYP_BSS
) != 0
2500 || (section
.s_flags
& STYP_SBSS
) != 0)
2501 bss_size
+= current
->size
;
2502 else if (section
.s_flags
== 0
2503 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2504 || section
.s_flags
== STYP_COMMENT
)
2510 /* Set up the file header. */
2511 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2513 /* We will NOT put a fucking timestamp in the header here. Every
2514 time you put it back, I will come in and take it out again. I'm
2515 sorry. This field does not belong here. We fill it with a 0 so
2516 it compares the same but is not a reasonable time. --
2518 internal_f
.f_timdat
= 0;
2520 if (bfd_get_symcount (abfd
) != 0)
2522 /* The ECOFF f_nsyms field is not actually the number of
2523 symbols, it's the size of symbolic information header. */
2524 internal_f
.f_nsyms
= external_hdr_size
;
2525 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2529 internal_f
.f_nsyms
= 0;
2530 internal_f
.f_symptr
= 0;
2533 internal_f
.f_opthdr
= aoutsz
;
2535 internal_f
.f_flags
= F_LNNO
;
2536 if (reloc_size
== 0)
2537 internal_f
.f_flags
|= F_RELFLG
;
2538 if (bfd_get_symcount (abfd
) == 0)
2539 internal_f
.f_flags
|= F_LSYMS
;
2540 if (abfd
->flags
& EXEC_P
)
2541 internal_f
.f_flags
|= F_EXEC
;
2543 if (bfd_little_endian (abfd
))
2544 internal_f
.f_flags
|= F_AR32WR
;
2546 internal_f
.f_flags
|= F_AR32W
;
2548 /* Set up the ``optional'' header. */
2549 if ((abfd
->flags
& D_PAGED
) != 0)
2550 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2552 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2554 /* FIXME: Is this really correct? */
2555 internal_a
.vstamp
= symhdr
->vstamp
;
2557 /* At least on Ultrix, these have to be rounded to page boundaries.
2558 FIXME: Is this true on other platforms? */
2559 if ((abfd
->flags
& D_PAGED
) != 0)
2561 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2562 internal_a
.text_start
= text_start
&~ (round
- 1);
2563 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2564 internal_a
.data_start
= data_start
&~ (round
- 1);
2568 internal_a
.tsize
= text_size
;
2569 internal_a
.text_start
= text_start
;
2570 internal_a
.dsize
= data_size
;
2571 internal_a
.data_start
= data_start
;
2574 /* On Ultrix, the initial portions of the .sbss and .bss segments
2575 are at the end of the data section. The bsize field in the
2576 optional header records how many bss bytes are required beyond
2577 those in the data section. The value is not rounded to a page
2579 if (bss_size
< internal_a
.dsize
- data_size
)
2582 bss_size
-= internal_a
.dsize
- data_size
;
2583 internal_a
.bsize
= bss_size
;
2584 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2586 internal_a
.entry
= bfd_get_start_address (abfd
);
2588 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2590 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2591 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2592 for (i
= 0; i
< 4; i
++)
2593 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2595 /* Let the backend adjust the headers if necessary. */
2596 if (backend
->adjust_headers
)
2598 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2602 /* Write out the file header and the optional header. */
2603 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2606 bfd_coff_swap_filehdr_out (abfd
, (void *) &internal_f
, buff
);
2607 if (bfd_bwrite (buff
, filhsz
, abfd
) != filhsz
)
2610 bfd_coff_swap_aouthdr_out (abfd
, (void *) &internal_a
, buff
);
2611 if (bfd_bwrite (buff
, aoutsz
, abfd
) != aoutsz
)
2614 /* Build the external symbol information. This must be done before
2615 writing out the relocs so that we know the symbol indices. We
2616 don't do this if this BFD was created by the backend linker,
2617 since it will have already handled the symbols and relocs. */
2618 if (! ecoff_data (abfd
)->linker
)
2620 symhdr
->iextMax
= 0;
2621 symhdr
->issExtMax
= 0;
2622 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2623 debug
->ssext
= debug
->ssext_end
= NULL
;
2624 if (! bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2625 (abfd
->flags
& EXEC_P
) == 0,
2626 ecoff_get_extr
, ecoff_set_index
))
2629 /* Write out the relocs. */
2630 for (current
= abfd
->sections
;
2632 current
= current
->next
)
2634 arelent
**reloc_ptr_ptr
;
2635 arelent
**reloc_end
;
2639 if (current
->reloc_count
== 0)
2642 amt
= current
->reloc_count
* external_reloc_size
;
2643 reloc_buff
= bfd_alloc (abfd
, amt
);
2644 if (reloc_buff
== NULL
)
2647 reloc_ptr_ptr
= current
->orelocation
;
2648 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2649 out_ptr
= (char *) reloc_buff
;
2652 reloc_ptr_ptr
< reloc_end
;
2653 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2657 struct internal_reloc in
;
2659 memset ((void *) &in
, 0, sizeof in
);
2661 reloc
= *reloc_ptr_ptr
;
2662 sym
= *reloc
->sym_ptr_ptr
;
2664 /* If the howto field has not been initialised then skip this reloc.
2665 This assumes that an error message has been issued elsewhere. */
2666 if (reloc
->howto
== NULL
)
2669 in
.r_vaddr
= (reloc
->address
2670 + bfd_get_section_vma (abfd
, current
));
2671 in
.r_type
= reloc
->howto
->type
;
2673 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2675 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2689 { _TEXT
, RELOC_SECTION_TEXT
},
2690 { _RDATA
, RELOC_SECTION_RDATA
},
2691 { _DATA
, RELOC_SECTION_DATA
},
2692 { _SDATA
, RELOC_SECTION_SDATA
},
2693 { _SBSS
, RELOC_SECTION_SBSS
},
2694 { _BSS
, RELOC_SECTION_BSS
},
2695 { _INIT
, RELOC_SECTION_INIT
},
2696 { _LIT8
, RELOC_SECTION_LIT8
},
2697 { _LIT4
, RELOC_SECTION_LIT4
},
2698 { _XDATA
, RELOC_SECTION_XDATA
},
2699 { _PDATA
, RELOC_SECTION_PDATA
},
2700 { _FINI
, RELOC_SECTION_FINI
},
2701 { _LITA
, RELOC_SECTION_LITA
},
2702 { "*ABS*", RELOC_SECTION_ABS
},
2703 { _RCONST
, RELOC_SECTION_RCONST
}
2706 name
= bfd_get_section_name (abfd
, bfd_get_section (sym
));
2708 for (j
= 0; j
< ARRAY_SIZE (section_symndx
); j
++)
2709 if (streq (name
, section_symndx
[j
].name
))
2711 in
.r_symndx
= section_symndx
[j
].r_symndx
;
2715 if (j
== ARRAY_SIZE (section_symndx
))
2720 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2722 (*swap_reloc_out
) (abfd
, &in
, (void *) out_ptr
);
2725 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2727 amt
= current
->reloc_count
* external_reloc_size
;
2728 if (bfd_bwrite (reloc_buff
, amt
, abfd
) != amt
)
2730 bfd_release (abfd
, reloc_buff
);
2734 /* Write out the symbolic debugging information. */
2735 if (bfd_get_symcount (abfd
) > 0)
2737 /* Write out the debugging information. */
2738 if (! bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2739 ecoff_data (abfd
)->sym_filepos
))
2744 /* The .bss section of a demand paged executable must receive an
2745 entire page. If there are symbols, the symbols will start on the
2746 next page. If there are no symbols, we must fill out the page by
2748 if (bfd_get_symcount (abfd
) == 0
2749 && (abfd
->flags
& EXEC_P
) != 0
2750 && (abfd
->flags
& D_PAGED
) != 0)
2754 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2757 if (bfd_bread (&c
, (bfd_size_type
) 1, abfd
) == 0)
2759 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2762 if (bfd_bwrite (&c
, (bfd_size_type
) 1, abfd
) != 1)
2766 if (reloc_buff
!= NULL
)
2767 bfd_release (abfd
, reloc_buff
);
2772 if (reloc_buff
!= NULL
)
2773 bfd_release (abfd
, reloc_buff
);
2779 /* Archive handling. ECOFF uses what appears to be a unique type of
2780 archive header (armap). The byte ordering of the armap and the
2781 contents are encoded in the name of the armap itself. At least for
2782 now, we only support archives with the same byte ordering in the
2783 armap and the contents.
2785 The first four bytes in the armap are the number of symbol
2786 definitions. This is always a power of two.
2788 This is followed by the symbol definitions. Each symbol definition
2789 occupies 8 bytes. The first four bytes are the offset from the
2790 start of the armap strings to the null-terminated string naming
2791 this symbol. The second four bytes are the file offset to the
2792 archive member which defines this symbol. If the second four bytes
2793 are 0, then this is not actually a symbol definition, and it should
2796 The symbols are hashed into the armap with a closed hashing scheme.
2797 See the functions below for the details of the algorithm.
2799 After the symbol definitions comes four bytes holding the size of
2800 the string table, followed by the string table itself. */
2802 /* The name of an archive headers looks like this:
2803 __________E[BL]E[BL]_ (with a trailing space).
2804 The trailing space is changed to an X if the archive is changed to
2805 indicate that the armap is out of date.
2807 The Alpha seems to use ________64E[BL]E[BL]_. */
2809 #define ARMAP_BIG_ENDIAN 'B'
2810 #define ARMAP_LITTLE_ENDIAN 'L'
2811 #define ARMAP_MARKER 'E'
2812 #define ARMAP_START_LENGTH 10
2813 #define ARMAP_HEADER_MARKER_INDEX 10
2814 #define ARMAP_HEADER_ENDIAN_INDEX 11
2815 #define ARMAP_OBJECT_MARKER_INDEX 12
2816 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2817 #define ARMAP_END_INDEX 14
2818 #define ARMAP_END "_ "
2820 /* This is a magic number used in the hashing algorithm. */
2821 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2823 /* This returns the hash value to use for a string. It also sets
2824 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2825 is the number of entries in the hash table, and HLOG is the log
2829 ecoff_armap_hash (const char *s
,
2830 unsigned int *rehash
,
2840 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2841 hash
*= ARMAP_HASH_MAGIC
;
2842 *rehash
= (hash
& (size
- 1)) | 1;
2843 return hash
>> (32 - hlog
);
2846 /* Read in the armap. */
2849 _bfd_ecoff_slurp_armap (bfd
*abfd
)
2853 struct areltdata
*mapdata
;
2854 bfd_size_type parsed_size
;
2856 struct artdata
*ardata
;
2863 /* Get the name of the first element. */
2864 i
= bfd_bread ((void *) nextname
, (bfd_size_type
) 16, abfd
);
2870 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2873 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2874 standard COFF armap. We could move the ECOFF armap stuff into
2875 bfd_slurp_armap, but that seems inappropriate since no other
2876 target uses this format. Instead, we check directly for a COFF
2878 if (CONST_STRNEQ (nextname
, "/ "))
2879 return bfd_slurp_armap (abfd
);
2881 /* See if the first element is an armap. */
2882 if (! strneq (nextname
, ecoff_backend (abfd
)->armap_start
, ARMAP_START_LENGTH
)
2883 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
2884 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2885 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2886 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
2887 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2888 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2889 || ! strneq (nextname
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1))
2891 bfd_has_map (abfd
) = FALSE
;
2895 /* Make sure we have the right byte ordering. */
2896 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2897 ^ (bfd_header_big_endian (abfd
)))
2898 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2899 ^ (bfd_big_endian (abfd
))))
2901 bfd_set_error (bfd_error_wrong_format
);
2905 /* Read in the armap. */
2906 ardata
= bfd_ardata (abfd
);
2907 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
2908 if (mapdata
== NULL
)
2910 parsed_size
= mapdata
->parsed_size
;
2911 bfd_release (abfd
, (void *) mapdata
);
2913 raw_armap
= (char *) bfd_alloc (abfd
, parsed_size
);
2914 if (raw_armap
== NULL
)
2917 if (bfd_bread ((void *) raw_armap
, parsed_size
, abfd
) != parsed_size
)
2919 if (bfd_get_error () != bfd_error_system_call
)
2920 bfd_set_error (bfd_error_malformed_archive
);
2921 bfd_release (abfd
, (void *) raw_armap
);
2925 ardata
->tdata
= (void *) raw_armap
;
2927 count
= H_GET_32 (abfd
, raw_armap
);
2929 ardata
->symdef_count
= 0;
2930 ardata
->cache
= NULL
;
2932 /* This code used to overlay the symdefs over the raw archive data,
2933 but that doesn't work on a 64 bit host. */
2934 stringbase
= raw_armap
+ count
* 8 + 8;
2936 #ifdef CHECK_ARMAP_HASH
2940 /* Double check that I have the hashing algorithm right by making
2941 sure that every symbol can be looked up successfully. */
2943 for (i
= 1; i
< count
; i
<<= 1)
2945 BFD_ASSERT (i
== count
);
2947 raw_ptr
= raw_armap
+ 4;
2948 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2950 unsigned int name_offset
, file_offset
;
2951 unsigned int hash
, rehash
, srch
;
2953 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2954 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2955 if (file_offset
== 0)
2957 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
2962 /* See if we can rehash to this location. */
2963 for (srch
= (hash
+ rehash
) & (count
- 1);
2964 srch
!= hash
&& srch
!= i
;
2965 srch
= (srch
+ rehash
) & (count
- 1))
2966 BFD_ASSERT (H_GET_32 (abfd
, (raw_armap
+ 8 + srch
* 8)) != 0);
2967 BFD_ASSERT (srch
== i
);
2971 #endif /* CHECK_ARMAP_HASH */
2973 raw_ptr
= raw_armap
+ 4;
2974 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2975 if (H_GET_32 (abfd
, (raw_ptr
+ 4)) != 0)
2976 ++ardata
->symdef_count
;
2978 amt
= ardata
->symdef_count
;
2979 amt
*= sizeof (carsym
);
2980 symdef_ptr
= (carsym
*) bfd_alloc (abfd
, amt
);
2984 ardata
->symdefs
= symdef_ptr
;
2986 raw_ptr
= raw_armap
+ 4;
2987 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2989 unsigned int name_offset
, file_offset
;
2991 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2992 if (file_offset
== 0)
2994 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2995 symdef_ptr
->name
= stringbase
+ name_offset
;
2996 symdef_ptr
->file_offset
= file_offset
;
3000 ardata
->first_file_filepos
= bfd_tell (abfd
);
3001 /* Pad to an even boundary. */
3002 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
3004 bfd_has_map (abfd
) = TRUE
;
3009 /* Write out an armap. */
3012 _bfd_ecoff_write_armap (bfd
*abfd
,
3013 unsigned int elength
,
3015 unsigned int orl_count
,
3018 unsigned int hashsize
, hashlog
;
3019 bfd_size_type symdefsize
;
3021 unsigned int stringsize
;
3022 unsigned int mapsize
;
3025 struct stat statbuf
;
3028 bfd_byte
*hashtable
;
3032 /* Ultrix appears to use as a hash table size the least power of two
3033 greater than twice the number of entries. */
3034 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3036 hashsize
= 1 << hashlog
;
3038 symdefsize
= hashsize
* 8;
3040 stringsize
= stridx
+ padit
;
3042 /* Include 8 bytes to store symdefsize and stringsize in output. */
3043 mapsize
= symdefsize
+ stringsize
+ 8;
3045 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3047 memset ((void *) &hdr
, 0, sizeof hdr
);
3049 /* Work out the ECOFF armap name. */
3050 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3051 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3052 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3053 (bfd_header_big_endian (abfd
)
3055 : ARMAP_LITTLE_ENDIAN
);
3056 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3057 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3058 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3059 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3061 /* Write the timestamp of the archive header to be just a little bit
3062 later than the timestamp of the file, otherwise the linker will
3063 complain that the index is out of date. Actually, the Ultrix
3064 linker just checks the archive name; the GNU linker may check the
3066 stat (abfd
->filename
, &statbuf
);
3067 _bfd_ar_spacepad (hdr
.ar_date
, sizeof (hdr
.ar_date
), "%ld",
3068 (long) (statbuf
.st_mtime
+ 60));
3070 /* The DECstation uses zeroes for the uid, gid and mode of the
3072 hdr
.ar_uid
[0] = '0';
3073 hdr
.ar_gid
[0] = '0';
3074 /* Building gcc ends up extracting the armap as a file - twice. */
3075 hdr
.ar_mode
[0] = '6';
3076 hdr
.ar_mode
[1] = '4';
3077 hdr
.ar_mode
[2] = '4';
3079 _bfd_ar_spacepad (hdr
.ar_size
, sizeof (hdr
.ar_size
), "%-10ld", mapsize
);
3081 hdr
.ar_fmag
[0] = '`';
3082 hdr
.ar_fmag
[1] = '\012';
3084 /* Turn all null bytes in the header into spaces. */
3085 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3086 if (((char *) (&hdr
))[i
] == '\0')
3087 (((char *) (&hdr
))[i
]) = ' ';
3089 if (bfd_bwrite ((void *) &hdr
, (bfd_size_type
) sizeof (struct ar_hdr
), abfd
)
3090 != sizeof (struct ar_hdr
))
3093 H_PUT_32 (abfd
, hashsize
, temp
);
3094 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3097 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3101 current
= abfd
->archive_head
;
3103 for (i
= 0; i
< orl_count
; i
++)
3105 unsigned int hash
, rehash
= 0;
3107 /* Advance firstreal to the file position of this archive
3109 if (map
[i
].u
.abfd
!= last_elt
)
3113 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3114 firstreal
+= firstreal
% 2;
3115 current
= current
->archive_next
;
3117 while (current
!= map
[i
].u
.abfd
);
3122 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3123 if (H_GET_32 (abfd
, (hashtable
+ (hash
* 8) + 4)) != 0)
3127 /* The desired slot is already taken. */
3128 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3130 srch
= (srch
+ rehash
) & (hashsize
- 1))
3131 if (H_GET_32 (abfd
, (hashtable
+ (srch
* 8) + 4)) == 0)
3134 BFD_ASSERT (srch
!= hash
);
3139 H_PUT_32 (abfd
, map
[i
].namidx
, (hashtable
+ hash
* 8));
3140 H_PUT_32 (abfd
, firstreal
, (hashtable
+ hash
* 8 + 4));
3143 if (bfd_bwrite ((void *) hashtable
, symdefsize
, abfd
) != symdefsize
)
3146 bfd_release (abfd
, hashtable
);
3148 /* Now write the strings. */
3149 H_PUT_32 (abfd
, stringsize
, temp
);
3150 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3152 for (i
= 0; i
< orl_count
; i
++)
3156 len
= strlen (*map
[i
].name
) + 1;
3157 if (bfd_bwrite ((void *) (*map
[i
].name
), len
, abfd
) != len
)
3161 /* The spec sez this should be a newline. But in order to be
3162 bug-compatible for DECstation ar we use a null. */
3165 if (bfd_bwrite ("", (bfd_size_type
) 1, abfd
) != 1)
3172 /* ECOFF linker code. */
3174 /* Routine to create an entry in an ECOFF link hash table. */
3176 static struct bfd_hash_entry
*
3177 ecoff_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3178 struct bfd_hash_table
*table
,
3181 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3183 /* Allocate the structure if it has not already been allocated by a
3186 ret
= ((struct ecoff_link_hash_entry
*)
3187 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3191 /* Call the allocation method of the superclass. */
3192 ret
= ((struct ecoff_link_hash_entry
*)
3193 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3198 /* Set local fields. */
3204 memset ((void *) &ret
->esym
, 0, sizeof ret
->esym
);
3206 return (struct bfd_hash_entry
*) ret
;
3209 /* Create an ECOFF link hash table. */
3211 struct bfd_link_hash_table
*
3212 _bfd_ecoff_bfd_link_hash_table_create (bfd
*abfd
)
3214 struct ecoff_link_hash_table
*ret
;
3215 bfd_size_type amt
= sizeof (struct ecoff_link_hash_table
);
3217 ret
= (struct ecoff_link_hash_table
*) bfd_malloc (amt
);
3220 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
3221 ecoff_link_hash_newfunc
,
3222 sizeof (struct ecoff_link_hash_entry
)))
3230 /* Look up an entry in an ECOFF link hash table. */
3232 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3233 ((struct ecoff_link_hash_entry *) \
3234 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3236 /* Get the ECOFF link hash table from the info structure. This is
3239 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3241 /* Add the external symbols of an object file to the global linker
3242 hash table. The external symbols and strings we are passed are
3243 just allocated on the stack, and will be discarded. We must
3244 explicitly save any information we may need later on in the link.
3245 We do not want to read the external symbol information again. */
3248 ecoff_link_add_externals (bfd
*abfd
,
3249 struct bfd_link_info
*info
,
3250 void * external_ext
,
3253 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3254 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
3255 = backend
->debug_swap
.swap_ext_in
;
3256 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3257 unsigned long ext_count
;
3258 struct bfd_link_hash_entry
**sym_hash
;
3263 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3266 amt
*= sizeof (struct bfd_link_hash_entry
*);
3267 sym_hash
= (struct bfd_link_hash_entry
**) bfd_alloc (abfd
, amt
);
3270 ecoff_data (abfd
)->sym_hashes
= (struct ecoff_link_hash_entry
**) sym_hash
;
3272 ext_ptr
= (char *) external_ext
;
3273 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3274 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3281 struct ecoff_link_hash_entry
*h
;
3285 (*swap_ext_in
) (abfd
, (void *) ext_ptr
, &esym
);
3287 /* Skip debugging symbols. */
3289 switch (esym
.asym
.st
)
3305 /* Get the information for this symbol. */
3306 value
= esym
.asym
.value
;
3307 switch (esym
.asym
.sc
)
3327 section
= bfd_make_section_old_way (abfd
, _TEXT
);
3328 value
-= section
->vma
;
3331 section
= bfd_make_section_old_way (abfd
, _DATA
);
3332 value
-= section
->vma
;
3335 section
= bfd_make_section_old_way (abfd
, _BSS
);
3336 value
-= section
->vma
;
3339 section
= bfd_abs_section_ptr
;
3342 section
= bfd_und_section_ptr
;
3345 section
= bfd_make_section_old_way (abfd
, _SDATA
);
3346 value
-= section
->vma
;
3349 section
= bfd_make_section_old_way (abfd
, _SBSS
);
3350 value
-= section
->vma
;
3353 section
= bfd_make_section_old_way (abfd
, _RDATA
);
3354 value
-= section
->vma
;
3357 if (value
> ecoff_data (abfd
)->gp_size
)
3359 section
= bfd_com_section_ptr
;
3364 if (ecoff_scom_section
.name
== NULL
)
3366 /* Initialize the small common section. */
3367 ecoff_scom_section
.name
= SCOMMON
;
3368 ecoff_scom_section
.flags
= SEC_IS_COMMON
;
3369 ecoff_scom_section
.output_section
= &ecoff_scom_section
;
3370 ecoff_scom_section
.symbol
= &ecoff_scom_symbol
;
3371 ecoff_scom_section
.symbol_ptr_ptr
= &ecoff_scom_symbol_ptr
;
3372 ecoff_scom_symbol
.name
= SCOMMON
;
3373 ecoff_scom_symbol
.flags
= BSF_SECTION_SYM
;
3374 ecoff_scom_symbol
.section
= &ecoff_scom_section
;
3375 ecoff_scom_symbol_ptr
= &ecoff_scom_symbol
;
3377 section
= &ecoff_scom_section
;
3380 section
= bfd_und_section_ptr
;
3383 section
= bfd_make_section_old_way (abfd
, _INIT
);
3384 value
-= section
->vma
;
3387 section
= bfd_make_section_old_way (abfd
, _FINI
);
3388 value
-= section
->vma
;
3391 section
= bfd_make_section_old_way (abfd
, _RCONST
);
3392 value
-= section
->vma
;
3396 if (section
== NULL
)
3399 name
= ssext
+ esym
.asym
.iss
;
3401 if (! (_bfd_generic_link_add_one_symbol
3403 (flagword
) (esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
),
3404 section
, value
, NULL
, TRUE
, TRUE
, sym_hash
)))
3407 h
= (struct ecoff_link_hash_entry
*) *sym_hash
;
3409 /* If we are building an ECOFF hash table, save the external
3410 symbol information. */
3411 if (bfd_get_flavour (info
->output_bfd
) == bfd_get_flavour (abfd
))
3414 || (! bfd_is_und_section (section
)
3415 && (! bfd_is_com_section (section
)
3416 || (h
->root
.type
!= bfd_link_hash_defined
3417 && h
->root
.type
!= bfd_link_hash_defweak
))))
3423 /* Remember whether this symbol was small undefined. */
3424 if (esym
.asym
.sc
== scSUndefined
)
3427 /* If this symbol was ever small undefined, it needs to wind
3428 up in a GP relative section. We can't control the
3429 section of a defined symbol, but we can control the
3430 section of a common symbol. This case is actually needed
3431 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3433 && h
->root
.type
== bfd_link_hash_common
3434 && streq (h
->root
.u
.c
.p
->section
->name
, SCOMMON
))
3436 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
3438 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
3439 if (h
->esym
.asym
.sc
== scCommon
)
3440 h
->esym
.asym
.sc
= scSCommon
;
3448 /* Add symbols from an ECOFF object file to the global linker hash
3452 ecoff_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3455 bfd_size_type external_ext_size
;
3456 void * external_ext
= NULL
;
3457 bfd_size_type esize
;
3461 if (! ecoff_slurp_symbolic_header (abfd
))
3464 /* If there are no symbols, we don't want it. */
3465 if (bfd_get_symcount (abfd
) == 0)
3468 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3470 /* Read in the external symbols and external strings. */
3471 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3472 esize
= symhdr
->iextMax
* external_ext_size
;
3473 external_ext
= bfd_malloc (esize
);
3474 if (external_ext
== NULL
&& esize
!= 0)
3477 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbExtOffset
, SEEK_SET
) != 0
3478 || bfd_bread (external_ext
, esize
, abfd
) != esize
)
3481 ssext
= (char *) bfd_malloc ((bfd_size_type
) symhdr
->issExtMax
);
3482 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3485 if (bfd_seek (abfd
, (file_ptr
) symhdr
->cbSsExtOffset
, SEEK_SET
) != 0
3486 || (bfd_bread (ssext
, (bfd_size_type
) symhdr
->issExtMax
, abfd
)
3487 != (bfd_size_type
) symhdr
->issExtMax
))
3490 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3494 if (external_ext
!= NULL
)
3495 free (external_ext
);
3501 if (external_ext
!= NULL
)
3502 free (external_ext
);
3506 /* Factored out from ecoff_link_check_archive_element. */
3509 read_ext_syms_and_strs (HDRR
**symhdr
, bfd_size_type
*external_ext_size
,
3510 bfd_size_type
*esize
, void **external_ext
, char **ssext
, bfd
*abfd
,
3511 const struct ecoff_backend_data
* const backend
)
3513 if (! ecoff_slurp_symbolic_header (abfd
))
3516 /* If there are no symbols, we don't want it. */
3517 if (bfd_get_symcount (abfd
) == 0)
3520 *symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3522 *external_ext_size
= backend
->debug_swap
.external_ext_size
;
3523 *esize
= (*symhdr
)->iextMax
* *external_ext_size
;
3524 *external_ext
= bfd_malloc (*esize
);
3525 if (*external_ext
== NULL
&& *esize
!= 0)
3528 if (bfd_seek (abfd
, (file_ptr
) (*symhdr
)->cbExtOffset
, SEEK_SET
) != 0
3529 || bfd_bread (*external_ext
, *esize
, abfd
) != *esize
)
3532 *ssext
= (char *) bfd_malloc ((bfd_size_type
) (*symhdr
)->issExtMax
);
3533 if (*ssext
== NULL
&& (*symhdr
)->issExtMax
!= 0)
3536 if (bfd_seek (abfd
, (file_ptr
) (*symhdr
)->cbSsExtOffset
, SEEK_SET
) != 0
3537 || (bfd_bread (*ssext
, (bfd_size_type
) (*symhdr
)->issExtMax
, abfd
)
3538 != (bfd_size_type
) (*symhdr
)->issExtMax
))
3544 reread_ext_syms_and_strs (HDRR
**symhdr
, bfd_size_type
*external_ext_size
,
3545 bfd_size_type
*esize
, void **external_ext
, char **ssext
, bfd
*abfd
,
3546 const struct ecoff_backend_data
* const backend
)
3548 if (*external_ext
!= NULL
)
3549 free (*external_ext
);
3550 *external_ext
= NULL
;
3554 return read_ext_syms_and_strs (symhdr
, external_ext_size
, esize
,
3555 external_ext
, ssext
, abfd
, backend
);
3558 /* This is called if we used _bfd_generic_link_add_archive_symbols
3559 because we were not dealing with an ECOFF archive. */
3562 ecoff_link_check_archive_element (bfd
*abfd
,
3563 struct bfd_link_info
*info
,
3564 bfd_boolean
*pneeded
)
3566 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3567 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
3568 = backend
->debug_swap
.swap_ext_in
;
3570 bfd_size_type external_ext_size
;
3571 void * external_ext
= NULL
;
3572 bfd_size_type esize
;
3579 /* Read in the external symbols and external strings. */
3580 if (!read_ext_syms_and_strs (&symhdr
, &external_ext_size
, &esize
,
3581 &external_ext
, &ssext
, abfd
, backend
))
3584 /* If there are no symbols, we don't want it. */
3585 if (bfd_get_symcount (abfd
) == 0)
3586 goto successful_return
;
3588 /* Look through the external symbols to see if they define some
3589 symbol that is currently undefined. */
3590 ext_ptr
= (char *) external_ext
;
3591 ext_end
= ext_ptr
+ esize
;
3592 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
)
3598 struct bfd_link_hash_entry
*h
;
3600 (*swap_ext_in
) (abfd
, (void *) ext_ptr
, &esym
);
3602 /* See if this symbol defines something. */
3603 if (esym
.asym
.st
!= stGlobal
3604 && esym
.asym
.st
!= stLabel
3605 && esym
.asym
.st
!= stProc
)
3608 switch (esym
.asym
.sc
)
3632 name
= ssext
+ esym
.asym
.iss
;
3633 h
= bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
3635 /* Unlike the generic linker, we do not pull in elements because
3636 of common symbols. */
3638 || h
->type
!= bfd_link_hash_undefined
)
3641 /* Include this element. */
3643 if (!(*info
->callbacks
3644 ->add_archive_element
) (info
, abfd
, name
, &abfd
))
3646 /* Potentially, the add_archive_element hook may have set a
3647 substitute BFD for us. */
3649 && !reread_ext_syms_and_strs (&symhdr
, &external_ext_size
, &esize
,
3650 &external_ext
, &ssext
, abfd
, backend
))
3652 if (! ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
))
3656 goto successful_return
;
3660 if (external_ext
!= NULL
)
3661 free (external_ext
);
3666 if (external_ext
!= NULL
)
3667 free (external_ext
);
3673 /* Add the symbols from an archive file to the global hash table.
3674 This looks through the undefined symbols, looks each one up in the
3675 archive hash table, and adds any associated object file. We do not
3676 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3677 already have a hash table, so there is no reason to construct
3681 ecoff_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3683 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3684 const bfd_byte
*raw_armap
;
3685 struct bfd_link_hash_entry
**pundef
;
3686 unsigned int armap_count
;
3687 unsigned int armap_log
;
3689 const bfd_byte
*hashtable
;
3690 const char *stringbase
;
3692 if (! bfd_has_map (abfd
))
3694 /* An empty archive is a special case. */
3695 if (bfd_openr_next_archived_file (abfd
, NULL
) == NULL
)
3697 bfd_set_error (bfd_error_no_armap
);
3701 /* If we don't have any raw data for this archive, as can happen on
3702 Irix 4.0.5F, we call the generic routine.
3703 FIXME: We should be more clever about this, since someday tdata
3704 may get to something for a generic archive. */
3705 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3706 if (raw_armap
== NULL
)
3707 return (_bfd_generic_link_add_archive_symbols
3708 (abfd
, info
, ecoff_link_check_archive_element
));
3710 armap_count
= H_GET_32 (abfd
, raw_armap
);
3713 for (i
= 1; i
< armap_count
; i
<<= 1)
3715 BFD_ASSERT (i
== armap_count
);
3717 hashtable
= raw_armap
+ 4;
3718 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3720 /* Look through the list of undefined symbols. */
3721 pundef
= &info
->hash
->undefs
;
3722 while (*pundef
!= NULL
)
3724 struct bfd_link_hash_entry
*h
;
3725 unsigned int hash
, rehash
= 0;
3726 unsigned int file_offset
;
3732 /* When a symbol is defined, it is not necessarily removed from
3734 if (h
->type
!= bfd_link_hash_undefined
3735 && h
->type
!= bfd_link_hash_common
)
3737 /* Remove this entry from the list, for general cleanliness
3738 and because we are going to look through the list again
3739 if we search any more libraries. We can't remove the
3740 entry if it is the tail, because that would lose any
3741 entries we add to the list later on. */
3742 if (*pundef
!= info
->hash
->undefs_tail
)
3743 *pundef
= (*pundef
)->u
.undef
.next
;
3745 pundef
= &(*pundef
)->u
.undef
.next
;
3749 /* Native ECOFF linkers do not pull in archive elements merely
3750 to satisfy common definitions, so neither do we. We leave
3751 them on the list, though, in case we are linking against some
3752 other object format. */
3753 if (h
->type
!= bfd_link_hash_undefined
)
3755 pundef
= &(*pundef
)->u
.undef
.next
;
3759 /* Look for this symbol in the archive hash table. */
3760 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3763 file_offset
= H_GET_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3764 if (file_offset
== 0)
3766 /* Nothing in this slot. */
3767 pundef
= &(*pundef
)->u
.undef
.next
;
3771 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (hash
* 8));
3772 if (name
[0] != h
->root
.string
[0]
3773 || ! streq (name
, h
->root
.string
))
3778 /* That was the wrong symbol. Try rehashing. */
3780 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3782 srch
= (srch
+ rehash
) & (armap_count
- 1))
3784 file_offset
= H_GET_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3785 if (file_offset
== 0)
3787 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (srch
* 8));
3788 if (name
[0] == h
->root
.string
[0]
3789 && streq (name
, h
->root
.string
))
3798 pundef
= &(*pundef
)->u
.undef
.next
;
3805 element
= (*backend
->get_elt_at_filepos
) (abfd
, (file_ptr
) file_offset
);
3806 if (element
== NULL
)
3809 if (! bfd_check_format (element
, bfd_object
))
3812 /* Unlike the generic linker, we know that this element provides
3813 a definition for an undefined symbol and we know that we want
3814 to include it. We don't need to check anything. */
3815 if (!(*info
->callbacks
3816 ->add_archive_element
) (info
, element
, name
, &element
))
3818 if (! ecoff_link_add_object_symbols (element
, info
))
3821 pundef
= &(*pundef
)->u
.undef
.next
;
3827 /* Given an ECOFF BFD, add symbols to the global hash table as
3831 _bfd_ecoff_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3833 switch (bfd_get_format (abfd
))
3836 return ecoff_link_add_object_symbols (abfd
, info
);
3838 return ecoff_link_add_archive_symbols (abfd
, info
);
3840 bfd_set_error (bfd_error_wrong_format
);
3846 /* ECOFF final link routines. */
3848 /* Structure used to pass information to ecoff_link_write_external. */
3853 struct bfd_link_info
*info
;
3856 /* Accumulate the debugging information for an input BFD into the
3857 output BFD. This must read in the symbolic information of the
3861 ecoff_final_link_debug_accumulate (bfd
*output_bfd
,
3863 struct bfd_link_info
*info
,
3866 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
3867 const struct ecoff_debug_swap
* const swap
=
3868 &ecoff_backend (input_bfd
)->debug_swap
;
3869 HDRR
*symhdr
= &debug
->symbolic_header
;
3872 #define READ(ptr, offset, count, size, type) \
3873 if (symhdr->count == 0) \
3874 debug->ptr = NULL; \
3877 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
3878 debug->ptr = (type) bfd_malloc (amt); \
3879 if (debug->ptr == NULL) \
3882 goto return_something; \
3884 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
3885 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
3888 goto return_something; \
3892 /* If raw_syments is not NULL, then the data was already by read by
3893 _bfd_ecoff_slurp_symbolic_info. */
3894 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3896 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
3898 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, void *);
3899 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, void *);
3900 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, void *);
3901 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, void *);
3902 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
3904 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
3905 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, void *);
3906 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, void *);
3910 /* We do not read the external strings or the external symbols. */
3912 ret
= (bfd_ecoff_debug_accumulate
3913 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
3914 &ecoff_backend (output_bfd
)->debug_swap
,
3915 input_bfd
, debug
, swap
, info
));
3918 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3920 if (debug
->line
!= NULL
)
3922 if (debug
->external_dnr
!= NULL
)
3923 free (debug
->external_dnr
);
3924 if (debug
->external_pdr
!= NULL
)
3925 free (debug
->external_pdr
);
3926 if (debug
->external_sym
!= NULL
)
3927 free (debug
->external_sym
);
3928 if (debug
->external_opt
!= NULL
)
3929 free (debug
->external_opt
);
3930 if (debug
->external_aux
!= NULL
)
3931 free (debug
->external_aux
);
3932 if (debug
->ss
!= NULL
)
3934 if (debug
->external_fdr
!= NULL
)
3935 free (debug
->external_fdr
);
3936 if (debug
->external_rfd
!= NULL
)
3937 free (debug
->external_rfd
);
3939 /* Make sure we don't accidentally follow one of these pointers
3940 into freed memory. */
3942 debug
->external_dnr
= NULL
;
3943 debug
->external_pdr
= NULL
;
3944 debug
->external_sym
= NULL
;
3945 debug
->external_opt
= NULL
;
3946 debug
->external_aux
= NULL
;
3948 debug
->external_fdr
= NULL
;
3949 debug
->external_rfd
= NULL
;
3955 /* Relocate and write an ECOFF section into an ECOFF output file. */
3958 ecoff_indirect_link_order (bfd
*output_bfd
,
3959 struct bfd_link_info
*info
,
3960 asection
*output_section
,
3961 struct bfd_link_order
*link_order
)
3963 asection
*input_section
;
3965 bfd_byte
*contents
= NULL
;
3966 bfd_size_type external_reloc_size
;
3967 bfd_size_type external_relocs_size
;
3968 void * external_relocs
= NULL
;
3970 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
3972 input_section
= link_order
->u
.indirect
.section
;
3973 input_bfd
= input_section
->owner
;
3974 if (input_section
->size
== 0)
3977 BFD_ASSERT (input_section
->output_section
== output_section
);
3978 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
3979 BFD_ASSERT (input_section
->size
== link_order
->size
);
3981 /* Get the section contents. */
3982 if (!bfd_malloc_and_get_section (input_bfd
, input_section
, &contents
))
3985 /* Get the relocs. If we are relaxing MIPS code, they will already
3986 have been read in. Otherwise, we read them in now. */
3987 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
3988 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
3990 external_relocs
= bfd_malloc (external_relocs_size
);
3991 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
3994 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0
3995 || (bfd_bread (external_relocs
, external_relocs_size
, input_bfd
)
3996 != external_relocs_size
))
3999 /* Relocate the section contents. */
4000 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
4001 (output_bfd
, info
, input_bfd
, input_section
, contents
,
4005 /* Write out the relocated section. */
4006 if (! bfd_set_section_contents (output_bfd
,
4009 input_section
->output_offset
,
4010 input_section
->size
))
4013 /* If we are producing relocatable output, the relocs were
4014 modified, and we write them out now. We use the reloc_count
4015 field of output_section to keep track of the number of relocs we
4016 have output so far. */
4017 if (info
->relocatable
)
4019 file_ptr pos
= (output_section
->rel_filepos
4020 + output_section
->reloc_count
* external_reloc_size
);
4021 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
4022 || (bfd_bwrite (external_relocs
, external_relocs_size
, output_bfd
)
4023 != external_relocs_size
))
4025 output_section
->reloc_count
+= input_section
->reloc_count
;
4028 if (contents
!= NULL
)
4030 if (external_relocs
!= NULL
)
4031 free (external_relocs
);
4035 if (contents
!= NULL
)
4037 if (external_relocs
!= NULL
)
4038 free (external_relocs
);
4042 /* Generate a reloc when linking an ECOFF file. This is a reloc
4043 requested by the linker, and does come from any input file. This
4044 is used to build constructor and destructor tables when linking
4048 ecoff_reloc_link_order (bfd
*output_bfd
,
4049 struct bfd_link_info
*info
,
4050 asection
*output_section
,
4051 struct bfd_link_order
*link_order
)
4053 enum bfd_link_order_type type
;
4057 struct internal_reloc in
;
4058 bfd_size_type external_reloc_size
;
4063 type
= link_order
->type
;
4065 addend
= link_order
->u
.reloc
.p
->addend
;
4067 /* We set up an arelent to pass to the backend adjust_reloc_out
4069 rel
.address
= link_order
->offset
;
4071 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
4074 bfd_set_error (bfd_error_bad_value
);
4078 if (type
== bfd_section_reloc_link_order
)
4080 section
= link_order
->u
.reloc
.p
->u
.section
;
4081 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
4085 struct bfd_link_hash_entry
*h
;
4087 /* Treat a reloc against a defined symbol as though it were
4088 actually against the section. */
4089 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4090 link_order
->u
.reloc
.p
->u
.name
,
4091 FALSE
, FALSE
, FALSE
);
4093 && (h
->type
== bfd_link_hash_defined
4094 || h
->type
== bfd_link_hash_defweak
))
4096 type
= bfd_section_reloc_link_order
;
4097 section
= h
->u
.def
.section
->output_section
;
4098 /* It seems that we ought to add the symbol value to the
4099 addend here, but in practice it has already been added
4100 because it was passed to constructor_callback. */
4101 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
4105 /* We can't set up a reloc against a symbol correctly,
4106 because we have no asymbol structure. Currently no
4107 adjust_reloc_out routine cares. */
4108 rel
.sym_ptr_ptr
= NULL
;
4112 /* All ECOFF relocs are in-place. Put the addend into the object
4115 BFD_ASSERT (rel
.howto
->partial_inplace
);
4119 bfd_reloc_status_type rstat
;
4122 size
= bfd_get_reloc_size (rel
.howto
);
4123 buf
= (bfd_byte
*) bfd_zmalloc (size
);
4126 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
,
4127 (bfd_vma
) addend
, buf
);
4133 case bfd_reloc_outofrange
:
4135 case bfd_reloc_overflow
:
4136 if (! ((*info
->callbacks
->reloc_overflow
)
4138 (link_order
->type
== bfd_section_reloc_link_order
4139 ? bfd_section_name (output_bfd
, section
)
4140 : link_order
->u
.reloc
.p
->u
.name
),
4141 rel
.howto
->name
, addend
, NULL
,
4142 NULL
, (bfd_vma
) 0)))
4149 ok
= bfd_set_section_contents (output_bfd
, output_section
, (void *) buf
,
4150 (file_ptr
) link_order
->offset
, size
);
4158 /* Move the information into an internal_reloc structure. */
4159 in
.r_vaddr
= (rel
.address
4160 + bfd_get_section_vma (output_bfd
, output_section
));
4161 in
.r_type
= rel
.howto
->type
;
4163 if (type
== bfd_symbol_reloc_link_order
)
4165 struct ecoff_link_hash_entry
*h
;
4167 h
= ((struct ecoff_link_hash_entry
*)
4168 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
4169 link_order
->u
.reloc
.p
->u
.name
,
4170 FALSE
, FALSE
, TRUE
));
4173 in
.r_symndx
= h
->indx
;
4176 if (! ((*info
->callbacks
->unattached_reloc
)
4177 (info
, link_order
->u
.reloc
.p
->u
.name
, NULL
,
4178 NULL
, (bfd_vma
) 0)))
4195 { _TEXT
, RELOC_SECTION_TEXT
},
4196 { _RDATA
, RELOC_SECTION_RDATA
},
4197 { _DATA
, RELOC_SECTION_DATA
},
4198 { _SDATA
, RELOC_SECTION_SDATA
},
4199 { _SBSS
, RELOC_SECTION_SBSS
},
4200 { _BSS
, RELOC_SECTION_BSS
},
4201 { _INIT
, RELOC_SECTION_INIT
},
4202 { _LIT8
, RELOC_SECTION_LIT8
},
4203 { _LIT4
, RELOC_SECTION_LIT4
},
4204 { _XDATA
, RELOC_SECTION_XDATA
},
4205 { _PDATA
, RELOC_SECTION_PDATA
},
4206 { _FINI
, RELOC_SECTION_FINI
},
4207 { _LITA
, RELOC_SECTION_LITA
},
4208 { "*ABS*", RELOC_SECTION_ABS
},
4209 { _RCONST
, RELOC_SECTION_RCONST
}
4212 name
= bfd_get_section_name (output_bfd
, section
);
4214 for (i
= 0; i
< ARRAY_SIZE (section_symndx
); i
++)
4215 if (streq (name
, section_symndx
[i
].name
))
4217 in
.r_symndx
= section_symndx
[i
].r_symndx
;
4221 if (i
== ARRAY_SIZE (section_symndx
))
4227 /* Let the BFD backend adjust the reloc. */
4228 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4230 /* Get some memory and swap out the reloc. */
4231 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4232 rbuf
= (bfd_byte
*) bfd_malloc (external_reloc_size
);
4236 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (void *) rbuf
);
4238 pos
= (output_section
->rel_filepos
4239 + output_section
->reloc_count
* external_reloc_size
);
4240 ok
= (bfd_seek (output_bfd
, pos
, SEEK_SET
) == 0
4241 && (bfd_bwrite ((void *) rbuf
, external_reloc_size
, output_bfd
)
4242 == external_reloc_size
));
4245 ++output_section
->reloc_count
;
4252 /* Put out information for an external symbol. These come only from
4256 ecoff_link_write_external (struct bfd_hash_entry
*bh
, void * data
)
4258 struct ecoff_link_hash_entry
*h
= (struct ecoff_link_hash_entry
*) bh
;
4259 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4260 bfd
*output_bfd
= einfo
->abfd
;
4263 if (h
->root
.type
== bfd_link_hash_warning
)
4265 h
= (struct ecoff_link_hash_entry
*) h
->root
.u
.i
.link
;
4266 if (h
->root
.type
== bfd_link_hash_new
)
4270 /* We need to check if this symbol is being stripped. */
4271 if (h
->root
.type
== bfd_link_hash_undefined
4272 || h
->root
.type
== bfd_link_hash_undefweak
)
4274 else if (einfo
->info
->strip
== strip_all
4275 || (einfo
->info
->strip
== strip_some
4276 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4277 h
->root
.root
.string
,
4278 FALSE
, FALSE
) == NULL
))
4283 if (strip
|| h
->written
)
4286 if (h
->abfd
== NULL
)
4289 h
->esym
.cobol_main
= 0;
4290 h
->esym
.weakext
= 0;
4291 h
->esym
.reserved
= 0;
4292 h
->esym
.ifd
= ifdNil
;
4293 h
->esym
.asym
.value
= 0;
4294 h
->esym
.asym
.st
= stGlobal
;
4296 if (h
->root
.type
!= bfd_link_hash_defined
4297 && h
->root
.type
!= bfd_link_hash_defweak
)
4298 h
->esym
.asym
.sc
= scAbs
;
4301 asection
*output_section
;
4309 section_storage_classes
[] =
4313 { _SDATA
, scSData
},
4314 { _RDATA
, scRData
},
4319 { _PDATA
, scPData
},
4320 { _XDATA
, scXData
},
4321 { _RCONST
, scRConst
}
4324 output_section
= h
->root
.u
.def
.section
->output_section
;
4325 name
= bfd_section_name (output_section
->owner
, output_section
);
4327 for (i
= 0; i
< ARRAY_SIZE (section_storage_classes
); i
++)
4328 if (streq (name
, section_storage_classes
[i
].name
))
4330 h
->esym
.asym
.sc
= section_storage_classes
[i
].sc
;
4334 if (i
== ARRAY_SIZE (section_storage_classes
))
4335 h
->esym
.asym
.sc
= scAbs
;
4338 h
->esym
.asym
.reserved
= 0;
4339 h
->esym
.asym
.index
= indexNil
;
4341 else if (h
->esym
.ifd
!= -1)
4343 struct ecoff_debug_info
*debug
;
4345 /* Adjust the FDR index for the symbol by that used for the
4347 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4348 BFD_ASSERT (h
->esym
.ifd
>= 0
4349 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4350 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4353 switch (h
->root
.type
)
4356 case bfd_link_hash_warning
:
4357 case bfd_link_hash_new
:
4359 case bfd_link_hash_undefined
:
4360 case bfd_link_hash_undefweak
:
4361 if (h
->esym
.asym
.sc
!= scUndefined
4362 && h
->esym
.asym
.sc
!= scSUndefined
)
4363 h
->esym
.asym
.sc
= scUndefined
;
4365 case bfd_link_hash_defined
:
4366 case bfd_link_hash_defweak
:
4367 if (h
->esym
.asym
.sc
== scUndefined
4368 || h
->esym
.asym
.sc
== scSUndefined
)
4369 h
->esym
.asym
.sc
= scAbs
;
4370 else if (h
->esym
.asym
.sc
== scCommon
)
4371 h
->esym
.asym
.sc
= scBss
;
4372 else if (h
->esym
.asym
.sc
== scSCommon
)
4373 h
->esym
.asym
.sc
= scSBss
;
4374 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4375 + h
->root
.u
.def
.section
->output_section
->vma
4376 + h
->root
.u
.def
.section
->output_offset
);
4378 case bfd_link_hash_common
:
4379 if (h
->esym
.asym
.sc
!= scCommon
4380 && h
->esym
.asym
.sc
!= scSCommon
)
4381 h
->esym
.asym
.sc
= scCommon
;
4382 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4384 case bfd_link_hash_indirect
:
4385 /* We ignore these symbols, since the indirected symbol is
4386 already in the hash table. */
4390 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4392 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4395 return (bfd_ecoff_debug_one_external
4396 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4397 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4401 /* ECOFF final link routine. This looks through all the input BFDs
4402 and gathers together all the debugging information, and then
4403 processes all the link order information. This may cause it to
4404 close and reopen some input BFDs; I'll see how bad this is. */
4407 _bfd_ecoff_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
4409 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4410 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4415 struct bfd_link_order
*p
;
4416 struct extsym_info einfo
;
4418 /* We accumulate the debugging information counts in the symbolic
4420 symhdr
= &debug
->symbolic_header
;
4422 symhdr
->ilineMax
= 0;
4426 symhdr
->isymMax
= 0;
4427 symhdr
->ioptMax
= 0;
4428 symhdr
->iauxMax
= 0;
4430 symhdr
->issExtMax
= 0;
4433 symhdr
->iextMax
= 0;
4435 /* We accumulate the debugging information itself in the debug_info
4438 debug
->external_dnr
= NULL
;
4439 debug
->external_pdr
= NULL
;
4440 debug
->external_sym
= NULL
;
4441 debug
->external_opt
= NULL
;
4442 debug
->external_aux
= NULL
;
4444 debug
->ssext
= debug
->ssext_end
= NULL
;
4445 debug
->external_fdr
= NULL
;
4446 debug
->external_rfd
= NULL
;
4447 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4449 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4453 /* Accumulate the debugging symbols from each input BFD. */
4454 for (input_bfd
= info
->input_bfds
;
4456 input_bfd
= input_bfd
->link_next
)
4460 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4462 /* Arbitrarily set the symbolic header vstamp to the vstamp
4463 of the first object file in the link. */
4464 if (symhdr
->vstamp
== 0)
4466 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4467 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4471 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4472 debug
, &backend
->debug_swap
,
4477 /* Combine the register masks. */
4478 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4479 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4480 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4481 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4482 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4483 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4486 /* Write out the external symbols. */
4489 bfd_hash_traverse (&info
->hash
->table
, ecoff_link_write_external
, &einfo
);
4491 if (info
->relocatable
)
4493 /* We need to make a pass over the link_orders to count up the
4494 number of relocations we will need to output, so that we know
4495 how much space they will take up. */
4496 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4499 for (p
= o
->map_head
.link_order
;
4502 if (p
->type
== bfd_indirect_link_order
)
4503 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4504 else if (p
->type
== bfd_section_reloc_link_order
4505 || p
->type
== bfd_symbol_reloc_link_order
)
4510 /* Compute the reloc and symbol file positions. */
4511 ecoff_compute_reloc_file_positions (abfd
);
4513 /* Write out the debugging information. */
4514 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4515 &backend
->debug_swap
, info
,
4516 ecoff_data (abfd
)->sym_filepos
))
4519 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4521 if (info
->relocatable
)
4523 /* Now reset the reloc_count field of the sections in the output
4524 BFD to 0, so that we can use them to keep track of how many
4525 relocs we have output thus far. */
4526 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4530 /* Get a value for the GP register. */
4531 if (ecoff_data (abfd
)->gp
== 0)
4533 struct bfd_link_hash_entry
*h
;
4535 h
= bfd_link_hash_lookup (info
->hash
, "_gp", FALSE
, FALSE
, TRUE
);
4537 && h
->type
== bfd_link_hash_defined
)
4538 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4539 + h
->u
.def
.section
->output_section
->vma
4540 + h
->u
.def
.section
->output_offset
);
4541 else if (info
->relocatable
)
4545 /* Make up a value. */
4547 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4550 && (streq (o
->name
, _SBSS
)
4551 || streq (o
->name
, _SDATA
)
4552 || streq (o
->name
, _LIT4
)
4553 || streq (o
->name
, _LIT8
)
4554 || streq (o
->name
, _LITA
)))
4557 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4561 /* If the relocate_section function needs to do a reloc
4562 involving the GP value, it should make a reloc_dangerous
4563 callback to warn that GP is not defined. */
4567 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4569 for (p
= o
->map_head
.link_order
;
4573 if (p
->type
== bfd_indirect_link_order
4574 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4575 == bfd_target_ecoff_flavour
))
4577 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4580 else if (p
->type
== bfd_section_reloc_link_order
4581 || p
->type
== bfd_symbol_reloc_link_order
)
4583 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4588 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4594 bfd_get_symcount (abfd
) = symhdr
->iextMax
+ symhdr
->isymMax
;
4596 ecoff_data (abfd
)->linker
= TRUE
;