1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright (C) 1990-2021 Free Software Foundation, Inc.
3 Original version by Per Bothner.
4 Full support added by Ian Lance Taylor, ian@cygnus.com.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
27 #include "ecoff-bfd.h"
29 #include "aout/stab_gnu.h"
31 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
32 some other stuff which we don't want and which conflicts with stuff
35 #include "aout/aout64.h"
38 #undef obj_sym_filepos
40 #include "coff/internal.h"
42 #include "coff/symconst.h"
43 #include "coff/ecoff.h"
46 #include "libiberty.h"
48 #define streq(a, b) (strcmp ((a), (b)) == 0)
49 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0)
52 /* This stuff is somewhat copied from coffcode.h. */
53 static asection bfd_debug_section
=
54 BFD_FAKE_SECTION (bfd_debug_section
, NULL
, "*DEBUG*", 0, 0);
56 /* Create an ECOFF object. */
59 _bfd_ecoff_mkobject (bfd
*abfd
)
61 size_t amt
= sizeof (ecoff_data_type
);
63 abfd
->tdata
.ecoff_obj_data
= (struct ecoff_tdata
*) bfd_zalloc (abfd
, amt
);
64 if (abfd
->tdata
.ecoff_obj_data
== NULL
)
70 /* This is a hook called by coff_real_object_p to create any backend
71 specific information. */
74 _bfd_ecoff_mkobject_hook (bfd
*abfd
, void * filehdr
, void * aouthdr
)
76 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
77 struct internal_aouthdr
*internal_a
= (struct internal_aouthdr
*) aouthdr
;
78 ecoff_data_type
*ecoff
;
80 if (! _bfd_ecoff_mkobject (abfd
))
83 ecoff
= ecoff_data (abfd
);
85 ecoff
->sym_filepos
= internal_f
->f_symptr
;
87 if (internal_a
!= NULL
)
91 ecoff
->text_start
= internal_a
->text_start
;
92 ecoff
->text_end
= internal_a
->text_start
+ internal_a
->tsize
;
93 ecoff
->gp
= internal_a
->gp_value
;
94 ecoff
->gprmask
= internal_a
->gprmask
;
95 for (i
= 0; i
< 4; i
++)
96 ecoff
->cprmask
[i
] = internal_a
->cprmask
[i
];
97 ecoff
->fprmask
= internal_a
->fprmask
;
98 if (internal_a
->magic
== ECOFF_AOUT_ZMAGIC
)
99 abfd
->flags
|= D_PAGED
;
101 abfd
->flags
&=~ D_PAGED
;
104 /* It turns out that no special action is required by the MIPS or
105 Alpha ECOFF backends. They have different information in the
106 a.out header, but we just copy it all (e.g., gprmask, cprmask and
107 fprmask) and let the swapping routines ensure that only relevant
108 information is written out. */
110 return (void *) ecoff
;
113 /* Initialize a new section. */
116 _bfd_ecoff_new_section_hook (bfd
*abfd
, asection
*section
)
126 { _TEXT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
127 { _INIT
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
128 { _FINI
, SEC_ALLOC
| SEC_CODE
| SEC_LOAD
},
129 { _DATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
},
130 { _SDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_SMALL_DATA
},
131 { _RDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
132 { _LIT8
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
| SEC_SMALL_DATA
},
133 { _LIT4
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
| SEC_SMALL_DATA
},
134 { _RCONST
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
135 { _PDATA
, SEC_ALLOC
| SEC_DATA
| SEC_LOAD
| SEC_READONLY
},
137 { _SBSS
, SEC_ALLOC
| SEC_SMALL_DATA
},
138 /* An Irix 4 shared libary. */
139 { _LIB
, SEC_COFF_SHARED_LIBRARY
}
142 section
->alignment_power
= 4;
144 for (i
= 0; i
< ARRAY_SIZE (section_flags
); i
++)
145 if (streq (section
->name
, section_flags
[i
].name
))
147 section
->flags
|= section_flags
[i
].flags
;
152 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
153 uncertain about .init on some systems and I don't know how shared
156 return _bfd_generic_new_section_hook (abfd
, section
);
160 _bfd_ecoff_set_alignment_hook (bfd
*abfd ATTRIBUTE_UNUSED
,
161 asection
*section ATTRIBUTE_UNUSED
,
162 void *scnhdr ATTRIBUTE_UNUSED
)
166 /* Determine the machine architecture and type. This is called from
167 the generic COFF routines. It is the inverse of ecoff_get_magic,
168 below. This could be an ECOFF backend routine, with one version
169 for each target, but there aren't all that many ECOFF targets. */
172 _bfd_ecoff_set_arch_mach_hook (bfd
*abfd
, void * filehdr
)
174 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
175 enum bfd_architecture arch
;
178 switch (internal_f
->f_magic
)
181 case MIPS_MAGIC_LITTLE
:
183 arch
= bfd_arch_mips
;
184 mach
= bfd_mach_mips3000
;
187 case MIPS_MAGIC_LITTLE2
:
188 case MIPS_MAGIC_BIG2
:
189 /* MIPS ISA level 2: the r6000. */
190 arch
= bfd_arch_mips
;
191 mach
= bfd_mach_mips6000
;
194 case MIPS_MAGIC_LITTLE3
:
195 case MIPS_MAGIC_BIG3
:
196 /* MIPS ISA level 3: the r4000. */
197 arch
= bfd_arch_mips
;
198 mach
= bfd_mach_mips4000
;
202 arch
= bfd_arch_alpha
;
207 arch
= bfd_arch_obscure
;
212 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
216 _bfd_ecoff_no_long_sections (bfd
*abfd
, int enable
)
223 /* Get the magic number to use based on the architecture and machine.
224 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
227 ecoff_get_magic (bfd
*abfd
)
231 switch (bfd_get_arch (abfd
))
234 switch (bfd_get_mach (abfd
))
238 case bfd_mach_mips3000
:
239 big
= MIPS_MAGIC_BIG
;
240 little
= MIPS_MAGIC_LITTLE
;
243 case bfd_mach_mips6000
:
244 big
= MIPS_MAGIC_BIG2
;
245 little
= MIPS_MAGIC_LITTLE2
;
248 case bfd_mach_mips4000
:
249 big
= MIPS_MAGIC_BIG3
;
250 little
= MIPS_MAGIC_LITTLE3
;
254 return bfd_big_endian (abfd
) ? big
: little
;
265 /* Get the section s_flags to use for a section. */
268 ecoff_sec_to_styp_flags (const char *name
, flagword flags
)
278 { _TEXT
, STYP_TEXT
},
279 { _DATA
, STYP_DATA
},
280 { _SDATA
, STYP_SDATA
},
281 { _RDATA
, STYP_RDATA
},
282 { _LITA
, STYP_LITA
},
283 { _LIT8
, STYP_LIT8
},
284 { _LIT4
, STYP_LIT4
},
286 { _SBSS
, STYP_SBSS
},
287 { _INIT
, STYP_ECOFF_INIT
},
288 { _FINI
, STYP_ECOFF_FINI
},
289 { _PDATA
, STYP_PDATA
},
290 { _XDATA
, STYP_XDATA
},
291 { _LIB
, STYP_ECOFF_LIB
},
293 { _HASH
, STYP_HASH
},
294 { _DYNAMIC
, STYP_DYNAMIC
},
295 { _LIBLIST
, STYP_LIBLIST
},
296 { _RELDYN
, STYP_RELDYN
},
297 { _CONFLIC
, STYP_CONFLIC
},
298 { _DYNSTR
, STYP_DYNSTR
},
299 { _DYNSYM
, STYP_DYNSYM
},
300 { _RCONST
, STYP_RCONST
}
304 for (i
= 0; i
< ARRAY_SIZE (styp_flags
); i
++)
305 if (streq (name
, styp_flags
[i
].name
))
307 styp
= styp_flags
[i
].flags
;
313 if (streq (name
, _COMMENT
))
316 flags
&=~ SEC_NEVER_LOAD
;
318 else if (flags
& SEC_CODE
)
320 else if (flags
& SEC_DATA
)
322 else if (flags
& SEC_READONLY
)
324 else if (flags
& SEC_LOAD
)
330 if (flags
& SEC_NEVER_LOAD
)
336 /* Get the BFD flags to use for a section. */
339 _bfd_ecoff_styp_to_sec_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
341 const char *name ATTRIBUTE_UNUSED
,
342 asection
*section ATTRIBUTE_UNUSED
,
343 flagword
* flags_ptr
)
345 struct internal_scnhdr
*internal_s
= (struct internal_scnhdr
*) hdr
;
346 long styp_flags
= internal_s
->s_flags
;
347 flagword sec_flags
= 0;
349 if (styp_flags
& STYP_NOLOAD
)
350 sec_flags
|= SEC_NEVER_LOAD
;
352 /* For 386 COFF, at least, an unloadable text or data section is
353 actually a shared library section. */
354 if ((styp_flags
& STYP_TEXT
)
355 || (styp_flags
& STYP_ECOFF_INIT
)
356 || (styp_flags
& STYP_ECOFF_FINI
)
357 || (styp_flags
& STYP_DYNAMIC
)
358 || (styp_flags
& STYP_LIBLIST
)
359 || (styp_flags
& STYP_RELDYN
)
360 || styp_flags
== STYP_CONFLIC
361 || (styp_flags
& STYP_DYNSTR
)
362 || (styp_flags
& STYP_DYNSYM
)
363 || (styp_flags
& STYP_HASH
))
365 if (sec_flags
& SEC_NEVER_LOAD
)
366 sec_flags
|= SEC_CODE
| SEC_COFF_SHARED_LIBRARY
;
368 sec_flags
|= SEC_CODE
| SEC_LOAD
| SEC_ALLOC
;
370 else if ((styp_flags
& STYP_DATA
)
371 || (styp_flags
& STYP_RDATA
)
372 || (styp_flags
& STYP_SDATA
)
373 || styp_flags
== STYP_PDATA
374 || styp_flags
== STYP_XDATA
375 || (styp_flags
& STYP_GOT
)
376 || styp_flags
== STYP_RCONST
)
378 if (sec_flags
& SEC_NEVER_LOAD
)
379 sec_flags
|= SEC_DATA
| SEC_COFF_SHARED_LIBRARY
;
381 sec_flags
|= SEC_DATA
| SEC_LOAD
| SEC_ALLOC
;
382 if ((styp_flags
& STYP_RDATA
)
383 || styp_flags
== STYP_PDATA
384 || styp_flags
== STYP_RCONST
)
385 sec_flags
|= SEC_READONLY
;
386 if (styp_flags
& STYP_SDATA
)
387 sec_flags
|= SEC_SMALL_DATA
;
389 else if (styp_flags
& STYP_SBSS
)
390 sec_flags
|= SEC_ALLOC
| SEC_SMALL_DATA
;
391 else if (styp_flags
& STYP_BSS
)
392 sec_flags
|= SEC_ALLOC
;
393 else if ((styp_flags
& STYP_INFO
) || styp_flags
== STYP_COMMENT
)
394 sec_flags
|= SEC_NEVER_LOAD
;
395 else if ((styp_flags
& STYP_LITA
)
396 || (styp_flags
& STYP_LIT8
)
397 || (styp_flags
& STYP_LIT4
))
398 sec_flags
|= SEC_DATA
|SEC_SMALL_DATA
| SEC_LOAD
| SEC_ALLOC
| SEC_READONLY
;
399 else if (styp_flags
& STYP_ECOFF_LIB
)
400 sec_flags
|= SEC_COFF_SHARED_LIBRARY
;
402 sec_flags
|= SEC_ALLOC
| SEC_LOAD
;
404 * flags_ptr
= sec_flags
;
408 /* Read in the symbolic header for an ECOFF object file. */
411 ecoff_slurp_symbolic_header (bfd
*abfd
)
413 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
414 bfd_size_type external_hdr_size
;
416 HDRR
*internal_symhdr
;
418 /* See if we've already read it in. */
419 if (ecoff_data (abfd
)->debug_info
.symbolic_header
.magic
==
420 backend
->debug_swap
.sym_magic
)
423 /* See whether there is a symbolic header. */
424 if (ecoff_data (abfd
)->sym_filepos
== 0)
430 /* At this point bfd_get_symcount (abfd) holds the number of symbols
431 as read from the file header, but on ECOFF this is always the
432 size of the symbolic information header. It would be cleaner to
433 handle this when we first read the file in coffgen.c. */
434 external_hdr_size
= backend
->debug_swap
.external_hdr_size
;
435 if (bfd_get_symcount (abfd
) != external_hdr_size
)
437 bfd_set_error (bfd_error_bad_value
);
441 /* Read the symbolic information header. */
442 if (bfd_seek (abfd
, ecoff_data (abfd
)->sym_filepos
, SEEK_SET
) != 0)
444 raw
= _bfd_malloc_and_read (abfd
, external_hdr_size
, external_hdr_size
);
448 internal_symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
449 (*backend
->debug_swap
.swap_hdr_in
) (abfd
, raw
, internal_symhdr
);
451 if (internal_symhdr
->magic
!= backend
->debug_swap
.sym_magic
)
453 bfd_set_error (bfd_error_bad_value
);
457 /* Now we can get the correct number of symbols. */
458 abfd
->symcount
= internal_symhdr
->isymMax
+ internal_symhdr
->iextMax
;
467 /* Read in and swap the important symbolic information for an ECOFF
468 object file. This is called by gdb via the read_debug_info entry
469 point in the backend structure. */
472 _bfd_ecoff_slurp_symbolic_info (bfd
*abfd
,
473 asection
*ignore ATTRIBUTE_UNUSED
,
474 struct ecoff_debug_info
*debug
)
476 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
477 HDRR
*internal_symhdr
;
478 bfd_size_type raw_base
;
479 bfd_size_type raw_size
;
481 bfd_size_type external_fdr_size
;
485 bfd_size_type raw_end
;
486 bfd_size_type cb_end
;
490 BFD_ASSERT (debug
== &ecoff_data (abfd
)->debug_info
);
492 /* Check whether we've already gotten it, and whether there's any to
494 if (ecoff_data (abfd
)->raw_syments
!= NULL
)
496 if (ecoff_data (abfd
)->sym_filepos
== 0)
502 if (! ecoff_slurp_symbolic_header (abfd
))
505 internal_symhdr
= &debug
->symbolic_header
;
507 /* Read all the symbolic information at once. */
508 raw_base
= (ecoff_data (abfd
)->sym_filepos
509 + backend
->debug_swap
.external_hdr_size
);
511 /* Alpha ecoff makes the determination of raw_size difficult. It has
512 an undocumented debug data section between the symhdr and the first
513 documented section. And the ordering of the sections varies between
514 statically and dynamically linked executables.
515 If bfd supports SEEK_END someday, this code could be simplified. */
518 #define UPDATE_RAW_END(start, count, size) \
519 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
520 if (cb_end > raw_end) \
523 UPDATE_RAW_END (cbLineOffset
, cbLine
, sizeof (unsigned char));
524 UPDATE_RAW_END (cbDnOffset
, idnMax
, backend
->debug_swap
.external_dnr_size
);
525 UPDATE_RAW_END (cbPdOffset
, ipdMax
, backend
->debug_swap
.external_pdr_size
);
526 UPDATE_RAW_END (cbSymOffset
, isymMax
, backend
->debug_swap
.external_sym_size
);
527 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
528 optimization symtab, not the number of entries. */
529 UPDATE_RAW_END (cbOptOffset
, ioptMax
, sizeof (char));
530 UPDATE_RAW_END (cbAuxOffset
, iauxMax
, sizeof (union aux_ext
));
531 UPDATE_RAW_END (cbSsOffset
, issMax
, sizeof (char));
532 UPDATE_RAW_END (cbSsExtOffset
, issExtMax
, sizeof (char));
533 UPDATE_RAW_END (cbFdOffset
, ifdMax
, backend
->debug_swap
.external_fdr_size
);
534 UPDATE_RAW_END (cbRfdOffset
, crfd
, backend
->debug_swap
.external_rfd_size
);
535 UPDATE_RAW_END (cbExtOffset
, iextMax
, backend
->debug_swap
.external_ext_size
);
537 #undef UPDATE_RAW_END
539 raw_size
= raw_end
- raw_base
;
542 ecoff_data (abfd
)->sym_filepos
= 0;
545 pos
= ecoff_data (abfd
)->sym_filepos
;
546 pos
+= backend
->debug_swap
.external_hdr_size
;
547 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
549 raw
= _bfd_alloc_and_read (abfd
, raw_size
, raw_size
);
553 ecoff_data (abfd
)->raw_syments
= raw
;
555 /* Get pointers for the numeric offsets in the HDRR structure. */
556 #define FIX(off1, off2, type) \
557 if (internal_symhdr->off1 == 0) \
558 debug->off2 = NULL; \
560 debug->off2 = (type) ((char *) raw \
561 + (internal_symhdr->off1 \
564 FIX (cbLineOffset
, line
, unsigned char *);
565 FIX (cbDnOffset
, external_dnr
, void *);
566 FIX (cbPdOffset
, external_pdr
, void *);
567 FIX (cbSymOffset
, external_sym
, void *);
568 FIX (cbOptOffset
, external_opt
, void *);
569 FIX (cbAuxOffset
, external_aux
, union aux_ext
*);
570 FIX (cbSsOffset
, ss
, char *);
571 FIX (cbSsExtOffset
, ssext
, char *);
572 FIX (cbFdOffset
, external_fdr
, void *);
573 FIX (cbRfdOffset
, external_rfd
, void *);
574 FIX (cbExtOffset
, external_ext
, void *);
577 /* I don't want to always swap all the data, because it will just
578 waste time and most programs will never look at it. The only
579 time the linker needs most of the debugging information swapped
580 is when linking big-endian and little-endian MIPS object files
581 together, which is not a common occurrence.
583 We need to look at the fdr to deal with a lot of information in
584 the symbols, so we swap them here. */
585 if (_bfd_mul_overflow ((unsigned long) internal_symhdr
->ifdMax
,
586 sizeof (struct fdr
), &amt
))
588 bfd_set_error (bfd_error_file_too_big
);
591 debug
->fdr
= (FDR
*) bfd_alloc (abfd
, amt
);
592 if (debug
->fdr
== NULL
)
594 external_fdr_size
= backend
->debug_swap
.external_fdr_size
;
595 fdr_ptr
= debug
->fdr
;
596 fraw_src
= (char *) debug
->external_fdr
;
597 /* PR 17512: file: 3372-1243-0.004. */
598 if (fraw_src
== NULL
&& internal_symhdr
->ifdMax
> 0)
600 fraw_end
= fraw_src
+ internal_symhdr
->ifdMax
* external_fdr_size
;
601 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
602 (*backend
->debug_swap
.swap_fdr_in
) (abfd
, (void *) fraw_src
, fdr_ptr
);
607 /* ECOFF symbol table routines. The ECOFF symbol table is described
608 in gcc/mips-tfile.c. */
610 /* ECOFF uses two common sections. One is the usual one, and the
611 other is for small objects. All the small objects are kept
612 together, and then referenced via the gp pointer, which yields
613 faster assembler code. This is what we use for the small common
615 static asection ecoff_scom_section
;
616 static const asymbol ecoff_scom_symbol
=
617 GLOBAL_SYM_INIT (SCOMMON
, &ecoff_scom_section
);
618 static asection ecoff_scom_section
=
619 BFD_FAKE_SECTION (ecoff_scom_section
, &ecoff_scom_symbol
,
620 SCOMMON
, 0, SEC_IS_COMMON
| SEC_SMALL_DATA
);
622 /* Create an empty symbol. */
625 _bfd_ecoff_make_empty_symbol (bfd
*abfd
)
627 ecoff_symbol_type
*new_symbol
;
628 size_t amt
= sizeof (ecoff_symbol_type
);
630 new_symbol
= (ecoff_symbol_type
*) bfd_zalloc (abfd
, amt
);
631 if (new_symbol
== NULL
)
633 new_symbol
->symbol
.section
= NULL
;
634 new_symbol
->fdr
= NULL
;
635 new_symbol
->local
= FALSE
;
636 new_symbol
->native
= NULL
;
637 new_symbol
->symbol
.the_bfd
= abfd
;
638 return &new_symbol
->symbol
;
641 /* Set the BFD flags and section for an ECOFF symbol. */
644 ecoff_set_symbol_info (bfd
*abfd
,
650 asym
->the_bfd
= abfd
;
651 asym
->value
= ecoff_sym
->value
;
652 asym
->section
= &bfd_debug_section
;
655 /* Most symbol types are just for debugging. */
656 switch (ecoff_sym
->st
)
665 if (ECOFF_IS_STAB (ecoff_sym
))
667 asym
->flags
= BSF_DEBUGGING
;
672 asym
->flags
= BSF_DEBUGGING
;
677 asym
->flags
= BSF_EXPORT
| BSF_WEAK
;
679 asym
->flags
= BSF_EXPORT
| BSF_GLOBAL
;
682 asym
->flags
= BSF_LOCAL
;
683 /* Normally, a local stProc symbol will have a corresponding
684 external symbol. We mark the local symbol as a debugging
685 symbol, in order to prevent nm from printing both out.
686 Similarly, we mark stLabel and stabs symbols as debugging
687 symbols. In both cases, we do want to set the value
688 correctly based on the symbol class. */
689 if (ecoff_sym
->st
== stProc
690 || ecoff_sym
->st
== stLabel
691 || ECOFF_IS_STAB (ecoff_sym
))
692 asym
->flags
|= BSF_DEBUGGING
;
695 if (ecoff_sym
->st
== stProc
|| ecoff_sym
->st
== stStaticProc
)
696 asym
->flags
|= BSF_FUNCTION
;
698 switch (ecoff_sym
->sc
)
701 /* Used for compiler generated labels. Leave them in the
702 debugging section, and mark them as local. If BSF_DEBUGGING
703 is set, then nm does not display them for some reason. If no
704 flags are set then the linker whines about them. */
705 asym
->flags
= BSF_LOCAL
;
708 asym
->section
= bfd_make_section_old_way (abfd
, _TEXT
);
709 asym
->value
-= asym
->section
->vma
;
712 asym
->section
= bfd_make_section_old_way (abfd
, _DATA
);
713 asym
->value
-= asym
->section
->vma
;
716 asym
->section
= bfd_make_section_old_way (abfd
, _BSS
);
717 asym
->value
-= asym
->section
->vma
;
720 asym
->flags
= BSF_DEBUGGING
;
723 asym
->section
= bfd_abs_section_ptr
;
726 asym
->section
= bfd_und_section_ptr
;
736 asym
->flags
= BSF_DEBUGGING
;
739 asym
->section
= bfd_make_section_old_way (abfd
, ".sdata");
740 asym
->value
-= asym
->section
->vma
;
743 asym
->section
= bfd_make_section_old_way (abfd
, ".sbss");
744 asym
->value
-= asym
->section
->vma
;
747 asym
->section
= bfd_make_section_old_way (abfd
, ".rdata");
748 asym
->value
-= asym
->section
->vma
;
751 asym
->flags
= BSF_DEBUGGING
;
754 if (asym
->value
> ecoff_data (abfd
)->gp_size
)
756 asym
->section
= bfd_com_section_ptr
;
762 asym
->section
= &ecoff_scom_section
;
767 asym
->flags
= BSF_DEBUGGING
;
770 asym
->section
= bfd_und_section_ptr
;
775 asym
->section
= bfd_make_section_old_way (abfd
, ".init");
776 asym
->value
-= asym
->section
->vma
;
781 asym
->flags
= BSF_DEBUGGING
;
784 asym
->section
= bfd_make_section_old_way (abfd
, ".fini");
785 asym
->value
-= asym
->section
->vma
;
788 asym
->section
= bfd_make_section_old_way (abfd
, ".rconst");
789 asym
->value
-= asym
->section
->vma
;
795 /* Look for special constructors symbols and make relocation entries
796 in a special construction section. These are produced by the
797 -fgnu-linker argument to g++. */
798 if (ECOFF_IS_STAB (ecoff_sym
))
800 switch (ECOFF_UNMARK_STAB (ecoff_sym
->index
))
809 /* Mark the symbol as a constructor. */
810 asym
->flags
|= BSF_CONSTRUCTOR
;
817 /* Read an ECOFF symbol table. */
820 _bfd_ecoff_slurp_symbol_table (bfd
*abfd
)
822 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
823 const bfd_size_type external_ext_size
824 = backend
->debug_swap
.external_ext_size
;
825 const bfd_size_type external_sym_size
826 = backend
->debug_swap
.external_sym_size
;
827 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
828 = backend
->debug_swap
.swap_ext_in
;
829 void (* const swap_sym_in
) (bfd
*, void *, SYMR
*)
830 = backend
->debug_swap
.swap_sym_in
;
831 ecoff_symbol_type
*internal
;
832 ecoff_symbol_type
*internal_ptr
;
839 /* If we've already read in the symbol table, do nothing. */
840 if (ecoff_data (abfd
)->canonical_symbols
!= NULL
)
843 /* Get the symbolic information. */
844 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
845 &ecoff_data (abfd
)->debug_info
))
847 if (bfd_get_symcount (abfd
) == 0)
850 if (_bfd_mul_overflow (bfd_get_symcount (abfd
),
851 sizeof (ecoff_symbol_type
), &amt
))
853 bfd_set_error (bfd_error_file_too_big
);
856 internal
= (ecoff_symbol_type
*) bfd_alloc (abfd
, amt
);
857 if (internal
== NULL
)
860 internal_ptr
= internal
;
861 eraw_src
= (char *) ecoff_data (abfd
)->debug_info
.external_ext
;
863 + (ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
864 * external_ext_size
));
865 for (; eraw_src
< eraw_end
; eraw_src
+= external_ext_size
, internal_ptr
++)
869 (*swap_ext_in
) (abfd
, (void *) eraw_src
, &internal_esym
);
871 /* PR 17512: file: 3372-1000-0.004. */
872 if (internal_esym
.asym
.iss
>= ecoff_data (abfd
)->debug_info
.symbolic_header
.issExtMax
873 || internal_esym
.asym
.iss
< 0)
876 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ssext
877 + internal_esym
.asym
.iss
);
879 if (!ecoff_set_symbol_info (abfd
, &internal_esym
.asym
,
880 &internal_ptr
->symbol
, 1,
881 internal_esym
.weakext
))
884 /* The alpha uses a negative ifd field for section symbols. */
885 if (internal_esym
.ifd
>= 0)
887 /* PR 17512: file: 3372-1983-0.004. */
888 if (internal_esym
.ifd
>= ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
)
889 internal_ptr
->fdr
= NULL
;
891 internal_ptr
->fdr
= (ecoff_data (abfd
)->debug_info
.fdr
892 + internal_esym
.ifd
);
895 internal_ptr
->fdr
= NULL
;
896 internal_ptr
->local
= FALSE
;
897 internal_ptr
->native
= (void *) eraw_src
;
900 /* The local symbols must be accessed via the fdr's, because the
901 string and aux indices are relative to the fdr information. */
902 fdr_ptr
= ecoff_data (abfd
)->debug_info
.fdr
;
903 fdr_end
= fdr_ptr
+ ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
;
904 for (; fdr_ptr
< fdr_end
; fdr_ptr
++)
909 lraw_src
= ((char *) ecoff_data (abfd
)->debug_info
.external_sym
910 + fdr_ptr
->isymBase
* external_sym_size
);
911 lraw_end
= lraw_src
+ fdr_ptr
->csym
* external_sym_size
;
914 lraw_src
+= external_sym_size
, internal_ptr
++)
918 (*swap_sym_in
) (abfd
, (void *) lraw_src
, &internal_sym
);
919 internal_ptr
->symbol
.name
= (ecoff_data (abfd
)->debug_info
.ss
922 if (!ecoff_set_symbol_info (abfd
, &internal_sym
,
923 &internal_ptr
->symbol
, 0, 0))
925 internal_ptr
->fdr
= fdr_ptr
;
926 internal_ptr
->local
= TRUE
;
927 internal_ptr
->native
= (void *) lraw_src
;
931 /* PR 17512: file: 3372-3080-0.004.
932 A discrepancy between ecoff_data (abfd)->debug_info.symbolic_header.isymMax
933 and ecoff_data (abfd)->debug_info.symbolic_header.ifdMax can mean that
934 we have fewer symbols than we were expecting. Allow for this by updating
935 the symbol count and warning the user. */
936 if (internal_ptr
- internal
< (ptrdiff_t) bfd_get_symcount (abfd
))
938 abfd
->symcount
= internal_ptr
- internal
;
940 /* xgettext:c-format */
941 (_("%pB: warning: isymMax (%ld) is greater than ifdMax (%ld)"),
942 abfd
, ecoff_data (abfd
)->debug_info
.symbolic_header
.isymMax
,
943 ecoff_data (abfd
)->debug_info
.symbolic_header
.ifdMax
);
946 ecoff_data (abfd
)->canonical_symbols
= internal
;
951 /* Return the amount of space needed for the canonical symbols. */
954 _bfd_ecoff_get_symtab_upper_bound (bfd
*abfd
)
956 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
,
957 &ecoff_data (abfd
)->debug_info
))
960 if (bfd_get_symcount (abfd
) == 0)
963 return (bfd_get_symcount (abfd
) + 1) * (sizeof (ecoff_symbol_type
*));
966 /* Get the canonical symbols. */
969 _bfd_ecoff_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
971 unsigned int counter
= 0;
972 ecoff_symbol_type
*symbase
;
973 ecoff_symbol_type
**location
= (ecoff_symbol_type
**) alocation
;
975 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
977 if (bfd_get_symcount (abfd
) == 0)
980 symbase
= ecoff_data (abfd
)->canonical_symbols
;
981 while (counter
< bfd_get_symcount (abfd
))
983 *(location
++) = symbase
++;
987 return bfd_get_symcount (abfd
);
990 /* Turn ECOFF type information into a printable string.
991 ecoff_emit_aggregate and ecoff_type_to_string are from
992 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
994 /* Write aggregate information to a string. */
997 ecoff_emit_aggregate (bfd
*abfd
,
1004 const struct ecoff_debug_swap
* const debug_swap
=
1005 &ecoff_backend (abfd
)->debug_swap
;
1006 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1007 unsigned int ifd
= rndx
->rfd
;
1008 unsigned int indx
= rndx
->index
;
1014 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1015 struct return type of a procedure compiled without -g. */
1016 if (ifd
== 0xffffffff
1017 || (rndx
->rfd
== 0xfff && indx
== 0))
1018 name
= "<undefined>";
1019 else if (indx
== indexNil
)
1025 if (debug_info
->external_rfd
== NULL
)
1026 fdr
= debug_info
->fdr
+ ifd
;
1031 (*debug_swap
->swap_rfd_in
) (abfd
,
1032 ((char *) debug_info
->external_rfd
1033 + ((fdr
->rfdBase
+ ifd
)
1034 * debug_swap
->external_rfd_size
)),
1036 fdr
= debug_info
->fdr
+ rfd
;
1039 indx
+= fdr
->isymBase
;
1041 (*debug_swap
->swap_sym_in
) (abfd
,
1042 ((char *) debug_info
->external_sym
1043 + indx
* debug_swap
->external_sym_size
),
1046 name
= debug_info
->ss
+ fdr
->issBase
+ sym
.iss
;
1050 "%s %s { ifd = %u, index = %lu }",
1052 ((unsigned long) indx
1053 + debug_info
->symbolic_header
.iextMax
));
1056 /* Convert the type information to string format. */
1059 ecoff_type_to_string (bfd
*abfd
, FDR
*fdr
, unsigned int indx
, char *buff
)
1061 union aux_ext
*aux_ptr
;
1071 unsigned int basic_type
;
1078 aux_ptr
= ecoff_data (abfd
)->debug_info
.external_aux
+ fdr
->iauxBase
;
1079 bigendian
= fdr
->fBigendian
;
1081 for (i
= 0; i
< 7; i
++)
1083 qualifiers
[i
].low_bound
= 0;
1084 qualifiers
[i
].high_bound
= 0;
1085 qualifiers
[i
].stride
= 0;
1088 if (AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
]) == (bfd_vma
) -1)
1089 return "-1 (no type)";
1090 _bfd_ecoff_swap_tir_in (bigendian
, &aux_ptr
[indx
++].a_ti
, &u
.ti
);
1092 basic_type
= u
.ti
.bt
;
1093 qualifiers
[0].type
= u
.ti
.tq0
;
1094 qualifiers
[1].type
= u
.ti
.tq1
;
1095 qualifiers
[2].type
= u
.ti
.tq2
;
1096 qualifiers
[3].type
= u
.ti
.tq3
;
1097 qualifiers
[4].type
= u
.ti
.tq4
;
1098 qualifiers
[5].type
= u
.ti
.tq5
;
1099 qualifiers
[6].type
= tqNil
;
1101 /* Go get the basic type. */
1104 case btNil
: /* Undefined. */
1108 case btAdr
: /* Address - integer same size as pointer. */
1109 strcpy (p1
, "address");
1112 case btChar
: /* Character. */
1113 strcpy (p1
, "char");
1116 case btUChar
: /* Unsigned character. */
1117 strcpy (p1
, "unsigned char");
1120 case btShort
: /* Short. */
1121 strcpy (p1
, "short");
1124 case btUShort
: /* Unsigned short. */
1125 strcpy (p1
, "unsigned short");
1128 case btInt
: /* Int. */
1132 case btUInt
: /* Unsigned int. */
1133 strcpy (p1
, "unsigned int");
1136 case btLong
: /* Long. */
1137 strcpy (p1
, "long");
1140 case btULong
: /* Unsigned long. */
1141 strcpy (p1
, "unsigned long");
1144 case btFloat
: /* Float (real). */
1145 strcpy (p1
, "float");
1148 case btDouble
: /* Double (real). */
1149 strcpy (p1
, "double");
1152 /* Structures add 1-2 aux words:
1153 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1154 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1156 case btStruct
: /* Structure (Record). */
1157 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1158 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1159 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1161 indx
++; /* Skip aux words. */
1164 /* Unions add 1-2 aux words:
1165 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1166 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1168 case btUnion
: /* Union. */
1169 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1170 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1171 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1173 indx
++; /* Skip aux words. */
1176 /* Enumerations add 1-2 aux words:
1177 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1178 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1180 case btEnum
: /* Enumeration. */
1181 _bfd_ecoff_swap_rndx_in (bigendian
, &aux_ptr
[indx
].a_rndx
, &rndx
);
1182 ecoff_emit_aggregate (abfd
, fdr
, p1
, &rndx
,
1183 (long) AUX_GET_ISYM (bigendian
, &aux_ptr
[indx
+1]),
1185 indx
++; /* Skip aux words. */
1188 case btTypedef
: /* Defined via a typedef, isymRef points. */
1189 strcpy (p1
, "typedef");
1192 case btRange
: /* Subrange of int. */
1193 strcpy (p1
, "subrange");
1196 case btSet
: /* Pascal sets. */
1200 case btComplex
: /* Fortran complex. */
1201 strcpy (p1
, "complex");
1204 case btDComplex
: /* Fortran double complex. */
1205 strcpy (p1
, "double complex");
1208 case btIndirect
: /* Forward or unnamed typedef. */
1209 strcpy (p1
, "forward/unamed typedef");
1212 case btFixedDec
: /* Fixed Decimal. */
1213 strcpy (p1
, "fixed decimal");
1216 case btFloatDec
: /* Float Decimal. */
1217 strcpy (p1
, "float decimal");
1220 case btString
: /* Varying Length Character String. */
1221 strcpy (p1
, "string");
1224 case btBit
: /* Aligned Bit String. */
1228 case btPicture
: /* Picture. */
1229 strcpy (p1
, "picture");
1232 case btVoid
: /* Void. */
1233 strcpy (p1
, "void");
1237 sprintf (p1
, _("unknown basic type %d"), (int) basic_type
);
1243 /* If this is a bitfield, get the bitsize. */
1248 bitsize
= AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
++]);
1249 sprintf (p1
, " : %d", bitsize
);
1252 /* Deal with any qualifiers. */
1253 if (qualifiers
[0].type
!= tqNil
)
1255 /* Snarf up any array bounds in the correct order. Arrays
1256 store 5 successive words in the aux. table:
1257 word 0 RNDXR to type of the bounds (ie, int)
1258 word 1 Current file descriptor index
1260 word 3 high bound (or -1 if [])
1261 word 4 stride size in bits. */
1262 for (i
= 0; i
< 7; i
++)
1264 if (qualifiers
[i
].type
== tqArray
)
1266 qualifiers
[i
].low_bound
=
1267 AUX_GET_DNLOW (bigendian
, &aux_ptr
[indx
+2]);
1268 qualifiers
[i
].high_bound
=
1269 AUX_GET_DNHIGH (bigendian
, &aux_ptr
[indx
+3]);
1270 qualifiers
[i
].stride
=
1271 AUX_GET_WIDTH (bigendian
, &aux_ptr
[indx
+4]);
1276 /* Now print out the qualifiers. */
1277 for (i
= 0; i
< 6; i
++)
1279 switch (qualifiers
[i
].type
)
1286 strcpy (p2
, "ptr to ");
1287 p2
+= sizeof ("ptr to ")-1;
1291 strcpy (p2
, "volatile ");
1292 p2
+= sizeof ("volatile ")-1;
1296 strcpy (p2
, "far ");
1297 p2
+= sizeof ("far ")-1;
1301 strcpy (p2
, "func. ret. ");
1302 p2
+= sizeof ("func. ret. ");
1307 int first_array
= i
;
1310 /* Print array bounds reversed (ie, in the order the C
1311 programmer writes them). C is such a fun language.... */
1312 while (i
< 5 && qualifiers
[i
+1].type
== tqArray
)
1315 for (j
= i
; j
>= first_array
; j
--)
1317 strcpy (p2
, "array [");
1318 p2
+= sizeof ("array [")-1;
1319 if (qualifiers
[j
].low_bound
!= 0)
1321 "%ld:%ld {%ld bits}",
1322 (long) qualifiers
[j
].low_bound
,
1323 (long) qualifiers
[j
].high_bound
,
1324 (long) qualifiers
[j
].stride
);
1326 else if (qualifiers
[j
].high_bound
!= -1)
1329 (long) (qualifiers
[j
].high_bound
+ 1),
1330 (long) (qualifiers
[j
].stride
));
1333 sprintf (p2
, " {%ld bits}", (long) qualifiers
[j
].stride
);
1336 strcpy (p2
, "] of ");
1337 p2
+= sizeof ("] of ")-1;
1345 strcpy (p2
, buffer1
);
1349 /* Return information about ECOFF symbol SYMBOL in RET. */
1352 _bfd_ecoff_get_symbol_info (bfd
*abfd ATTRIBUTE_UNUSED
,
1356 bfd_symbol_info (symbol
, ret
);
1359 /* Return whether this is a local label. */
1362 _bfd_ecoff_bfd_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
,
1365 return name
[0] == '$';
1368 /* Print information about an ECOFF symbol. */
1371 _bfd_ecoff_print_symbol (bfd
*abfd
,
1374 bfd_print_symbol_type how
)
1376 const struct ecoff_debug_swap
* const debug_swap
1377 = &ecoff_backend (abfd
)->debug_swap
;
1378 FILE *file
= (FILE *)filep
;
1382 case bfd_print_symbol_name
:
1383 fprintf (file
, "%s", symbol
->name
);
1385 case bfd_print_symbol_more
:
1386 if (ecoffsymbol (symbol
)->local
)
1390 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1392 fprintf (file
, "ecoff local ");
1393 fprintf_vma (file
, (bfd_vma
) ecoff_sym
.value
);
1394 fprintf (file
, " %x %x", (unsigned) ecoff_sym
.st
,
1395 (unsigned) ecoff_sym
.sc
);
1401 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1403 fprintf (file
, "ecoff extern ");
1404 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1405 fprintf (file
, " %x %x", (unsigned) ecoff_ext
.asym
.st
,
1406 (unsigned) ecoff_ext
.asym
.sc
);
1409 case bfd_print_symbol_all
:
1410 /* Print out the symbols in a reasonable way. */
1419 if (ecoffsymbol (symbol
)->local
)
1421 (*debug_swap
->swap_sym_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1424 pos
= ((((char *) ecoffsymbol (symbol
)->native
1425 - (char *) ecoff_data (abfd
)->debug_info
.external_sym
)
1426 / debug_swap
->external_sym_size
)
1427 + ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
);
1434 (*debug_swap
->swap_ext_in
) (abfd
, ecoffsymbol (symbol
)->native
,
1437 pos
= (((char *) ecoffsymbol (symbol
)->native
1438 - (char *) ecoff_data (abfd
)->debug_info
.external_ext
)
1439 / debug_swap
->external_ext_size
);
1440 jmptbl
= ecoff_ext
.jmptbl
? 'j' : ' ';
1441 cobol_main
= ecoff_ext
.cobol_main
? 'c' : ' ';
1442 weakext
= ecoff_ext
.weakext
? 'w' : ' ';
1445 fprintf (file
, "[%3d] %c ",
1447 fprintf_vma (file
, (bfd_vma
) ecoff_ext
.asym
.value
);
1448 fprintf (file
, " st %x sc %x indx %x %c%c%c %s",
1449 (unsigned) ecoff_ext
.asym
.st
,
1450 (unsigned) ecoff_ext
.asym
.sc
,
1451 (unsigned) ecoff_ext
.asym
.index
,
1452 jmptbl
, cobol_main
, weakext
,
1455 if (ecoffsymbol (symbol
)->fdr
!= NULL
1456 && ecoff_ext
.asym
.index
!= indexNil
)
1461 bfd_size_type sym_base
;
1462 union aux_ext
*aux_base
;
1464 fdr
= ecoffsymbol (symbol
)->fdr
;
1465 indx
= ecoff_ext
.asym
.index
;
1467 /* sym_base is used to map the fdr relative indices which
1468 appear in the file to the position number which we are
1470 sym_base
= fdr
->isymBase
;
1471 if (ecoffsymbol (symbol
)->local
)
1473 ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
1475 /* aux_base is the start of the aux entries for this file;
1476 asym.index is an offset from this. */
1477 aux_base
= (ecoff_data (abfd
)->debug_info
.external_aux
1480 /* The aux entries are stored in host byte order; the
1481 order is indicated by a bit in the fdr. */
1482 bigendian
= fdr
->fBigendian
;
1484 /* This switch is basically from gcc/mips-tdump.c. */
1485 switch (ecoff_ext
.asym
.st
)
1493 fprintf (file
, _("\n End+1 symbol: %ld"),
1494 (long) (indx
+ sym_base
));
1498 if (ecoff_ext
.asym
.sc
== scText
1499 || ecoff_ext
.asym
.sc
== scInfo
)
1500 fprintf (file
, _("\n First symbol: %ld"),
1501 (long) (indx
+ sym_base
));
1503 fprintf (file
, _("\n First symbol: %ld"),
1505 (AUX_GET_ISYM (bigendian
,
1506 &aux_base
[ecoff_ext
.asym
.index
])
1512 if (ECOFF_IS_STAB (&ecoff_ext
.asym
))
1514 else if (ecoffsymbol (symbol
)->local
)
1517 /* xgettext:c-format */
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, buff
));
1526 fprintf (file
, _("\n Local symbol: %ld"),
1529 + (ecoff_data (abfd
)
1530 ->debug_info
.symbolic_header
.iextMax
)));
1534 fprintf (file
, _("\n struct; End+1 symbol: %ld"),
1535 (long) (indx
+ sym_base
));
1539 fprintf (file
, _("\n union; End+1 symbol: %ld"),
1540 (long) (indx
+ sym_base
));
1544 fprintf (file
, _("\n enum; End+1 symbol: %ld"),
1545 (long) (indx
+ sym_base
));
1549 if (! ECOFF_IS_STAB (&ecoff_ext
.asym
))
1552 fprintf (file
, _("\n Type: %s"),
1553 ecoff_type_to_string (abfd
, fdr
, indx
, buff
));
1563 /* Read in the relocs for a section. */
1566 ecoff_slurp_reloc_table (bfd
*abfd
,
1570 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
1571 arelent
*internal_relocs
;
1572 bfd_size_type external_reloc_size
;
1574 bfd_byte
*external_relocs
;
1578 if (section
->relocation
!= NULL
1579 || section
->reloc_count
== 0
1580 || (section
->flags
& SEC_CONSTRUCTOR
) != 0)
1583 if (! _bfd_ecoff_slurp_symbol_table (abfd
))
1586 external_reloc_size
= backend
->external_reloc_size
;
1587 amt
= external_reloc_size
* section
->reloc_count
;
1588 if (bfd_seek (abfd
, section
->rel_filepos
, SEEK_SET
) != 0)
1590 external_relocs
= _bfd_malloc_and_read (abfd
, amt
, amt
);
1591 if (external_relocs
== NULL
)
1594 amt
= section
->reloc_count
;
1595 amt
*= sizeof (arelent
);
1596 internal_relocs
= (arelent
*) bfd_alloc (abfd
, amt
);
1597 if (internal_relocs
== NULL
)
1599 free (external_relocs
);
1603 for (i
= 0, rptr
= internal_relocs
; i
< section
->reloc_count
; i
++, rptr
++)
1605 struct internal_reloc intern
;
1607 (*backend
->swap_reloc_in
) (abfd
,
1608 external_relocs
+ i
* external_reloc_size
,
1611 if (intern
.r_extern
)
1613 /* r_symndx is an index into the external symbols. */
1614 BFD_ASSERT (intern
.r_symndx
>= 0
1616 < (ecoff_data (abfd
)
1617 ->debug_info
.symbolic_header
.iextMax
)));
1618 rptr
->sym_ptr_ptr
= symbols
+ intern
.r_symndx
;
1621 else if (intern
.r_symndx
== RELOC_SECTION_NONE
1622 || intern
.r_symndx
== RELOC_SECTION_ABS
)
1624 rptr
->sym_ptr_ptr
= bfd_abs_section_ptr
->symbol_ptr_ptr
;
1629 const char *sec_name
;
1632 /* r_symndx is a section key. */
1633 switch (intern
.r_symndx
)
1635 case RELOC_SECTION_TEXT
: sec_name
= _TEXT
; break;
1636 case RELOC_SECTION_RDATA
: sec_name
= _RDATA
; break;
1637 case RELOC_SECTION_DATA
: sec_name
= _DATA
; break;
1638 case RELOC_SECTION_SDATA
: sec_name
= _SDATA
; break;
1639 case RELOC_SECTION_SBSS
: sec_name
= _SBSS
; break;
1640 case RELOC_SECTION_BSS
: sec_name
= _BSS
; break;
1641 case RELOC_SECTION_INIT
: sec_name
= _INIT
; break;
1642 case RELOC_SECTION_LIT8
: sec_name
= _LIT8
; break;
1643 case RELOC_SECTION_LIT4
: sec_name
= _LIT4
; break;
1644 case RELOC_SECTION_XDATA
: sec_name
= _XDATA
; break;
1645 case RELOC_SECTION_PDATA
: sec_name
= _PDATA
; break;
1646 case RELOC_SECTION_FINI
: sec_name
= _FINI
; break;
1647 case RELOC_SECTION_LITA
: sec_name
= _LITA
; break;
1648 case RELOC_SECTION_RCONST
: sec_name
= _RCONST
; break;
1652 sec
= bfd_get_section_by_name (abfd
, sec_name
);
1655 rptr
->sym_ptr_ptr
= sec
->symbol_ptr_ptr
;
1657 rptr
->addend
= - bfd_section_vma (sec
);
1660 rptr
->address
= intern
.r_vaddr
- bfd_section_vma (section
);
1662 /* Let the backend select the howto field and do any other
1663 required processing. */
1664 (*backend
->adjust_reloc_in
) (abfd
, &intern
, rptr
);
1667 free (external_relocs
);
1669 section
->relocation
= internal_relocs
;
1674 /* Get a canonical list of relocs. */
1677 _bfd_ecoff_canonicalize_reloc (bfd
*abfd
,
1684 if (section
->flags
& SEC_CONSTRUCTOR
)
1686 arelent_chain
*chain
;
1688 /* This section has relocs made up by us, not the file, so take
1689 them out of their chain and place them into the data area
1691 for (count
= 0, chain
= section
->constructor_chain
;
1692 count
< section
->reloc_count
;
1693 count
++, chain
= chain
->next
)
1694 *relptr
++ = &chain
->relent
;
1700 if (! ecoff_slurp_reloc_table (abfd
, section
, symbols
))
1703 tblptr
= section
->relocation
;
1705 for (count
= 0; count
< section
->reloc_count
; count
++)
1706 *relptr
++ = tblptr
++;
1711 return section
->reloc_count
;
1714 /* Provided a BFD, a section and an offset into the section, calculate
1715 and return the name of the source file and the line nearest to the
1719 _bfd_ecoff_find_nearest_line (bfd
*abfd
,
1720 asymbol
**symbols ATTRIBUTE_UNUSED
,
1723 const char **filename_ptr
,
1724 const char **functionname_ptr
,
1725 unsigned int *retline_ptr
,
1726 unsigned int *discriminator_ptr
)
1728 const struct ecoff_debug_swap
* const debug_swap
1729 = &ecoff_backend (abfd
)->debug_swap
;
1730 struct ecoff_debug_info
* const debug_info
= &ecoff_data (abfd
)->debug_info
;
1731 struct ecoff_find_line
*line_info
;
1733 /* Make sure we have the FDR's. */
1734 if (! _bfd_ecoff_slurp_symbolic_info (abfd
, NULL
, debug_info
)
1735 || bfd_get_symcount (abfd
) == 0)
1738 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1740 size_t amt
= sizeof (struct ecoff_find_line
);
1742 ecoff_data (abfd
)->find_line_info
=
1743 (struct ecoff_find_line
*) bfd_zalloc (abfd
, amt
);
1744 if (ecoff_data (abfd
)->find_line_info
== NULL
)
1748 if (discriminator_ptr
)
1749 *discriminator_ptr
= 0;
1750 line_info
= ecoff_data (abfd
)->find_line_info
;
1751 return _bfd_ecoff_locate_line (abfd
, section
, offset
, debug_info
,
1752 debug_swap
, line_info
, filename_ptr
,
1753 functionname_ptr
, retline_ptr
);
1756 /* Copy private BFD data. This is called by objcopy and strip. We
1757 use it to copy the ECOFF debugging information from one BFD to the
1758 other. It would be theoretically possible to represent the ECOFF
1759 debugging information in the symbol table. However, it would be a
1760 lot of work, and there would be little gain (gas, gdb, and ld
1761 already access the ECOFF debugging information via the
1762 ecoff_debug_info structure, and that structure would have to be
1763 retained in order to support ECOFF debugging in MIPS ELF).
1765 The debugging information for the ECOFF external symbols comes from
1766 the symbol table, so this function only handles the other debugging
1770 _bfd_ecoff_bfd_copy_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
1772 struct ecoff_debug_info
*iinfo
= &ecoff_data (ibfd
)->debug_info
;
1773 struct ecoff_debug_info
*oinfo
= &ecoff_data (obfd
)->debug_info
;
1775 asymbol
**sym_ptr_ptr
;
1779 /* We only want to copy information over if both BFD's use ECOFF
1781 if (bfd_get_flavour (ibfd
) != bfd_target_ecoff_flavour
1782 || bfd_get_flavour (obfd
) != bfd_target_ecoff_flavour
)
1785 /* Copy the GP value and the register masks. */
1786 ecoff_data (obfd
)->gp
= ecoff_data (ibfd
)->gp
;
1787 ecoff_data (obfd
)->gprmask
= ecoff_data (ibfd
)->gprmask
;
1788 ecoff_data (obfd
)->fprmask
= ecoff_data (ibfd
)->fprmask
;
1789 for (i
= 0; i
< 3; i
++)
1790 ecoff_data (obfd
)->cprmask
[i
] = ecoff_data (ibfd
)->cprmask
[i
];
1792 /* Copy the version stamp. */
1793 oinfo
->symbolic_header
.vstamp
= iinfo
->symbolic_header
.vstamp
;
1795 /* If there are no symbols, don't copy any debugging information. */
1796 c
= bfd_get_symcount (obfd
);
1797 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1798 if (c
== 0 || sym_ptr_ptr
== NULL
)
1801 /* See if there are any local symbols. */
1803 for (; c
> 0; c
--, sym_ptr_ptr
++)
1805 if (ecoffsymbol (*sym_ptr_ptr
)->local
)
1814 /* There are some local symbols. We just bring over all the
1815 debugging information. FIXME: This is not quite the right
1816 thing to do. If the user has asked us to discard all
1817 debugging information, then we are probably going to wind up
1818 keeping it because there will probably be some local symbol
1819 which objcopy did not discard. We should actually break
1820 apart the debugging information and only keep that which
1821 applies to the symbols we want to keep. */
1822 oinfo
->symbolic_header
.ilineMax
= iinfo
->symbolic_header
.ilineMax
;
1823 oinfo
->symbolic_header
.cbLine
= iinfo
->symbolic_header
.cbLine
;
1824 oinfo
->line
= iinfo
->line
;
1826 oinfo
->symbolic_header
.idnMax
= iinfo
->symbolic_header
.idnMax
;
1827 oinfo
->external_dnr
= iinfo
->external_dnr
;
1829 oinfo
->symbolic_header
.ipdMax
= iinfo
->symbolic_header
.ipdMax
;
1830 oinfo
->external_pdr
= iinfo
->external_pdr
;
1832 oinfo
->symbolic_header
.isymMax
= iinfo
->symbolic_header
.isymMax
;
1833 oinfo
->external_sym
= iinfo
->external_sym
;
1835 oinfo
->symbolic_header
.ioptMax
= iinfo
->symbolic_header
.ioptMax
;
1836 oinfo
->external_opt
= iinfo
->external_opt
;
1838 oinfo
->symbolic_header
.iauxMax
= iinfo
->symbolic_header
.iauxMax
;
1839 oinfo
->external_aux
= iinfo
->external_aux
;
1841 oinfo
->symbolic_header
.issMax
= iinfo
->symbolic_header
.issMax
;
1842 oinfo
->ss
= iinfo
->ss
;
1844 oinfo
->symbolic_header
.ifdMax
= iinfo
->symbolic_header
.ifdMax
;
1845 oinfo
->external_fdr
= iinfo
->external_fdr
;
1847 oinfo
->symbolic_header
.crfd
= iinfo
->symbolic_header
.crfd
;
1848 oinfo
->external_rfd
= iinfo
->external_rfd
;
1852 /* We are discarding all the local symbol information. Look
1853 through the external symbols and remove all references to FDR
1854 or aux information. */
1855 c
= bfd_get_symcount (obfd
);
1856 sym_ptr_ptr
= bfd_get_outsymbols (obfd
);
1857 for (; c
> 0; c
--, sym_ptr_ptr
++)
1861 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_in
))
1862 (obfd
, ecoffsymbol (*sym_ptr_ptr
)->native
, &esym
);
1864 esym
.asym
.index
= indexNil
;
1865 (*(ecoff_backend (obfd
)->debug_swap
.swap_ext_out
))
1866 (obfd
, &esym
, ecoffsymbol (*sym_ptr_ptr
)->native
);
1873 /* Set the architecture. The supported architecture is stored in the
1874 backend pointer. We always set the architecture anyhow, since many
1875 callers ignore the return value. */
1878 _bfd_ecoff_set_arch_mach (bfd
*abfd
,
1879 enum bfd_architecture arch
,
1880 unsigned long machine
)
1882 bfd_default_set_arch_mach (abfd
, arch
, machine
);
1883 return arch
== ecoff_backend (abfd
)->arch
;
1886 /* Get the size of the section headers. */
1889 _bfd_ecoff_sizeof_headers (bfd
*abfd
,
1890 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1897 for (current
= abfd
->sections
;
1899 current
= current
->next
)
1902 ret
= (bfd_coff_filhsz (abfd
)
1903 + bfd_coff_aoutsz (abfd
)
1904 + c
* bfd_coff_scnhsz (abfd
));
1905 return (int) BFD_ALIGN (ret
, 16);
1908 /* Get the contents of a section. */
1911 _bfd_ecoff_get_section_contents (bfd
*abfd
,
1915 bfd_size_type count
)
1917 return _bfd_generic_get_section_contents (abfd
, section
, location
,
1921 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1922 called via qsort. */
1925 ecoff_sort_hdrs (const void * arg1
, const void * arg2
)
1927 const asection
*hdr1
= *(const asection
**) arg1
;
1928 const asection
*hdr2
= *(const asection
**) arg2
;
1930 if ((hdr1
->flags
& SEC_ALLOC
) != 0)
1932 if ((hdr2
->flags
& SEC_ALLOC
) == 0)
1937 if ((hdr2
->flags
& SEC_ALLOC
) != 0)
1940 if (hdr1
->vma
< hdr2
->vma
)
1942 else if (hdr1
->vma
> hdr2
->vma
)
1948 /* Calculate the file position for each section, and set
1952 ecoff_compute_section_file_positions (bfd
*abfd
)
1954 file_ptr sofar
, file_sofar
;
1955 asection
**sorted_hdrs
;
1959 bfd_boolean rdata_in_text
;
1960 bfd_boolean first_data
, first_nonalloc
;
1961 const bfd_vma round
= ecoff_backend (abfd
)->round
;
1964 sofar
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
1967 /* Sort the sections by VMA. */
1968 amt
= abfd
->section_count
;
1969 amt
*= sizeof (asection
*);
1970 sorted_hdrs
= (asection
**) bfd_malloc (amt
);
1971 if (sorted_hdrs
== NULL
)
1973 for (current
= abfd
->sections
, i
= 0;
1975 current
= current
->next
, i
++)
1976 sorted_hdrs
[i
] = current
;
1977 BFD_ASSERT (i
== abfd
->section_count
);
1979 qsort (sorted_hdrs
, abfd
->section_count
, sizeof (asection
*),
1982 /* Some versions of the OSF linker put the .rdata section in the
1983 text segment, and some do not. */
1984 rdata_in_text
= ecoff_backend (abfd
)->rdata_in_text
;
1987 for (i
= 0; i
< abfd
->section_count
; i
++)
1989 current
= sorted_hdrs
[i
];
1990 if (streq (current
->name
, _RDATA
))
1992 if ((current
->flags
& SEC_CODE
) == 0
1993 && ! streq (current
->name
, _PDATA
)
1994 && ! streq (current
->name
, _RCONST
))
1996 rdata_in_text
= FALSE
;
2001 ecoff_data (abfd
)->rdata_in_text
= rdata_in_text
;
2004 first_nonalloc
= TRUE
;
2005 for (i
= 0; i
< abfd
->section_count
; i
++)
2007 unsigned int alignment_power
;
2009 current
= sorted_hdrs
[i
];
2011 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2012 supposed to indicate the number of .pdata entries that are
2013 really in the section. Each entry is 8 bytes. We store this
2014 away in line_filepos before increasing the section size. */
2015 if (streq (current
->name
, _PDATA
))
2016 current
->line_filepos
= current
->size
/ 8;
2018 alignment_power
= current
->alignment_power
;
2020 /* On Ultrix, the data sections in an executable file must be
2021 aligned to a page boundary within the file. This does not
2022 affect the section size, though. FIXME: Does this work for
2023 other platforms? It requires some modification for the
2024 Alpha, because .rdata on the Alpha goes with the text, not
2026 if ((abfd
->flags
& EXEC_P
) != 0
2027 && (abfd
->flags
& D_PAGED
) != 0
2029 && (current
->flags
& SEC_CODE
) == 0
2031 || ! streq (current
->name
, _RDATA
))
2032 && ! streq (current
->name
, _PDATA
)
2033 && ! streq (current
->name
, _RCONST
))
2035 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2036 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2039 else if (streq (current
->name
, _LIB
))
2041 /* On Irix 4, the location of contents of the .lib section
2042 from a shared library section is also rounded up to a
2045 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2046 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2048 else if (first_nonalloc
2049 && (current
->flags
& SEC_ALLOC
) == 0
2050 && (abfd
->flags
& D_PAGED
) != 0)
2052 /* Skip up to the next page for an unallocated section, such
2053 as the .comment section on the Alpha. This leaves room
2054 for the .bss section. */
2055 first_nonalloc
= FALSE
;
2056 sofar
= (sofar
+ round
- 1) &~ (round
- 1);
2057 file_sofar
= (file_sofar
+ round
- 1) &~ (round
- 1);
2060 /* Align the sections in the file to the same boundary on
2061 which they are aligned in virtual memory. */
2062 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2063 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2064 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2066 if ((abfd
->flags
& D_PAGED
) != 0
2067 && (current
->flags
& SEC_ALLOC
) != 0)
2069 sofar
+= (current
->vma
- sofar
) % round
;
2070 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2071 file_sofar
+= (current
->vma
- file_sofar
) % round
;
2074 if ((current
->flags
& (SEC_HAS_CONTENTS
| SEC_LOAD
)) != 0)
2075 current
->filepos
= file_sofar
;
2077 sofar
+= current
->size
;
2078 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2079 file_sofar
+= current
->size
;
2081 /* Make sure that this section is of the right size too. */
2083 sofar
= BFD_ALIGN (sofar
, 1 << alignment_power
);
2084 if ((current
->flags
& SEC_HAS_CONTENTS
) != 0)
2085 file_sofar
= BFD_ALIGN (file_sofar
, 1 << alignment_power
);
2086 current
->size
+= sofar
- old_sofar
;
2092 ecoff_data (abfd
)->reloc_filepos
= file_sofar
;
2097 /* Determine the location of the relocs for all the sections in the
2098 output file, as well as the location of the symbolic debugging
2101 static bfd_size_type
2102 ecoff_compute_reloc_file_positions (bfd
*abfd
)
2104 const bfd_size_type external_reloc_size
=
2105 ecoff_backend (abfd
)->external_reloc_size
;
2106 file_ptr reloc_base
;
2107 bfd_size_type reloc_size
;
2111 if (! abfd
->output_has_begun
)
2113 if (! ecoff_compute_section_file_positions (abfd
))
2115 abfd
->output_has_begun
= TRUE
;
2118 reloc_base
= ecoff_data (abfd
)->reloc_filepos
;
2121 for (current
= abfd
->sections
;
2123 current
= current
->next
)
2125 if (current
->reloc_count
== 0)
2126 current
->rel_filepos
= 0;
2129 bfd_size_type relsize
;
2131 current
->rel_filepos
= reloc_base
;
2132 relsize
= current
->reloc_count
* external_reloc_size
;
2133 reloc_size
+= relsize
;
2134 reloc_base
+= relsize
;
2138 sym_base
= ecoff_data (abfd
)->reloc_filepos
+ reloc_size
;
2140 /* At least on Ultrix, the symbol table of an executable file must
2141 be aligned to a page boundary. FIXME: Is this true on other
2143 if ((abfd
->flags
& EXEC_P
) != 0
2144 && (abfd
->flags
& D_PAGED
) != 0)
2145 sym_base
= ((sym_base
+ ecoff_backend (abfd
)->round
- 1)
2146 &~ (ecoff_backend (abfd
)->round
- 1));
2148 ecoff_data (abfd
)->sym_filepos
= sym_base
;
2153 /* Set the contents of a section. */
2156 _bfd_ecoff_set_section_contents (bfd
*abfd
,
2158 const void * location
,
2160 bfd_size_type count
)
2164 /* This must be done first, because bfd_set_section_contents is
2165 going to set output_has_begun to TRUE. */
2166 if (! abfd
->output_has_begun
2167 && ! ecoff_compute_section_file_positions (abfd
))
2170 /* Handle the .lib section specially so that Irix 4 shared libraries
2171 work out. See coff_set_section_contents in coffcode.h. */
2172 if (streq (section
->name
, _LIB
))
2174 bfd_byte
*rec
, *recend
;
2176 rec
= (bfd_byte
*) location
;
2177 recend
= rec
+ count
;
2178 while (rec
< recend
)
2181 rec
+= bfd_get_32 (abfd
, rec
) * 4;
2184 BFD_ASSERT (rec
== recend
);
2190 pos
= section
->filepos
+ offset
;
2191 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0
2192 || bfd_bwrite (location
, count
, abfd
) != count
)
2198 /* Set the GP value for an ECOFF file. This is a hook used by the
2202 bfd_ecoff_set_gp_value (bfd
*abfd
, bfd_vma gp_value
)
2204 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2205 || bfd_get_format (abfd
) != bfd_object
)
2207 bfd_set_error (bfd_error_invalid_operation
);
2211 ecoff_data (abfd
)->gp
= gp_value
;
2216 /* Set the register masks for an ECOFF file. This is a hook used by
2220 bfd_ecoff_set_regmasks (bfd
*abfd
,
2221 unsigned long gprmask
,
2222 unsigned long fprmask
,
2223 unsigned long *cprmask
)
2225 ecoff_data_type
*tdata
;
2227 if (bfd_get_flavour (abfd
) != bfd_target_ecoff_flavour
2228 || bfd_get_format (abfd
) != bfd_object
)
2230 bfd_set_error (bfd_error_invalid_operation
);
2234 tdata
= ecoff_data (abfd
);
2235 tdata
->gprmask
= gprmask
;
2236 tdata
->fprmask
= fprmask
;
2237 if (cprmask
!= NULL
)
2241 for (i
= 0; i
< 3; i
++)
2242 tdata
->cprmask
[i
] = cprmask
[i
];
2248 /* Get ECOFF EXTR information for an external symbol. This function
2249 is passed to bfd_ecoff_debug_externals. */
2252 ecoff_get_extr (asymbol
*sym
, EXTR
*esym
)
2254 ecoff_symbol_type
*ecoff_sym_ptr
;
2257 if (bfd_asymbol_flavour (sym
) != bfd_target_ecoff_flavour
2258 || ecoffsymbol (sym
)->native
== NULL
)
2260 /* Don't include debugging, local, or section symbols. */
2261 if ((sym
->flags
& BSF_DEBUGGING
) != 0
2262 || (sym
->flags
& BSF_LOCAL
) != 0
2263 || (sym
->flags
& BSF_SECTION_SYM
) != 0)
2267 esym
->cobol_main
= 0;
2268 esym
->weakext
= (sym
->flags
& BSF_WEAK
) != 0;
2271 /* FIXME: we can do better than this for st and sc. */
2272 esym
->asym
.st
= stGlobal
;
2273 esym
->asym
.sc
= scAbs
;
2274 esym
->asym
.reserved
= 0;
2275 esym
->asym
.index
= indexNil
;
2279 ecoff_sym_ptr
= ecoffsymbol (sym
);
2281 if (ecoff_sym_ptr
->local
)
2284 input_bfd
= bfd_asymbol_bfd (sym
);
2285 (*(ecoff_backend (input_bfd
)->debug_swap
.swap_ext_in
))
2286 (input_bfd
, ecoff_sym_ptr
->native
, esym
);
2288 /* If the symbol was defined by the linker, then esym will be
2289 undefined but sym will not be. Get a better class for such a
2291 if ((esym
->asym
.sc
== scUndefined
2292 || esym
->asym
.sc
== scSUndefined
)
2293 && ! bfd_is_und_section (bfd_asymbol_section (sym
)))
2294 esym
->asym
.sc
= scAbs
;
2296 /* Adjust the FDR index for the symbol by that used for the input
2298 if (esym
->ifd
!= -1)
2300 struct ecoff_debug_info
*input_debug
;
2302 input_debug
= &ecoff_data (input_bfd
)->debug_info
;
2303 BFD_ASSERT (esym
->ifd
< input_debug
->symbolic_header
.ifdMax
);
2304 if (input_debug
->ifdmap
!= NULL
)
2305 esym
->ifd
= input_debug
->ifdmap
[esym
->ifd
];
2311 /* Set the external symbol index. This routine is passed to
2312 bfd_ecoff_debug_externals. */
2315 ecoff_set_index (asymbol
*sym
, bfd_size_type indx
)
2317 ecoff_set_sym_index (sym
, indx
);
2320 /* Write out an ECOFF file. */
2323 _bfd_ecoff_write_object_contents (bfd
*abfd
)
2325 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
2326 const bfd_vma round
= backend
->round
;
2327 const bfd_size_type filhsz
= bfd_coff_filhsz (abfd
);
2328 const bfd_size_type aoutsz
= bfd_coff_aoutsz (abfd
);
2329 const bfd_size_type scnhsz
= bfd_coff_scnhsz (abfd
);
2330 const bfd_size_type external_hdr_size
2331 = backend
->debug_swap
.external_hdr_size
;
2332 const bfd_size_type external_reloc_size
= backend
->external_reloc_size
;
2333 void (* const adjust_reloc_out
) (bfd
*, const arelent
*, struct internal_reloc
*)
2334 = backend
->adjust_reloc_out
;
2335 void (* const swap_reloc_out
) (bfd
*, const struct internal_reloc
*, void *)
2336 = backend
->swap_reloc_out
;
2337 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
2338 HDRR
* const symhdr
= &debug
->symbolic_header
;
2341 bfd_size_type reloc_size
;
2342 bfd_size_type text_size
;
2344 bfd_boolean set_text_start
;
2345 bfd_size_type data_size
;
2347 bfd_boolean set_data_start
;
2348 bfd_size_type bss_size
;
2350 void * reloc_buff
= NULL
;
2351 struct internal_filehdr internal_f
;
2352 struct internal_aouthdr internal_a
;
2355 /* Determine where the sections and relocs will go in the output
2357 reloc_size
= ecoff_compute_reloc_file_positions (abfd
);
2360 for (current
= abfd
->sections
;
2362 current
= current
->next
)
2364 current
->target_index
= count
;
2368 if ((abfd
->flags
& D_PAGED
) != 0)
2369 text_size
= _bfd_ecoff_sizeof_headers (abfd
, NULL
);
2373 set_text_start
= FALSE
;
2376 set_data_start
= FALSE
;
2379 /* Write section headers to the file. */
2381 /* Allocate buff big enough to hold a section header,
2382 file header, or a.out header. */
2391 buff
= bfd_malloc (siz
);
2396 internal_f
.f_nscns
= 0;
2397 if (bfd_seek (abfd
, (file_ptr
) (filhsz
+ aoutsz
), SEEK_SET
) != 0)
2400 for (current
= abfd
->sections
;
2402 current
= current
->next
)
2404 struct internal_scnhdr section
;
2407 ++internal_f
.f_nscns
;
2409 strncpy (section
.s_name
, current
->name
, sizeof section
.s_name
);
2411 /* This seems to be correct for Irix 4 shared libraries. */
2412 vma
= bfd_section_vma (current
);
2413 if (streq (current
->name
, _LIB
))
2414 section
.s_vaddr
= 0;
2416 section
.s_vaddr
= vma
;
2418 section
.s_paddr
= current
->lma
;
2419 section
.s_size
= current
->size
;
2421 /* If this section is unloadable then the scnptr will be 0. */
2422 if ((current
->flags
& (SEC_LOAD
| SEC_HAS_CONTENTS
)) == 0)
2423 section
.s_scnptr
= 0;
2425 section
.s_scnptr
= current
->filepos
;
2426 section
.s_relptr
= current
->rel_filepos
;
2428 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2429 object file produced by the assembler is supposed to point to
2430 information about how much room is required by objects of
2431 various different sizes. I think this only matters if we
2432 want the linker to compute the best size to use, or
2433 something. I don't know what happens if the information is
2435 if (! streq (current
->name
, _PDATA
))
2436 section
.s_lnnoptr
= 0;
2439 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2440 hold the number of entries in the section (each entry is
2441 8 bytes). We stored this in the line_filepos field in
2442 ecoff_compute_section_file_positions. */
2443 section
.s_lnnoptr
= current
->line_filepos
;
2446 section
.s_nreloc
= current
->reloc_count
;
2447 section
.s_nlnno
= 0;
2448 section
.s_flags
= ecoff_sec_to_styp_flags (current
->name
,
2451 if (bfd_coff_swap_scnhdr_out (abfd
, (void *) §ion
, buff
) == 0
2452 || bfd_bwrite (buff
, scnhsz
, abfd
) != scnhsz
)
2455 if ((section
.s_flags
& STYP_TEXT
) != 0
2456 || ((section
.s_flags
& STYP_RDATA
) != 0
2457 && ecoff_data (abfd
)->rdata_in_text
)
2458 || section
.s_flags
== STYP_PDATA
2459 || (section
.s_flags
& STYP_DYNAMIC
) != 0
2460 || (section
.s_flags
& STYP_LIBLIST
) != 0
2461 || (section
.s_flags
& STYP_RELDYN
) != 0
2462 || section
.s_flags
== STYP_CONFLIC
2463 || (section
.s_flags
& STYP_DYNSTR
) != 0
2464 || (section
.s_flags
& STYP_DYNSYM
) != 0
2465 || (section
.s_flags
& STYP_HASH
) != 0
2466 || (section
.s_flags
& STYP_ECOFF_INIT
) != 0
2467 || (section
.s_flags
& STYP_ECOFF_FINI
) != 0
2468 || section
.s_flags
== STYP_RCONST
)
2470 text_size
+= current
->size
;
2471 if (! set_text_start
|| text_start
> vma
)
2474 set_text_start
= TRUE
;
2477 else if ((section
.s_flags
& STYP_RDATA
) != 0
2478 || (section
.s_flags
& STYP_DATA
) != 0
2479 || (section
.s_flags
& STYP_LITA
) != 0
2480 || (section
.s_flags
& STYP_LIT8
) != 0
2481 || (section
.s_flags
& STYP_LIT4
) != 0
2482 || (section
.s_flags
& STYP_SDATA
) != 0
2483 || section
.s_flags
== STYP_XDATA
2484 || (section
.s_flags
& STYP_GOT
) != 0)
2486 data_size
+= current
->size
;
2487 if (! set_data_start
|| data_start
> vma
)
2490 set_data_start
= TRUE
;
2493 else if ((section
.s_flags
& STYP_BSS
) != 0
2494 || (section
.s_flags
& STYP_SBSS
) != 0)
2495 bss_size
+= current
->size
;
2496 else if (section
.s_flags
== 0
2497 || (section
.s_flags
& STYP_ECOFF_LIB
) != 0
2498 || section
.s_flags
== STYP_COMMENT
)
2504 /* Set up the file header. */
2505 internal_f
.f_magic
= ecoff_get_magic (abfd
);
2507 /* We will NOT put a fucking timestamp in the header here. Every
2508 time you put it back, I will come in and take it out again. I'm
2509 sorry. This field does not belong here. We fill it with a 0 so
2510 it compares the same but is not a reasonable time. --
2512 internal_f
.f_timdat
= 0;
2514 if (bfd_get_symcount (abfd
) != 0)
2516 /* The ECOFF f_nsyms field is not actually the number of
2517 symbols, it's the size of symbolic information header. */
2518 internal_f
.f_nsyms
= external_hdr_size
;
2519 internal_f
.f_symptr
= ecoff_data (abfd
)->sym_filepos
;
2523 internal_f
.f_nsyms
= 0;
2524 internal_f
.f_symptr
= 0;
2527 internal_f
.f_opthdr
= aoutsz
;
2529 internal_f
.f_flags
= F_LNNO
;
2530 if (reloc_size
== 0)
2531 internal_f
.f_flags
|= F_RELFLG
;
2532 if (bfd_get_symcount (abfd
) == 0)
2533 internal_f
.f_flags
|= F_LSYMS
;
2534 if (abfd
->flags
& EXEC_P
)
2535 internal_f
.f_flags
|= F_EXEC
;
2537 if (bfd_little_endian (abfd
))
2538 internal_f
.f_flags
|= F_AR32WR
;
2540 internal_f
.f_flags
|= F_AR32W
;
2542 /* Set up the ``optional'' header. */
2543 if ((abfd
->flags
& D_PAGED
) != 0)
2544 internal_a
.magic
= ECOFF_AOUT_ZMAGIC
;
2546 internal_a
.magic
= ECOFF_AOUT_OMAGIC
;
2548 /* FIXME: Is this really correct? */
2549 internal_a
.vstamp
= symhdr
->vstamp
;
2551 /* At least on Ultrix, these have to be rounded to page boundaries.
2552 FIXME: Is this true on other platforms? */
2553 if ((abfd
->flags
& D_PAGED
) != 0)
2555 internal_a
.tsize
= (text_size
+ round
- 1) &~ (round
- 1);
2556 internal_a
.text_start
= text_start
&~ (round
- 1);
2557 internal_a
.dsize
= (data_size
+ round
- 1) &~ (round
- 1);
2558 internal_a
.data_start
= data_start
&~ (round
- 1);
2562 internal_a
.tsize
= text_size
;
2563 internal_a
.text_start
= text_start
;
2564 internal_a
.dsize
= data_size
;
2565 internal_a
.data_start
= data_start
;
2568 /* On Ultrix, the initial portions of the .sbss and .bss segments
2569 are at the end of the data section. The bsize field in the
2570 optional header records how many bss bytes are required beyond
2571 those in the data section. The value is not rounded to a page
2573 if (bss_size
< internal_a
.dsize
- data_size
)
2576 bss_size
-= internal_a
.dsize
- data_size
;
2577 internal_a
.bsize
= bss_size
;
2578 internal_a
.bss_start
= internal_a
.data_start
+ internal_a
.dsize
;
2580 internal_a
.entry
= bfd_get_start_address (abfd
);
2582 internal_a
.gp_value
= ecoff_data (abfd
)->gp
;
2584 internal_a
.gprmask
= ecoff_data (abfd
)->gprmask
;
2585 internal_a
.fprmask
= ecoff_data (abfd
)->fprmask
;
2586 for (i
= 0; i
< 4; i
++)
2587 internal_a
.cprmask
[i
] = ecoff_data (abfd
)->cprmask
[i
];
2589 /* Let the backend adjust the headers if necessary. */
2590 if (backend
->adjust_headers
)
2592 if (! (*backend
->adjust_headers
) (abfd
, &internal_f
, &internal_a
))
2596 /* Write out the file header and the optional header. */
2597 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
2600 bfd_coff_swap_filehdr_out (abfd
, (void *) &internal_f
, buff
);
2601 if (bfd_bwrite (buff
, filhsz
, abfd
) != filhsz
)
2604 bfd_coff_swap_aouthdr_out (abfd
, (void *) &internal_a
, buff
);
2605 if (bfd_bwrite (buff
, aoutsz
, abfd
) != aoutsz
)
2608 /* Build the external symbol information. This must be done before
2609 writing out the relocs so that we know the symbol indices. We
2610 don't do this if this BFD was created by the backend linker,
2611 since it will have already handled the symbols and relocs. */
2612 if (! ecoff_data (abfd
)->linker
)
2614 symhdr
->iextMax
= 0;
2615 symhdr
->issExtMax
= 0;
2616 debug
->external_ext
= debug
->external_ext_end
= NULL
;
2617 debug
->ssext
= debug
->ssext_end
= NULL
;
2618 if (! bfd_ecoff_debug_externals (abfd
, debug
, &backend
->debug_swap
,
2619 (abfd
->flags
& EXEC_P
) == 0,
2620 ecoff_get_extr
, ecoff_set_index
))
2623 /* Write out the relocs. */
2624 for (current
= abfd
->sections
;
2626 current
= current
->next
)
2628 arelent
**reloc_ptr_ptr
;
2629 arelent
**reloc_end
;
2633 if (current
->reloc_count
== 0)
2636 amt
= current
->reloc_count
* external_reloc_size
;
2637 reloc_buff
= bfd_alloc (abfd
, amt
);
2638 if (reloc_buff
== NULL
)
2641 reloc_ptr_ptr
= current
->orelocation
;
2642 reloc_end
= reloc_ptr_ptr
+ current
->reloc_count
;
2643 out_ptr
= (char *) reloc_buff
;
2646 reloc_ptr_ptr
< reloc_end
;
2647 reloc_ptr_ptr
++, out_ptr
+= external_reloc_size
)
2651 struct internal_reloc in
;
2653 memset ((void *) &in
, 0, sizeof in
);
2655 reloc
= *reloc_ptr_ptr
;
2656 sym
= *reloc
->sym_ptr_ptr
;
2658 /* If the howto field has not been initialised then skip this reloc.
2659 This assumes that an error message has been issued elsewhere. */
2660 if (reloc
->howto
== NULL
)
2663 in
.r_vaddr
= reloc
->address
+ bfd_section_vma (current
);
2664 in
.r_type
= reloc
->howto
->type
;
2666 if ((sym
->flags
& BSF_SECTION_SYM
) == 0)
2668 in
.r_symndx
= ecoff_get_sym_index (*reloc
->sym_ptr_ptr
);
2682 { _TEXT
, RELOC_SECTION_TEXT
},
2683 { _RDATA
, RELOC_SECTION_RDATA
},
2684 { _DATA
, RELOC_SECTION_DATA
},
2685 { _SDATA
, RELOC_SECTION_SDATA
},
2686 { _SBSS
, RELOC_SECTION_SBSS
},
2687 { _BSS
, RELOC_SECTION_BSS
},
2688 { _INIT
, RELOC_SECTION_INIT
},
2689 { _LIT8
, RELOC_SECTION_LIT8
},
2690 { _LIT4
, RELOC_SECTION_LIT4
},
2691 { _XDATA
, RELOC_SECTION_XDATA
},
2692 { _PDATA
, RELOC_SECTION_PDATA
},
2693 { _FINI
, RELOC_SECTION_FINI
},
2694 { _LITA
, RELOC_SECTION_LITA
},
2695 { "*ABS*", RELOC_SECTION_ABS
},
2696 { _RCONST
, RELOC_SECTION_RCONST
}
2699 name
= bfd_section_name (bfd_asymbol_section (sym
));
2701 for (j
= 0; j
< ARRAY_SIZE (section_symndx
); j
++)
2702 if (streq (name
, section_symndx
[j
].name
))
2704 in
.r_symndx
= section_symndx
[j
].r_symndx
;
2708 if (j
== ARRAY_SIZE (section_symndx
))
2713 (*adjust_reloc_out
) (abfd
, reloc
, &in
);
2715 (*swap_reloc_out
) (abfd
, &in
, (void *) out_ptr
);
2718 if (bfd_seek (abfd
, current
->rel_filepos
, SEEK_SET
) != 0)
2720 amt
= current
->reloc_count
* external_reloc_size
;
2721 if (bfd_bwrite (reloc_buff
, amt
, abfd
) != amt
)
2723 bfd_release (abfd
, reloc_buff
);
2727 /* Write out the symbolic debugging information. */
2728 if (bfd_get_symcount (abfd
) > 0)
2730 /* Write out the debugging information. */
2731 if (! bfd_ecoff_write_debug (abfd
, debug
, &backend
->debug_swap
,
2732 ecoff_data (abfd
)->sym_filepos
))
2737 /* The .bss section of a demand paged executable must receive an
2738 entire page. If there are symbols, the symbols will start on the
2739 next page. If there are no symbols, we must fill out the page by
2741 if (bfd_get_symcount (abfd
) == 0
2742 && (abfd
->flags
& EXEC_P
) != 0
2743 && (abfd
->flags
& D_PAGED
) != 0)
2747 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2750 if (bfd_bread (&c
, (bfd_size_type
) 1, abfd
) == 0)
2752 if (bfd_seek (abfd
, (file_ptr
) ecoff_data (abfd
)->sym_filepos
- 1,
2755 if (bfd_bwrite (&c
, (bfd_size_type
) 1, abfd
) != 1)
2759 if (reloc_buff
!= NULL
)
2760 bfd_release (abfd
, reloc_buff
);
2764 if (reloc_buff
!= NULL
)
2765 bfd_release (abfd
, reloc_buff
);
2770 /* Archive handling. ECOFF uses what appears to be a unique type of
2771 archive header (armap). The byte ordering of the armap and the
2772 contents are encoded in the name of the armap itself. At least for
2773 now, we only support archives with the same byte ordering in the
2774 armap and the contents.
2776 The first four bytes in the armap are the number of symbol
2777 definitions. This is always a power of two.
2779 This is followed by the symbol definitions. Each symbol definition
2780 occupies 8 bytes. The first four bytes are the offset from the
2781 start of the armap strings to the null-terminated string naming
2782 this symbol. The second four bytes are the file offset to the
2783 archive member which defines this symbol. If the second four bytes
2784 are 0, then this is not actually a symbol definition, and it should
2787 The symbols are hashed into the armap with a closed hashing scheme.
2788 See the functions below for the details of the algorithm.
2790 After the symbol definitions comes four bytes holding the size of
2791 the string table, followed by the string table itself. */
2793 /* The name of an archive headers looks like this:
2794 __________E[BL]E[BL]_ (with a trailing space).
2795 The trailing space is changed to an X if the archive is changed to
2796 indicate that the armap is out of date.
2798 The Alpha seems to use ________64E[BL]E[BL]_. */
2800 #define ARMAP_BIG_ENDIAN 'B'
2801 #define ARMAP_LITTLE_ENDIAN 'L'
2802 #define ARMAP_MARKER 'E'
2803 #define ARMAP_START_LENGTH 10
2804 #define ARMAP_HEADER_MARKER_INDEX 10
2805 #define ARMAP_HEADER_ENDIAN_INDEX 11
2806 #define ARMAP_OBJECT_MARKER_INDEX 12
2807 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2808 #define ARMAP_END_INDEX 14
2809 #define ARMAP_END "_ "
2811 /* This is a magic number used in the hashing algorithm. */
2812 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2814 /* This returns the hash value to use for a string. It also sets
2815 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2816 is the number of entries in the hash table, and HLOG is the log
2820 ecoff_armap_hash (const char *s
,
2821 unsigned int *rehash
,
2831 hash
= ((hash
>> 27) | (hash
<< 5)) + *s
++;
2832 hash
*= ARMAP_HASH_MAGIC
;
2833 *rehash
= (hash
& (size
- 1)) | 1;
2834 return hash
>> (32 - hlog
);
2837 /* Read in the armap. */
2840 _bfd_ecoff_slurp_armap (bfd
*abfd
)
2844 struct areltdata
*mapdata
;
2845 bfd_size_type parsed_size
, stringsize
;
2847 struct artdata
*ardata
;
2854 /* Get the name of the first element. */
2855 i
= bfd_bread ((void *) nextname
, (bfd_size_type
) 16, abfd
);
2861 if (bfd_seek (abfd
, (file_ptr
) -16, SEEK_CUR
) != 0)
2864 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2865 standard COFF armap. We could move the ECOFF armap stuff into
2866 bfd_slurp_armap, but that seems inappropriate since no other
2867 target uses this format. Instead, we check directly for a COFF
2869 if (CONST_STRNEQ (nextname
, "/ "))
2870 return bfd_slurp_armap (abfd
);
2872 /* See if the first element is an armap. */
2873 if (! strneq (nextname
, ecoff_backend (abfd
)->armap_start
, ARMAP_START_LENGTH
)
2874 || nextname
[ARMAP_HEADER_MARKER_INDEX
] != ARMAP_MARKER
2875 || (nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2876 && nextname
[ARMAP_HEADER_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2877 || nextname
[ARMAP_OBJECT_MARKER_INDEX
] != ARMAP_MARKER
2878 || (nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_BIG_ENDIAN
2879 && nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] != ARMAP_LITTLE_ENDIAN
)
2880 || ! strneq (nextname
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1))
2882 abfd
->has_armap
= FALSE
;
2886 /* Make sure we have the right byte ordering. */
2887 if (((nextname
[ARMAP_HEADER_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2888 ^ (bfd_header_big_endian (abfd
)))
2889 || ((nextname
[ARMAP_OBJECT_ENDIAN_INDEX
] == ARMAP_BIG_ENDIAN
)
2890 ^ (bfd_big_endian (abfd
))))
2892 bfd_set_error (bfd_error_wrong_format
);
2896 /* Read in the armap. */
2897 ardata
= bfd_ardata (abfd
);
2898 mapdata
= (struct areltdata
*) _bfd_read_ar_hdr (abfd
);
2899 if (mapdata
== NULL
)
2901 parsed_size
= mapdata
->parsed_size
;
2904 if (parsed_size
+ 1 < 9)
2906 bfd_set_error (bfd_error_malformed_archive
);
2910 raw_armap
= (char *) _bfd_alloc_and_read (abfd
, parsed_size
+ 1, parsed_size
);
2911 if (raw_armap
== NULL
)
2913 raw_armap
[parsed_size
] = 0;
2915 ardata
->tdata
= (void *) raw_armap
;
2917 count
= H_GET_32 (abfd
, raw_armap
);
2918 if ((parsed_size
- 8) / 8 < count
)
2919 goto error_malformed
;
2921 ardata
->symdef_count
= 0;
2922 ardata
->cache
= NULL
;
2924 /* This code used to overlay the symdefs over the raw archive data,
2925 but that doesn't work on a 64 bit host. */
2926 stringbase
= raw_armap
+ count
* 8 + 8;
2927 stringsize
= parsed_size
- (count
* 8 + 8);
2929 #ifdef CHECK_ARMAP_HASH
2933 /* Double check that I have the hashing algorithm right by making
2934 sure that every symbol can be looked up successfully. */
2936 for (i
= 1; i
< count
; i
<<= 1)
2938 BFD_ASSERT (i
== count
);
2940 raw_ptr
= raw_armap
+ 4;
2941 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2943 unsigned int name_offset
, file_offset
;
2944 unsigned int hash
, rehash
, srch
;
2946 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2947 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2948 if (file_offset
== 0)
2950 hash
= ecoff_armap_hash (stringbase
+ name_offset
, &rehash
, count
,
2955 /* See if we can rehash to this location. */
2956 for (srch
= (hash
+ rehash
) & (count
- 1);
2957 srch
!= hash
&& srch
!= i
;
2958 srch
= (srch
+ rehash
) & (count
- 1))
2959 BFD_ASSERT (H_GET_32 (abfd
, (raw_armap
+ 8 + srch
* 8)) != 0);
2960 BFD_ASSERT (srch
== i
);
2964 #endif /* CHECK_ARMAP_HASH */
2966 raw_ptr
= raw_armap
+ 4;
2967 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2968 if (H_GET_32 (abfd
, (raw_ptr
+ 4)) != 0)
2969 ++ardata
->symdef_count
;
2971 amt
= ardata
->symdef_count
;
2972 amt
*= sizeof (carsym
);
2973 symdef_ptr
= (carsym
*) bfd_alloc (abfd
, amt
);
2977 ardata
->symdefs
= symdef_ptr
;
2979 raw_ptr
= raw_armap
+ 4;
2980 for (i
= 0; i
< count
; i
++, raw_ptr
+= 8)
2982 unsigned int name_offset
, file_offset
;
2984 file_offset
= H_GET_32 (abfd
, (raw_ptr
+ 4));
2985 if (file_offset
== 0)
2987 name_offset
= H_GET_32 (abfd
, raw_ptr
);
2988 if (name_offset
> stringsize
)
2989 goto error_malformed
;
2990 symdef_ptr
->name
= stringbase
+ name_offset
;
2991 symdef_ptr
->file_offset
= file_offset
;
2995 ardata
->first_file_filepos
= bfd_tell (abfd
);
2996 /* Pad to an even boundary. */
2997 ardata
->first_file_filepos
+= ardata
->first_file_filepos
% 2;
2998 abfd
->has_armap
= TRUE
;
3002 bfd_set_error (bfd_error_malformed_archive
);
3004 ardata
->symdef_count
= 0;
3005 ardata
->symdefs
= NULL
;
3006 ardata
->tdata
= NULL
;
3007 bfd_release (abfd
, raw_armap
);
3011 /* Write out an armap. */
3014 _bfd_ecoff_write_armap (bfd
*abfd
,
3015 unsigned int elength
,
3017 unsigned int orl_count
,
3020 unsigned int hashsize
, hashlog
;
3021 bfd_size_type symdefsize
;
3023 unsigned int stringsize
;
3024 unsigned int mapsize
;
3027 struct stat statbuf
;
3030 bfd_byte
*hashtable
;
3034 /* Ultrix appears to use as a hash table size the least power of two
3035 greater than twice the number of entries. */
3036 for (hashlog
= 0; ((unsigned int) 1 << hashlog
) <= 2 * orl_count
; hashlog
++)
3038 hashsize
= 1 << hashlog
;
3040 symdefsize
= hashsize
* 8;
3042 stringsize
= stridx
+ padit
;
3044 /* Include 8 bytes to store symdefsize and stringsize in output. */
3045 mapsize
= symdefsize
+ stringsize
+ 8;
3047 firstreal
= SARMAG
+ sizeof (struct ar_hdr
) + mapsize
+ elength
;
3049 memset ((void *) &hdr
, 0, sizeof hdr
);
3051 /* Work out the ECOFF armap name. */
3052 strcpy (hdr
.ar_name
, ecoff_backend (abfd
)->armap_start
);
3053 hdr
.ar_name
[ARMAP_HEADER_MARKER_INDEX
] = ARMAP_MARKER
;
3054 hdr
.ar_name
[ARMAP_HEADER_ENDIAN_INDEX
] =
3055 (bfd_header_big_endian (abfd
)
3057 : ARMAP_LITTLE_ENDIAN
);
3058 hdr
.ar_name
[ARMAP_OBJECT_MARKER_INDEX
] = ARMAP_MARKER
;
3059 hdr
.ar_name
[ARMAP_OBJECT_ENDIAN_INDEX
] =
3060 bfd_big_endian (abfd
) ? ARMAP_BIG_ENDIAN
: ARMAP_LITTLE_ENDIAN
;
3061 memcpy (hdr
.ar_name
+ ARMAP_END_INDEX
, ARMAP_END
, sizeof ARMAP_END
- 1);
3063 /* Write the timestamp of the archive header to be just a little bit
3064 later than the timestamp of the file, otherwise the linker will
3065 complain that the index is out of date. Actually, the Ultrix
3066 linker just checks the archive name; the GNU linker may check the
3068 stat (bfd_get_filename (abfd
), &statbuf
);
3069 _bfd_ar_spacepad (hdr
.ar_date
, sizeof (hdr
.ar_date
), "%ld",
3070 (long) (statbuf
.st_mtime
+ 60));
3072 /* The DECstation uses zeroes for the uid, gid and mode of the
3074 hdr
.ar_uid
[0] = '0';
3075 hdr
.ar_gid
[0] = '0';
3076 /* Building gcc ends up extracting the armap as a file - twice. */
3077 hdr
.ar_mode
[0] = '6';
3078 hdr
.ar_mode
[1] = '4';
3079 hdr
.ar_mode
[2] = '4';
3081 _bfd_ar_spacepad (hdr
.ar_size
, sizeof (hdr
.ar_size
), "%-10ld", mapsize
);
3083 hdr
.ar_fmag
[0] = '`';
3084 hdr
.ar_fmag
[1] = '\012';
3086 /* Turn all null bytes in the header into spaces. */
3087 for (i
= 0; i
< sizeof (struct ar_hdr
); i
++)
3088 if (((char *) (&hdr
))[i
] == '\0')
3089 (((char *) (&hdr
))[i
]) = ' ';
3091 if (bfd_bwrite ((void *) &hdr
, (bfd_size_type
) sizeof (struct ar_hdr
), abfd
)
3092 != sizeof (struct ar_hdr
))
3095 H_PUT_32 (abfd
, hashsize
, temp
);
3096 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3099 hashtable
= (bfd_byte
*) bfd_zalloc (abfd
, symdefsize
);
3103 current
= abfd
->archive_head
;
3105 for (i
= 0; i
< orl_count
; i
++)
3107 unsigned int hash
, rehash
= 0;
3109 /* Advance firstreal to the file position of this archive
3111 if (map
[i
].u
.abfd
!= last_elt
)
3115 firstreal
+= arelt_size (current
) + sizeof (struct ar_hdr
);
3116 firstreal
+= firstreal
% 2;
3117 current
= current
->archive_next
;
3119 while (current
!= map
[i
].u
.abfd
);
3124 hash
= ecoff_armap_hash (*map
[i
].name
, &rehash
, hashsize
, hashlog
);
3125 if (H_GET_32 (abfd
, (hashtable
+ (hash
* 8) + 4)) != 0)
3129 /* The desired slot is already taken. */
3130 for (srch
= (hash
+ rehash
) & (hashsize
- 1);
3132 srch
= (srch
+ rehash
) & (hashsize
- 1))
3133 if (H_GET_32 (abfd
, (hashtable
+ (srch
* 8) + 4)) == 0)
3136 BFD_ASSERT (srch
!= hash
);
3141 H_PUT_32 (abfd
, map
[i
].namidx
, (hashtable
+ hash
* 8));
3142 H_PUT_32 (abfd
, firstreal
, (hashtable
+ hash
* 8 + 4));
3145 if (bfd_bwrite ((void *) hashtable
, symdefsize
, abfd
) != symdefsize
)
3148 bfd_release (abfd
, hashtable
);
3150 /* Now write the strings. */
3151 H_PUT_32 (abfd
, stringsize
, temp
);
3152 if (bfd_bwrite ((void *) temp
, (bfd_size_type
) 4, abfd
) != 4)
3154 for (i
= 0; i
< orl_count
; i
++)
3158 len
= strlen (*map
[i
].name
) + 1;
3159 if (bfd_bwrite ((void *) (*map
[i
].name
), len
, abfd
) != len
)
3163 /* The spec sez this should be a newline. But in order to be
3164 bug-compatible for DECstation ar we use a null. */
3167 if (bfd_bwrite ("", (bfd_size_type
) 1, abfd
) != 1)
3174 /* ECOFF linker code. */
3176 /* Routine to create an entry in an ECOFF link hash table. */
3178 static struct bfd_hash_entry
*
3179 ecoff_link_hash_newfunc (struct bfd_hash_entry
*entry
,
3180 struct bfd_hash_table
*table
,
3183 struct ecoff_link_hash_entry
*ret
= (struct ecoff_link_hash_entry
*) entry
;
3185 /* Allocate the structure if it has not already been allocated by a
3188 ret
= ((struct ecoff_link_hash_entry
*)
3189 bfd_hash_allocate (table
, sizeof (struct ecoff_link_hash_entry
)));
3193 /* Call the allocation method of the superclass. */
3194 ret
= ((struct ecoff_link_hash_entry
*)
3195 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
3200 /* Set local fields. */
3206 memset ((void *) &ret
->esym
, 0, sizeof ret
->esym
);
3208 return (struct bfd_hash_entry
*) ret
;
3211 /* Create an ECOFF link hash table. */
3213 struct bfd_link_hash_table
*
3214 _bfd_ecoff_bfd_link_hash_table_create (bfd
*abfd
)
3216 struct ecoff_link_hash_table
*ret
;
3217 size_t amt
= sizeof (struct ecoff_link_hash_table
);
3219 ret
= (struct ecoff_link_hash_table
*) bfd_malloc (amt
);
3222 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
3223 ecoff_link_hash_newfunc
,
3224 sizeof (struct ecoff_link_hash_entry
)))
3232 /* Look up an entry in an ECOFF link hash table. */
3234 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3235 ((struct ecoff_link_hash_entry *) \
3236 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3238 /* Get the ECOFF link hash table from the info structure. This is
3241 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3243 /* Add the external symbols of an object file to the global linker
3244 hash table. The external symbols and strings we are passed are
3245 just allocated on the stack, and will be discarded. We must
3246 explicitly save any information we may need later on in the link.
3247 We do not want to read the external symbol information again. */
3250 ecoff_link_add_externals (bfd
*abfd
,
3251 struct bfd_link_info
*info
,
3252 void * external_ext
,
3255 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3256 void (* const swap_ext_in
) (bfd
*, void *, EXTR
*)
3257 = backend
->debug_swap
.swap_ext_in
;
3258 bfd_size_type external_ext_size
= backend
->debug_swap
.external_ext_size
;
3259 unsigned long ext_count
;
3260 struct bfd_link_hash_entry
**sym_hash
;
3265 ext_count
= ecoff_data (abfd
)->debug_info
.symbolic_header
.iextMax
;
3268 amt
*= sizeof (struct bfd_link_hash_entry
*);
3269 sym_hash
= (struct bfd_link_hash_entry
**) bfd_alloc (abfd
, amt
);
3272 ecoff_data (abfd
)->sym_hashes
= (struct ecoff_link_hash_entry
**) sym_hash
;
3274 ext_ptr
= (char *) external_ext
;
3275 ext_end
= ext_ptr
+ ext_count
* external_ext_size
;
3276 for (; ext_ptr
< ext_end
; ext_ptr
+= external_ext_size
, sym_hash
++)
3283 struct ecoff_link_hash_entry
*h
;
3287 (*swap_ext_in
) (abfd
, (void *) ext_ptr
, &esym
);
3289 /* Skip debugging symbols. */
3291 switch (esym
.asym
.st
)
3307 /* Get the information for this symbol. */
3308 value
= esym
.asym
.value
;
3309 switch (esym
.asym
.sc
)
3329 section
= bfd_make_section_old_way (abfd
, _TEXT
);
3330 value
-= section
->vma
;
3333 section
= bfd_make_section_old_way (abfd
, _DATA
);
3334 value
-= section
->vma
;
3337 section
= bfd_make_section_old_way (abfd
, _BSS
);
3338 value
-= section
->vma
;
3341 section
= bfd_abs_section_ptr
;
3344 section
= bfd_und_section_ptr
;
3347 section
= bfd_make_section_old_way (abfd
, _SDATA
);
3348 value
-= section
->vma
;
3351 section
= bfd_make_section_old_way (abfd
, _SBSS
);
3352 value
-= section
->vma
;
3355 section
= bfd_make_section_old_way (abfd
, _RDATA
);
3356 value
-= section
->vma
;
3359 if (value
> ecoff_data (abfd
)->gp_size
)
3361 section
= bfd_com_section_ptr
;
3366 section
= &ecoff_scom_section
;
3369 section
= bfd_und_section_ptr
;
3372 section
= bfd_make_section_old_way (abfd
, _INIT
);
3373 value
-= section
->vma
;
3376 section
= bfd_make_section_old_way (abfd
, _FINI
);
3377 value
-= section
->vma
;
3380 section
= bfd_make_section_old_way (abfd
, _RCONST
);
3381 value
-= section
->vma
;
3385 if (section
== NULL
)
3388 name
= ssext
+ esym
.asym
.iss
;
3390 if (! (_bfd_generic_link_add_one_symbol
3392 (flagword
) (esym
.weakext
? BSF_WEAK
: BSF_GLOBAL
),
3393 section
, value
, NULL
, TRUE
, TRUE
, sym_hash
)))
3396 h
= (struct ecoff_link_hash_entry
*) *sym_hash
;
3398 /* If we are building an ECOFF hash table, save the external
3399 symbol information. */
3400 if (bfd_get_flavour (info
->output_bfd
) == bfd_get_flavour (abfd
))
3403 || (! bfd_is_und_section (section
)
3404 && (! bfd_is_com_section (section
)
3405 || (h
->root
.type
!= bfd_link_hash_defined
3406 && h
->root
.type
!= bfd_link_hash_defweak
))))
3412 /* Remember whether this symbol was small undefined. */
3413 if (esym
.asym
.sc
== scSUndefined
)
3416 /* If this symbol was ever small undefined, it needs to wind
3417 up in a GP relative section. We can't control the
3418 section of a defined symbol, but we can control the
3419 section of a common symbol. This case is actually needed
3420 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3422 && h
->root
.type
== bfd_link_hash_common
3423 && streq (h
->root
.u
.c
.p
->section
->name
, SCOMMON
))
3425 h
->root
.u
.c
.p
->section
= bfd_make_section_old_way (abfd
,
3427 h
->root
.u
.c
.p
->section
->flags
= SEC_ALLOC
;
3428 if (h
->esym
.asym
.sc
== scCommon
)
3429 h
->esym
.asym
.sc
= scSCommon
;
3437 /* Add symbols from an ECOFF object file to the global linker hash
3441 ecoff_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3444 bfd_size_type external_ext_size
;
3445 void * external_ext
= NULL
;
3446 bfd_size_type esize
;
3450 if (! ecoff_slurp_symbolic_header (abfd
))
3453 /* If there are no symbols, we don't want it. */
3454 if (bfd_get_symcount (abfd
) == 0)
3457 symhdr
= &ecoff_data (abfd
)->debug_info
.symbolic_header
;
3459 /* Read in the external symbols and external strings. */
3460 if (bfd_seek (abfd
, symhdr
->cbExtOffset
, SEEK_SET
) != 0)
3462 external_ext_size
= ecoff_backend (abfd
)->debug_swap
.external_ext_size
;
3463 esize
= symhdr
->iextMax
* external_ext_size
;
3464 external_ext
= _bfd_malloc_and_read (abfd
, esize
, esize
);
3465 if (external_ext
== NULL
&& esize
!= 0)
3468 if (bfd_seek (abfd
, symhdr
->cbSsExtOffset
, SEEK_SET
) != 0)
3470 ssext
= (char *) _bfd_malloc_and_read (abfd
, symhdr
->issExtMax
,
3472 if (ssext
== NULL
&& symhdr
->issExtMax
!= 0)
3475 result
= ecoff_link_add_externals (abfd
, info
, external_ext
, ssext
);
3478 free (external_ext
);
3483 free (external_ext
);
3487 /* This is called if we used _bfd_generic_link_add_archive_symbols
3488 because we were not dealing with an ECOFF archive. */
3491 ecoff_link_check_archive_element (bfd
*abfd
,
3492 struct bfd_link_info
*info
,
3493 struct bfd_link_hash_entry
*h
,
3495 bfd_boolean
*pneeded
)
3499 /* Unlike the generic linker, we do not pull in elements because
3500 of common symbols. */
3501 if (h
->type
!= bfd_link_hash_undefined
)
3504 /* Include this element? */
3505 if (!(*info
->callbacks
->add_archive_element
) (info
, abfd
, name
, &abfd
))
3509 return ecoff_link_add_object_symbols (abfd
, info
);
3512 /* Add the symbols from an archive file to the global hash table.
3513 This looks through the undefined symbols, looks each one up in the
3514 archive hash table, and adds any associated object file. We do not
3515 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3516 already have a hash table, so there is no reason to construct
3520 ecoff_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3522 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
3523 const bfd_byte
*raw_armap
;
3524 struct bfd_link_hash_entry
**pundef
;
3525 unsigned int armap_count
;
3526 unsigned int armap_log
;
3528 const bfd_byte
*hashtable
;
3529 const char *stringbase
;
3531 if (! bfd_has_map (abfd
))
3533 /* An empty archive is a special case. */
3534 if (bfd_openr_next_archived_file (abfd
, NULL
) == NULL
)
3536 bfd_set_error (bfd_error_no_armap
);
3540 /* If we don't have any raw data for this archive, as can happen on
3541 Irix 4.0.5F, we call the generic routine.
3542 FIXME: We should be more clever about this, since someday tdata
3543 may get to something for a generic archive. */
3544 raw_armap
= (const bfd_byte
*) bfd_ardata (abfd
)->tdata
;
3545 if (raw_armap
== NULL
)
3546 return (_bfd_generic_link_add_archive_symbols
3547 (abfd
, info
, ecoff_link_check_archive_element
));
3549 armap_count
= H_GET_32 (abfd
, raw_armap
);
3552 for (i
= 1; i
< armap_count
; i
<<= 1)
3554 BFD_ASSERT (i
== armap_count
);
3556 hashtable
= raw_armap
+ 4;
3557 stringbase
= (const char *) raw_armap
+ armap_count
* 8 + 8;
3559 /* Look through the list of undefined symbols. */
3560 pundef
= &info
->hash
->undefs
;
3561 while (*pundef
!= NULL
)
3563 struct bfd_link_hash_entry
*h
;
3564 unsigned int hash
, rehash
= 0;
3565 unsigned int file_offset
;
3571 /* When a symbol is defined, it is not necessarily removed from
3573 if (h
->type
!= bfd_link_hash_undefined
3574 && h
->type
!= bfd_link_hash_common
)
3576 /* Remove this entry from the list, for general cleanliness
3577 and because we are going to look through the list again
3578 if we search any more libraries. We can't remove the
3579 entry if it is the tail, because that would lose any
3580 entries we add to the list later on. */
3581 if (*pundef
!= info
->hash
->undefs_tail
)
3582 *pundef
= (*pundef
)->u
.undef
.next
;
3584 pundef
= &(*pundef
)->u
.undef
.next
;
3588 /* Native ECOFF linkers do not pull in archive elements merely
3589 to satisfy common definitions, so neither do we. We leave
3590 them on the list, though, in case we are linking against some
3591 other object format. */
3592 if (h
->type
!= bfd_link_hash_undefined
)
3594 pundef
= &(*pundef
)->u
.undef
.next
;
3598 /* Look for this symbol in the archive hash table. */
3599 hash
= ecoff_armap_hash (h
->root
.string
, &rehash
, armap_count
,
3602 file_offset
= H_GET_32 (abfd
, hashtable
+ (hash
* 8) + 4);
3603 if (file_offset
== 0)
3605 /* Nothing in this slot. */
3606 pundef
= &(*pundef
)->u
.undef
.next
;
3610 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (hash
* 8));
3611 if (name
[0] != h
->root
.string
[0]
3612 || ! streq (name
, h
->root
.string
))
3617 /* That was the wrong symbol. Try rehashing. */
3619 for (srch
= (hash
+ rehash
) & (armap_count
- 1);
3621 srch
= (srch
+ rehash
) & (armap_count
- 1))
3623 file_offset
= H_GET_32 (abfd
, hashtable
+ (srch
* 8) + 4);
3624 if (file_offset
== 0)
3626 name
= stringbase
+ H_GET_32 (abfd
, hashtable
+ (srch
* 8));
3627 if (name
[0] == h
->root
.string
[0]
3628 && streq (name
, h
->root
.string
))
3637 pundef
= &(*pundef
)->u
.undef
.next
;
3644 element
= (*backend
->get_elt_at_filepos
) (abfd
, (file_ptr
) file_offset
);
3645 if (element
== NULL
)
3648 if (! bfd_check_format (element
, bfd_object
))
3651 /* Unlike the generic linker, we know that this element provides
3652 a definition for an undefined symbol and we know that we want
3653 to include it. We don't need to check anything. */
3654 if (!(*info
->callbacks
3655 ->add_archive_element
) (info
, element
, name
, &element
))
3657 if (! ecoff_link_add_object_symbols (element
, info
))
3660 pundef
= &(*pundef
)->u
.undef
.next
;
3666 /* Given an ECOFF BFD, add symbols to the global hash table as
3670 _bfd_ecoff_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
3672 switch (bfd_get_format (abfd
))
3675 return ecoff_link_add_object_symbols (abfd
, info
);
3677 return ecoff_link_add_archive_symbols (abfd
, info
);
3679 bfd_set_error (bfd_error_wrong_format
);
3685 /* ECOFF final link routines. */
3687 /* Structure used to pass information to ecoff_link_write_external. */
3692 struct bfd_link_info
*info
;
3695 /* Accumulate the debugging information for an input BFD into the
3696 output BFD. This must read in the symbolic information of the
3700 ecoff_final_link_debug_accumulate (bfd
*output_bfd
,
3702 struct bfd_link_info
*info
,
3705 struct ecoff_debug_info
* const debug
= &ecoff_data (input_bfd
)->debug_info
;
3706 const struct ecoff_debug_swap
* const swap
=
3707 &ecoff_backend (input_bfd
)->debug_swap
;
3708 HDRR
*symhdr
= &debug
->symbolic_header
;
3711 #define READ(ptr, offset, count, size, type) \
3715 debug->ptr = NULL; \
3716 if (symhdr->count == 0) \
3718 if (_bfd_mul_overflow (size, symhdr->count, &amt)) \
3720 bfd_set_error (bfd_error_file_too_big); \
3722 goto return_something; \
3724 if (bfd_seek (input_bfd, symhdr->offset, SEEK_SET) != 0) \
3727 goto return_something; \
3729 debug->ptr = (type) _bfd_malloc_and_read (input_bfd, amt, amt); \
3730 if (debug->ptr == NULL) \
3733 goto return_something; \
3737 /* If raw_syments is not NULL, then the data was already by read by
3738 _bfd_ecoff_slurp_symbolic_info. */
3739 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3741 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char),
3743 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, void *);
3744 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, void *);
3745 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, void *);
3746 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, void *);
3747 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
3749 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
3750 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, void *);
3751 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, void *);
3755 /* We do not read the external strings or the external symbols. */
3757 ret
= (bfd_ecoff_debug_accumulate
3758 (handle
, output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
3759 &ecoff_backend (output_bfd
)->debug_swap
,
3760 input_bfd
, debug
, swap
, info
));
3763 if (ecoff_data (input_bfd
)->raw_syments
== NULL
)
3766 free (debug
->external_dnr
);
3767 free (debug
->external_pdr
);
3768 free (debug
->external_sym
);
3769 free (debug
->external_opt
);
3770 free (debug
->external_aux
);
3772 free (debug
->external_fdr
);
3773 free (debug
->external_rfd
);
3775 /* Make sure we don't accidentally follow one of these pointers
3776 into freed memory. */
3778 debug
->external_dnr
= NULL
;
3779 debug
->external_pdr
= NULL
;
3780 debug
->external_sym
= NULL
;
3781 debug
->external_opt
= NULL
;
3782 debug
->external_aux
= NULL
;
3784 debug
->external_fdr
= NULL
;
3785 debug
->external_rfd
= NULL
;
3791 /* Relocate and write an ECOFF section into an ECOFF output file. */
3794 ecoff_indirect_link_order (bfd
*output_bfd
,
3795 struct bfd_link_info
*info
,
3796 asection
*output_section
,
3797 struct bfd_link_order
*link_order
)
3799 asection
*input_section
;
3801 bfd_byte
*contents
= NULL
;
3802 bfd_size_type external_reloc_size
;
3803 bfd_size_type external_relocs_size
;
3804 void * external_relocs
= NULL
;
3806 BFD_ASSERT ((output_section
->flags
& SEC_HAS_CONTENTS
) != 0);
3808 input_section
= link_order
->u
.indirect
.section
;
3809 input_bfd
= input_section
->owner
;
3810 if (input_section
->size
== 0)
3813 BFD_ASSERT (input_section
->output_section
== output_section
);
3814 BFD_ASSERT (input_section
->output_offset
== link_order
->offset
);
3815 BFD_ASSERT (input_section
->size
== link_order
->size
);
3817 /* Get the section contents. */
3818 if (!bfd_malloc_and_get_section (input_bfd
, input_section
, &contents
))
3821 /* Get the relocs. If we are relaxing MIPS code, they will already
3822 have been read in. Otherwise, we read them in now. */
3823 external_reloc_size
= ecoff_backend (input_bfd
)->external_reloc_size
;
3824 external_relocs_size
= external_reloc_size
* input_section
->reloc_count
;
3826 if (bfd_seek (input_bfd
, input_section
->rel_filepos
, SEEK_SET
) != 0)
3828 external_relocs
= _bfd_malloc_and_read (input_bfd
, external_relocs_size
,
3829 external_relocs_size
);
3830 if (external_relocs
== NULL
&& external_relocs_size
!= 0)
3833 /* Relocate the section contents. */
3834 if (! ((*ecoff_backend (input_bfd
)->relocate_section
)
3835 (output_bfd
, info
, input_bfd
, input_section
, contents
,
3839 /* Write out the relocated section. */
3840 if (! bfd_set_section_contents (output_bfd
,
3843 input_section
->output_offset
,
3844 input_section
->size
))
3847 /* If we are producing relocatable output, the relocs were
3848 modified, and we write them out now. We use the reloc_count
3849 field of output_section to keep track of the number of relocs we
3850 have output so far. */
3851 if (bfd_link_relocatable (info
))
3853 file_ptr pos
= (output_section
->rel_filepos
3854 + output_section
->reloc_count
* external_reloc_size
);
3855 if (bfd_seek (output_bfd
, pos
, SEEK_SET
) != 0
3856 || (bfd_bwrite (external_relocs
, external_relocs_size
, output_bfd
)
3857 != external_relocs_size
))
3859 output_section
->reloc_count
+= input_section
->reloc_count
;
3863 free (external_relocs
);
3868 free (external_relocs
);
3872 /* Generate a reloc when linking an ECOFF file. This is a reloc
3873 requested by the linker, and does come from any input file. This
3874 is used to build constructor and destructor tables when linking
3878 ecoff_reloc_link_order (bfd
*output_bfd
,
3879 struct bfd_link_info
*info
,
3880 asection
*output_section
,
3881 struct bfd_link_order
*link_order
)
3883 enum bfd_link_order_type type
;
3887 struct internal_reloc in
;
3888 bfd_size_type external_reloc_size
;
3893 type
= link_order
->type
;
3895 addend
= link_order
->u
.reloc
.p
->addend
;
3897 /* We set up an arelent to pass to the backend adjust_reloc_out
3899 rel
.address
= link_order
->offset
;
3901 rel
.howto
= bfd_reloc_type_lookup (output_bfd
, link_order
->u
.reloc
.p
->reloc
);
3904 bfd_set_error (bfd_error_bad_value
);
3908 if (type
== bfd_section_reloc_link_order
)
3910 section
= link_order
->u
.reloc
.p
->u
.section
;
3911 rel
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
3915 struct bfd_link_hash_entry
*h
;
3917 /* Treat a reloc against a defined symbol as though it were
3918 actually against the section. */
3919 h
= bfd_wrapped_link_hash_lookup (output_bfd
, info
,
3920 link_order
->u
.reloc
.p
->u
.name
,
3921 FALSE
, FALSE
, FALSE
);
3923 && (h
->type
== bfd_link_hash_defined
3924 || h
->type
== bfd_link_hash_defweak
))
3926 type
= bfd_section_reloc_link_order
;
3927 section
= h
->u
.def
.section
->output_section
;
3928 /* It seems that we ought to add the symbol value to the
3929 addend here, but in practice it has already been added
3930 because it was passed to constructor_callback. */
3931 addend
+= section
->vma
+ h
->u
.def
.section
->output_offset
;
3935 /* We can't set up a reloc against a symbol correctly,
3936 because we have no asymbol structure. Currently no
3937 adjust_reloc_out routine cares. */
3938 rel
.sym_ptr_ptr
= NULL
;
3942 /* All ECOFF relocs are in-place. Put the addend into the object
3945 BFD_ASSERT (rel
.howto
->partial_inplace
);
3949 bfd_reloc_status_type rstat
;
3952 size
= bfd_get_reloc_size (rel
.howto
);
3953 buf
= (bfd_byte
*) bfd_zmalloc (size
);
3954 if (buf
== NULL
&& size
!= 0)
3956 rstat
= _bfd_relocate_contents (rel
.howto
, output_bfd
,
3957 (bfd_vma
) addend
, buf
);
3963 case bfd_reloc_outofrange
:
3965 case bfd_reloc_overflow
:
3966 (*info
->callbacks
->reloc_overflow
)
3968 (link_order
->type
== bfd_section_reloc_link_order
3969 ? bfd_section_name (section
)
3970 : link_order
->u
.reloc
.p
->u
.name
),
3971 rel
.howto
->name
, addend
, NULL
, NULL
, (bfd_vma
) 0);
3974 ok
= bfd_set_section_contents (output_bfd
, output_section
, (void *) buf
,
3975 (file_ptr
) link_order
->offset
, size
);
3983 /* Move the information into an internal_reloc structure. */
3984 in
.r_vaddr
= rel
.address
+ bfd_section_vma (output_section
);
3985 in
.r_type
= rel
.howto
->type
;
3987 if (type
== bfd_symbol_reloc_link_order
)
3989 struct ecoff_link_hash_entry
*h
;
3991 h
= ((struct ecoff_link_hash_entry
*)
3992 bfd_wrapped_link_hash_lookup (output_bfd
, info
,
3993 link_order
->u
.reloc
.p
->u
.name
,
3994 FALSE
, FALSE
, TRUE
));
3997 in
.r_symndx
= h
->indx
;
4000 (*info
->callbacks
->unattached_reloc
)
4001 (info
, link_order
->u
.reloc
.p
->u
.name
, NULL
, NULL
, (bfd_vma
) 0);
4017 { _TEXT
, RELOC_SECTION_TEXT
},
4018 { _RDATA
, RELOC_SECTION_RDATA
},
4019 { _DATA
, RELOC_SECTION_DATA
},
4020 { _SDATA
, RELOC_SECTION_SDATA
},
4021 { _SBSS
, RELOC_SECTION_SBSS
},
4022 { _BSS
, RELOC_SECTION_BSS
},
4023 { _INIT
, RELOC_SECTION_INIT
},
4024 { _LIT8
, RELOC_SECTION_LIT8
},
4025 { _LIT4
, RELOC_SECTION_LIT4
},
4026 { _XDATA
, RELOC_SECTION_XDATA
},
4027 { _PDATA
, RELOC_SECTION_PDATA
},
4028 { _FINI
, RELOC_SECTION_FINI
},
4029 { _LITA
, RELOC_SECTION_LITA
},
4030 { "*ABS*", RELOC_SECTION_ABS
},
4031 { _RCONST
, RELOC_SECTION_RCONST
}
4034 name
= bfd_section_name (section
);
4036 for (i
= 0; i
< ARRAY_SIZE (section_symndx
); i
++)
4037 if (streq (name
, section_symndx
[i
].name
))
4039 in
.r_symndx
= section_symndx
[i
].r_symndx
;
4043 if (i
== ARRAY_SIZE (section_symndx
))
4049 /* Let the BFD backend adjust the reloc. */
4050 (*ecoff_backend (output_bfd
)->adjust_reloc_out
) (output_bfd
, &rel
, &in
);
4052 /* Get some memory and swap out the reloc. */
4053 external_reloc_size
= ecoff_backend (output_bfd
)->external_reloc_size
;
4054 rbuf
= (bfd_byte
*) bfd_malloc (external_reloc_size
);
4058 (*ecoff_backend (output_bfd
)->swap_reloc_out
) (output_bfd
, &in
, (void *) rbuf
);
4060 pos
= (output_section
->rel_filepos
4061 + output_section
->reloc_count
* external_reloc_size
);
4062 ok
= (bfd_seek (output_bfd
, pos
, SEEK_SET
) == 0
4063 && (bfd_bwrite ((void *) rbuf
, external_reloc_size
, output_bfd
)
4064 == external_reloc_size
));
4067 ++output_section
->reloc_count
;
4074 /* Put out information for an external symbol. These come only from
4078 ecoff_link_write_external (struct bfd_hash_entry
*bh
, void * data
)
4080 struct ecoff_link_hash_entry
*h
= (struct ecoff_link_hash_entry
*) bh
;
4081 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
4082 bfd
*output_bfd
= einfo
->abfd
;
4085 if (h
->root
.type
== bfd_link_hash_warning
)
4087 h
= (struct ecoff_link_hash_entry
*) h
->root
.u
.i
.link
;
4088 if (h
->root
.type
== bfd_link_hash_new
)
4092 /* We need to check if this symbol is being stripped. */
4093 if (h
->root
.type
== bfd_link_hash_undefined
4094 || h
->root
.type
== bfd_link_hash_undefweak
)
4096 else if (einfo
->info
->strip
== strip_all
4097 || (einfo
->info
->strip
== strip_some
4098 && bfd_hash_lookup (einfo
->info
->keep_hash
,
4099 h
->root
.root
.string
,
4100 FALSE
, FALSE
) == NULL
))
4105 if (strip
|| h
->written
)
4108 if (h
->abfd
== NULL
)
4111 h
->esym
.cobol_main
= 0;
4112 h
->esym
.weakext
= 0;
4113 h
->esym
.reserved
= 0;
4114 h
->esym
.ifd
= ifdNil
;
4115 h
->esym
.asym
.value
= 0;
4116 h
->esym
.asym
.st
= stGlobal
;
4118 if (h
->root
.type
!= bfd_link_hash_defined
4119 && h
->root
.type
!= bfd_link_hash_defweak
)
4120 h
->esym
.asym
.sc
= scAbs
;
4123 asection
*output_section
;
4131 section_storage_classes
[] =
4135 { _SDATA
, scSData
},
4136 { _RDATA
, scRData
},
4141 { _PDATA
, scPData
},
4142 { _XDATA
, scXData
},
4143 { _RCONST
, scRConst
}
4146 output_section
= h
->root
.u
.def
.section
->output_section
;
4147 name
= bfd_section_name (output_section
);
4149 for (i
= 0; i
< ARRAY_SIZE (section_storage_classes
); i
++)
4150 if (streq (name
, section_storage_classes
[i
].name
))
4152 h
->esym
.asym
.sc
= section_storage_classes
[i
].sc
;
4156 if (i
== ARRAY_SIZE (section_storage_classes
))
4157 h
->esym
.asym
.sc
= scAbs
;
4160 h
->esym
.asym
.reserved
= 0;
4161 h
->esym
.asym
.index
= indexNil
;
4163 else if (h
->esym
.ifd
!= -1)
4165 struct ecoff_debug_info
*debug
;
4167 /* Adjust the FDR index for the symbol by that used for the
4169 debug
= &ecoff_data (h
->abfd
)->debug_info
;
4170 BFD_ASSERT (h
->esym
.ifd
>= 0
4171 && h
->esym
.ifd
< debug
->symbolic_header
.ifdMax
);
4172 h
->esym
.ifd
= debug
->ifdmap
[h
->esym
.ifd
];
4175 switch (h
->root
.type
)
4178 case bfd_link_hash_warning
:
4179 case bfd_link_hash_new
:
4181 case bfd_link_hash_undefined
:
4182 case bfd_link_hash_undefweak
:
4183 if (h
->esym
.asym
.sc
!= scUndefined
4184 && h
->esym
.asym
.sc
!= scSUndefined
)
4185 h
->esym
.asym
.sc
= scUndefined
;
4187 case bfd_link_hash_defined
:
4188 case bfd_link_hash_defweak
:
4189 if (h
->esym
.asym
.sc
== scUndefined
4190 || h
->esym
.asym
.sc
== scSUndefined
)
4191 h
->esym
.asym
.sc
= scAbs
;
4192 else if (h
->esym
.asym
.sc
== scCommon
)
4193 h
->esym
.asym
.sc
= scBss
;
4194 else if (h
->esym
.asym
.sc
== scSCommon
)
4195 h
->esym
.asym
.sc
= scSBss
;
4196 h
->esym
.asym
.value
= (h
->root
.u
.def
.value
4197 + h
->root
.u
.def
.section
->output_section
->vma
4198 + h
->root
.u
.def
.section
->output_offset
);
4200 case bfd_link_hash_common
:
4201 if (h
->esym
.asym
.sc
!= scCommon
4202 && h
->esym
.asym
.sc
!= scSCommon
)
4203 h
->esym
.asym
.sc
= scCommon
;
4204 h
->esym
.asym
.value
= h
->root
.u
.c
.size
;
4206 case bfd_link_hash_indirect
:
4207 /* We ignore these symbols, since the indirected symbol is
4208 already in the hash table. */
4212 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4214 h
->indx
= ecoff_data (output_bfd
)->debug_info
.symbolic_header
.iextMax
;
4217 return (bfd_ecoff_debug_one_external
4218 (output_bfd
, &ecoff_data (output_bfd
)->debug_info
,
4219 &ecoff_backend (output_bfd
)->debug_swap
, h
->root
.root
.string
,
4223 /* ECOFF final link routine. This looks through all the input BFDs
4224 and gathers together all the debugging information, and then
4225 processes all the link order information. This may cause it to
4226 close and reopen some input BFDs; I'll see how bad this is. */
4229 _bfd_ecoff_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
4231 const struct ecoff_backend_data
* const backend
= ecoff_backend (abfd
);
4232 struct ecoff_debug_info
* const debug
= &ecoff_data (abfd
)->debug_info
;
4237 struct bfd_link_order
*p
;
4238 struct extsym_info einfo
;
4240 /* We accumulate the debugging information counts in the symbolic
4242 symhdr
= &debug
->symbolic_header
;
4244 symhdr
->ilineMax
= 0;
4248 symhdr
->isymMax
= 0;
4249 symhdr
->ioptMax
= 0;
4250 symhdr
->iauxMax
= 0;
4252 symhdr
->issExtMax
= 0;
4255 symhdr
->iextMax
= 0;
4257 /* We accumulate the debugging information itself in the debug_info
4260 debug
->external_dnr
= NULL
;
4261 debug
->external_pdr
= NULL
;
4262 debug
->external_sym
= NULL
;
4263 debug
->external_opt
= NULL
;
4264 debug
->external_aux
= NULL
;
4266 debug
->ssext
= debug
->ssext_end
= NULL
;
4267 debug
->external_fdr
= NULL
;
4268 debug
->external_rfd
= NULL
;
4269 debug
->external_ext
= debug
->external_ext_end
= NULL
;
4271 handle
= bfd_ecoff_debug_init (abfd
, debug
, &backend
->debug_swap
, info
);
4275 /* Accumulate the debugging symbols from each input BFD. */
4276 for (input_bfd
= info
->input_bfds
;
4278 input_bfd
= input_bfd
->link
.next
)
4282 if (bfd_get_flavour (input_bfd
) == bfd_target_ecoff_flavour
)
4284 /* Arbitrarily set the symbolic header vstamp to the vstamp
4285 of the first object file in the link. */
4286 if (symhdr
->vstamp
== 0)
4288 = ecoff_data (input_bfd
)->debug_info
.symbolic_header
.vstamp
;
4289 ret
= ecoff_final_link_debug_accumulate (abfd
, input_bfd
, info
,
4293 ret
= bfd_ecoff_debug_accumulate_other (handle
, abfd
,
4294 debug
, &backend
->debug_swap
,
4299 /* Combine the register masks. */
4300 ecoff_data (abfd
)->gprmask
|= ecoff_data (input_bfd
)->gprmask
;
4301 ecoff_data (abfd
)->fprmask
|= ecoff_data (input_bfd
)->fprmask
;
4302 ecoff_data (abfd
)->cprmask
[0] |= ecoff_data (input_bfd
)->cprmask
[0];
4303 ecoff_data (abfd
)->cprmask
[1] |= ecoff_data (input_bfd
)->cprmask
[1];
4304 ecoff_data (abfd
)->cprmask
[2] |= ecoff_data (input_bfd
)->cprmask
[2];
4305 ecoff_data (abfd
)->cprmask
[3] |= ecoff_data (input_bfd
)->cprmask
[3];
4308 /* Write out the external symbols. */
4311 bfd_hash_traverse (&info
->hash
->table
, ecoff_link_write_external
, &einfo
);
4313 if (bfd_link_relocatable (info
))
4315 /* We need to make a pass over the link_orders to count up the
4316 number of relocations we will need to output, so that we know
4317 how much space they will take up. */
4318 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4321 for (p
= o
->map_head
.link_order
;
4324 if (p
->type
== bfd_indirect_link_order
)
4325 o
->reloc_count
+= p
->u
.indirect
.section
->reloc_count
;
4326 else if (p
->type
== bfd_section_reloc_link_order
4327 || p
->type
== bfd_symbol_reloc_link_order
)
4332 /* Compute the reloc and symbol file positions. */
4333 ecoff_compute_reloc_file_positions (abfd
);
4335 /* Write out the debugging information. */
4336 if (! bfd_ecoff_write_accumulated_debug (handle
, abfd
, debug
,
4337 &backend
->debug_swap
, info
,
4338 ecoff_data (abfd
)->sym_filepos
))
4341 bfd_ecoff_debug_free (handle
, abfd
, debug
, &backend
->debug_swap
, info
);
4343 if (bfd_link_relocatable (info
))
4345 /* Now reset the reloc_count field of the sections in the output
4346 BFD to 0, so that we can use them to keep track of how many
4347 relocs we have output thus far. */
4348 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4352 /* Get a value for the GP register. */
4353 if (ecoff_data (abfd
)->gp
== 0)
4355 struct bfd_link_hash_entry
*h
;
4357 h
= bfd_link_hash_lookup (info
->hash
, "_gp", FALSE
, FALSE
, TRUE
);
4359 && h
->type
== bfd_link_hash_defined
)
4360 ecoff_data (abfd
)->gp
= (h
->u
.def
.value
4361 + h
->u
.def
.section
->output_section
->vma
4362 + h
->u
.def
.section
->output_offset
);
4363 else if (bfd_link_relocatable (info
))
4367 /* Make up a value. */
4369 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4372 && (streq (o
->name
, _SBSS
)
4373 || streq (o
->name
, _SDATA
)
4374 || streq (o
->name
, _LIT4
)
4375 || streq (o
->name
, _LIT8
)
4376 || streq (o
->name
, _LITA
)))
4379 ecoff_data (abfd
)->gp
= lo
+ 0x8000;
4383 /* If the relocate_section function needs to do a reloc
4384 involving the GP value, it should make a reloc_dangerous
4385 callback to warn that GP is not defined. */
4389 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
4391 for (p
= o
->map_head
.link_order
;
4395 if (p
->type
== bfd_indirect_link_order
4396 && (bfd_get_flavour (p
->u
.indirect
.section
->owner
)
4397 == bfd_target_ecoff_flavour
))
4399 if (! ecoff_indirect_link_order (abfd
, info
, o
, p
))
4402 else if (p
->type
== bfd_section_reloc_link_order
4403 || p
->type
== bfd_symbol_reloc_link_order
)
4405 if (! ecoff_reloc_link_order (abfd
, info
, o
, p
))
4410 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
4416 abfd
->symcount
= symhdr
->iextMax
+ symhdr
->isymMax
;
4418 ecoff_data (abfd
)->linker
= TRUE
;