2001-05-25 H.J. Lu <hjl@gnu.org>
[binutils.git] / bfd / ecoff.c
blobd05c15f285907b7aaedc6611321b3d243a891f31
1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Original version by Per Bothner.
5 Full support added by Ian Lance Taylor, ian@cygnus.com.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include "bfd.h"
24 #include "sysdep.h"
25 #include "bfdlink.h"
26 #include "libbfd.h"
27 #include "aout/ar.h"
28 #include "aout/ranlib.h"
29 #include "aout/stab_gnu.h"
31 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
32 some other stuff which we don't want and which conflicts with stuff
33 we do want. */
34 #include "libaout.h"
35 #include "aout/aout64.h"
36 #undef N_ABS
37 #undef exec_hdr
38 #undef obj_sym_filepos
40 #include "coff/internal.h"
41 #include "coff/sym.h"
42 #include "coff/symconst.h"
43 #include "coff/ecoff.h"
44 #include "libcoff.h"
45 #include "libecoff.h"
47 /* Prototypes for static functions. */
49 static int ecoff_get_magic PARAMS ((bfd *abfd));
50 static long ecoff_sec_to_styp_flags PARAMS ((const char *name,
51 flagword flags));
52 static boolean ecoff_slurp_symbolic_header PARAMS ((bfd *abfd));
53 static boolean ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym,
54 asymbol *asym, int ext, int weak));
55 static void ecoff_emit_aggregate PARAMS ((bfd *abfd, FDR *fdr,
56 char *string,
57 RNDXR *rndx, long isym,
58 const char *which));
59 static char *ecoff_type_to_string PARAMS ((bfd *abfd, FDR *fdr,
60 unsigned int indx));
61 static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section,
62 asymbol **symbols));
63 static int ecoff_sort_hdrs PARAMS ((const PTR, const PTR));
64 static boolean ecoff_compute_section_file_positions PARAMS ((bfd *abfd));
65 static bfd_size_type ecoff_compute_reloc_file_positions PARAMS ((bfd *abfd));
66 static boolean ecoff_get_extr PARAMS ((asymbol *, EXTR *));
67 static void ecoff_set_index PARAMS ((asymbol *, bfd_size_type));
68 static unsigned int ecoff_armap_hash PARAMS ((CONST char *s,
69 unsigned int *rehash,
70 unsigned int size,
71 unsigned int hlog));
73 /* This stuff is somewhat copied from coffcode.h. */
75 static asection bfd_debug_section =
77 /* name, id, index, next, flags, user_set_vma, reloc_done, */
78 "*DEBUG*", 0, 0, NULL, 0, 0, 0,
79 /* linker_mark, linker_has_input, gc_mark, segment_mark, */
80 0, 0, 0, 0,
81 /* vma, lma, _cooked_size, _raw_size, */
82 0, 0, 0, 0,
83 /* output_offset, output_section, alignment_power, */
84 0, NULL, 0,
85 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
86 NULL, NULL, 0, 0, 0,
87 /* line_filepos, userdata, contents, lineno, lineno_count, */
88 0, NULL, NULL, NULL, 0,
89 /* entsize, comdat, kept_section, moving_line_filepos, */
90 0, NULL, NULL, 0,
91 /* target_index, used_by_bfd, constructor_chain, owner, */
92 0, NULL, NULL, NULL,
93 /* symbol, */
94 (struct symbol_cache_entry *) NULL,
95 /* symbol_ptr_ptr, */
96 (struct symbol_cache_entry **) NULL,
97 /* link_order_head, link_order_tail */
98 NULL, NULL
101 /* Create an ECOFF object. */
103 boolean
104 _bfd_ecoff_mkobject (abfd)
105 bfd *abfd;
107 abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *)
108 bfd_zalloc (abfd, sizeof (ecoff_data_type)));
109 if (abfd->tdata.ecoff_obj_data == NULL)
110 return false;
112 return true;
115 /* This is a hook called by coff_real_object_p to create any backend
116 specific information. */
119 _bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr)
120 bfd *abfd;
121 PTR filehdr;
122 PTR aouthdr;
124 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
125 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
126 ecoff_data_type *ecoff;
128 if (_bfd_ecoff_mkobject (abfd) == false)
129 return NULL;
131 ecoff = ecoff_data (abfd);
132 ecoff->gp_size = 8;
133 ecoff->sym_filepos = internal_f->f_symptr;
135 if (internal_a != (struct internal_aouthdr *) NULL)
137 int i;
139 ecoff->text_start = internal_a->text_start;
140 ecoff->text_end = internal_a->text_start + internal_a->tsize;
141 ecoff->gp = internal_a->gp_value;
142 ecoff->gprmask = internal_a->gprmask;
143 for (i = 0; i < 4; i++)
144 ecoff->cprmask[i] = internal_a->cprmask[i];
145 ecoff->fprmask = internal_a->fprmask;
146 if (internal_a->magic == ECOFF_AOUT_ZMAGIC)
147 abfd->flags |= D_PAGED;
148 else
149 abfd->flags &=~ D_PAGED;
152 /* It turns out that no special action is required by the MIPS or
153 Alpha ECOFF backends. They have different information in the
154 a.out header, but we just copy it all (e.g., gprmask, cprmask and
155 fprmask) and let the swapping routines ensure that only relevant
156 information is written out. */
158 return (PTR) ecoff;
161 /* Initialize a new section. */
163 boolean
164 _bfd_ecoff_new_section_hook (abfd, section)
165 bfd *abfd ATTRIBUTE_UNUSED;
166 asection *section;
168 section->alignment_power = 4;
170 if (strcmp (section->name, _TEXT) == 0
171 || strcmp (section->name, _INIT) == 0
172 || strcmp (section->name, _FINI) == 0)
173 section->flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
174 else if (strcmp (section->name, _DATA) == 0
175 || strcmp (section->name, _SDATA) == 0)
176 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
177 else if (strcmp (section->name, _RDATA) == 0
178 || strcmp (section->name, _LIT8) == 0
179 || strcmp (section->name, _LIT4) == 0
180 || strcmp (section->name, _RCONST) == 0
181 || strcmp (section->name, _PDATA) == 0)
182 section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
183 else if (strcmp (section->name, _BSS) == 0
184 || strcmp (section->name, _SBSS) == 0)
185 section->flags |= SEC_ALLOC;
186 else if (strcmp (section->name, _LIB) == 0)
188 /* An Irix 4 shared libary. */
189 section->flags |= SEC_COFF_SHARED_LIBRARY;
192 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
193 uncertain about .init on some systems and I don't know how shared
194 libraries work. */
196 return true;
199 /* Determine the machine architecture and type. This is called from
200 the generic COFF routines. It is the inverse of ecoff_get_magic,
201 below. This could be an ECOFF backend routine, with one version
202 for each target, but there aren't all that many ECOFF targets. */
204 boolean
205 _bfd_ecoff_set_arch_mach_hook (abfd, filehdr)
206 bfd *abfd;
207 PTR filehdr;
209 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
210 enum bfd_architecture arch;
211 unsigned long mach;
213 switch (internal_f->f_magic)
215 case MIPS_MAGIC_1:
216 case MIPS_MAGIC_LITTLE:
217 case MIPS_MAGIC_BIG:
218 arch = bfd_arch_mips;
219 mach = 3000;
220 break;
222 case MIPS_MAGIC_LITTLE2:
223 case MIPS_MAGIC_BIG2:
224 /* MIPS ISA level 2: the r6000 */
225 arch = bfd_arch_mips;
226 mach = 6000;
227 break;
229 case MIPS_MAGIC_LITTLE3:
230 case MIPS_MAGIC_BIG3:
231 /* MIPS ISA level 3: the r4000 */
232 arch = bfd_arch_mips;
233 mach = 4000;
234 break;
236 case ALPHA_MAGIC:
237 arch = bfd_arch_alpha;
238 mach = 0;
239 break;
241 default:
242 arch = bfd_arch_obscure;
243 mach = 0;
244 break;
247 return bfd_default_set_arch_mach (abfd, arch, mach);
250 /* Get the magic number to use based on the architecture and machine.
251 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
253 static int
254 ecoff_get_magic (abfd)
255 bfd *abfd;
257 int big, little;
259 switch (bfd_get_arch (abfd))
261 case bfd_arch_mips:
262 switch (bfd_get_mach (abfd))
264 default:
265 case 0:
266 case 3000:
267 big = MIPS_MAGIC_BIG;
268 little = MIPS_MAGIC_LITTLE;
269 break;
271 case 6000:
272 big = MIPS_MAGIC_BIG2;
273 little = MIPS_MAGIC_LITTLE2;
274 break;
276 case 4000:
277 big = MIPS_MAGIC_BIG3;
278 little = MIPS_MAGIC_LITTLE3;
279 break;
282 return bfd_big_endian (abfd) ? big : little;
284 case bfd_arch_alpha:
285 return ALPHA_MAGIC;
287 default:
288 abort ();
289 return 0;
293 /* Get the section s_flags to use for a section. */
295 static long
296 ecoff_sec_to_styp_flags (name, flags)
297 const char *name;
298 flagword flags;
300 long styp;
302 styp = 0;
304 if (strcmp (name, _TEXT) == 0)
305 styp = STYP_TEXT;
306 else if (strcmp (name, _DATA) == 0)
307 styp = STYP_DATA;
308 else if (strcmp (name, _SDATA) == 0)
309 styp = STYP_SDATA;
310 else if (strcmp (name, _RDATA) == 0)
311 styp = STYP_RDATA;
312 else if (strcmp (name, _LITA) == 0)
313 styp = STYP_LITA;
314 else if (strcmp (name, _LIT8) == 0)
315 styp = STYP_LIT8;
316 else if (strcmp (name, _LIT4) == 0)
317 styp = STYP_LIT4;
318 else if (strcmp (name, _BSS) == 0)
319 styp = STYP_BSS;
320 else if (strcmp (name, _SBSS) == 0)
321 styp = STYP_SBSS;
322 else if (strcmp (name, _INIT) == 0)
323 styp = STYP_ECOFF_INIT;
324 else if (strcmp (name, _FINI) == 0)
325 styp = STYP_ECOFF_FINI;
326 else if (strcmp (name, _PDATA) == 0)
327 styp = STYP_PDATA;
328 else if (strcmp (name, _XDATA) == 0)
329 styp = STYP_XDATA;
330 else if (strcmp (name, _LIB) == 0)
331 styp = STYP_ECOFF_LIB;
332 else if (strcmp (name, _GOT) == 0)
333 styp = STYP_GOT;
334 else if (strcmp (name, _HASH) == 0)
335 styp = STYP_HASH;
336 else if (strcmp (name, _DYNAMIC) == 0)
337 styp = STYP_DYNAMIC;
338 else if (strcmp (name, _LIBLIST) == 0)
339 styp = STYP_LIBLIST;
340 else if (strcmp (name, _RELDYN) == 0)
341 styp = STYP_RELDYN;
342 else if (strcmp (name, _CONFLIC) == 0)
343 styp = STYP_CONFLIC;
344 else if (strcmp (name, _DYNSTR) == 0)
345 styp = STYP_DYNSTR;
346 else if (strcmp (name, _DYNSYM) == 0)
347 styp = STYP_DYNSYM;
348 else if (strcmp (name, _COMMENT) == 0)
350 styp = STYP_COMMENT;
351 flags &=~ SEC_NEVER_LOAD;
353 else if (strcmp (name, _RCONST) == 0)
354 styp = STYP_RCONST;
355 else if (flags & SEC_CODE)
356 styp = STYP_TEXT;
357 else if (flags & SEC_DATA)
358 styp = STYP_DATA;
359 else if (flags & SEC_READONLY)
360 styp = STYP_RDATA;
361 else if (flags & SEC_LOAD)
362 styp = STYP_REG;
363 else
364 styp = STYP_BSS;
366 if (flags & SEC_NEVER_LOAD)
367 styp |= STYP_NOLOAD;
369 return styp;
372 /* Get the BFD flags to use for a section. */
374 flagword
375 _bfd_ecoff_styp_to_sec_flags (abfd, hdr, name, section)
376 bfd *abfd ATTRIBUTE_UNUSED;
377 PTR hdr;
378 const char *name ATTRIBUTE_UNUSED;
379 asection *section ATTRIBUTE_UNUSED;
381 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
382 long styp_flags = internal_s->s_flags;
383 flagword sec_flags=0;
385 if (styp_flags & STYP_NOLOAD)
386 sec_flags |= SEC_NEVER_LOAD;
388 /* For 386 COFF, at least, an unloadable text or data section is
389 actually a shared library section. */
390 if ((styp_flags & STYP_TEXT)
391 || (styp_flags & STYP_ECOFF_INIT)
392 || (styp_flags & STYP_ECOFF_FINI)
393 || (styp_flags & STYP_DYNAMIC)
394 || (styp_flags & STYP_LIBLIST)
395 || (styp_flags & STYP_RELDYN)
396 || styp_flags == STYP_CONFLIC
397 || (styp_flags & STYP_DYNSTR)
398 || (styp_flags & STYP_DYNSYM)
399 || (styp_flags & STYP_HASH))
401 if (sec_flags & SEC_NEVER_LOAD)
402 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
403 else
404 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
406 else if ((styp_flags & STYP_DATA)
407 || (styp_flags & STYP_RDATA)
408 || (styp_flags & STYP_SDATA)
409 || styp_flags == STYP_PDATA
410 || styp_flags == STYP_XDATA
411 || (styp_flags & STYP_GOT)
412 || styp_flags == STYP_RCONST)
414 if (sec_flags & SEC_NEVER_LOAD)
415 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
416 else
417 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
418 if ((styp_flags & STYP_RDATA)
419 || styp_flags == STYP_PDATA
420 || styp_flags == STYP_RCONST)
421 sec_flags |= SEC_READONLY;
423 else if ((styp_flags & STYP_BSS)
424 || (styp_flags & STYP_SBSS))
426 sec_flags |= SEC_ALLOC;
428 else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT)
430 sec_flags |= SEC_NEVER_LOAD;
432 else if ((styp_flags & STYP_LITA)
433 || (styp_flags & STYP_LIT8)
434 || (styp_flags & STYP_LIT4))
436 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
438 else if (styp_flags & STYP_ECOFF_LIB)
440 sec_flags |= SEC_COFF_SHARED_LIBRARY;
442 else
444 sec_flags |= SEC_ALLOC | SEC_LOAD;
447 return sec_flags;
450 /* Read in the symbolic header for an ECOFF object file. */
452 static boolean
453 ecoff_slurp_symbolic_header (abfd)
454 bfd *abfd;
456 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
457 bfd_size_type external_hdr_size;
458 PTR raw = NULL;
459 HDRR *internal_symhdr;
461 /* See if we've already read it in. */
462 if (ecoff_data (abfd)->debug_info.symbolic_header.magic ==
463 backend->debug_swap.sym_magic)
464 return true;
466 /* See whether there is a symbolic header. */
467 if (ecoff_data (abfd)->sym_filepos == 0)
469 bfd_get_symcount (abfd) = 0;
470 return true;
473 /* At this point bfd_get_symcount (abfd) holds the number of symbols
474 as read from the file header, but on ECOFF this is always the
475 size of the symbolic information header. It would be cleaner to
476 handle this when we first read the file in coffgen.c. */
477 external_hdr_size = backend->debug_swap.external_hdr_size;
478 if (bfd_get_symcount (abfd) != external_hdr_size)
480 bfd_set_error (bfd_error_bad_value);
481 return false;
484 /* Read the symbolic information header. */
485 raw = (PTR) bfd_malloc ((size_t) external_hdr_size);
486 if (raw == NULL)
487 goto error_return;
489 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) == -1
490 || (bfd_read (raw, external_hdr_size, 1, abfd)
491 != external_hdr_size))
492 goto error_return;
493 internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
494 (*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr);
496 if (internal_symhdr->magic != backend->debug_swap.sym_magic)
498 bfd_set_error (bfd_error_bad_value);
499 goto error_return;
502 /* Now we can get the correct number of symbols. */
503 bfd_get_symcount (abfd) = (internal_symhdr->isymMax
504 + internal_symhdr->iextMax);
506 if (raw != NULL)
507 free (raw);
508 return true;
509 error_return:
510 if (raw != NULL)
511 free (raw);
512 return false;
515 /* Read in and swap the important symbolic information for an ECOFF
516 object file. This is called by gdb via the read_debug_info entry
517 point in the backend structure. */
519 boolean
520 _bfd_ecoff_slurp_symbolic_info (abfd, ignore, debug)
521 bfd *abfd;
522 asection *ignore ATTRIBUTE_UNUSED;
523 struct ecoff_debug_info *debug;
525 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
526 HDRR *internal_symhdr;
527 bfd_size_type raw_base;
528 bfd_size_type raw_size;
529 PTR raw;
530 bfd_size_type external_fdr_size;
531 char *fraw_src;
532 char *fraw_end;
533 struct fdr *fdr_ptr;
534 bfd_size_type raw_end;
535 bfd_size_type cb_end;
537 BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info);
539 /* Check whether we've already gotten it, and whether there's any to
540 get. */
541 if (ecoff_data (abfd)->raw_syments != (PTR) NULL)
542 return true;
543 if (ecoff_data (abfd)->sym_filepos == 0)
545 bfd_get_symcount (abfd) = 0;
546 return true;
549 if (! ecoff_slurp_symbolic_header (abfd))
550 return false;
552 internal_symhdr = &debug->symbolic_header;
554 /* Read all the symbolic information at once. */
555 raw_base = (ecoff_data (abfd)->sym_filepos
556 + backend->debug_swap.external_hdr_size);
558 /* Alpha ecoff makes the determination of raw_size difficult. It has
559 an undocumented debug data section between the symhdr and the first
560 documented section. And the ordering of the sections varies between
561 statically and dynamically linked executables.
562 If bfd supports SEEK_END someday, this code could be simplified. */
564 raw_end = 0;
566 #define UPDATE_RAW_END(start, count, size) \
567 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
568 if (cb_end > raw_end) \
569 raw_end = cb_end
571 UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char));
572 UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size);
573 UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size);
574 UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size);
575 UPDATE_RAW_END (cbOptOffset, ioptMax, backend->debug_swap.external_opt_size);
576 UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext));
577 UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char));
578 UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char));
579 UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size);
580 UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size);
581 UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size);
583 #undef UPDATE_RAW_END
585 raw_size = raw_end - raw_base;
586 if (raw_size == 0)
588 ecoff_data (abfd)->sym_filepos = 0;
589 return true;
591 raw = (PTR) bfd_alloc (abfd, raw_size);
592 if (raw == NULL)
593 return false;
594 if (bfd_seek (abfd,
595 (ecoff_data (abfd)->sym_filepos
596 + backend->debug_swap.external_hdr_size),
597 SEEK_SET) != 0
598 || bfd_read (raw, raw_size, 1, abfd) != raw_size)
600 bfd_release (abfd, raw);
601 return false;
604 ecoff_data (abfd)->raw_syments = raw;
606 /* Get pointers for the numeric offsets in the HDRR structure. */
607 #define FIX(off1, off2, type) \
608 if (internal_symhdr->off1 == 0) \
609 debug->off2 = (type) NULL; \
610 else \
611 debug->off2 = (type) ((char *) raw \
612 + (internal_symhdr->off1 \
613 - raw_base))
614 FIX (cbLineOffset, line, unsigned char *);
615 FIX (cbDnOffset, external_dnr, PTR);
616 FIX (cbPdOffset, external_pdr, PTR);
617 FIX (cbSymOffset, external_sym, PTR);
618 FIX (cbOptOffset, external_opt, PTR);
619 FIX (cbAuxOffset, external_aux, union aux_ext *);
620 FIX (cbSsOffset, ss, char *);
621 FIX (cbSsExtOffset, ssext, char *);
622 FIX (cbFdOffset, external_fdr, PTR);
623 FIX (cbRfdOffset, external_rfd, PTR);
624 FIX (cbExtOffset, external_ext, PTR);
625 #undef FIX
627 /* I don't want to always swap all the data, because it will just
628 waste time and most programs will never look at it. The only
629 time the linker needs most of the debugging information swapped
630 is when linking big-endian and little-endian MIPS object files
631 together, which is not a common occurrence.
633 We need to look at the fdr to deal with a lot of information in
634 the symbols, so we swap them here. */
635 debug->fdr = (struct fdr *) bfd_alloc (abfd,
636 (internal_symhdr->ifdMax *
637 sizeof (struct fdr)));
638 if (debug->fdr == NULL)
639 return false;
640 external_fdr_size = backend->debug_swap.external_fdr_size;
641 fdr_ptr = debug->fdr;
642 fraw_src = (char *) debug->external_fdr;
643 fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size;
644 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
645 (*backend->debug_swap.swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
647 return true;
650 /* ECOFF symbol table routines. The ECOFF symbol table is described
651 in gcc/mips-tfile.c. */
653 /* ECOFF uses two common sections. One is the usual one, and the
654 other is for small objects. All the small objects are kept
655 together, and then referenced via the gp pointer, which yields
656 faster assembler code. This is what we use for the small common
657 section. */
658 static asection ecoff_scom_section;
659 static asymbol ecoff_scom_symbol;
660 static asymbol *ecoff_scom_symbol_ptr;
662 /* Create an empty symbol. */
664 asymbol *
665 _bfd_ecoff_make_empty_symbol (abfd)
666 bfd *abfd;
668 ecoff_symbol_type *new;
670 new = (ecoff_symbol_type *) bfd_alloc (abfd, sizeof (ecoff_symbol_type));
671 if (new == (ecoff_symbol_type *) NULL)
672 return (asymbol *) NULL;
673 memset ((PTR) new, 0, sizeof *new);
674 new->symbol.section = (asection *) NULL;
675 new->fdr = (FDR *) NULL;
676 new->local = false;
677 new->native = NULL;
678 new->symbol.the_bfd = abfd;
679 return &new->symbol;
682 /* Set the BFD flags and section for an ECOFF symbol. */
684 static boolean
685 ecoff_set_symbol_info (abfd, ecoff_sym, asym, ext, weak)
686 bfd *abfd;
687 SYMR *ecoff_sym;
688 asymbol *asym;
689 int ext;
690 int weak;
692 asym->the_bfd = abfd;
693 asym->value = ecoff_sym->value;
694 asym->section = &bfd_debug_section;
695 asym->udata.i = 0;
697 /* Most symbol types are just for debugging. */
698 switch (ecoff_sym->st)
700 case stGlobal:
701 case stStatic:
702 case stLabel:
703 case stProc:
704 case stStaticProc:
705 break;
706 case stNil:
707 if (ECOFF_IS_STAB (ecoff_sym))
709 asym->flags = BSF_DEBUGGING;
710 return true;
712 break;
713 default:
714 asym->flags = BSF_DEBUGGING;
715 return true;
718 if (weak)
719 asym->flags = BSF_EXPORT | BSF_WEAK;
720 else if (ext)
721 asym->flags = BSF_EXPORT | BSF_GLOBAL;
722 else
724 asym->flags = BSF_LOCAL;
725 /* Normally, a local stProc symbol will have a corresponding
726 external symbol. We mark the local symbol as a debugging
727 symbol, in order to prevent nm from printing both out.
728 Similarly, we mark stLabel and stabs symbols as debugging
729 symbols. In both cases, we do want to set the value
730 correctly based on the symbol class. */
731 if (ecoff_sym->st == stProc
732 || ecoff_sym->st == stLabel
733 || ECOFF_IS_STAB (ecoff_sym))
734 asym->flags |= BSF_DEBUGGING;
736 switch (ecoff_sym->sc)
738 case scNil:
739 /* Used for compiler generated labels. Leave them in the
740 debugging section, and mark them as local. If BSF_DEBUGGING
741 is set, then nm does not display them for some reason. If no
742 flags are set then the linker whines about them. */
743 asym->flags = BSF_LOCAL;
744 break;
745 case scText:
746 asym->section = bfd_make_section_old_way (abfd, ".text");
747 asym->value -= asym->section->vma;
748 break;
749 case scData:
750 asym->section = bfd_make_section_old_way (abfd, ".data");
751 asym->value -= asym->section->vma;
752 break;
753 case scBss:
754 asym->section = bfd_make_section_old_way (abfd, ".bss");
755 asym->value -= asym->section->vma;
756 break;
757 case scRegister:
758 asym->flags = BSF_DEBUGGING;
759 break;
760 case scAbs:
761 asym->section = bfd_abs_section_ptr;
762 break;
763 case scUndefined:
764 asym->section = bfd_und_section_ptr;
765 asym->flags = 0;
766 asym->value = 0;
767 break;
768 case scCdbLocal:
769 case scBits:
770 case scCdbSystem:
771 case scRegImage:
772 case scInfo:
773 case scUserStruct:
774 asym->flags = BSF_DEBUGGING;
775 break;
776 case scSData:
777 asym->section = bfd_make_section_old_way (abfd, ".sdata");
778 asym->value -= asym->section->vma;
779 break;
780 case scSBss:
781 asym->section = bfd_make_section_old_way (abfd, ".sbss");
782 asym->value -= asym->section->vma;
783 break;
784 case scRData:
785 asym->section = bfd_make_section_old_way (abfd, ".rdata");
786 asym->value -= asym->section->vma;
787 break;
788 case scVar:
789 asym->flags = BSF_DEBUGGING;
790 break;
791 case scCommon:
792 if (asym->value > ecoff_data (abfd)->gp_size)
794 asym->section = bfd_com_section_ptr;
795 asym->flags = 0;
796 break;
798 /* Fall through. */
799 case scSCommon:
800 if (ecoff_scom_section.name == NULL)
802 /* Initialize the small common section. */
803 ecoff_scom_section.name = SCOMMON;
804 ecoff_scom_section.flags = SEC_IS_COMMON;
805 ecoff_scom_section.output_section = &ecoff_scom_section;
806 ecoff_scom_section.symbol = &ecoff_scom_symbol;
807 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
808 ecoff_scom_symbol.name = SCOMMON;
809 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
810 ecoff_scom_symbol.section = &ecoff_scom_section;
811 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
813 asym->section = &ecoff_scom_section;
814 asym->flags = 0;
815 break;
816 case scVarRegister:
817 case scVariant:
818 asym->flags = BSF_DEBUGGING;
819 break;
820 case scSUndefined:
821 asym->section = bfd_und_section_ptr;
822 asym->flags = 0;
823 asym->value = 0;
824 break;
825 case scInit:
826 asym->section = bfd_make_section_old_way (abfd, ".init");
827 asym->value -= asym->section->vma;
828 break;
829 case scBasedVar:
830 case scXData:
831 case scPData:
832 asym->flags = BSF_DEBUGGING;
833 break;
834 case scFini:
835 asym->section = bfd_make_section_old_way (abfd, ".fini");
836 asym->value -= asym->section->vma;
837 break;
838 case scRConst:
839 asym->section = bfd_make_section_old_way (abfd, ".rconst");
840 asym->value -= asym->section->vma;
841 break;
842 default:
843 break;
846 /* Look for special constructors symbols and make relocation entries
847 in a special construction section. These are produced by the
848 -fgnu-linker argument to g++. */
849 if (ECOFF_IS_STAB (ecoff_sym))
851 switch (ECOFF_UNMARK_STAB (ecoff_sym->index))
853 default:
854 break;
856 case N_SETA:
857 case N_SETT:
858 case N_SETD:
859 case N_SETB:
861 /* This code is no longer needed. It used to be used to
862 make the linker handle set symbols, but they are now
863 handled in the add_symbols routine instead. */
864 #if 0
865 const char *name;
866 asection *section;
867 arelent_chain *reloc_chain;
868 unsigned int bitsize;
870 /* Get a section with the same name as the symbol (usually
871 __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the
872 name ___CTOR_LIST (three underscores). We need
873 __CTOR_LIST (two underscores), since ECOFF doesn't use
874 a leading underscore. This should be handled by gcc,
875 but instead we do it here. Actually, this should all
876 be done differently anyhow. */
877 name = bfd_asymbol_name (asym);
878 if (name[0] == '_' && name[1] == '_' && name[2] == '_')
880 ++name;
881 asym->name = name;
883 section = bfd_get_section_by_name (abfd, name);
884 if (section == (asection *) NULL)
886 char *copy;
888 copy = (char *) bfd_alloc (abfd, strlen (name) + 1);
889 if (!copy)
890 return false;
891 strcpy (copy, name);
892 section = bfd_make_section (abfd, copy);
895 /* Build a reloc pointing to this constructor. */
896 reloc_chain =
897 (arelent_chain *) bfd_alloc (abfd, sizeof (arelent_chain));
898 if (!reloc_chain)
899 return false;
900 reloc_chain->relent.sym_ptr_ptr =
901 bfd_get_section (asym)->symbol_ptr_ptr;
902 reloc_chain->relent.address = section->_raw_size;
903 reloc_chain->relent.addend = asym->value;
904 reloc_chain->relent.howto =
905 ecoff_backend (abfd)->constructor_reloc;
907 /* Set up the constructor section to hold the reloc. */
908 section->flags = SEC_CONSTRUCTOR;
909 ++section->reloc_count;
911 /* Constructor sections must be rounded to a boundary
912 based on the bitsize. These are not real sections--
913 they are handled specially by the linker--so the ECOFF
914 16 byte alignment restriction does not apply. */
915 bitsize = ecoff_backend (abfd)->constructor_bitsize;
916 section->alignment_power = 1;
917 while ((1 << section->alignment_power) < bitsize / 8)
918 ++section->alignment_power;
920 reloc_chain->next = section->constructor_chain;
921 section->constructor_chain = reloc_chain;
922 section->_raw_size += bitsize / 8;
924 #endif /* 0 */
926 /* Mark the symbol as a constructor. */
927 asym->flags |= BSF_CONSTRUCTOR;
929 break;
932 return true;
935 /* Read an ECOFF symbol table. */
937 boolean
938 _bfd_ecoff_slurp_symbol_table (abfd)
939 bfd *abfd;
941 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
942 const bfd_size_type external_ext_size
943 = backend->debug_swap.external_ext_size;
944 const bfd_size_type external_sym_size
945 = backend->debug_swap.external_sym_size;
946 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
947 = backend->debug_swap.swap_ext_in;
948 void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *))
949 = backend->debug_swap.swap_sym_in;
950 bfd_size_type internal_size;
951 ecoff_symbol_type *internal;
952 ecoff_symbol_type *internal_ptr;
953 char *eraw_src;
954 char *eraw_end;
955 FDR *fdr_ptr;
956 FDR *fdr_end;
958 /* If we've already read in the symbol table, do nothing. */
959 if (ecoff_data (abfd)->canonical_symbols != NULL)
960 return true;
962 /* Get the symbolic information. */
963 if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL,
964 &ecoff_data (abfd)->debug_info))
965 return false;
966 if (bfd_get_symcount (abfd) == 0)
967 return true;
969 internal_size = bfd_get_symcount (abfd) * sizeof (ecoff_symbol_type);
970 internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size);
971 if (internal == NULL)
972 return false;
974 internal_ptr = internal;
975 eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext;
976 eraw_end = (eraw_src
977 + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax
978 * external_ext_size));
979 for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++)
981 EXTR internal_esym;
983 (*swap_ext_in) (abfd, (PTR) eraw_src, &internal_esym);
984 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext
985 + internal_esym.asym.iss);
986 if (!ecoff_set_symbol_info (abfd, &internal_esym.asym,
987 &internal_ptr->symbol, 1,
988 internal_esym.weakext))
989 return false;
990 /* The alpha uses a negative ifd field for section symbols. */
991 if (internal_esym.ifd >= 0)
992 internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr
993 + internal_esym.ifd);
994 else
995 internal_ptr->fdr = NULL;
996 internal_ptr->local = false;
997 internal_ptr->native = (PTR) eraw_src;
1000 /* The local symbols must be accessed via the fdr's, because the
1001 string and aux indices are relative to the fdr information. */
1002 fdr_ptr = ecoff_data (abfd)->debug_info.fdr;
1003 fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax;
1004 for (; fdr_ptr < fdr_end; fdr_ptr++)
1006 char *lraw_src;
1007 char *lraw_end;
1009 lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym
1010 + fdr_ptr->isymBase * external_sym_size);
1011 lraw_end = lraw_src + fdr_ptr->csym * external_sym_size;
1012 for (;
1013 lraw_src < lraw_end;
1014 lraw_src += external_sym_size, internal_ptr++)
1016 SYMR internal_sym;
1018 (*swap_sym_in) (abfd, (PTR) lraw_src, &internal_sym);
1019 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss
1020 + fdr_ptr->issBase
1021 + internal_sym.iss);
1022 if (!ecoff_set_symbol_info (abfd, &internal_sym,
1023 &internal_ptr->symbol, 0, 0))
1024 return false;
1025 internal_ptr->fdr = fdr_ptr;
1026 internal_ptr->local = true;
1027 internal_ptr->native = (PTR) lraw_src;
1031 ecoff_data (abfd)->canonical_symbols = internal;
1033 return true;
1036 /* Return the amount of space needed for the canonical symbols. */
1038 long
1039 _bfd_ecoff_get_symtab_upper_bound (abfd)
1040 bfd *abfd;
1042 if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL,
1043 &ecoff_data (abfd)->debug_info))
1044 return -1;
1046 if (bfd_get_symcount (abfd) == 0)
1047 return 0;
1049 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
1052 /* Get the canonical symbols. */
1054 long
1055 _bfd_ecoff_get_symtab (abfd, alocation)
1056 bfd *abfd;
1057 asymbol **alocation;
1059 unsigned int counter = 0;
1060 ecoff_symbol_type *symbase;
1061 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
1063 if (_bfd_ecoff_slurp_symbol_table (abfd) == false)
1064 return -1;
1065 if (bfd_get_symcount (abfd) == 0)
1066 return 0;
1068 symbase = ecoff_data (abfd)->canonical_symbols;
1069 while (counter < bfd_get_symcount (abfd))
1071 *(location++) = symbase++;
1072 counter++;
1074 *location++ = (ecoff_symbol_type *) NULL;
1075 return bfd_get_symcount (abfd);
1078 /* Turn ECOFF type information into a printable string.
1079 ecoff_emit_aggregate and ecoff_type_to_string are from
1080 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1082 /* Write aggregate information to a string. */
1084 static void
1085 ecoff_emit_aggregate (abfd, fdr, string, rndx, isym, which)
1086 bfd *abfd;
1087 FDR *fdr;
1088 char *string;
1089 RNDXR *rndx;
1090 long isym;
1091 const char *which;
1093 const struct ecoff_debug_swap * const debug_swap =
1094 &ecoff_backend (abfd)->debug_swap;
1095 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1096 unsigned int ifd = rndx->rfd;
1097 unsigned int indx = rndx->index;
1098 const char *name;
1100 if (ifd == 0xfff)
1101 ifd = isym;
1103 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1104 struct return type of a procedure compiled without -g. */
1105 if (ifd == 0xffffffff
1106 || (rndx->rfd == 0xfff && indx == 0))
1107 name = "<undefined>";
1108 else if (indx == indexNil)
1109 name = "<no name>";
1110 else
1112 SYMR sym;
1114 if (debug_info->external_rfd == NULL)
1115 fdr = debug_info->fdr + ifd;
1116 else
1118 RFDT rfd;
1120 (*debug_swap->swap_rfd_in) (abfd,
1121 ((char *) debug_info->external_rfd
1122 + ((fdr->rfdBase + ifd)
1123 * debug_swap->external_rfd_size)),
1124 &rfd);
1125 fdr = debug_info->fdr + rfd;
1128 indx += fdr->isymBase;
1130 (*debug_swap->swap_sym_in) (abfd,
1131 ((char *) debug_info->external_sym
1132 + indx * debug_swap->external_sym_size),
1133 &sym);
1135 name = debug_info->ss + fdr->issBase + sym.iss;
1138 sprintf (string,
1139 "%s %s { ifd = %u, index = %lu }",
1140 which, name, ifd,
1141 ((long) indx
1142 + debug_info->symbolic_header.iextMax));
1145 /* Convert the type information to string format. */
1147 static char *
1148 ecoff_type_to_string (abfd, fdr, indx)
1149 bfd *abfd;
1150 FDR *fdr;
1151 unsigned int indx;
1153 union aux_ext *aux_ptr;
1154 int bigendian;
1155 AUXU u;
1156 struct qual {
1157 unsigned int type;
1158 int low_bound;
1159 int high_bound;
1160 int stride;
1161 } qualifiers[7];
1162 unsigned int basic_type;
1163 int i;
1164 char buffer1[1024];
1165 static char buffer2[1024];
1166 char *p1 = buffer1;
1167 char *p2 = buffer2;
1168 RNDXR rndx;
1170 aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase;
1171 bigendian = fdr->fBigendian;
1173 for (i = 0; i < 7; i++)
1175 qualifiers[i].low_bound = 0;
1176 qualifiers[i].high_bound = 0;
1177 qualifiers[i].stride = 0;
1180 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1)
1181 return "-1 (no type)";
1182 _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1184 basic_type = u.ti.bt;
1185 qualifiers[0].type = u.ti.tq0;
1186 qualifiers[1].type = u.ti.tq1;
1187 qualifiers[2].type = u.ti.tq2;
1188 qualifiers[3].type = u.ti.tq3;
1189 qualifiers[4].type = u.ti.tq4;
1190 qualifiers[5].type = u.ti.tq5;
1191 qualifiers[6].type = tqNil;
1194 * Go get the basic type.
1196 switch (basic_type)
1198 case btNil: /* undefined */
1199 strcpy (p1, "nil");
1200 break;
1202 case btAdr: /* address - integer same size as pointer */
1203 strcpy (p1, "address");
1204 break;
1206 case btChar: /* character */
1207 strcpy (p1, "char");
1208 break;
1210 case btUChar: /* unsigned character */
1211 strcpy (p1, "unsigned char");
1212 break;
1214 case btShort: /* short */
1215 strcpy (p1, "short");
1216 break;
1218 case btUShort: /* unsigned short */
1219 strcpy (p1, "unsigned short");
1220 break;
1222 case btInt: /* int */
1223 strcpy (p1, "int");
1224 break;
1226 case btUInt: /* unsigned int */
1227 strcpy (p1, "unsigned int");
1228 break;
1230 case btLong: /* long */
1231 strcpy (p1, "long");
1232 break;
1234 case btULong: /* unsigned long */
1235 strcpy (p1, "unsigned long");
1236 break;
1238 case btFloat: /* float (real) */
1239 strcpy (p1, "float");
1240 break;
1242 case btDouble: /* Double (real) */
1243 strcpy (p1, "double");
1244 break;
1246 /* Structures add 1-2 aux words:
1247 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1248 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1250 case btStruct: /* Structure (Record) */
1251 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1252 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1253 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1254 "struct");
1255 indx++; /* skip aux words */
1256 break;
1258 /* Unions add 1-2 aux words:
1259 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1260 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1262 case btUnion: /* Union */
1263 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1264 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1265 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1266 "union");
1267 indx++; /* skip aux words */
1268 break;
1270 /* Enumerations add 1-2 aux words:
1271 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1272 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1274 case btEnum: /* Enumeration */
1275 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1276 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1277 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1278 "enum");
1279 indx++; /* skip aux words */
1280 break;
1282 case btTypedef: /* defined via a typedef, isymRef points */
1283 strcpy (p1, "typedef");
1284 break;
1286 case btRange: /* subrange of int */
1287 strcpy (p1, "subrange");
1288 break;
1290 case btSet: /* pascal sets */
1291 strcpy (p1, "set");
1292 break;
1294 case btComplex: /* fortran complex */
1295 strcpy (p1, "complex");
1296 break;
1298 case btDComplex: /* fortran double complex */
1299 strcpy (p1, "double complex");
1300 break;
1302 case btIndirect: /* forward or unnamed typedef */
1303 strcpy (p1, "forward/unamed typedef");
1304 break;
1306 case btFixedDec: /* Fixed Decimal */
1307 strcpy (p1, "fixed decimal");
1308 break;
1310 case btFloatDec: /* Float Decimal */
1311 strcpy (p1, "float decimal");
1312 break;
1314 case btString: /* Varying Length Character String */
1315 strcpy (p1, "string");
1316 break;
1318 case btBit: /* Aligned Bit String */
1319 strcpy (p1, "bit");
1320 break;
1322 case btPicture: /* Picture */
1323 strcpy (p1, "picture");
1324 break;
1326 case btVoid: /* Void */
1327 strcpy (p1, "void");
1328 break;
1330 default:
1331 sprintf (p1, _("Unknown basic type %d"), (int) basic_type);
1332 break;
1335 p1 += strlen (buffer1);
1338 * If this is a bitfield, get the bitsize.
1340 if (u.ti.fBitfield)
1342 int bitsize;
1344 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1345 sprintf (p1, " : %d", bitsize);
1346 p1 += strlen (buffer1);
1350 * Deal with any qualifiers.
1352 if (qualifiers[0].type != tqNil)
1355 * Snarf up any array bounds in the correct order. Arrays
1356 * store 5 successive words in the aux. table:
1357 * word 0 RNDXR to type of the bounds (ie, int)
1358 * word 1 Current file descriptor index
1359 * word 2 low bound
1360 * word 3 high bound (or -1 if [])
1361 * word 4 stride size in bits
1363 for (i = 0; i < 7; i++)
1365 if (qualifiers[i].type == tqArray)
1367 qualifiers[i].low_bound =
1368 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1369 qualifiers[i].high_bound =
1370 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1371 qualifiers[i].stride =
1372 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1373 indx += 5;
1378 * Now print out the qualifiers.
1380 for (i = 0; i < 6; i++)
1382 switch (qualifiers[i].type)
1384 case tqNil:
1385 case tqMax:
1386 break;
1388 case tqPtr:
1389 strcpy (p2, "ptr to ");
1390 p2 += sizeof ("ptr to ")-1;
1391 break;
1393 case tqVol:
1394 strcpy (p2, "volatile ");
1395 p2 += sizeof ("volatile ")-1;
1396 break;
1398 case tqFar:
1399 strcpy (p2, "far ");
1400 p2 += sizeof ("far ")-1;
1401 break;
1403 case tqProc:
1404 strcpy (p2, "func. ret. ");
1405 p2 += sizeof ("func. ret. ");
1406 break;
1408 case tqArray:
1410 int first_array = i;
1411 int j;
1413 /* Print array bounds reversed (ie, in the order the C
1414 programmer writes them). C is such a fun language.... */
1416 while (i < 5 && qualifiers[i+1].type == tqArray)
1417 i++;
1419 for (j = i; j >= first_array; j--)
1421 strcpy (p2, "array [");
1422 p2 += sizeof ("array [")-1;
1423 if (qualifiers[j].low_bound != 0)
1424 sprintf (p2,
1425 "%ld:%ld {%ld bits}",
1426 (long) qualifiers[j].low_bound,
1427 (long) qualifiers[j].high_bound,
1428 (long) qualifiers[j].stride);
1430 else if (qualifiers[j].high_bound != -1)
1431 sprintf (p2,
1432 "%ld {%ld bits}",
1433 (long) (qualifiers[j].high_bound + 1),
1434 (long) (qualifiers[j].stride));
1436 else
1437 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1439 p2 += strlen (p2);
1440 strcpy (p2, "] of ");
1441 p2 += sizeof ("] of ")-1;
1444 break;
1449 strcpy (p2, buffer1);
1450 return buffer2;
1453 /* Return information about ECOFF symbol SYMBOL in RET. */
1455 void
1456 _bfd_ecoff_get_symbol_info (abfd, symbol, ret)
1457 bfd *abfd ATTRIBUTE_UNUSED;
1458 asymbol *symbol;
1459 symbol_info *ret;
1461 bfd_symbol_info (symbol, ret);
1464 /* Return whether this is a local label. */
1466 boolean
1467 _bfd_ecoff_bfd_is_local_label_name (abfd, name)
1468 bfd *abfd ATTRIBUTE_UNUSED;
1469 const char *name;
1471 return name[0] == '$';
1474 /* Print information about an ECOFF symbol. */
1476 void
1477 _bfd_ecoff_print_symbol (abfd, filep, symbol, how)
1478 bfd *abfd;
1479 PTR filep;
1480 asymbol *symbol;
1481 bfd_print_symbol_type how;
1483 const struct ecoff_debug_swap * const debug_swap
1484 = &ecoff_backend (abfd)->debug_swap;
1485 FILE *file = (FILE *)filep;
1487 switch (how)
1489 case bfd_print_symbol_name:
1490 fprintf (file, "%s", symbol->name);
1491 break;
1492 case bfd_print_symbol_more:
1493 if (ecoffsymbol (symbol)->local)
1495 SYMR ecoff_sym;
1497 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1498 &ecoff_sym);
1499 fprintf (file, "ecoff local ");
1500 fprintf_vma (file, (bfd_vma) ecoff_sym.value);
1501 fprintf (file, " %x %x", (unsigned) ecoff_sym.st,
1502 (unsigned) ecoff_sym.sc);
1504 else
1506 EXTR ecoff_ext;
1508 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1509 &ecoff_ext);
1510 fprintf (file, "ecoff extern ");
1511 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1512 fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st,
1513 (unsigned) ecoff_ext.asym.sc);
1515 break;
1516 case bfd_print_symbol_all:
1517 /* Print out the symbols in a reasonable way */
1519 char type;
1520 int pos;
1521 EXTR ecoff_ext;
1522 char jmptbl;
1523 char cobol_main;
1524 char weakext;
1526 if (ecoffsymbol (symbol)->local)
1528 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1529 &ecoff_ext.asym);
1530 type = 'l';
1531 pos = ((((char *) ecoffsymbol (symbol)->native
1532 - (char *) ecoff_data (abfd)->debug_info.external_sym)
1533 / debug_swap->external_sym_size)
1534 + ecoff_data (abfd)->debug_info.symbolic_header.iextMax);
1535 jmptbl = ' ';
1536 cobol_main = ' ';
1537 weakext = ' ';
1539 else
1541 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1542 &ecoff_ext);
1543 type = 'e';
1544 pos = (((char *) ecoffsymbol (symbol)->native
1545 - (char *) ecoff_data (abfd)->debug_info.external_ext)
1546 / debug_swap->external_ext_size);
1547 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1548 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1549 weakext = ecoff_ext.weakext ? 'w' : ' ';
1552 fprintf (file, "[%3d] %c ",
1553 pos, type);
1554 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1555 fprintf (file, " st %x sc %x indx %x %c%c%c %s",
1556 (unsigned) ecoff_ext.asym.st,
1557 (unsigned) ecoff_ext.asym.sc,
1558 (unsigned) ecoff_ext.asym.index,
1559 jmptbl, cobol_main, weakext,
1560 symbol->name);
1562 if (ecoffsymbol (symbol)->fdr != NULL
1563 && ecoff_ext.asym.index != indexNil)
1565 FDR *fdr;
1566 unsigned int indx;
1567 int bigendian;
1568 bfd_size_type sym_base;
1569 union aux_ext *aux_base;
1571 fdr = ecoffsymbol (symbol)->fdr;
1572 indx = ecoff_ext.asym.index;
1574 /* sym_base is used to map the fdr relative indices which
1575 appear in the file to the position number which we are
1576 using. */
1577 sym_base = fdr->isymBase;
1578 if (ecoffsymbol (symbol)->local)
1579 sym_base +=
1580 ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
1582 /* aux_base is the start of the aux entries for this file;
1583 asym.index is an offset from this. */
1584 aux_base = (ecoff_data (abfd)->debug_info.external_aux
1585 + fdr->iauxBase);
1587 /* The aux entries are stored in host byte order; the
1588 order is indicated by a bit in the fdr. */
1589 bigendian = fdr->fBigendian;
1591 /* This switch is basically from gcc/mips-tdump.c */
1592 switch (ecoff_ext.asym.st)
1594 case stNil:
1595 case stLabel:
1596 break;
1598 case stFile:
1599 case stBlock:
1600 fprintf (file, _("\n End+1 symbol: %ld"),
1601 (long) (indx + sym_base));
1602 break;
1604 case stEnd:
1605 if (ecoff_ext.asym.sc == scText
1606 || ecoff_ext.asym.sc == scInfo)
1607 fprintf (file, _("\n First symbol: %ld"),
1608 (long) (indx + sym_base));
1609 else
1610 fprintf (file, _("\n First symbol: %ld"),
1611 ((long)
1612 (AUX_GET_ISYM (bigendian,
1613 &aux_base[ecoff_ext.asym.index])
1614 + sym_base)));
1615 break;
1617 case stProc:
1618 case stStaticProc:
1619 if (ECOFF_IS_STAB (&ecoff_ext.asym))
1621 else if (ecoffsymbol (symbol)->local)
1622 fprintf (file, _("\n End+1 symbol: %-7ld Type: %s"),
1623 ((long)
1624 (AUX_GET_ISYM (bigendian,
1625 &aux_base[ecoff_ext.asym.index])
1626 + sym_base)),
1627 ecoff_type_to_string (abfd, fdr, indx + 1));
1628 else
1629 fprintf (file, _("\n Local symbol: %ld"),
1630 ((long) indx
1631 + (long) sym_base
1632 + (ecoff_data (abfd)
1633 ->debug_info.symbolic_header.iextMax)));
1634 break;
1636 case stStruct:
1637 fprintf (file, _("\n struct; End+1 symbol: %ld"),
1638 (long) (indx + sym_base));
1639 break;
1641 case stUnion:
1642 fprintf (file, _("\n union; End+1 symbol: %ld"),
1643 (long) (indx + sym_base));
1644 break;
1646 case stEnum:
1647 fprintf (file, _("\n enum; End+1 symbol: %ld"),
1648 (long) (indx + sym_base));
1649 break;
1651 default:
1652 if (! ECOFF_IS_STAB (&ecoff_ext.asym))
1653 fprintf (file, _("\n Type: %s"),
1654 ecoff_type_to_string (abfd, fdr, indx));
1655 break;
1659 break;
1663 /* Read in the relocs for a section. */
1665 static boolean
1666 ecoff_slurp_reloc_table (abfd, section, symbols)
1667 bfd *abfd;
1668 asection *section;
1669 asymbol **symbols;
1671 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
1672 arelent *internal_relocs;
1673 bfd_size_type external_reloc_size;
1674 bfd_size_type external_relocs_size;
1675 char *external_relocs;
1676 arelent *rptr;
1677 unsigned int i;
1679 if (section->relocation != (arelent *) NULL
1680 || section->reloc_count == 0
1681 || (section->flags & SEC_CONSTRUCTOR) != 0)
1682 return true;
1684 if (_bfd_ecoff_slurp_symbol_table (abfd) == false)
1685 return false;
1687 internal_relocs = (arelent *) bfd_alloc (abfd,
1688 (sizeof (arelent)
1689 * section->reloc_count));
1690 external_reloc_size = backend->external_reloc_size;
1691 external_relocs_size = external_reloc_size * section->reloc_count;
1692 external_relocs = (char *) bfd_alloc (abfd, external_relocs_size);
1693 if (internal_relocs == (arelent *) NULL
1694 || external_relocs == (char *) NULL)
1695 return false;
1696 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
1697 return false;
1698 if (bfd_read (external_relocs, 1, external_relocs_size, abfd)
1699 != external_relocs_size)
1700 return false;
1702 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
1704 struct internal_reloc intern;
1706 (*backend->swap_reloc_in) (abfd,
1707 external_relocs + i * external_reloc_size,
1708 &intern);
1710 if (intern.r_extern)
1712 /* r_symndx is an index into the external symbols. */
1713 BFD_ASSERT (intern.r_symndx >= 0
1714 && (intern.r_symndx
1715 < (ecoff_data (abfd)
1716 ->debug_info.symbolic_header.iextMax)));
1717 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
1718 rptr->addend = 0;
1720 else if (intern.r_symndx == RELOC_SECTION_NONE
1721 || intern.r_symndx == RELOC_SECTION_ABS)
1723 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1724 rptr->addend = 0;
1726 else
1728 CONST char *sec_name;
1729 asection *sec;
1731 /* r_symndx is a section key. */
1732 switch (intern.r_symndx)
1734 case RELOC_SECTION_TEXT: sec_name = ".text"; break;
1735 case RELOC_SECTION_RDATA: sec_name = ".rdata"; break;
1736 case RELOC_SECTION_DATA: sec_name = ".data"; break;
1737 case RELOC_SECTION_SDATA: sec_name = ".sdata"; break;
1738 case RELOC_SECTION_SBSS: sec_name = ".sbss"; break;
1739 case RELOC_SECTION_BSS: sec_name = ".bss"; break;
1740 case RELOC_SECTION_INIT: sec_name = ".init"; break;
1741 case RELOC_SECTION_LIT8: sec_name = ".lit8"; break;
1742 case RELOC_SECTION_LIT4: sec_name = ".lit4"; break;
1743 case RELOC_SECTION_XDATA: sec_name = ".xdata"; break;
1744 case RELOC_SECTION_PDATA: sec_name = ".pdata"; break;
1745 case RELOC_SECTION_FINI: sec_name = ".fini"; break;
1746 case RELOC_SECTION_LITA: sec_name = ".lita"; break;
1747 case RELOC_SECTION_RCONST: sec_name = ".rconst"; break;
1748 default: abort ();
1751 sec = bfd_get_section_by_name (abfd, sec_name);
1752 if (sec == (asection *) NULL)
1753 abort ();
1754 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
1756 rptr->addend = - bfd_get_section_vma (abfd, sec);
1759 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
1761 /* Let the backend select the howto field and do any other
1762 required processing. */
1763 (*backend->adjust_reloc_in) (abfd, &intern, rptr);
1766 bfd_release (abfd, external_relocs);
1768 section->relocation = internal_relocs;
1770 return true;
1773 /* Get a canonical list of relocs. */
1775 long
1776 _bfd_ecoff_canonicalize_reloc (abfd, section, relptr, symbols)
1777 bfd *abfd;
1778 asection *section;
1779 arelent **relptr;
1780 asymbol **symbols;
1782 unsigned int count;
1784 if (section->flags & SEC_CONSTRUCTOR)
1786 arelent_chain *chain;
1788 /* This section has relocs made up by us, not the file, so take
1789 them out of their chain and place them into the data area
1790 provided. */
1791 for (count = 0, chain = section->constructor_chain;
1792 count < section->reloc_count;
1793 count++, chain = chain->next)
1794 *relptr++ = &chain->relent;
1796 else
1798 arelent *tblptr;
1800 if (ecoff_slurp_reloc_table (abfd, section, symbols) == false)
1801 return -1;
1803 tblptr = section->relocation;
1805 for (count = 0; count < section->reloc_count; count++)
1806 *relptr++ = tblptr++;
1809 *relptr = (arelent *) NULL;
1811 return section->reloc_count;
1814 /* Provided a BFD, a section and an offset into the section, calculate
1815 and return the name of the source file and the line nearest to the
1816 wanted location. */
1818 boolean
1819 _bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset,
1820 filename_ptr, functionname_ptr, retline_ptr)
1821 bfd *abfd;
1822 asection *section;
1823 asymbol **ignore_symbols ATTRIBUTE_UNUSED;
1824 bfd_vma offset;
1825 CONST char **filename_ptr;
1826 CONST char **functionname_ptr;
1827 unsigned int *retline_ptr;
1829 const struct ecoff_debug_swap * const debug_swap
1830 = &ecoff_backend (abfd)->debug_swap;
1831 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1832 struct ecoff_find_line *line_info;
1834 /* Make sure we have the FDR's. */
1835 if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL, debug_info)
1836 || bfd_get_symcount (abfd) == 0)
1837 return false;
1839 if (ecoff_data (abfd)->find_line_info == NULL)
1841 ecoff_data (abfd)->find_line_info =
1842 ((struct ecoff_find_line *)
1843 bfd_zalloc (abfd, sizeof (struct ecoff_find_line)));
1844 if (ecoff_data (abfd)->find_line_info == NULL)
1845 return false;
1847 line_info = ecoff_data (abfd)->find_line_info;
1849 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info,
1850 debug_swap, line_info, filename_ptr,
1851 functionname_ptr, retline_ptr);
1854 /* Copy private BFD data. This is called by objcopy and strip. We
1855 use it to copy the ECOFF debugging information from one BFD to the
1856 other. It would be theoretically possible to represent the ECOFF
1857 debugging information in the symbol table. However, it would be a
1858 lot of work, and there would be little gain (gas, gdb, and ld
1859 already access the ECOFF debugging information via the
1860 ecoff_debug_info structure, and that structure would have to be
1861 retained in order to support ECOFF debugging in MIPS ELF).
1863 The debugging information for the ECOFF external symbols comes from
1864 the symbol table, so this function only handles the other debugging
1865 information. */
1867 boolean
1868 _bfd_ecoff_bfd_copy_private_bfd_data (ibfd, obfd)
1869 bfd *ibfd;
1870 bfd *obfd;
1872 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
1873 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
1874 register int i;
1875 asymbol **sym_ptr_ptr;
1876 size_t c;
1877 boolean local;
1879 /* We only want to copy information over if both BFD's use ECOFF
1880 format. */
1881 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour
1882 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
1883 return true;
1885 /* Copy the GP value and the register masks. */
1886 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
1887 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
1888 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
1889 for (i = 0; i < 3; i++)
1890 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
1892 /* Copy the version stamp. */
1893 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
1895 /* If there are no symbols, don't copy any debugging information. */
1896 c = bfd_get_symcount (obfd);
1897 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1898 if (c == 0 || sym_ptr_ptr == (asymbol **) NULL)
1899 return true;
1901 /* See if there are any local symbols. */
1902 local = false;
1903 for (; c > 0; c--, sym_ptr_ptr++)
1905 if (ecoffsymbol (*sym_ptr_ptr)->local)
1907 local = true;
1908 break;
1912 if (local)
1914 /* There are some local symbols. We just bring over all the
1915 debugging information. FIXME: This is not quite the right
1916 thing to do. If the user has asked us to discard all
1917 debugging information, then we are probably going to wind up
1918 keeping it because there will probably be some local symbol
1919 which objcopy did not discard. We should actually break
1920 apart the debugging information and only keep that which
1921 applies to the symbols we want to keep. */
1922 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
1923 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
1924 oinfo->line = iinfo->line;
1926 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
1927 oinfo->external_dnr = iinfo->external_dnr;
1929 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
1930 oinfo->external_pdr = iinfo->external_pdr;
1932 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
1933 oinfo->external_sym = iinfo->external_sym;
1935 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
1936 oinfo->external_opt = iinfo->external_opt;
1938 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
1939 oinfo->external_aux = iinfo->external_aux;
1941 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
1942 oinfo->ss = iinfo->ss;
1944 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
1945 oinfo->external_fdr = iinfo->external_fdr;
1947 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
1948 oinfo->external_rfd = iinfo->external_rfd;
1950 else
1952 /* We are discarding all the local symbol information. Look
1953 through the external symbols and remove all references to FDR
1954 or aux information. */
1955 c = bfd_get_symcount (obfd);
1956 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1957 for (; c > 0; c--, sym_ptr_ptr++)
1959 EXTR esym;
1961 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
1962 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
1963 esym.ifd = ifdNil;
1964 esym.asym.index = indexNil;
1965 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
1966 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
1970 return true;
1973 /* Set the architecture. The supported architecture is stored in the
1974 backend pointer. We always set the architecture anyhow, since many
1975 callers ignore the return value. */
1977 boolean
1978 _bfd_ecoff_set_arch_mach (abfd, arch, machine)
1979 bfd *abfd;
1980 enum bfd_architecture arch;
1981 unsigned long machine;
1983 bfd_default_set_arch_mach (abfd, arch, machine);
1984 return arch == ecoff_backend (abfd)->arch;
1987 /* Get the size of the section headers. */
1990 _bfd_ecoff_sizeof_headers (abfd, reloc)
1991 bfd *abfd;
1992 boolean reloc ATTRIBUTE_UNUSED;
1994 asection *current;
1995 int c;
1996 int ret;
1998 c = 0;
1999 for (current = abfd->sections;
2000 current != (asection *)NULL;
2001 current = current->next)
2002 ++c;
2004 ret = (bfd_coff_filhsz (abfd)
2005 + bfd_coff_aoutsz (abfd)
2006 + c * bfd_coff_scnhsz (abfd));
2007 return BFD_ALIGN (ret, 16);
2010 /* Get the contents of a section. */
2012 boolean
2013 _bfd_ecoff_get_section_contents (abfd, section, location, offset, count)
2014 bfd *abfd;
2015 asection *section;
2016 PTR location;
2017 file_ptr offset;
2018 bfd_size_type count;
2020 return _bfd_generic_get_section_contents (abfd, section, location,
2021 offset, count);
2024 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
2025 called via qsort. */
2027 static int
2028 ecoff_sort_hdrs (arg1, arg2)
2029 const PTR arg1;
2030 const PTR arg2;
2032 const asection *hdr1 = *(const asection **) arg1;
2033 const asection *hdr2 = *(const asection **) arg2;
2035 if ((hdr1->flags & SEC_ALLOC) != 0)
2037 if ((hdr2->flags & SEC_ALLOC) == 0)
2038 return -1;
2040 else
2042 if ((hdr2->flags & SEC_ALLOC) != 0)
2043 return 1;
2045 if (hdr1->vma < hdr2->vma)
2046 return -1;
2047 else if (hdr1->vma > hdr2->vma)
2048 return 1;
2049 else
2050 return 0;
2053 /* Calculate the file position for each section, and set
2054 reloc_filepos. */
2056 static boolean
2057 ecoff_compute_section_file_positions (abfd)
2058 bfd *abfd;
2060 file_ptr sofar, file_sofar;
2061 asection **sorted_hdrs;
2062 asection *current;
2063 unsigned int i;
2064 file_ptr old_sofar;
2065 boolean rdata_in_text;
2066 boolean first_data, first_nonalloc;
2067 const bfd_vma round = ecoff_backend (abfd)->round;
2069 sofar = _bfd_ecoff_sizeof_headers (abfd, false);
2070 file_sofar = sofar;
2072 /* Sort the sections by VMA. */
2073 sorted_hdrs = (asection **) bfd_malloc (abfd->section_count
2074 * sizeof (asection *));
2075 if (sorted_hdrs == NULL)
2076 return false;
2077 for (current = abfd->sections, i = 0;
2078 current != NULL;
2079 current = current->next, i++)
2080 sorted_hdrs[i] = current;
2081 BFD_ASSERT (i == abfd->section_count);
2083 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *),
2084 ecoff_sort_hdrs);
2086 /* Some versions of the OSF linker put the .rdata section in the
2087 text segment, and some do not. */
2088 rdata_in_text = ecoff_backend (abfd)->rdata_in_text;
2089 if (rdata_in_text)
2091 for (i = 0; i < abfd->section_count; i++)
2093 current = sorted_hdrs[i];
2094 if (strcmp (current->name, _RDATA) == 0)
2095 break;
2096 if ((current->flags & SEC_CODE) == 0
2097 && strcmp (current->name, _PDATA) != 0
2098 && strcmp (current->name, _RCONST) != 0)
2100 rdata_in_text = false;
2101 break;
2105 ecoff_data (abfd)->rdata_in_text = rdata_in_text;
2107 first_data = true;
2108 first_nonalloc = true;
2109 for (i = 0; i < abfd->section_count; i++)
2111 unsigned int alignment_power;
2113 current = sorted_hdrs[i];
2115 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2116 supposed to indicate the number of .pdata entries that are
2117 really in the section. Each entry is 8 bytes. We store this
2118 away in line_filepos before increasing the section size. */
2119 if (strcmp (current->name, _PDATA) == 0)
2120 current->line_filepos = current->_raw_size / 8;
2122 alignment_power = current->alignment_power;
2124 /* On Ultrix, the data sections in an executable file must be
2125 aligned to a page boundary within the file. This does not
2126 affect the section size, though. FIXME: Does this work for
2127 other platforms? It requires some modification for the
2128 Alpha, because .rdata on the Alpha goes with the text, not
2129 the data. */
2130 if ((abfd->flags & EXEC_P) != 0
2131 && (abfd->flags & D_PAGED) != 0
2132 && ! first_data
2133 && (current->flags & SEC_CODE) == 0
2134 && (! rdata_in_text
2135 || strcmp (current->name, _RDATA) != 0)
2136 && strcmp (current->name, _PDATA) != 0
2137 && strcmp (current->name, _RCONST) != 0)
2139 sofar = (sofar + round - 1) &~ (round - 1);
2140 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2141 first_data = false;
2143 else if (strcmp (current->name, _LIB) == 0)
2145 /* On Irix 4, the location of contents of the .lib section
2146 from a shared library section is also rounded up to a
2147 page boundary. */
2149 sofar = (sofar + round - 1) &~ (round - 1);
2150 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2152 else if (first_nonalloc
2153 && (current->flags & SEC_ALLOC) == 0
2154 && (abfd->flags & D_PAGED) != 0)
2156 /* Skip up to the next page for an unallocated section, such
2157 as the .comment section on the Alpha. This leaves room
2158 for the .bss section. */
2159 first_nonalloc = false;
2160 sofar = (sofar + round - 1) &~ (round - 1);
2161 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2164 /* Align the sections in the file to the same boundary on
2165 which they are aligned in virtual memory. */
2166 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2167 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2168 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2170 if ((abfd->flags & D_PAGED) != 0
2171 && (current->flags & SEC_ALLOC) != 0)
2173 sofar += (current->vma - sofar) % round;
2174 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2175 file_sofar += (current->vma - file_sofar) % round;
2178 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
2179 current->filepos = file_sofar;
2181 sofar += current->_raw_size;
2182 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2183 file_sofar += current->_raw_size;
2185 /* make sure that this section is of the right size too */
2186 old_sofar = sofar;
2187 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2188 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2189 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2190 current->_raw_size += sofar - old_sofar;
2193 free (sorted_hdrs);
2194 sorted_hdrs = NULL;
2196 ecoff_data (abfd)->reloc_filepos = file_sofar;
2198 return true;
2201 /* Determine the location of the relocs for all the sections in the
2202 output file, as well as the location of the symbolic debugging
2203 information. */
2205 static bfd_size_type
2206 ecoff_compute_reloc_file_positions (abfd)
2207 bfd *abfd;
2209 const bfd_size_type external_reloc_size =
2210 ecoff_backend (abfd)->external_reloc_size;
2211 file_ptr reloc_base;
2212 bfd_size_type reloc_size;
2213 asection *current;
2214 file_ptr sym_base;
2216 if (! abfd->output_has_begun)
2218 if (! ecoff_compute_section_file_positions (abfd))
2219 abort ();
2220 abfd->output_has_begun = true;
2223 reloc_base = ecoff_data (abfd)->reloc_filepos;
2225 reloc_size = 0;
2226 for (current = abfd->sections;
2227 current != (asection *)NULL;
2228 current = current->next)
2230 if (current->reloc_count == 0)
2231 current->rel_filepos = 0;
2232 else
2234 bfd_size_type relsize;
2236 current->rel_filepos = reloc_base;
2237 relsize = current->reloc_count * external_reloc_size;
2238 reloc_size += relsize;
2239 reloc_base += relsize;
2243 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2245 /* At least on Ultrix, the symbol table of an executable file must
2246 be aligned to a page boundary. FIXME: Is this true on other
2247 platforms? */
2248 if ((abfd->flags & EXEC_P) != 0
2249 && (abfd->flags & D_PAGED) != 0)
2250 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2251 &~ (ecoff_backend (abfd)->round - 1));
2253 ecoff_data (abfd)->sym_filepos = sym_base;
2255 return reloc_size;
2258 /* Set the contents of a section. */
2260 boolean
2261 _bfd_ecoff_set_section_contents (abfd, section, location, offset, count)
2262 bfd *abfd;
2263 asection *section;
2264 PTR location;
2265 file_ptr offset;
2266 bfd_size_type count;
2268 /* This must be done first, because bfd_set_section_contents is
2269 going to set output_has_begun to true. */
2270 if (abfd->output_has_begun == false)
2272 if (! ecoff_compute_section_file_positions (abfd))
2273 return false;
2276 /* Handle the .lib section specially so that Irix 4 shared libraries
2277 work out. See coff_set_section_contents in coffcode.h. */
2278 if (strcmp (section->name, _LIB) == 0)
2280 bfd_byte *rec, *recend;
2282 rec = (bfd_byte *) location;
2283 recend = rec + count;
2284 while (rec < recend)
2286 ++section->lma;
2287 rec += bfd_get_32 (abfd, rec) * 4;
2290 BFD_ASSERT (rec == recend);
2293 if (count == 0)
2294 return true;
2296 if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0
2297 || bfd_write (location, 1, count, abfd) != count)
2298 return false;
2300 return true;
2303 /* Get the GP value for an ECOFF file. This is a hook used by
2304 nlmconv. */
2306 bfd_vma
2307 bfd_ecoff_get_gp_value (abfd)
2308 bfd *abfd;
2310 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2311 || bfd_get_format (abfd) != bfd_object)
2313 bfd_set_error (bfd_error_invalid_operation);
2314 return 0;
2317 return ecoff_data (abfd)->gp;
2320 /* Set the GP value for an ECOFF file. This is a hook used by the
2321 assembler. */
2323 boolean
2324 bfd_ecoff_set_gp_value (abfd, gp_value)
2325 bfd *abfd;
2326 bfd_vma gp_value;
2328 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2329 || bfd_get_format (abfd) != bfd_object)
2331 bfd_set_error (bfd_error_invalid_operation);
2332 return false;
2335 ecoff_data (abfd)->gp = gp_value;
2337 return true;
2340 /* Set the register masks for an ECOFF file. This is a hook used by
2341 the assembler. */
2343 boolean
2344 bfd_ecoff_set_regmasks (abfd, gprmask, fprmask, cprmask)
2345 bfd *abfd;
2346 unsigned long gprmask;
2347 unsigned long fprmask;
2348 unsigned long *cprmask;
2350 ecoff_data_type *tdata;
2352 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2353 || bfd_get_format (abfd) != bfd_object)
2355 bfd_set_error (bfd_error_invalid_operation);
2356 return false;
2359 tdata = ecoff_data (abfd);
2360 tdata->gprmask = gprmask;
2361 tdata->fprmask = fprmask;
2362 if (cprmask != (unsigned long *) NULL)
2364 register int i;
2366 for (i = 0; i < 3; i++)
2367 tdata->cprmask[i] = cprmask[i];
2370 return true;
2373 /* Get ECOFF EXTR information for an external symbol. This function
2374 is passed to bfd_ecoff_debug_externals. */
2376 static boolean
2377 ecoff_get_extr (sym, esym)
2378 asymbol *sym;
2379 EXTR *esym;
2381 ecoff_symbol_type *ecoff_sym_ptr;
2382 bfd *input_bfd;
2384 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2385 || ecoffsymbol (sym)->native == NULL)
2387 /* Don't include debugging, local, or section symbols. */
2388 if ((sym->flags & BSF_DEBUGGING) != 0
2389 || (sym->flags & BSF_LOCAL) != 0
2390 || (sym->flags & BSF_SECTION_SYM) != 0)
2391 return false;
2393 esym->jmptbl = 0;
2394 esym->cobol_main = 0;
2395 esym->weakext = (sym->flags & BSF_WEAK) != 0;
2396 esym->reserved = 0;
2397 esym->ifd = ifdNil;
2398 /* FIXME: we can do better than this for st and sc. */
2399 esym->asym.st = stGlobal;
2400 esym->asym.sc = scAbs;
2401 esym->asym.reserved = 0;
2402 esym->asym.index = indexNil;
2403 return true;
2406 ecoff_sym_ptr = ecoffsymbol (sym);
2408 if (ecoff_sym_ptr->local)
2409 return false;
2411 input_bfd = bfd_asymbol_bfd (sym);
2412 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2413 (input_bfd, ecoff_sym_ptr->native, esym);
2415 /* If the symbol was defined by the linker, then esym will be
2416 undefined but sym will not be. Get a better class for such a
2417 symbol. */
2418 if ((esym->asym.sc == scUndefined
2419 || esym->asym.sc == scSUndefined)
2420 && ! bfd_is_und_section (bfd_get_section (sym)))
2421 esym->asym.sc = scAbs;
2423 /* Adjust the FDR index for the symbol by that used for the input
2424 BFD. */
2425 if (esym->ifd != -1)
2427 struct ecoff_debug_info *input_debug;
2429 input_debug = &ecoff_data (input_bfd)->debug_info;
2430 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
2431 if (input_debug->ifdmap != (RFDT *) NULL)
2432 esym->ifd = input_debug->ifdmap[esym->ifd];
2435 return true;
2438 /* Set the external symbol index. This routine is passed to
2439 bfd_ecoff_debug_externals. */
2441 static void
2442 ecoff_set_index (sym, indx)
2443 asymbol *sym;
2444 bfd_size_type indx;
2446 ecoff_set_sym_index (sym, indx);
2449 /* Write out an ECOFF file. */
2451 boolean
2452 _bfd_ecoff_write_object_contents (abfd)
2453 bfd *abfd;
2455 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2456 const bfd_vma round = backend->round;
2457 const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2458 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2459 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2460 const bfd_size_type external_hdr_size
2461 = backend->debug_swap.external_hdr_size;
2462 const bfd_size_type external_reloc_size = backend->external_reloc_size;
2463 void (* const adjust_reloc_out) PARAMS ((bfd *,
2464 const arelent *,
2465 struct internal_reloc *))
2466 = backend->adjust_reloc_out;
2467 void (* const swap_reloc_out) PARAMS ((bfd *,
2468 const struct internal_reloc *,
2469 PTR))
2470 = backend->swap_reloc_out;
2471 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2472 HDRR * const symhdr = &debug->symbolic_header;
2473 asection *current;
2474 unsigned int count;
2475 bfd_size_type reloc_size;
2476 bfd_size_type text_size;
2477 bfd_vma text_start;
2478 boolean set_text_start;
2479 bfd_size_type data_size;
2480 bfd_vma data_start;
2481 boolean set_data_start;
2482 bfd_size_type bss_size;
2483 PTR buff = NULL;
2484 PTR reloc_buff = NULL;
2485 struct internal_filehdr internal_f;
2486 struct internal_aouthdr internal_a;
2487 int i;
2489 /* Determine where the sections and relocs will go in the output
2490 file. */
2491 reloc_size = ecoff_compute_reloc_file_positions (abfd);
2493 count = 1;
2494 for (current = abfd->sections;
2495 current != (asection *)NULL;
2496 current = current->next)
2498 current->target_index = count;
2499 ++count;
2502 if ((abfd->flags & D_PAGED) != 0)
2503 text_size = _bfd_ecoff_sizeof_headers (abfd, false);
2504 else
2505 text_size = 0;
2506 text_start = 0;
2507 set_text_start = false;
2508 data_size = 0;
2509 data_start = 0;
2510 set_data_start = false;
2511 bss_size = 0;
2513 /* Write section headers to the file. */
2515 /* Allocate buff big enough to hold a section header,
2516 file header, or a.out header. */
2518 bfd_size_type siz;
2519 siz = scnhsz;
2520 if (siz < filhsz)
2521 siz = filhsz;
2522 if (siz < aoutsz)
2523 siz = aoutsz;
2524 buff = (PTR) bfd_malloc ((size_t) siz);
2525 if (buff == NULL)
2526 goto error_return;
2529 internal_f.f_nscns = 0;
2530 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2531 goto error_return;
2532 for (current = abfd->sections;
2533 current != (asection *) NULL;
2534 current = current->next)
2536 struct internal_scnhdr section;
2537 bfd_vma vma;
2539 ++internal_f.f_nscns;
2541 strncpy (section.s_name, current->name, sizeof section.s_name);
2543 /* This seems to be correct for Irix 4 shared libraries. */
2544 vma = bfd_get_section_vma (abfd, current);
2545 if (strcmp (current->name, _LIB) == 0)
2546 section.s_vaddr = 0;
2547 else
2548 section.s_vaddr = vma;
2550 section.s_paddr = current->lma;
2551 section.s_size = bfd_get_section_size_before_reloc (current);
2553 /* If this section is unloadable then the scnptr will be 0. */
2554 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2555 section.s_scnptr = 0;
2556 else
2557 section.s_scnptr = current->filepos;
2558 section.s_relptr = current->rel_filepos;
2560 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2561 object file produced by the assembler is supposed to point to
2562 information about how much room is required by objects of
2563 various different sizes. I think this only matters if we
2564 want the linker to compute the best size to use, or
2565 something. I don't know what happens if the information is
2566 not present. */
2567 if (strcmp (current->name, _PDATA) != 0)
2568 section.s_lnnoptr = 0;
2569 else
2571 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2572 hold the number of entries in the section (each entry is
2573 8 bytes). We stored this in the line_filepos field in
2574 ecoff_compute_section_file_positions. */
2575 section.s_lnnoptr = current->line_filepos;
2578 section.s_nreloc = current->reloc_count;
2579 section.s_nlnno = 0;
2580 section.s_flags = ecoff_sec_to_styp_flags (current->name,
2581 current->flags);
2583 if (bfd_coff_swap_scnhdr_out (abfd, (PTR) &section, buff) == 0
2584 || bfd_write (buff, 1, scnhsz, abfd) != scnhsz)
2585 goto error_return;
2587 if ((section.s_flags & STYP_TEXT) != 0
2588 || ((section.s_flags & STYP_RDATA) != 0
2589 && ecoff_data (abfd)->rdata_in_text)
2590 || section.s_flags == STYP_PDATA
2591 || (section.s_flags & STYP_DYNAMIC) != 0
2592 || (section.s_flags & STYP_LIBLIST) != 0
2593 || (section.s_flags & STYP_RELDYN) != 0
2594 || section.s_flags == STYP_CONFLIC
2595 || (section.s_flags & STYP_DYNSTR) != 0
2596 || (section.s_flags & STYP_DYNSYM) != 0
2597 || (section.s_flags & STYP_HASH) != 0
2598 || (section.s_flags & STYP_ECOFF_INIT) != 0
2599 || (section.s_flags & STYP_ECOFF_FINI) != 0
2600 || section.s_flags == STYP_RCONST)
2602 text_size += bfd_get_section_size_before_reloc (current);
2603 if (! set_text_start || text_start > vma)
2605 text_start = vma;
2606 set_text_start = true;
2609 else if ((section.s_flags & STYP_RDATA) != 0
2610 || (section.s_flags & STYP_DATA) != 0
2611 || (section.s_flags & STYP_LITA) != 0
2612 || (section.s_flags & STYP_LIT8) != 0
2613 || (section.s_flags & STYP_LIT4) != 0
2614 || (section.s_flags & STYP_SDATA) != 0
2615 || section.s_flags == STYP_XDATA
2616 || (section.s_flags & STYP_GOT) != 0)
2618 data_size += bfd_get_section_size_before_reloc (current);
2619 if (! set_data_start || data_start > vma)
2621 data_start = vma;
2622 set_data_start = true;
2625 else if ((section.s_flags & STYP_BSS) != 0
2626 || (section.s_flags & STYP_SBSS) != 0)
2627 bss_size += bfd_get_section_size_before_reloc (current);
2628 else if (section.s_flags == 0
2629 || (section.s_flags & STYP_ECOFF_LIB) != 0
2630 || section.s_flags == STYP_COMMENT)
2631 /* Do nothing */ ;
2632 else
2633 abort ();
2636 /* Set up the file header. */
2638 internal_f.f_magic = ecoff_get_magic (abfd);
2640 /* We will NOT put a fucking timestamp in the header here. Every
2641 time you put it back, I will come in and take it out again. I'm
2642 sorry. This field does not belong here. We fill it with a 0 so
2643 it compares the same but is not a reasonable time. --
2644 gnu@cygnus.com. */
2645 internal_f.f_timdat = 0;
2647 if (bfd_get_symcount (abfd) != 0)
2649 /* The ECOFF f_nsyms field is not actually the number of
2650 symbols, it's the size of symbolic information header. */
2651 internal_f.f_nsyms = external_hdr_size;
2652 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
2654 else
2656 internal_f.f_nsyms = 0;
2657 internal_f.f_symptr = 0;
2660 internal_f.f_opthdr = aoutsz;
2662 internal_f.f_flags = F_LNNO;
2663 if (reloc_size == 0)
2664 internal_f.f_flags |= F_RELFLG;
2665 if (bfd_get_symcount (abfd) == 0)
2666 internal_f.f_flags |= F_LSYMS;
2667 if (abfd->flags & EXEC_P)
2668 internal_f.f_flags |= F_EXEC;
2670 if (bfd_little_endian (abfd))
2671 internal_f.f_flags |= F_AR32WR;
2672 else
2673 internal_f.f_flags |= F_AR32W;
2675 /* Set up the ``optional'' header. */
2676 if ((abfd->flags & D_PAGED) != 0)
2677 internal_a.magic = ECOFF_AOUT_ZMAGIC;
2678 else
2679 internal_a.magic = ECOFF_AOUT_OMAGIC;
2681 /* FIXME: Is this really correct? */
2682 internal_a.vstamp = symhdr->vstamp;
2684 /* At least on Ultrix, these have to be rounded to page boundaries.
2685 FIXME: Is this true on other platforms? */
2686 if ((abfd->flags & D_PAGED) != 0)
2688 internal_a.tsize = (text_size + round - 1) &~ (round - 1);
2689 internal_a.text_start = text_start &~ (round - 1);
2690 internal_a.dsize = (data_size + round - 1) &~ (round - 1);
2691 internal_a.data_start = data_start &~ (round - 1);
2693 else
2695 internal_a.tsize = text_size;
2696 internal_a.text_start = text_start;
2697 internal_a.dsize = data_size;
2698 internal_a.data_start = data_start;
2701 /* On Ultrix, the initial portions of the .sbss and .bss segments
2702 are at the end of the data section. The bsize field in the
2703 optional header records how many bss bytes are required beyond
2704 those in the data section. The value is not rounded to a page
2705 boundary. */
2706 if (bss_size < internal_a.dsize - data_size)
2707 bss_size = 0;
2708 else
2709 bss_size -= internal_a.dsize - data_size;
2710 internal_a.bsize = bss_size;
2711 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
2713 internal_a.entry = bfd_get_start_address (abfd);
2715 internal_a.gp_value = ecoff_data (abfd)->gp;
2717 internal_a.gprmask = ecoff_data (abfd)->gprmask;
2718 internal_a.fprmask = ecoff_data (abfd)->fprmask;
2719 for (i = 0; i < 4; i++)
2720 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
2722 /* Let the backend adjust the headers if necessary. */
2723 if (backend->adjust_headers)
2725 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a))
2726 goto error_return;
2729 /* Write out the file header and the optional header. */
2731 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2732 goto error_return;
2734 bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, buff);
2735 if (bfd_write (buff, 1, filhsz, abfd) != filhsz)
2736 goto error_return;
2738 bfd_coff_swap_aouthdr_out (abfd, (PTR) &internal_a, buff);
2739 if (bfd_write (buff, 1, aoutsz, abfd) != aoutsz)
2740 goto error_return;
2742 /* Build the external symbol information. This must be done before
2743 writing out the relocs so that we know the symbol indices. We
2744 don't do this if this BFD was created by the backend linker,
2745 since it will have already handled the symbols and relocs. */
2746 if (! ecoff_data (abfd)->linker)
2748 symhdr->iextMax = 0;
2749 symhdr->issExtMax = 0;
2750 debug->external_ext = debug->external_ext_end = NULL;
2751 debug->ssext = debug->ssext_end = NULL;
2752 if (bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2753 (((abfd->flags & EXEC_P) == 0)
2754 ? true : false),
2755 ecoff_get_extr, ecoff_set_index)
2756 == false)
2757 goto error_return;
2759 /* Write out the relocs. */
2760 for (current = abfd->sections;
2761 current != (asection *) NULL;
2762 current = current->next)
2764 arelent **reloc_ptr_ptr;
2765 arelent **reloc_end;
2766 char *out_ptr;
2768 if (current->reloc_count == 0)
2769 continue;
2771 reloc_buff =
2772 bfd_alloc (abfd, current->reloc_count * external_reloc_size);
2773 if (reloc_buff == NULL)
2774 goto error_return;
2776 reloc_ptr_ptr = current->orelocation;
2777 reloc_end = reloc_ptr_ptr + current->reloc_count;
2778 out_ptr = (char *) reloc_buff;
2779 for (;
2780 reloc_ptr_ptr < reloc_end;
2781 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2783 arelent *reloc;
2784 asymbol *sym;
2785 struct internal_reloc in;
2787 memset ((PTR) &in, 0, sizeof in);
2789 reloc = *reloc_ptr_ptr;
2790 sym = *reloc->sym_ptr_ptr;
2792 in.r_vaddr = (reloc->address
2793 + bfd_get_section_vma (abfd, current));
2794 in.r_type = reloc->howto->type;
2796 if ((sym->flags & BSF_SECTION_SYM) == 0)
2798 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2799 in.r_extern = 1;
2801 else
2803 CONST char *name;
2805 name = bfd_get_section_name (abfd, bfd_get_section (sym));
2806 if (strcmp (name, ".text") == 0)
2807 in.r_symndx = RELOC_SECTION_TEXT;
2808 else if (strcmp (name, ".rdata") == 0)
2809 in.r_symndx = RELOC_SECTION_RDATA;
2810 else if (strcmp (name, ".data") == 0)
2811 in.r_symndx = RELOC_SECTION_DATA;
2812 else if (strcmp (name, ".sdata") == 0)
2813 in.r_symndx = RELOC_SECTION_SDATA;
2814 else if (strcmp (name, ".sbss") == 0)
2815 in.r_symndx = RELOC_SECTION_SBSS;
2816 else if (strcmp (name, ".bss") == 0)
2817 in.r_symndx = RELOC_SECTION_BSS;
2818 else if (strcmp (name, ".init") == 0)
2819 in.r_symndx = RELOC_SECTION_INIT;
2820 else if (strcmp (name, ".lit8") == 0)
2821 in.r_symndx = RELOC_SECTION_LIT8;
2822 else if (strcmp (name, ".lit4") == 0)
2823 in.r_symndx = RELOC_SECTION_LIT4;
2824 else if (strcmp (name, ".xdata") == 0)
2825 in.r_symndx = RELOC_SECTION_XDATA;
2826 else if (strcmp (name, ".pdata") == 0)
2827 in.r_symndx = RELOC_SECTION_PDATA;
2828 else if (strcmp (name, ".fini") == 0)
2829 in.r_symndx = RELOC_SECTION_FINI;
2830 else if (strcmp (name, ".lita") == 0)
2831 in.r_symndx = RELOC_SECTION_LITA;
2832 else if (strcmp (name, "*ABS*") == 0)
2833 in.r_symndx = RELOC_SECTION_ABS;
2834 else if (strcmp (name, ".rconst") == 0)
2835 in.r_symndx = RELOC_SECTION_RCONST;
2836 else
2837 abort ();
2838 in.r_extern = 0;
2841 (*adjust_reloc_out) (abfd, reloc, &in);
2843 (*swap_reloc_out) (abfd, &in, (PTR) out_ptr);
2846 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
2847 goto error_return;
2848 if (bfd_write (reloc_buff,
2849 external_reloc_size, current->reloc_count, abfd)
2850 != external_reloc_size * current->reloc_count)
2851 goto error_return;
2852 bfd_release (abfd, reloc_buff);
2853 reloc_buff = NULL;
2856 /* Write out the symbolic debugging information. */
2857 if (bfd_get_symcount (abfd) > 0)
2859 /* Write out the debugging information. */
2860 if (bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
2861 ecoff_data (abfd)->sym_filepos)
2862 == false)
2863 goto error_return;
2867 /* The .bss section of a demand paged executable must receive an
2868 entire page. If there are symbols, the symbols will start on the
2869 next page. If there are no symbols, we must fill out the page by
2870 hand. */
2871 if (bfd_get_symcount (abfd) == 0
2872 && (abfd->flags & EXEC_P) != 0
2873 && (abfd->flags & D_PAGED) != 0)
2875 char c;
2877 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2878 SEEK_SET) != 0)
2879 goto error_return;
2880 if (bfd_read (&c, 1, 1, abfd) == 0)
2881 c = 0;
2882 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2883 SEEK_SET) != 0)
2884 goto error_return;
2885 if (bfd_write (&c, 1, 1, abfd) != 1)
2886 goto error_return;
2889 if (reloc_buff != NULL)
2890 bfd_release (abfd, reloc_buff);
2891 if (buff != NULL)
2892 free (buff);
2893 return true;
2894 error_return:
2895 if (reloc_buff != NULL)
2896 bfd_release (abfd, reloc_buff);
2897 if (buff != NULL)
2898 free (buff);
2899 return false;
2902 /* Archive handling. ECOFF uses what appears to be a unique type of
2903 archive header (armap). The byte ordering of the armap and the
2904 contents are encoded in the name of the armap itself. At least for
2905 now, we only support archives with the same byte ordering in the
2906 armap and the contents.
2908 The first four bytes in the armap are the number of symbol
2909 definitions. This is always a power of two.
2911 This is followed by the symbol definitions. Each symbol definition
2912 occupies 8 bytes. The first four bytes are the offset from the
2913 start of the armap strings to the null-terminated string naming
2914 this symbol. The second four bytes are the file offset to the
2915 archive member which defines this symbol. If the second four bytes
2916 are 0, then this is not actually a symbol definition, and it should
2917 be ignored.
2919 The symbols are hashed into the armap with a closed hashing scheme.
2920 See the functions below for the details of the algorithm.
2922 After the symbol definitions comes four bytes holding the size of
2923 the string table, followed by the string table itself. */
2925 /* The name of an archive headers looks like this:
2926 __________E[BL]E[BL]_ (with a trailing space).
2927 The trailing space is changed to an X if the archive is changed to
2928 indicate that the armap is out of date.
2930 The Alpha seems to use ________64E[BL]E[BL]_. */
2932 #define ARMAP_BIG_ENDIAN 'B'
2933 #define ARMAP_LITTLE_ENDIAN 'L'
2934 #define ARMAP_MARKER 'E'
2935 #define ARMAP_START_LENGTH 10
2936 #define ARMAP_HEADER_MARKER_INDEX 10
2937 #define ARMAP_HEADER_ENDIAN_INDEX 11
2938 #define ARMAP_OBJECT_MARKER_INDEX 12
2939 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2940 #define ARMAP_END_INDEX 14
2941 #define ARMAP_END "_ "
2943 /* This is a magic number used in the hashing algorithm. */
2944 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2946 /* This returns the hash value to use for a string. It also sets
2947 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2948 is the number of entries in the hash table, and HLOG is the log
2949 base 2 of SIZE. */
2951 static unsigned int
2952 ecoff_armap_hash (s, rehash, size, hlog)
2953 CONST char *s;
2954 unsigned int *rehash;
2955 unsigned int size;
2956 unsigned int hlog;
2958 unsigned int hash;
2960 if (hlog == 0)
2961 return 0;
2962 hash = *s++;
2963 while (*s != '\0')
2964 hash = ((hash >> 27) | (hash << 5)) + *s++;
2965 hash *= ARMAP_HASH_MAGIC;
2966 *rehash = (hash & (size - 1)) | 1;
2967 return hash >> (32 - hlog);
2970 /* Read in the armap. */
2972 boolean
2973 _bfd_ecoff_slurp_armap (abfd)
2974 bfd *abfd;
2976 char nextname[17];
2977 unsigned int i;
2978 struct areltdata *mapdata;
2979 bfd_size_type parsed_size;
2980 char *raw_armap;
2981 struct artdata *ardata;
2982 unsigned int count;
2983 char *raw_ptr;
2984 struct symdef *symdef_ptr;
2985 char *stringbase;
2987 /* Get the name of the first element. */
2988 i = bfd_read ((PTR) nextname, 1, 16, abfd);
2989 if (i == 0)
2990 return true;
2991 if (i != 16)
2992 return false;
2994 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
2995 return false;
2997 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2998 standard COFF armap. We could move the ECOFF armap stuff into
2999 bfd_slurp_armap, but that seems inappropriate since no other
3000 target uses this format. Instead, we check directly for a COFF
3001 armap. */
3002 if (strncmp (nextname, "/ ", 16) == 0)
3003 return bfd_slurp_armap (abfd);
3005 /* See if the first element is an armap. */
3006 if (strncmp (nextname, ecoff_backend (abfd)->armap_start,
3007 ARMAP_START_LENGTH) != 0
3008 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
3009 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3010 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3011 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
3012 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
3013 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
3014 || strncmp (nextname + ARMAP_END_INDEX,
3015 ARMAP_END, sizeof ARMAP_END - 1) != 0)
3017 bfd_has_map (abfd) = false;
3018 return true;
3021 /* Make sure we have the right byte ordering. */
3022 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3023 ^ (bfd_header_big_endian (abfd)))
3024 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
3025 ^ (bfd_big_endian (abfd))))
3027 bfd_set_error (bfd_error_wrong_format);
3028 return false;
3031 /* Read in the armap. */
3032 ardata = bfd_ardata (abfd);
3033 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
3034 if (mapdata == (struct areltdata *) NULL)
3035 return false;
3036 parsed_size = mapdata->parsed_size;
3037 bfd_release (abfd, (PTR) mapdata);
3039 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
3040 if (raw_armap == (char *) NULL)
3041 return false;
3043 if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
3045 if (bfd_get_error () != bfd_error_system_call)
3046 bfd_set_error (bfd_error_malformed_archive);
3047 bfd_release (abfd, (PTR) raw_armap);
3048 return false;
3051 ardata->tdata = (PTR) raw_armap;
3053 count = bfd_h_get_32 (abfd, (PTR) raw_armap);
3055 ardata->symdef_count = 0;
3056 ardata->cache = (struct ar_cache *) NULL;
3058 /* This code used to overlay the symdefs over the raw archive data,
3059 but that doesn't work on a 64 bit host. */
3061 stringbase = raw_armap + count * 8 + 8;
3063 #ifdef CHECK_ARMAP_HASH
3065 unsigned int hlog;
3067 /* Double check that I have the hashing algorithm right by making
3068 sure that every symbol can be looked up successfully. */
3069 hlog = 0;
3070 for (i = 1; i < count; i <<= 1)
3071 hlog++;
3072 BFD_ASSERT (i == count);
3074 raw_ptr = raw_armap + 4;
3075 for (i = 0; i < count; i++, raw_ptr += 8)
3077 unsigned int name_offset, file_offset;
3078 unsigned int hash, rehash, srch;
3080 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3081 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3082 if (file_offset == 0)
3083 continue;
3084 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
3085 hlog);
3086 if (hash == i)
3087 continue;
3089 /* See if we can rehash to this location. */
3090 for (srch = (hash + rehash) & (count - 1);
3091 srch != hash && srch != i;
3092 srch = (srch + rehash) & (count - 1))
3093 BFD_ASSERT (bfd_h_get_32 (abfd, (PTR) (raw_armap + 8 + srch * 8))
3094 != 0);
3095 BFD_ASSERT (srch == i);
3099 #endif /* CHECK_ARMAP_HASH */
3101 raw_ptr = raw_armap + 4;
3102 for (i = 0; i < count; i++, raw_ptr += 8)
3103 if (bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)) != 0)
3104 ++ardata->symdef_count;
3106 symdef_ptr = ((struct symdef *)
3107 bfd_alloc (abfd,
3108 ardata->symdef_count * sizeof (struct symdef)));
3109 if (!symdef_ptr)
3110 return false;
3112 ardata->symdefs = (carsym *) symdef_ptr;
3114 raw_ptr = raw_armap + 4;
3115 for (i = 0; i < count; i++, raw_ptr += 8)
3117 unsigned int name_offset, file_offset;
3119 file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4));
3120 if (file_offset == 0)
3121 continue;
3122 name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr);
3123 symdef_ptr->s.name = stringbase + name_offset;
3124 symdef_ptr->file_offset = file_offset;
3125 ++symdef_ptr;
3128 ardata->first_file_filepos = bfd_tell (abfd);
3129 /* Pad to an even boundary. */
3130 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3132 bfd_has_map (abfd) = true;
3134 return true;
3137 /* Write out an armap. */
3139 boolean
3140 _bfd_ecoff_write_armap (abfd, elength, map, orl_count, stridx)
3141 bfd *abfd;
3142 unsigned int elength;
3143 struct orl *map;
3144 unsigned int orl_count;
3145 int stridx;
3147 unsigned int hashsize, hashlog;
3148 unsigned int symdefsize;
3149 int padit;
3150 unsigned int stringsize;
3151 unsigned int mapsize;
3152 file_ptr firstreal;
3153 struct ar_hdr hdr;
3154 struct stat statbuf;
3155 unsigned int i;
3156 bfd_byte temp[4];
3157 bfd_byte *hashtable;
3158 bfd *current;
3159 bfd *last_elt;
3161 /* Ultrix appears to use as a hash table size the least power of two
3162 greater than twice the number of entries. */
3163 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++)
3165 hashsize = 1 << hashlog;
3167 symdefsize = hashsize * 8;
3168 padit = stridx % 2;
3169 stringsize = stridx + padit;
3171 /* Include 8 bytes to store symdefsize and stringsize in output. */
3172 mapsize = symdefsize + stringsize + 8;
3174 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3176 memset ((PTR) &hdr, 0, sizeof hdr);
3178 /* Work out the ECOFF armap name. */
3179 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3180 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3181 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3182 (bfd_header_big_endian (abfd)
3183 ? ARMAP_BIG_ENDIAN
3184 : ARMAP_LITTLE_ENDIAN);
3185 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3186 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3187 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3188 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3190 /* Write the timestamp of the archive header to be just a little bit
3191 later than the timestamp of the file, otherwise the linker will
3192 complain that the index is out of date. Actually, the Ultrix
3193 linker just checks the archive name; the GNU linker may check the
3194 date. */
3195 stat (abfd->filename, &statbuf);
3196 sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60));
3198 /* The DECstation uses zeroes for the uid, gid and mode of the
3199 armap. */
3200 hdr.ar_uid[0] = '0';
3201 hdr.ar_gid[0] = '0';
3202 #if 0
3203 hdr.ar_mode[0] = '0';
3204 #else
3205 /* Building gcc ends up extracting the armap as a file - twice. */
3206 hdr.ar_mode[0] = '6';
3207 hdr.ar_mode[1] = '4';
3208 hdr.ar_mode[2] = '4';
3209 #endif
3211 sprintf (hdr.ar_size, "%-10d", (int) mapsize);
3213 hdr.ar_fmag[0] = '`';
3214 hdr.ar_fmag[1] = '\012';
3216 /* Turn all null bytes in the header into spaces. */
3217 for (i = 0; i < sizeof (struct ar_hdr); i++)
3218 if (((char *) (&hdr))[i] == '\0')
3219 (((char *) (&hdr))[i]) = ' ';
3221 if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
3222 != sizeof (struct ar_hdr))
3223 return false;
3225 bfd_h_put_32 (abfd, (bfd_vma) hashsize, temp);
3226 if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3227 return false;
3229 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3230 if (!hashtable)
3231 return false;
3233 current = abfd->archive_head;
3234 last_elt = current;
3235 for (i = 0; i < orl_count; i++)
3237 unsigned int hash, rehash;
3239 /* Advance firstreal to the file position of this archive
3240 element. */
3241 if (((bfd *) map[i].pos) != last_elt)
3245 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3246 firstreal += firstreal % 2;
3247 current = current->next;
3249 while (current != (bfd *) map[i].pos);
3252 last_elt = current;
3254 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3255 if (bfd_h_get_32 (abfd, (PTR) (hashtable + (hash * 8) + 4)) != 0)
3257 unsigned int srch;
3259 /* The desired slot is already taken. */
3260 for (srch = (hash + rehash) & (hashsize - 1);
3261 srch != hash;
3262 srch = (srch + rehash) & (hashsize - 1))
3263 if (bfd_h_get_32 (abfd, (PTR) (hashtable + (srch * 8) + 4)) == 0)
3264 break;
3266 BFD_ASSERT (srch != hash);
3268 hash = srch;
3271 bfd_h_put_32 (abfd, (bfd_vma) map[i].namidx,
3272 (PTR) (hashtable + hash * 8));
3273 bfd_h_put_32 (abfd, (bfd_vma) firstreal,
3274 (PTR) (hashtable + hash * 8 + 4));
3277 if (bfd_write ((PTR) hashtable, 1, symdefsize, abfd) != symdefsize)
3278 return false;
3280 bfd_release (abfd, hashtable);
3282 /* Now write the strings. */
3283 bfd_h_put_32 (abfd, (bfd_vma) stringsize, temp);
3284 if (bfd_write ((PTR) temp, 1, 4, abfd) != 4)
3285 return false;
3286 for (i = 0; i < orl_count; i++)
3288 bfd_size_type len;
3290 len = strlen (*map[i].name) + 1;
3291 if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len)
3292 return false;
3295 /* The spec sez this should be a newline. But in order to be
3296 bug-compatible for DECstation ar we use a null. */
3297 if (padit)
3299 if (bfd_write ("", 1, 1, abfd) != 1)
3300 return false;
3303 return true;
3306 /* See whether this BFD is an archive. If it is, read in the armap
3307 and the extended name table. */
3309 const bfd_target *
3310 _bfd_ecoff_archive_p (abfd)
3311 bfd *abfd;
3313 struct artdata *tdata_hold;
3314 char armag[SARMAG + 1];
3316 tdata_hold = abfd->tdata.aout_ar_data;
3318 if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG)
3320 if (bfd_get_error () != bfd_error_system_call)
3321 bfd_set_error (bfd_error_wrong_format);
3322 return (const bfd_target *) NULL;
3325 if (strncmp (armag, ARMAG, SARMAG) != 0)
3327 bfd_set_error (bfd_error_wrong_format);
3328 return NULL;
3331 /* We are setting bfd_ardata(abfd) here, but since bfd_ardata
3332 involves a cast, we can't do it as the left operand of
3333 assignment. */
3334 abfd->tdata.aout_ar_data =
3335 (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata));
3337 if (bfd_ardata (abfd) == (struct artdata *) NULL)
3339 abfd->tdata.aout_ar_data = tdata_hold;
3340 return (const bfd_target *) NULL;
3343 bfd_ardata (abfd)->first_file_filepos = SARMAG;
3344 bfd_ardata (abfd)->cache = NULL;
3345 bfd_ardata (abfd)->archive_head = NULL;
3346 bfd_ardata (abfd)->symdefs = NULL;
3347 bfd_ardata (abfd)->extended_names = NULL;
3348 bfd_ardata (abfd)->tdata = NULL;
3350 if (_bfd_ecoff_slurp_armap (abfd) == false
3351 || _bfd_ecoff_slurp_extended_name_table (abfd) == false)
3353 bfd_release (abfd, bfd_ardata (abfd));
3354 abfd->tdata.aout_ar_data = tdata_hold;
3355 return (const bfd_target *) NULL;
3358 if (bfd_has_map (abfd))
3360 bfd *first;
3362 /* This archive has a map, so we may presume that the contents
3363 are object files. Make sure that if the first file in the
3364 archive can be recognized as an object file, it is for this
3365 target. If not, assume that this is the wrong format. If
3366 the first file is not an object file, somebody is doing
3367 something weird, and we permit it so that ar -t will work. */
3369 first = bfd_openr_next_archived_file (abfd, (bfd *) NULL);
3370 if (first != NULL)
3372 boolean fail;
3374 first->target_defaulted = false;
3375 fail = false;
3376 if (bfd_check_format (first, bfd_object)
3377 && first->xvec != abfd->xvec)
3379 (void) bfd_close (first);
3380 bfd_release (abfd, bfd_ardata (abfd));
3381 abfd->tdata.aout_ar_data = tdata_hold;
3382 bfd_set_error (bfd_error_wrong_format);
3383 return NULL;
3386 /* We ought to close first here, but we can't, because we
3387 have no way to remove it from the archive cache. FIXME. */
3391 return abfd->xvec;
3394 /* ECOFF linker code. */
3396 static struct bfd_hash_entry *ecoff_link_hash_newfunc
3397 PARAMS ((struct bfd_hash_entry *entry,
3398 struct bfd_hash_table *table,
3399 const char *string));
3400 static boolean ecoff_link_add_archive_symbols
3401 PARAMS ((bfd *, struct bfd_link_info *));
3402 static boolean ecoff_link_check_archive_element
3403 PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded));
3404 static boolean ecoff_link_add_object_symbols
3405 PARAMS ((bfd *, struct bfd_link_info *));
3406 static boolean ecoff_link_add_externals
3407 PARAMS ((bfd *, struct bfd_link_info *, PTR, char *));
3409 /* Routine to create an entry in an ECOFF link hash table. */
3411 static struct bfd_hash_entry *
3412 ecoff_link_hash_newfunc (entry, table, string)
3413 struct bfd_hash_entry *entry;
3414 struct bfd_hash_table *table;
3415 const char *string;
3417 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3419 /* Allocate the structure if it has not already been allocated by a
3420 subclass. */
3421 if (ret == (struct ecoff_link_hash_entry *) NULL)
3422 ret = ((struct ecoff_link_hash_entry *)
3423 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3424 if (ret == (struct ecoff_link_hash_entry *) NULL)
3425 return NULL;
3427 /* Call the allocation method of the superclass. */
3428 ret = ((struct ecoff_link_hash_entry *)
3429 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3430 table, string));
3432 if (ret)
3434 /* Set local fields. */
3435 ret->indx = -1;
3436 ret->abfd = NULL;
3437 ret->written = 0;
3438 ret->small = 0;
3440 memset ((PTR) &ret->esym, 0, sizeof ret->esym);
3442 return (struct bfd_hash_entry *) ret;
3445 /* Create an ECOFF link hash table. */
3447 struct bfd_link_hash_table *
3448 _bfd_ecoff_bfd_link_hash_table_create (abfd)
3449 bfd *abfd;
3451 struct ecoff_link_hash_table *ret;
3453 ret = ((struct ecoff_link_hash_table *)
3454 bfd_alloc (abfd, sizeof (struct ecoff_link_hash_table)));
3455 if (ret == NULL)
3456 return NULL;
3457 if (! _bfd_link_hash_table_init (&ret->root, abfd,
3458 ecoff_link_hash_newfunc))
3460 free (ret);
3461 return (struct bfd_link_hash_table *) NULL;
3463 return &ret->root;
3466 /* Look up an entry in an ECOFF link hash table. */
3468 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3469 ((struct ecoff_link_hash_entry *) \
3470 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3472 /* Traverse an ECOFF link hash table. */
3474 #define ecoff_link_hash_traverse(table, func, info) \
3475 (bfd_link_hash_traverse \
3476 (&(table)->root, \
3477 (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \
3478 (info)))
3480 /* Get the ECOFF link hash table from the info structure. This is
3481 just a cast. */
3483 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3485 /* Given an ECOFF BFD, add symbols to the global hash table as
3486 appropriate. */
3488 boolean
3489 _bfd_ecoff_bfd_link_add_symbols (abfd, info)
3490 bfd *abfd;
3491 struct bfd_link_info *info;
3493 switch (bfd_get_format (abfd))
3495 case bfd_object:
3496 return ecoff_link_add_object_symbols (abfd, info);
3497 case bfd_archive:
3498 return ecoff_link_add_archive_symbols (abfd, info);
3499 default:
3500 bfd_set_error (bfd_error_wrong_format);
3501 return false;
3505 /* Add the symbols from an archive file to the global hash table.
3506 This looks through the undefined symbols, looks each one up in the
3507 archive hash table, and adds any associated object file. We do not
3508 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3509 already have a hash table, so there is no reason to construct
3510 another one. */
3512 static boolean
3513 ecoff_link_add_archive_symbols (abfd, info)
3514 bfd *abfd;
3515 struct bfd_link_info *info;
3517 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3518 const bfd_byte *raw_armap;
3519 struct bfd_link_hash_entry **pundef;
3520 unsigned int armap_count;
3521 unsigned int armap_log;
3522 unsigned int i;
3523 const bfd_byte *hashtable;
3524 const char *stringbase;
3526 if (! bfd_has_map (abfd))
3528 /* An empty archive is a special case. */
3529 if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL)
3530 return true;
3531 bfd_set_error (bfd_error_no_armap);
3532 return false;
3535 /* If we don't have any raw data for this archive, as can happen on
3536 Irix 4.0.5F, we call the generic routine.
3537 FIXME: We should be more clever about this, since someday tdata
3538 may get to something for a generic archive. */
3539 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3540 if (raw_armap == (bfd_byte *) NULL)
3541 return (_bfd_generic_link_add_archive_symbols
3542 (abfd, info, ecoff_link_check_archive_element));
3544 armap_count = bfd_h_get_32 (abfd, raw_armap);
3546 armap_log = 0;
3547 for (i = 1; i < armap_count; i <<= 1)
3548 armap_log++;
3549 BFD_ASSERT (i == armap_count);
3551 hashtable = raw_armap + 4;
3552 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3554 /* Look through the list of undefined symbols. */
3555 pundef = &info->hash->undefs;
3556 while (*pundef != (struct bfd_link_hash_entry *) NULL)
3558 struct bfd_link_hash_entry *h;
3559 unsigned int hash, rehash;
3560 unsigned int file_offset;
3561 const char *name;
3562 bfd *element;
3564 h = *pundef;
3566 /* When a symbol is defined, it is not necessarily removed from
3567 the list. */
3568 if (h->type != bfd_link_hash_undefined
3569 && h->type != bfd_link_hash_common)
3571 /* Remove this entry from the list, for general cleanliness
3572 and because we are going to look through the list again
3573 if we search any more libraries. We can't remove the
3574 entry if it is the tail, because that would lose any
3575 entries we add to the list later on. */
3576 if (*pundef != info->hash->undefs_tail)
3577 *pundef = (*pundef)->next;
3578 else
3579 pundef = &(*pundef)->next;
3580 continue;
3583 /* Native ECOFF linkers do not pull in archive elements merely
3584 to satisfy common definitions, so neither do we. We leave
3585 them on the list, though, in case we are linking against some
3586 other object format. */
3587 if (h->type != bfd_link_hash_undefined)
3589 pundef = &(*pundef)->next;
3590 continue;
3593 /* Look for this symbol in the archive hash table. */
3594 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3595 armap_log);
3597 file_offset = bfd_h_get_32 (abfd, hashtable + (hash * 8) + 4);
3598 if (file_offset == 0)
3600 /* Nothing in this slot. */
3601 pundef = &(*pundef)->next;
3602 continue;
3605 name = stringbase + bfd_h_get_32 (abfd, hashtable + (hash * 8));
3606 if (name[0] != h->root.string[0]
3607 || strcmp (name, h->root.string) != 0)
3609 unsigned int srch;
3610 boolean found;
3612 /* That was the wrong symbol. Try rehashing. */
3613 found = false;
3614 for (srch = (hash + rehash) & (armap_count - 1);
3615 srch != hash;
3616 srch = (srch + rehash) & (armap_count - 1))
3618 file_offset = bfd_h_get_32 (abfd, hashtable + (srch * 8) + 4);
3619 if (file_offset == 0)
3620 break;
3621 name = stringbase + bfd_h_get_32 (abfd, hashtable + (srch * 8));
3622 if (name[0] == h->root.string[0]
3623 && strcmp (name, h->root.string) == 0)
3625 found = true;
3626 break;
3630 if (! found)
3632 pundef = &(*pundef)->next;
3633 continue;
3636 hash = srch;
3639 element = (*backend->get_elt_at_filepos) (abfd, file_offset);
3640 if (element == (bfd *) NULL)
3641 return false;
3643 if (! bfd_check_format (element, bfd_object))
3644 return false;
3646 /* Unlike the generic linker, we know that this element provides
3647 a definition for an undefined symbol and we know that we want
3648 to include it. We don't need to check anything. */
3649 if (! (*info->callbacks->add_archive_element) (info, element, name))
3650 return false;
3651 if (! ecoff_link_add_object_symbols (element, info))
3652 return false;
3654 pundef = &(*pundef)->next;
3657 return true;
3660 /* This is called if we used _bfd_generic_link_add_archive_symbols
3661 because we were not dealing with an ECOFF archive. */
3663 static boolean
3664 ecoff_link_check_archive_element (abfd, info, pneeded)
3665 bfd *abfd;
3666 struct bfd_link_info *info;
3667 boolean *pneeded;
3669 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3670 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
3671 = backend->debug_swap.swap_ext_in;
3672 HDRR *symhdr;
3673 bfd_size_type external_ext_size;
3674 PTR external_ext = NULL;
3675 size_t esize;
3676 char *ssext = NULL;
3677 char *ext_ptr;
3678 char *ext_end;
3680 *pneeded = false;
3682 if (! ecoff_slurp_symbolic_header (abfd))
3683 goto error_return;
3685 /* If there are no symbols, we don't want it. */
3686 if (bfd_get_symcount (abfd) == 0)
3687 goto successful_return;
3689 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3691 /* Read in the external symbols and external strings. */
3692 external_ext_size = backend->debug_swap.external_ext_size;
3693 esize = symhdr->iextMax * external_ext_size;
3694 external_ext = (PTR) bfd_malloc (esize);
3695 if (external_ext == NULL && esize != 0)
3696 goto error_return;
3698 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3699 || bfd_read (external_ext, 1, esize, abfd) != esize)
3700 goto error_return;
3702 ssext = (char *) bfd_malloc (symhdr->issExtMax);
3703 if (ssext == NULL && symhdr->issExtMax != 0)
3704 goto error_return;
3706 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3707 || (bfd_read (ssext, 1, symhdr->issExtMax, abfd) !=
3708 (bfd_size_type) symhdr->issExtMax))
3709 goto error_return;
3711 /* Look through the external symbols to see if they define some
3712 symbol that is currently undefined. */
3713 ext_ptr = (char *) external_ext;
3714 ext_end = ext_ptr + esize;
3715 for (; ext_ptr < ext_end; ext_ptr += external_ext_size)
3717 EXTR esym;
3718 boolean def;
3719 const char *name;
3720 struct bfd_link_hash_entry *h;
3722 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
3724 /* See if this symbol defines something. */
3725 if (esym.asym.st != stGlobal
3726 && esym.asym.st != stLabel
3727 && esym.asym.st != stProc)
3728 continue;
3730 switch (esym.asym.sc)
3732 case scText:
3733 case scData:
3734 case scBss:
3735 case scAbs:
3736 case scSData:
3737 case scSBss:
3738 case scRData:
3739 case scCommon:
3740 case scSCommon:
3741 case scInit:
3742 case scFini:
3743 case scRConst:
3744 def = true;
3745 break;
3746 default:
3747 def = false;
3748 break;
3751 if (! def)
3752 continue;
3754 name = ssext + esym.asym.iss;
3755 h = bfd_link_hash_lookup (info->hash, name, false, false, true);
3757 /* Unlike the generic linker, we do not pull in elements because
3758 of common symbols. */
3759 if (h == (struct bfd_link_hash_entry *) NULL
3760 || h->type != bfd_link_hash_undefined)
3761 continue;
3763 /* Include this element. */
3764 if (! (*info->callbacks->add_archive_element) (info, abfd, name))
3765 goto error_return;
3766 if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
3767 goto error_return;
3769 *pneeded = true;
3770 goto successful_return;
3773 successful_return:
3774 if (external_ext != NULL)
3775 free (external_ext);
3776 if (ssext != NULL)
3777 free (ssext);
3778 return true;
3779 error_return:
3780 if (external_ext != NULL)
3781 free (external_ext);
3782 if (ssext != NULL)
3783 free (ssext);
3784 return false;
3787 /* Add symbols from an ECOFF object file to the global linker hash
3788 table. */
3790 static boolean
3791 ecoff_link_add_object_symbols (abfd, info)
3792 bfd *abfd;
3793 struct bfd_link_info *info;
3795 HDRR *symhdr;
3796 bfd_size_type external_ext_size;
3797 PTR external_ext = NULL;
3798 size_t esize;
3799 char *ssext = NULL;
3800 boolean result;
3802 if (! ecoff_slurp_symbolic_header (abfd))
3803 return false;
3805 /* If there are no symbols, we don't want it. */
3806 if (bfd_get_symcount (abfd) == 0)
3807 return true;
3809 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3811 /* Read in the external symbols and external strings. */
3812 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3813 esize = symhdr->iextMax * external_ext_size;
3814 external_ext = (PTR) bfd_malloc (esize);
3815 if (external_ext == NULL && esize != 0)
3816 goto error_return;
3818 if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0
3819 || bfd_read (external_ext, 1, esize, abfd) != esize)
3820 goto error_return;
3822 ssext = (char *) bfd_malloc (symhdr->issExtMax);
3823 if (ssext == NULL && symhdr->issExtMax != 0)
3824 goto error_return;
3826 if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0
3827 || (bfd_read (ssext, 1, symhdr->issExtMax, abfd)
3828 != (bfd_size_type) symhdr->issExtMax))
3829 goto error_return;
3831 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3833 if (ssext != NULL)
3834 free (ssext);
3835 if (external_ext != NULL)
3836 free (external_ext);
3837 return result;
3839 error_return:
3840 if (ssext != NULL)
3841 free (ssext);
3842 if (external_ext != NULL)
3843 free (external_ext);
3844 return false;
3847 /* Add the external symbols of an object file to the global linker
3848 hash table. The external symbols and strings we are passed are
3849 just allocated on the stack, and will be discarded. We must
3850 explicitly save any information we may need later on in the link.
3851 We do not want to read the external symbol information again. */
3853 static boolean
3854 ecoff_link_add_externals (abfd, info, external_ext, ssext)
3855 bfd *abfd;
3856 struct bfd_link_info *info;
3857 PTR external_ext;
3858 char *ssext;
3860 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3861 void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *))
3862 = backend->debug_swap.swap_ext_in;
3863 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
3864 unsigned long ext_count;
3865 struct ecoff_link_hash_entry **sym_hash;
3866 char *ext_ptr;
3867 char *ext_end;
3869 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
3871 sym_hash = ((struct ecoff_link_hash_entry **)
3872 bfd_alloc (abfd,
3873 ext_count * sizeof (struct bfd_link_hash_entry *)));
3874 if (!sym_hash)
3875 return false;
3876 ecoff_data (abfd)->sym_hashes = sym_hash;
3878 ext_ptr = (char *) external_ext;
3879 ext_end = ext_ptr + ext_count * external_ext_size;
3880 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
3882 EXTR esym;
3883 boolean skip;
3884 bfd_vma value;
3885 asection *section;
3886 const char *name;
3887 struct ecoff_link_hash_entry *h;
3889 *sym_hash = NULL;
3891 (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym);
3893 /* Skip debugging symbols. */
3894 skip = false;
3895 switch (esym.asym.st)
3897 case stGlobal:
3898 case stStatic:
3899 case stLabel:
3900 case stProc:
3901 case stStaticProc:
3902 break;
3903 default:
3904 skip = true;
3905 break;
3908 if (skip)
3909 continue;
3911 /* Get the information for this symbol. */
3912 value = esym.asym.value;
3913 switch (esym.asym.sc)
3915 default:
3916 case scNil:
3917 case scRegister:
3918 case scCdbLocal:
3919 case scBits:
3920 case scCdbSystem:
3921 case scRegImage:
3922 case scInfo:
3923 case scUserStruct:
3924 case scVar:
3925 case scVarRegister:
3926 case scVariant:
3927 case scBasedVar:
3928 case scXData:
3929 case scPData:
3930 section = NULL;
3931 break;
3932 case scText:
3933 section = bfd_make_section_old_way (abfd, ".text");
3934 value -= section->vma;
3935 break;
3936 case scData:
3937 section = bfd_make_section_old_way (abfd, ".data");
3938 value -= section->vma;
3939 break;
3940 case scBss:
3941 section = bfd_make_section_old_way (abfd, ".bss");
3942 value -= section->vma;
3943 break;
3944 case scAbs:
3945 section = bfd_abs_section_ptr;
3946 break;
3947 case scUndefined:
3948 section = bfd_und_section_ptr;
3949 break;
3950 case scSData:
3951 section = bfd_make_section_old_way (abfd, ".sdata");
3952 value -= section->vma;
3953 break;
3954 case scSBss:
3955 section = bfd_make_section_old_way (abfd, ".sbss");
3956 value -= section->vma;
3957 break;
3958 case scRData:
3959 section = bfd_make_section_old_way (abfd, ".rdata");
3960 value -= section->vma;
3961 break;
3962 case scCommon:
3963 if (value > ecoff_data (abfd)->gp_size)
3965 section = bfd_com_section_ptr;
3966 break;
3968 /* Fall through. */
3969 case scSCommon:
3970 if (ecoff_scom_section.name == NULL)
3972 /* Initialize the small common section. */
3973 ecoff_scom_section.name = SCOMMON;
3974 ecoff_scom_section.flags = SEC_IS_COMMON;
3975 ecoff_scom_section.output_section = &ecoff_scom_section;
3976 ecoff_scom_section.symbol = &ecoff_scom_symbol;
3977 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
3978 ecoff_scom_symbol.name = SCOMMON;
3979 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
3980 ecoff_scom_symbol.section = &ecoff_scom_section;
3981 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
3983 section = &ecoff_scom_section;
3984 break;
3985 case scSUndefined:
3986 section = bfd_und_section_ptr;
3987 break;
3988 case scInit:
3989 section = bfd_make_section_old_way (abfd, ".init");
3990 value -= section->vma;
3991 break;
3992 case scFini:
3993 section = bfd_make_section_old_way (abfd, ".fini");
3994 value -= section->vma;
3995 break;
3996 case scRConst:
3997 section = bfd_make_section_old_way (abfd, ".rconst");
3998 value -= section->vma;
3999 break;
4002 if (section == (asection *) NULL)
4003 continue;
4005 name = ssext + esym.asym.iss;
4007 h = NULL;
4008 if (! (_bfd_generic_link_add_one_symbol
4009 (info, abfd, name,
4010 esym.weakext ? BSF_WEAK : BSF_GLOBAL,
4011 section, value, (const char *) NULL, true, true,
4012 (struct bfd_link_hash_entry **) &h)))
4013 return false;
4015 *sym_hash = h;
4017 /* If we are building an ECOFF hash table, save the external
4018 symbol information. */
4019 if (info->hash->creator->flavour == bfd_get_flavour (abfd))
4021 if (h->abfd == (bfd *) NULL
4022 || (! bfd_is_und_section (section)
4023 && (! bfd_is_com_section (section)
4024 || (h->root.type != bfd_link_hash_defined
4025 && h->root.type != bfd_link_hash_defweak))))
4027 h->abfd = abfd;
4028 h->esym = esym;
4031 /* Remember whether this symbol was small undefined. */
4032 if (esym.asym.sc == scSUndefined)
4033 h->small = 1;
4035 /* If this symbol was ever small undefined, it needs to wind
4036 up in a GP relative section. We can't control the
4037 section of a defined symbol, but we can control the
4038 section of a common symbol. This case is actually needed
4039 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
4040 if (h->small
4041 && h->root.type == bfd_link_hash_common
4042 && strcmp (h->root.u.c.p->section->name, SCOMMON) != 0)
4044 h->root.u.c.p->section = bfd_make_section_old_way (abfd,
4045 SCOMMON);
4046 h->root.u.c.p->section->flags = SEC_ALLOC;
4047 if (h->esym.asym.sc == scCommon)
4048 h->esym.asym.sc = scSCommon;
4053 return true;
4056 /* ECOFF final link routines. */
4058 static boolean ecoff_final_link_debug_accumulate
4059 PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *,
4060 PTR handle));
4061 static boolean ecoff_link_write_external
4062 PARAMS ((struct ecoff_link_hash_entry *, PTR));
4063 static boolean ecoff_indirect_link_order
4064 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4065 struct bfd_link_order *));
4066 static boolean ecoff_reloc_link_order
4067 PARAMS ((bfd *, struct bfd_link_info *, asection *,
4068 struct bfd_link_order *));
4070 /* Structure used to pass information to ecoff_link_write_external. */
4072 struct extsym_info
4074 bfd *abfd;
4075 struct bfd_link_info *info;
4078 /* ECOFF final link routine. This looks through all the input BFDs
4079 and gathers together all the debugging information, and then
4080 processes all the link order information. This may cause it to
4081 close and reopen some input BFDs; I'll see how bad this is. */
4083 boolean
4084 _bfd_ecoff_bfd_final_link (abfd, info)
4085 bfd *abfd;
4086 struct bfd_link_info *info;
4088 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4089 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4090 HDRR *symhdr;
4091 PTR handle;
4092 register bfd *input_bfd;
4093 asection *o;
4094 struct bfd_link_order *p;
4095 struct extsym_info einfo;
4097 /* We accumulate the debugging information counts in the symbolic
4098 header. */
4099 symhdr = &debug->symbolic_header;
4100 symhdr->vstamp = 0;
4101 symhdr->ilineMax = 0;
4102 symhdr->cbLine = 0;
4103 symhdr->idnMax = 0;
4104 symhdr->ipdMax = 0;
4105 symhdr->isymMax = 0;
4106 symhdr->ioptMax = 0;
4107 symhdr->iauxMax = 0;
4108 symhdr->issMax = 0;
4109 symhdr->issExtMax = 0;
4110 symhdr->ifdMax = 0;
4111 symhdr->crfd = 0;
4112 symhdr->iextMax = 0;
4114 /* We accumulate the debugging information itself in the debug_info
4115 structure. */
4116 debug->line = NULL;
4117 debug->external_dnr = NULL;
4118 debug->external_pdr = NULL;
4119 debug->external_sym = NULL;
4120 debug->external_opt = NULL;
4121 debug->external_aux = NULL;
4122 debug->ss = NULL;
4123 debug->ssext = debug->ssext_end = NULL;
4124 debug->external_fdr = NULL;
4125 debug->external_rfd = NULL;
4126 debug->external_ext = debug->external_ext_end = NULL;
4128 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4129 if (handle == (PTR) NULL)
4130 return false;
4132 /* Accumulate the debugging symbols from each input BFD. */
4133 for (input_bfd = info->input_bfds;
4134 input_bfd != (bfd *) NULL;
4135 input_bfd = input_bfd->link_next)
4137 boolean ret;
4139 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4141 /* Abitrarily set the symbolic header vstamp to the vstamp
4142 of the first object file in the link. */
4143 if (symhdr->vstamp == 0)
4144 symhdr->vstamp
4145 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4146 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4147 handle);
4149 else
4150 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4151 debug, &backend->debug_swap,
4152 input_bfd, info);
4153 if (! ret)
4154 return false;
4156 /* Combine the register masks. */
4157 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4158 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4159 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4160 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4161 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4162 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4165 /* Write out the external symbols. */
4166 einfo.abfd = abfd;
4167 einfo.info = info;
4168 ecoff_link_hash_traverse (ecoff_hash_table (info),
4169 ecoff_link_write_external,
4170 (PTR) &einfo);
4172 if (info->relocateable)
4174 /* We need to make a pass over the link_orders to count up the
4175 number of relocations we will need to output, so that we know
4176 how much space they will take up. */
4177 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4179 o->reloc_count = 0;
4180 for (p = o->link_order_head;
4181 p != (struct bfd_link_order *) NULL;
4182 p = p->next)
4183 if (p->type == bfd_indirect_link_order)
4184 o->reloc_count += p->u.indirect.section->reloc_count;
4185 else if (p->type == bfd_section_reloc_link_order
4186 || p->type == bfd_symbol_reloc_link_order)
4187 ++o->reloc_count;
4191 /* Compute the reloc and symbol file positions. */
4192 ecoff_compute_reloc_file_positions (abfd);
4194 /* Write out the debugging information. */
4195 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4196 &backend->debug_swap, info,
4197 ecoff_data (abfd)->sym_filepos))
4198 return false;
4200 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4202 if (info->relocateable)
4204 /* Now reset the reloc_count field of the sections in the output
4205 BFD to 0, so that we can use them to keep track of how many
4206 relocs we have output thus far. */
4207 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4208 o->reloc_count = 0;
4211 /* Get a value for the GP register. */
4212 if (ecoff_data (abfd)->gp == 0)
4214 struct bfd_link_hash_entry *h;
4216 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
4217 if (h != (struct bfd_link_hash_entry *) NULL
4218 && h->type == bfd_link_hash_defined)
4219 ecoff_data (abfd)->gp = (h->u.def.value
4220 + h->u.def.section->output_section->vma
4221 + h->u.def.section->output_offset);
4222 else if (info->relocateable)
4224 bfd_vma lo;
4226 /* Make up a value. */
4227 lo = (bfd_vma) -1;
4228 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4230 if (o->vma < lo
4231 && (strcmp (o->name, _SBSS) == 0
4232 || strcmp (o->name, _SDATA) == 0
4233 || strcmp (o->name, _LIT4) == 0
4234 || strcmp (o->name, _LIT8) == 0
4235 || strcmp (o->name, _LITA) == 0))
4236 lo = o->vma;
4238 ecoff_data (abfd)->gp = lo + 0x8000;
4240 else
4242 /* If the relocate_section function needs to do a reloc
4243 involving the GP value, it should make a reloc_dangerous
4244 callback to warn that GP is not defined. */
4248 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4250 for (p = o->link_order_head;
4251 p != (struct bfd_link_order *) NULL;
4252 p = p->next)
4254 if (p->type == bfd_indirect_link_order
4255 && (bfd_get_flavour (p->u.indirect.section->owner)
4256 == bfd_target_ecoff_flavour))
4258 if (! ecoff_indirect_link_order (abfd, info, o, p))
4259 return false;
4261 else if (p->type == bfd_section_reloc_link_order
4262 || p->type == bfd_symbol_reloc_link_order)
4264 if (! ecoff_reloc_link_order (abfd, info, o, p))
4265 return false;
4267 else
4269 if (! _bfd_default_link_order (abfd, info, o, p))
4270 return false;
4275 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4277 ecoff_data (abfd)->linker = true;
4279 return true;
4282 /* Accumulate the debugging information for an input BFD into the
4283 output BFD. This must read in the symbolic information of the
4284 input BFD. */
4286 static boolean
4287 ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle)
4288 bfd *output_bfd;
4289 bfd *input_bfd;
4290 struct bfd_link_info *info;
4291 PTR handle;
4293 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
4294 const struct ecoff_debug_swap * const swap =
4295 &ecoff_backend (input_bfd)->debug_swap;
4296 HDRR *symhdr = &debug->symbolic_header;
4297 boolean ret;
4299 #define READ(ptr, offset, count, size, type) \
4300 if (symhdr->count == 0) \
4301 debug->ptr = NULL; \
4302 else \
4304 debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
4305 if (debug->ptr == NULL) \
4307 ret = false; \
4308 goto return_something; \
4310 if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \
4311 != 0) \
4312 || (bfd_read (debug->ptr, size, symhdr->count, \
4313 input_bfd) != size * symhdr->count)) \
4315 ret = false; \
4316 goto return_something; \
4320 /* If raw_syments is not NULL, then the data was already by read by
4321 _bfd_ecoff_slurp_symbolic_info. */
4322 if (ecoff_data (input_bfd)->raw_syments == NULL)
4324 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
4325 unsigned char *);
4326 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
4327 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
4328 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
4329 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
4330 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
4331 union aux_ext *);
4332 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
4333 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
4334 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
4336 #undef READ
4338 /* We do not read the external strings or the external symbols. */
4340 ret = (bfd_ecoff_debug_accumulate
4341 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
4342 &ecoff_backend (output_bfd)->debug_swap,
4343 input_bfd, debug, swap, info));
4345 return_something:
4346 if (ecoff_data (input_bfd)->raw_syments == NULL)
4348 if (debug->line != NULL)
4349 free (debug->line);
4350 if (debug->external_dnr != NULL)
4351 free (debug->external_dnr);
4352 if (debug->external_pdr != NULL)
4353 free (debug->external_pdr);
4354 if (debug->external_sym != NULL)
4355 free (debug->external_sym);
4356 if (debug->external_opt != NULL)
4357 free (debug->external_opt);
4358 if (debug->external_aux != NULL)
4359 free (debug->external_aux);
4360 if (debug->ss != NULL)
4361 free (debug->ss);
4362 if (debug->external_fdr != NULL)
4363 free (debug->external_fdr);
4364 if (debug->external_rfd != NULL)
4365 free (debug->external_rfd);
4367 /* Make sure we don't accidentally follow one of these pointers
4368 into freed memory. */
4369 debug->line = NULL;
4370 debug->external_dnr = NULL;
4371 debug->external_pdr = NULL;
4372 debug->external_sym = NULL;
4373 debug->external_opt = NULL;
4374 debug->external_aux = NULL;
4375 debug->ss = NULL;
4376 debug->external_fdr = NULL;
4377 debug->external_rfd = NULL;
4380 return ret;
4383 /* Put out information for an external symbol. These come only from
4384 the hash table. */
4386 static boolean
4387 ecoff_link_write_external (h, data)
4388 struct ecoff_link_hash_entry *h;
4389 PTR data;
4391 struct extsym_info *einfo = (struct extsym_info *) data;
4392 bfd *output_bfd = einfo->abfd;
4393 boolean strip;
4395 /* We need to check if this symbol is being stripped. */
4396 if (h->root.type == bfd_link_hash_undefined
4397 || h->root.type == bfd_link_hash_undefweak)
4398 strip = false;
4399 else if (einfo->info->strip == strip_all
4400 || (einfo->info->strip == strip_some
4401 && bfd_hash_lookup (einfo->info->keep_hash,
4402 h->root.root.string,
4403 false, false) == NULL))
4404 strip = true;
4405 else
4406 strip = false;
4408 if (strip || h->written)
4409 return true;
4411 if (h->abfd == (bfd *) NULL)
4413 h->esym.jmptbl = 0;
4414 h->esym.cobol_main = 0;
4415 h->esym.weakext = 0;
4416 h->esym.reserved = 0;
4417 h->esym.ifd = ifdNil;
4418 h->esym.asym.value = 0;
4419 h->esym.asym.st = stGlobal;
4421 if (h->root.type != bfd_link_hash_defined
4422 && h->root.type != bfd_link_hash_defweak)
4423 h->esym.asym.sc = scAbs;
4424 else
4426 asection *output_section;
4427 const char *name;
4429 output_section = h->root.u.def.section->output_section;
4430 name = bfd_section_name (output_section->owner, output_section);
4432 if (strcmp (name, _TEXT) == 0)
4433 h->esym.asym.sc = scText;
4434 else if (strcmp (name, _DATA) == 0)
4435 h->esym.asym.sc = scData;
4436 else if (strcmp (name, _SDATA) == 0)
4437 h->esym.asym.sc = scSData;
4438 else if (strcmp (name, _RDATA) == 0)
4439 h->esym.asym.sc = scRData;
4440 else if (strcmp (name, _BSS) == 0)
4441 h->esym.asym.sc = scBss;
4442 else if (strcmp (name, _SBSS) == 0)
4443 h->esym.asym.sc = scSBss;
4444 else if (strcmp (name, _INIT) == 0)
4445 h->esym.asym.sc = scInit;
4446 else if (strcmp (name, _FINI) == 0)
4447 h->esym.asym.sc = scFini;
4448 else if (strcmp (name, _PDATA) == 0)
4449 h->esym.asym.sc = scPData;
4450 else if (strcmp (name, _XDATA) == 0)
4451 h->esym.asym.sc = scXData;
4452 else if (strcmp (name, _RCONST) == 0)
4453 h->esym.asym.sc = scRConst;
4454 else
4455 h->esym.asym.sc = scAbs;
4458 h->esym.asym.reserved = 0;
4459 h->esym.asym.index = indexNil;
4461 else if (h->esym.ifd != -1)
4463 struct ecoff_debug_info *debug;
4465 /* Adjust the FDR index for the symbol by that used for the
4466 input BFD. */
4467 debug = &ecoff_data (h->abfd)->debug_info;
4468 BFD_ASSERT (h->esym.ifd >= 0
4469 && h->esym.ifd < debug->symbolic_header.ifdMax);
4470 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4473 switch (h->root.type)
4475 default:
4476 case bfd_link_hash_new:
4477 abort ();
4478 case bfd_link_hash_undefined:
4479 case bfd_link_hash_undefweak:
4480 if (h->esym.asym.sc != scUndefined
4481 && h->esym.asym.sc != scSUndefined)
4482 h->esym.asym.sc = scUndefined;
4483 break;
4484 case bfd_link_hash_defined:
4485 case bfd_link_hash_defweak:
4486 if (h->esym.asym.sc == scUndefined
4487 || h->esym.asym.sc == scSUndefined)
4488 h->esym.asym.sc = scAbs;
4489 else if (h->esym.asym.sc == scCommon)
4490 h->esym.asym.sc = scBss;
4491 else if (h->esym.asym.sc == scSCommon)
4492 h->esym.asym.sc = scSBss;
4493 h->esym.asym.value = (h->root.u.def.value
4494 + h->root.u.def.section->output_section->vma
4495 + h->root.u.def.section->output_offset);
4496 break;
4497 case bfd_link_hash_common:
4498 if (h->esym.asym.sc != scCommon
4499 && h->esym.asym.sc != scSCommon)
4500 h->esym.asym.sc = scCommon;
4501 h->esym.asym.value = h->root.u.c.size;
4502 break;
4503 case bfd_link_hash_indirect:
4504 case bfd_link_hash_warning:
4505 /* FIXME: Ignore these for now. The circumstances under which
4506 they should be written out are not clear to me. */
4507 return true;
4510 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4511 symbol number. */
4512 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4513 h->written = 1;
4515 return (bfd_ecoff_debug_one_external
4516 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4517 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4518 &h->esym));
4521 /* Relocate and write an ECOFF section into an ECOFF output file. */
4523 static boolean
4524 ecoff_indirect_link_order (output_bfd, info, output_section, link_order)
4525 bfd *output_bfd;
4526 struct bfd_link_info *info;
4527 asection *output_section;
4528 struct bfd_link_order *link_order;
4530 asection *input_section;
4531 bfd *input_bfd;
4532 struct ecoff_section_tdata *section_tdata;
4533 bfd_size_type raw_size;
4534 bfd_size_type cooked_size;
4535 bfd_byte *contents = NULL;
4536 bfd_size_type external_reloc_size;
4537 bfd_size_type external_relocs_size;
4538 PTR external_relocs = NULL;
4540 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
4542 if (link_order->size == 0)
4543 return true;
4545 input_section = link_order->u.indirect.section;
4546 input_bfd = input_section->owner;
4547 section_tdata = ecoff_section_data (input_bfd, input_section);
4549 raw_size = input_section->_raw_size;
4550 cooked_size = input_section->_cooked_size;
4551 if (cooked_size == 0)
4552 cooked_size = raw_size;
4554 BFD_ASSERT (input_section->output_section == output_section);
4555 BFD_ASSERT (input_section->output_offset == link_order->offset);
4556 BFD_ASSERT (cooked_size == link_order->size);
4558 /* Get the section contents. We allocate memory for the larger of
4559 the size before relocating and the size after relocating. */
4560 contents = (bfd_byte *) bfd_malloc (raw_size >= cooked_size
4561 ? (size_t) raw_size
4562 : (size_t) cooked_size);
4563 if (contents == NULL && raw_size != 0)
4564 goto error_return;
4566 /* If we are relaxing, the contents may have already been read into
4567 memory, in which case we copy them into our new buffer. We don't
4568 simply reuse the old buffer in case cooked_size > raw_size. */
4569 if (section_tdata != (struct ecoff_section_tdata *) NULL
4570 && section_tdata->contents != (bfd_byte *) NULL)
4571 memcpy (contents, section_tdata->contents, (size_t) raw_size);
4572 else
4574 if (! bfd_get_section_contents (input_bfd, input_section,
4575 (PTR) contents,
4576 (file_ptr) 0, raw_size))
4577 goto error_return;
4580 /* Get the relocs. If we are relaxing MIPS code, they will already
4581 have been read in. Otherwise, we read them in now. */
4582 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
4583 external_relocs_size = external_reloc_size * input_section->reloc_count;
4585 if (section_tdata != (struct ecoff_section_tdata *) NULL
4586 && section_tdata->external_relocs != NULL)
4587 external_relocs = section_tdata->external_relocs;
4588 else
4590 external_relocs = (PTR) bfd_malloc ((size_t) external_relocs_size);
4591 if (external_relocs == NULL && external_relocs_size != 0)
4592 goto error_return;
4594 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
4595 || (bfd_read (external_relocs, 1, external_relocs_size, input_bfd)
4596 != external_relocs_size))
4597 goto error_return;
4600 /* Relocate the section contents. */
4601 if (! ((*ecoff_backend (input_bfd)->relocate_section)
4602 (output_bfd, info, input_bfd, input_section, contents,
4603 external_relocs)))
4604 goto error_return;
4606 /* Write out the relocated section. */
4607 if (! bfd_set_section_contents (output_bfd,
4608 output_section,
4609 (PTR) contents,
4610 input_section->output_offset,
4611 cooked_size))
4612 goto error_return;
4614 /* If we are producing relocateable output, the relocs were
4615 modified, and we write them out now. We use the reloc_count
4616 field of output_section to keep track of the number of relocs we
4617 have output so far. */
4618 if (info->relocateable)
4620 if (bfd_seek (output_bfd,
4621 (output_section->rel_filepos +
4622 output_section->reloc_count * external_reloc_size),
4623 SEEK_SET) != 0
4624 || (bfd_write (external_relocs, 1, external_relocs_size, output_bfd)
4625 != external_relocs_size))
4626 goto error_return;
4627 output_section->reloc_count += input_section->reloc_count;
4630 if (contents != NULL)
4631 free (contents);
4632 if (external_relocs != NULL && section_tdata == NULL)
4633 free (external_relocs);
4634 return true;
4636 error_return:
4637 if (contents != NULL)
4638 free (contents);
4639 if (external_relocs != NULL && section_tdata == NULL)
4640 free (external_relocs);
4641 return false;
4644 /* Generate a reloc when linking an ECOFF file. This is a reloc
4645 requested by the linker, and does come from any input file. This
4646 is used to build constructor and destructor tables when linking
4647 with -Ur. */
4649 static boolean
4650 ecoff_reloc_link_order (output_bfd, info, output_section, link_order)
4651 bfd *output_bfd;
4652 struct bfd_link_info *info;
4653 asection *output_section;
4654 struct bfd_link_order *link_order;
4656 enum bfd_link_order_type type;
4657 asection *section;
4658 bfd_vma addend;
4659 arelent rel;
4660 struct internal_reloc in;
4661 bfd_size_type external_reloc_size;
4662 bfd_byte *rbuf;
4663 boolean ok;
4665 type = link_order->type;
4666 section = NULL;
4667 addend = link_order->u.reloc.p->addend;
4669 /* We set up an arelent to pass to the backend adjust_reloc_out
4670 routine. */
4671 rel.address = link_order->offset;
4673 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4674 if (rel.howto == 0)
4676 bfd_set_error (bfd_error_bad_value);
4677 return false;
4680 if (type == bfd_section_reloc_link_order)
4682 section = link_order->u.reloc.p->u.section;
4683 rel.sym_ptr_ptr = section->symbol_ptr_ptr;
4685 else
4687 struct bfd_link_hash_entry *h;
4689 /* Treat a reloc against a defined symbol as though it were
4690 actually against the section. */
4691 h = bfd_wrapped_link_hash_lookup (output_bfd, info,
4692 link_order->u.reloc.p->u.name,
4693 false, false, false);
4694 if (h != NULL
4695 && (h->type == bfd_link_hash_defined
4696 || h->type == bfd_link_hash_defweak))
4698 type = bfd_section_reloc_link_order;
4699 section = h->u.def.section->output_section;
4700 /* It seems that we ought to add the symbol value to the
4701 addend here, but in practice it has already been added
4702 because it was passed to constructor_callback. */
4703 addend += section->vma + h->u.def.section->output_offset;
4705 else
4707 /* We can't set up a reloc against a symbol correctly,
4708 because we have no asymbol structure. Currently no
4709 adjust_reloc_out routine cares. */
4710 rel.sym_ptr_ptr = (asymbol **) NULL;
4714 /* All ECOFF relocs are in-place. Put the addend into the object
4715 file. */
4717 BFD_ASSERT (rel.howto->partial_inplace);
4718 if (addend != 0)
4720 bfd_size_type size;
4721 bfd_reloc_status_type rstat;
4722 bfd_byte *buf;
4723 boolean ok;
4725 size = bfd_get_reloc_size (rel.howto);
4726 buf = (bfd_byte *) bfd_zmalloc (size);
4727 if (buf == (bfd_byte *) NULL)
4728 return false;
4729 rstat = _bfd_relocate_contents (rel.howto, output_bfd, addend, buf);
4730 switch (rstat)
4732 case bfd_reloc_ok:
4733 break;
4734 default:
4735 case bfd_reloc_outofrange:
4736 abort ();
4737 case bfd_reloc_overflow:
4738 if (! ((*info->callbacks->reloc_overflow)
4739 (info,
4740 (link_order->type == bfd_section_reloc_link_order
4741 ? bfd_section_name (output_bfd, section)
4742 : link_order->u.reloc.p->u.name),
4743 rel.howto->name, addend, (bfd *) NULL,
4744 (asection *) NULL, (bfd_vma) 0)))
4746 free (buf);
4747 return false;
4749 break;
4751 ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf,
4752 (file_ptr) link_order->offset, size);
4753 free (buf);
4754 if (! ok)
4755 return false;
4758 rel.addend = 0;
4760 /* Move the information into a internal_reloc structure. */
4761 in.r_vaddr = (rel.address
4762 + bfd_get_section_vma (output_bfd, output_section));
4763 in.r_type = rel.howto->type;
4765 if (type == bfd_symbol_reloc_link_order)
4767 struct ecoff_link_hash_entry *h;
4769 h = ((struct ecoff_link_hash_entry *)
4770 bfd_wrapped_link_hash_lookup (output_bfd, info,
4771 link_order->u.reloc.p->u.name,
4772 false, false, true));
4773 if (h != (struct ecoff_link_hash_entry *) NULL
4774 && h->indx != -1)
4775 in.r_symndx = h->indx;
4776 else
4778 if (! ((*info->callbacks->unattached_reloc)
4779 (info, link_order->u.reloc.p->u.name, (bfd *) NULL,
4780 (asection *) NULL, (bfd_vma) 0)))
4781 return false;
4782 in.r_symndx = 0;
4784 in.r_extern = 1;
4786 else
4788 CONST char *name;
4790 name = bfd_get_section_name (output_bfd, section);
4791 if (strcmp (name, ".text") == 0)
4792 in.r_symndx = RELOC_SECTION_TEXT;
4793 else if (strcmp (name, ".rdata") == 0)
4794 in.r_symndx = RELOC_SECTION_RDATA;
4795 else if (strcmp (name, ".data") == 0)
4796 in.r_symndx = RELOC_SECTION_DATA;
4797 else if (strcmp (name, ".sdata") == 0)
4798 in.r_symndx = RELOC_SECTION_SDATA;
4799 else if (strcmp (name, ".sbss") == 0)
4800 in.r_symndx = RELOC_SECTION_SBSS;
4801 else if (strcmp (name, ".bss") == 0)
4802 in.r_symndx = RELOC_SECTION_BSS;
4803 else if (strcmp (name, ".init") == 0)
4804 in.r_symndx = RELOC_SECTION_INIT;
4805 else if (strcmp (name, ".lit8") == 0)
4806 in.r_symndx = RELOC_SECTION_LIT8;
4807 else if (strcmp (name, ".lit4") == 0)
4808 in.r_symndx = RELOC_SECTION_LIT4;
4809 else if (strcmp (name, ".xdata") == 0)
4810 in.r_symndx = RELOC_SECTION_XDATA;
4811 else if (strcmp (name, ".pdata") == 0)
4812 in.r_symndx = RELOC_SECTION_PDATA;
4813 else if (strcmp (name, ".fini") == 0)
4814 in.r_symndx = RELOC_SECTION_FINI;
4815 else if (strcmp (name, ".lita") == 0)
4816 in.r_symndx = RELOC_SECTION_LITA;
4817 else if (strcmp (name, "*ABS*") == 0)
4818 in.r_symndx = RELOC_SECTION_ABS;
4819 else if (strcmp (name, ".rconst") == 0)
4820 in.r_symndx = RELOC_SECTION_RCONST;
4821 else
4822 abort ();
4823 in.r_extern = 0;
4826 /* Let the BFD backend adjust the reloc. */
4827 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4829 /* Get some memory and swap out the reloc. */
4830 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4831 rbuf = (bfd_byte *) bfd_malloc ((size_t) external_reloc_size);
4832 if (rbuf == (bfd_byte *) NULL)
4833 return false;
4835 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (PTR) rbuf);
4837 ok = (bfd_seek (output_bfd,
4838 (output_section->rel_filepos +
4839 output_section->reloc_count * external_reloc_size),
4840 SEEK_SET) == 0
4841 && (bfd_write ((PTR) rbuf, 1, external_reloc_size, output_bfd)
4842 == external_reloc_size));
4844 if (ok)
4845 ++output_section->reloc_count;
4847 free (rbuf);
4849 return ok;